<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/">
	<channel>
		<title><![CDATA[DevOps Discussion Forum - All Forums]]></title>
		<link>https://forums.geekssolutions.io/</link>
		<description><![CDATA[DevOps Discussion Forum - https://forums.geekssolutions.io]]></description>
		<pubDate>Fri, 05 Jun 2026 20:40:49 +0000</pubDate>
		<generator>MyBB</generator>
		<item>
			<title><![CDATA[Extending LVM Logical Volume (LV) in Linux – Runbook]]></title>
			<link>https://forums.geekssolutions.io/showthread.php?tid=28</link>
			<pubDate>Wed, 22 Apr 2026 11:24:42 +0530</pubDate>
			<dc:creator><![CDATA[<a href="https://forums.geekssolutions.io/member.php?action=profile&uid=6">Kalyani</a>]]></dc:creator>
			<guid isPermaLink="false">https://forums.geekssolutions.io/showthread.php?tid=28</guid>
			<description><![CDATA[<span style="font-weight: bold;" class="mycode_b">Purpose</span><br />
Extend disk space on a Linux system using LVM <span style="font-weight: bold;" class="mycode_b">without downtime</span>.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Applies to</span><br />
Systems using LVM (Logical Volume Manager)<br />
<br />
<hr class="mycode_hr" />
<img src="https://forums.geekssolutions.io/images/smilies/exclamation.png" alt="Exclamation" title="Exclamation" class="smilie smilie_15" />  <span style="font-weight: bold;" class="mycode_b">Problem</span><br />
<br />
Filesystem (e.g. /, /var) is running out of space and needs to be extended.<br />
<br />
<hr class="mycode_hr" />
 <span style="font-weight: bold;" class="mycode_b">Step 1 </span>— Check Current Disk Usage<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>df -h</code></div></div>Output:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>/dev/mapper/rootvg-varlv    14G  13G  1.4G  91% /var</code></div></div><br />
<span style="font-weight: bold;" class="mycode_b">Outcome</span>:<br />
<ul class="mycode_list"><li>Identify which mount point is full (e.g /var) <br />
</li>
<li>This determines <span style="font-weight: bold;" class="mycode_b">which LV needs extension</span> <br />
</li>
</ul>
<hr class="mycode_hr" />
<br />
 <span style="font-weight: bold;" class="mycode_b">Step 2</span> — Verify LVM Setup (Build Context for Extension)<br />
<br />
  1. Map LV to Mount Point<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>lsblk</code></div></div>Output :<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>NAME              MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS<br />
sda                8:0    0  256G  0 disk<br />
├─sda4              8:4    0 63.3G  0 part<br />
  ├─rootvg-varlv  253:3    0  14G  0 lvm  /var<br />
<br />
└─sda5              8:5    0  100G  0 part<br />
  ├─rootvg-varlv  253:3    0  14G  0 lvm  /var</code></div></div><br />
<img src="https://forums.geekssolutions.io/images/smilies/lightbulb.png" alt="Idea" title="Idea" class="smilie smilie_18" />  Insight:<ul class="mycode_list"><li>Identifies <span style="font-weight: bold;" class="mycode_b">which LV is mounted where</span> <br />
</li>
<li>Confirms LVM usage (TYPE = lvm)<br />
 <br />
</li>
</ul>
  2. Identify Target LV<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>lvs -o lv_name,vg_name,lv_path</code></div></div>Output:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>LV    VG    Path<br />
varlv  rootvg /dev/rootvg/varlv</code></div></div><br />
<img src="https://forums.geekssolutions.io/images/smilies/lightbulb.png" alt="Idea" title="Idea" class="smilie smilie_18" />  Insight:<br />
<ul class="mycode_list"><li>Confirms exact LV <span style="font-weight: bold;" class="mycode_b">name</span> to extend (e.g varlv) <br />
</li>
<li>Provides <span style="font-weight: bold;" class="mycode_b">correct device path</span> required for lvextend (e.g  /dev/rootvg/varlv)<br />
 <br />
</li>
</ul>
  3. Check Available Space in VG <br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>vgs</code></div></div>Output:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>VG    #PV #LV #SN Attr  VSize    VFree<br />
rootvg  2  5  0 wz--n- &lt;163.31g 316.00m</code></div></div><br />
<img src="https://forums.geekssolutions.io/images/smilies/lightbulb.png" alt="Idea" title="Idea" class="smilie smilie_18" /> Insight:<ul class="mycode_list"><li>Determines if extension is possible <br />
</li>
</ul>
<br />
       Interpretation:<ul class="mycode_list"><li>VFree &gt; 0<br />
 → Extend directly <br />
</li>
<li>VFree = 0<br />
→ Add disk first<br />
</li>
</ul>
<br />
  4. Check Underlying Disks<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>pvs</code></div></div><div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>PV        VG    Fmt  Attr PSize    PFree<br />
/dev/sda4  rootvg lvm2 a--  63.31g    0<br />
/dev/sda5  rootvg lvm2 a--  &lt;100.00g 316.00m</code></div></div><br />
<img src="https://forums.geekssolutions.io/images/smilies/lightbulb.png" alt="Idea" title="Idea" class="smilie smilie_18" />  Insight:<ul class="mycode_list"><li>Shows disks backing the VG <br />
</li>
<li>Confirms whether storage is already fully utilized <br />
<br />
</li>
</ul>
<hr class="mycode_hr" />
<img src="https://forums.geekssolutions.io/images/smilies/cool.png" alt="Cool" title="Cool" class="smilie smilie_3" />  Step 2 Outcome (What we now know)<br />
<ul class="mycode_list"><li>Which <span style="font-weight: bold;" class="mycode_b">LV to extend</span> (varlv) <br />
</li>
<li>Its <span style="font-weight: bold;" class="mycode_b">mount point</span> (/var) and <span style="font-weight: bold;" class="mycode_b">exact path</span> (/dev/rootvg/varlv)<br />
</li>
<li>Whether <span style="font-weight: bold;" class="mycode_b">free space exists in VG</span> <br />
</li>
<li>Which <span style="font-weight: bold;" class="mycode_b">disks are backing LVM<br />
</span> <br />
</li>
</ul>
<hr class="mycode_hr" />
<br />
<img src="https://forums.geekssolutions.io/images/smilies/exclamation.png" alt="Exclamation" title="Exclamation" class="smilie smilie_15" />  Decision Point<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Case A</span>: VG has free space<br />
→ Extend LV directly<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Case B</span>: No free space<br />
→ Add disk / extend storage first<br />
<br />
<hr class="mycode_hr" />
<br />
<span style="font-weight: bold;" class="mycode_b">Case A</span> — Extend LV (VG has free space)<br />
<br />
  <span style="font-weight: bold;" class="mycode_b">Step 3</span> — Extend Logical Volume<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>lvextend -L +316M /dev/rootvg/varlv</code></div></div><ul class="mycode_list"><li>-L → size in GB/MB <br />
</li>
</ul>
<br />
OR use all free space:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>lvextend -l +100%FREE /dev/rootvg/varlv</code></div></div><ul class="mycode_list"><li>-l → extents / percentage <br />
</li>
</ul>
<br />
<span style="font-weight: bold;" class="mycode_b">Outcome</span>:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>Size of logical volume rootvg/varlv changed from 14.00 GiB (3584 extents) to &lt;14.31 GiB (3663 extents).<br />
Logical volume rootvg/varlv successfully resized.</code></div></div><ul class="mycode_list"><li>LV size increases <br />
</li>
<li>Filesystem unchanged (IMPORTANT) <br />
</li>
</ul>
<br />
<hr class="mycode_hr" />
<br />
  <span style="font-weight: bold;" class="mycode_b"> Step 4</span> — Resize Filesystem<br />
<br />
Check filesystem:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>lsblk -f</code></div></div><br />
For<span style="font-weight: bold;" class="mycode_b"> ext4</span>:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>resize2fs /dev/rootvg/varlv</code></div></div><br />
For <span style="font-weight: bold;" class="mycode_b">xfs</span>:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>xfs_growfs /var</code></div></div><br />
<span style="font-weight: bold;" class="mycode_b">Outcome</span>:<br />
<ul class="mycode_list"><li>Filesystem expands to use new space <br />
<br />
</li>
</ul>
<hr class="mycode_hr" />
<br />
 <span style="font-weight: bold;" class="mycode_b"> Step 5</span> — Verify<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>df -h</code></div></div><br />
<hr class="mycode_hr" />
<span style="font-weight: bold;" class="mycode_b">Case B</span> — No Free Space in VG<br />
<br />
  <span style="font-weight: bold;" class="mycode_b">Step 3</span> — Add New Disk (Cloud / VM level)<br />
<ul class="mycode_list"><li>Add a new disk from your cloud provider / hypervisor (e.g. AWS, Azure, VMware)<br />
</li>
<li>Example: New disk appears as /dev/sdb<br />
</li>
<li>Verify Disk is Added<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>lsblk</code></div></div></li>
<li>New disk should be visible (e.g. /dev/sdb) <br />
</li>
</ul>
<br />
<hr class="mycode_hr" />
  <span style="font-weight: bold;" class="mycode_b">Step </span>4 — Create PV<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>pvcreate /dev/sdb</code></div></div><br />
<hr class="mycode_hr" />
  <span style="font-weight: bold;" class="mycode_b">Step 5</span> — Extend VG<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>vgextend rootvg /dev/sdb</code></div></div><br />
<hr class="mycode_hr" />
  <span style="font-weight: bold;" class="mycode_b">Step 6</span> — Extend LV<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>lvextend -l +100%FREE /dev/rootvg/varlv</code></div></div><br />
<hr class="mycode_hr" />
  <span style="font-weight: bold;" class="mycode_b">Step 7</span> — Resize Filesystem<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>xfs_growfs /var</code></div></div><br />
# OR<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>resize2fs /dev/rootvg/varlv</code></div></div><br />
<hr class="mycode_hr" />
  <span style="font-weight: bold;" class="mycode_b">Step 8</span> — Verify<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>df -h</code></div></div><br />
<hr class="mycode_hr" />
<br />
 <span style="font-weight: bold;" class="mycode_b">Additional Note</span> — Expanding Existing Disk<br />
<br />
If the <span style="font-weight: bold;" class="mycode_b">same disk is increased in size</span> (no new disk added):<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>growpart /dev/sda 4</code></div></div><div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>pvresize /dev/sda4</code></div></div><br />
<span style="font-weight: bold;" class="mycode_b">Outcome</span>:<br />
<ul class="mycode_list"><li>growpart → expands the partition <br />
</li>
<li>pvresize → makes new space available to LVM <br />
</li>
</ul>
<br />
 You can now proceed with lvextend<br />
<br />
<br />
<hr class="mycode_hr" />
<br />
<img src="https://forums.geekssolutions.io/images/smilies/exclamation.png" alt="Exclamation" title="Exclamation" class="smilie smilie_15" /> <span style="font-weight: bold;" class="mycode_b">Common Mistakes</span><br />
<ul class="mycode_list"><li>Extending LV but not resizing filesystem <br />
</li>
<li>Using wrong filesystem command (resize2fs vs xfs_growfs) <br />
</li>
<li>Not checking vgs before starting <br />
</li>
<li>Using wrong device path <br />
</li>
<li>Confusing disk (/dev/sdb) with LV (/dev/rootvg/varlv) <br />
<br />
</li>
</ul>
<hr class="mycode_hr" />
<br />
<img src="https://forums.geekssolutions.io/images/smilies/huh.png" alt="Huh" title="Huh" class="smilie smilie_17" /> <span style="font-weight: bold;" class="mycode_b"> Key Concepts and Takeaways </span><br />
<ul class="mycode_list"><li><span style="font-weight: bold;" class="mycode_b">PV</span> (Physical Volume) → Disk (/dev/sda4) <br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">VG</span> (Volume Group) → Storage pool (rootvg) <br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">LV</span> (Logical Volume) → Usable volume (/var) <br />
</li>
</ul>
<br />
Flow:<br />
<span style="font-weight: bold;" class="mycode_b">Disk → PV → VG → LV → Filesystem</span><br />
<ul class="mycode_list"><li>Extension = <span style="font-weight: bold;" class="mycode_b">LV resize + filesystem resize</span> <br />
</li>
<li>vgs decides your approach (direct vs add disk) <br />
</li>
<li>LVM allows <span style="font-weight: bold;" class="mycode_b">online resizing (no downtime)</span> <br />
</li>
</ul>
<br />
<hr class="mycode_hr" />
<br />
<img src="https://forums.geekssolutions.io/images/smilies/exclamation.png" alt="Exclamation" title="Exclamation" class="smilie smilie_15" />  <span style="font-weight: bold;" class="mycode_b">Precautions</span><br />
<ul class="mycode_list"><li>Take backup before changes <br />
</li>
<li>Double-check device names <br />
</li>
<li>Run carefully on production<br />
</li>
</ul>
]]></description>
			<content:encoded><![CDATA[<span style="font-weight: bold;" class="mycode_b">Purpose</span><br />
Extend disk space on a Linux system using LVM <span style="font-weight: bold;" class="mycode_b">without downtime</span>.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Applies to</span><br />
Systems using LVM (Logical Volume Manager)<br />
<br />
<hr class="mycode_hr" />
<img src="https://forums.geekssolutions.io/images/smilies/exclamation.png" alt="Exclamation" title="Exclamation" class="smilie smilie_15" />  <span style="font-weight: bold;" class="mycode_b">Problem</span><br />
<br />
Filesystem (e.g. /, /var) is running out of space and needs to be extended.<br />
<br />
<hr class="mycode_hr" />
 <span style="font-weight: bold;" class="mycode_b">Step 1 </span>— Check Current Disk Usage<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>df -h</code></div></div>Output:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>/dev/mapper/rootvg-varlv    14G  13G  1.4G  91% /var</code></div></div><br />
<span style="font-weight: bold;" class="mycode_b">Outcome</span>:<br />
<ul class="mycode_list"><li>Identify which mount point is full (e.g /var) <br />
</li>
<li>This determines <span style="font-weight: bold;" class="mycode_b">which LV needs extension</span> <br />
</li>
</ul>
<hr class="mycode_hr" />
<br />
 <span style="font-weight: bold;" class="mycode_b">Step 2</span> — Verify LVM Setup (Build Context for Extension)<br />
<br />
  1. Map LV to Mount Point<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>lsblk</code></div></div>Output :<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>NAME              MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS<br />
sda                8:0    0  256G  0 disk<br />
├─sda4              8:4    0 63.3G  0 part<br />
  ├─rootvg-varlv  253:3    0  14G  0 lvm  /var<br />
<br />
└─sda5              8:5    0  100G  0 part<br />
  ├─rootvg-varlv  253:3    0  14G  0 lvm  /var</code></div></div><br />
<img src="https://forums.geekssolutions.io/images/smilies/lightbulb.png" alt="Idea" title="Idea" class="smilie smilie_18" />  Insight:<ul class="mycode_list"><li>Identifies <span style="font-weight: bold;" class="mycode_b">which LV is mounted where</span> <br />
</li>
<li>Confirms LVM usage (TYPE = lvm)<br />
 <br />
</li>
</ul>
  2. Identify Target LV<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>lvs -o lv_name,vg_name,lv_path</code></div></div>Output:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>LV    VG    Path<br />
varlv  rootvg /dev/rootvg/varlv</code></div></div><br />
<img src="https://forums.geekssolutions.io/images/smilies/lightbulb.png" alt="Idea" title="Idea" class="smilie smilie_18" />  Insight:<br />
<ul class="mycode_list"><li>Confirms exact LV <span style="font-weight: bold;" class="mycode_b">name</span> to extend (e.g varlv) <br />
</li>
<li>Provides <span style="font-weight: bold;" class="mycode_b">correct device path</span> required for lvextend (e.g  /dev/rootvg/varlv)<br />
 <br />
</li>
</ul>
  3. Check Available Space in VG <br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>vgs</code></div></div>Output:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>VG    #PV #LV #SN Attr  VSize    VFree<br />
rootvg  2  5  0 wz--n- &lt;163.31g 316.00m</code></div></div><br />
<img src="https://forums.geekssolutions.io/images/smilies/lightbulb.png" alt="Idea" title="Idea" class="smilie smilie_18" /> Insight:<ul class="mycode_list"><li>Determines if extension is possible <br />
</li>
</ul>
<br />
       Interpretation:<ul class="mycode_list"><li>VFree &gt; 0<br />
 → Extend directly <br />
</li>
<li>VFree = 0<br />
→ Add disk first<br />
</li>
</ul>
<br />
  4. Check Underlying Disks<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>pvs</code></div></div><div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>PV        VG    Fmt  Attr PSize    PFree<br />
/dev/sda4  rootvg lvm2 a--  63.31g    0<br />
/dev/sda5  rootvg lvm2 a--  &lt;100.00g 316.00m</code></div></div><br />
<img src="https://forums.geekssolutions.io/images/smilies/lightbulb.png" alt="Idea" title="Idea" class="smilie smilie_18" />  Insight:<ul class="mycode_list"><li>Shows disks backing the VG <br />
</li>
<li>Confirms whether storage is already fully utilized <br />
<br />
</li>
</ul>
<hr class="mycode_hr" />
<img src="https://forums.geekssolutions.io/images/smilies/cool.png" alt="Cool" title="Cool" class="smilie smilie_3" />  Step 2 Outcome (What we now know)<br />
<ul class="mycode_list"><li>Which <span style="font-weight: bold;" class="mycode_b">LV to extend</span> (varlv) <br />
</li>
<li>Its <span style="font-weight: bold;" class="mycode_b">mount point</span> (/var) and <span style="font-weight: bold;" class="mycode_b">exact path</span> (/dev/rootvg/varlv)<br />
</li>
<li>Whether <span style="font-weight: bold;" class="mycode_b">free space exists in VG</span> <br />
</li>
<li>Which <span style="font-weight: bold;" class="mycode_b">disks are backing LVM<br />
</span> <br />
</li>
</ul>
<hr class="mycode_hr" />
<br />
<img src="https://forums.geekssolutions.io/images/smilies/exclamation.png" alt="Exclamation" title="Exclamation" class="smilie smilie_15" />  Decision Point<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Case A</span>: VG has free space<br />
→ Extend LV directly<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Case B</span>: No free space<br />
→ Add disk / extend storage first<br />
<br />
<hr class="mycode_hr" />
<br />
<span style="font-weight: bold;" class="mycode_b">Case A</span> — Extend LV (VG has free space)<br />
<br />
  <span style="font-weight: bold;" class="mycode_b">Step 3</span> — Extend Logical Volume<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>lvextend -L +316M /dev/rootvg/varlv</code></div></div><ul class="mycode_list"><li>-L → size in GB/MB <br />
</li>
</ul>
<br />
OR use all free space:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>lvextend -l +100%FREE /dev/rootvg/varlv</code></div></div><ul class="mycode_list"><li>-l → extents / percentage <br />
</li>
</ul>
<br />
<span style="font-weight: bold;" class="mycode_b">Outcome</span>:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>Size of logical volume rootvg/varlv changed from 14.00 GiB (3584 extents) to &lt;14.31 GiB (3663 extents).<br />
Logical volume rootvg/varlv successfully resized.</code></div></div><ul class="mycode_list"><li>LV size increases <br />
</li>
<li>Filesystem unchanged (IMPORTANT) <br />
</li>
</ul>
<br />
<hr class="mycode_hr" />
<br />
  <span style="font-weight: bold;" class="mycode_b"> Step 4</span> — Resize Filesystem<br />
<br />
Check filesystem:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>lsblk -f</code></div></div><br />
For<span style="font-weight: bold;" class="mycode_b"> ext4</span>:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>resize2fs /dev/rootvg/varlv</code></div></div><br />
For <span style="font-weight: bold;" class="mycode_b">xfs</span>:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>xfs_growfs /var</code></div></div><br />
<span style="font-weight: bold;" class="mycode_b">Outcome</span>:<br />
<ul class="mycode_list"><li>Filesystem expands to use new space <br />
<br />
</li>
</ul>
<hr class="mycode_hr" />
<br />
 <span style="font-weight: bold;" class="mycode_b"> Step 5</span> — Verify<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>df -h</code></div></div><br />
<hr class="mycode_hr" />
<span style="font-weight: bold;" class="mycode_b">Case B</span> — No Free Space in VG<br />
<br />
  <span style="font-weight: bold;" class="mycode_b">Step 3</span> — Add New Disk (Cloud / VM level)<br />
<ul class="mycode_list"><li>Add a new disk from your cloud provider / hypervisor (e.g. AWS, Azure, VMware)<br />
</li>
<li>Example: New disk appears as /dev/sdb<br />
</li>
<li>Verify Disk is Added<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>lsblk</code></div></div></li>
<li>New disk should be visible (e.g. /dev/sdb) <br />
</li>
</ul>
<br />
<hr class="mycode_hr" />
  <span style="font-weight: bold;" class="mycode_b">Step </span>4 — Create PV<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>pvcreate /dev/sdb</code></div></div><br />
<hr class="mycode_hr" />
  <span style="font-weight: bold;" class="mycode_b">Step 5</span> — Extend VG<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>vgextend rootvg /dev/sdb</code></div></div><br />
<hr class="mycode_hr" />
  <span style="font-weight: bold;" class="mycode_b">Step 6</span> — Extend LV<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>lvextend -l +100%FREE /dev/rootvg/varlv</code></div></div><br />
<hr class="mycode_hr" />
  <span style="font-weight: bold;" class="mycode_b">Step 7</span> — Resize Filesystem<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>xfs_growfs /var</code></div></div><br />
# OR<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>resize2fs /dev/rootvg/varlv</code></div></div><br />
<hr class="mycode_hr" />
  <span style="font-weight: bold;" class="mycode_b">Step 8</span> — Verify<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>df -h</code></div></div><br />
<hr class="mycode_hr" />
<br />
 <span style="font-weight: bold;" class="mycode_b">Additional Note</span> — Expanding Existing Disk<br />
<br />
If the <span style="font-weight: bold;" class="mycode_b">same disk is increased in size</span> (no new disk added):<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>growpart /dev/sda 4</code></div></div><div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>pvresize /dev/sda4</code></div></div><br />
<span style="font-weight: bold;" class="mycode_b">Outcome</span>:<br />
<ul class="mycode_list"><li>growpart → expands the partition <br />
</li>
<li>pvresize → makes new space available to LVM <br />
</li>
</ul>
<br />
 You can now proceed with lvextend<br />
<br />
<br />
<hr class="mycode_hr" />
<br />
<img src="https://forums.geekssolutions.io/images/smilies/exclamation.png" alt="Exclamation" title="Exclamation" class="smilie smilie_15" /> <span style="font-weight: bold;" class="mycode_b">Common Mistakes</span><br />
<ul class="mycode_list"><li>Extending LV but not resizing filesystem <br />
</li>
<li>Using wrong filesystem command (resize2fs vs xfs_growfs) <br />
</li>
<li>Not checking vgs before starting <br />
</li>
<li>Using wrong device path <br />
</li>
<li>Confusing disk (/dev/sdb) with LV (/dev/rootvg/varlv) <br />
<br />
</li>
</ul>
<hr class="mycode_hr" />
<br />
<img src="https://forums.geekssolutions.io/images/smilies/huh.png" alt="Huh" title="Huh" class="smilie smilie_17" /> <span style="font-weight: bold;" class="mycode_b"> Key Concepts and Takeaways </span><br />
<ul class="mycode_list"><li><span style="font-weight: bold;" class="mycode_b">PV</span> (Physical Volume) → Disk (/dev/sda4) <br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">VG</span> (Volume Group) → Storage pool (rootvg) <br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">LV</span> (Logical Volume) → Usable volume (/var) <br />
</li>
</ul>
<br />
Flow:<br />
<span style="font-weight: bold;" class="mycode_b">Disk → PV → VG → LV → Filesystem</span><br />
<ul class="mycode_list"><li>Extension = <span style="font-weight: bold;" class="mycode_b">LV resize + filesystem resize</span> <br />
</li>
<li>vgs decides your approach (direct vs add disk) <br />
</li>
<li>LVM allows <span style="font-weight: bold;" class="mycode_b">online resizing (no downtime)</span> <br />
</li>
</ul>
<br />
<hr class="mycode_hr" />
<br />
<img src="https://forums.geekssolutions.io/images/smilies/exclamation.png" alt="Exclamation" title="Exclamation" class="smilie smilie_15" />  <span style="font-weight: bold;" class="mycode_b">Precautions</span><br />
<ul class="mycode_list"><li>Take backup before changes <br />
</li>
<li>Double-check device names <br />
</li>
<li>Run carefully on production<br />
</li>
</ul>
]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Upgrade Guide: Ubuntu 22.04 LTS → 24.04.4 LTS (Noble Numbat)]]></title>
			<link>https://forums.geekssolutions.io/showthread.php?tid=26</link>
			<pubDate>Tue, 07 Apr 2026 17:01:54 +0530</pubDate>
			<dc:creator><![CDATA[<a href="https://forums.geekssolutions.io/member.php?action=profile&uid=5">aniket.pitre</a>]]></dc:creator>
			<guid isPermaLink="false">https://forums.geekssolutions.io/showthread.php?tid=26</guid>
			<description><![CDATA[<span style="font-weight: bold;" class="mycode_b">Purpose:</span> Upgrade Ubuntu systems from 22.04 LTS to 24.04 LTS with full step-by-step procedure (including what appears on screen during upgrade)<br />
<span style="font-weight: bold;" class="mycode_b">Document Type:</span> Operational Runbook <br />
<hr class="mycode_hr" />
? Step 1 — Check Current Version<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>cat /etc/os-release</code></div></div>? Confirm:<ul class="mycode_list"><li>VERSION="22.04 LTS"<br />
</li>
<li>CODENAME=jammy<br />
</li>
</ul>
<hr class="mycode_hr" />
? Step 2 — Update Current System<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>sudo apt update &amp;&amp; sudo apt upgrade</code></div></div>? During this step:<ul class="mycode_list"><li>You may see package list fetching<br />
</li>
<li>If prompted:<ul class="mycode_list"><li>Press <span style="font-weight: bold;" class="mycode_b">Y</span> to continue<br />
</li>
</ul>
</li>
</ul>
<hr class="mycode_hr" />
? Step 3 — Install update-manager-core<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>sudo apt install update-manager-core</code></div></div>? If prompted:<ul class="mycode_list"><li>Press <span style="font-weight: bold;" class="mycode_b">Y</span> → continue installation<br />
</li>
</ul>
<hr class="mycode_hr" />
Edit Upgrade Configuration<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>sudo nano /etc/update-manager/release-upgrades</code></div></div>Find:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>Prompt=normal</code></div></div>Change to:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>Prompt=lts</code></div></div>? Save:<ul class="mycode_list"><li>CTRL + X<br />
</li>
<li>Press Y<br />
</li>
<li>Press ENTER<br />
</li>
</ul>
<hr class="mycode_hr" />
⚙️ Step 4 — Prepare System (dist-upgrade)<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>sudo apt dist-upgrade</code></div></div>? During this step:<ul class="mycode_list"><li>System may install/remove dependencies<br />
</li>
<li>If prompted:<ul class="mycode_list"><li>Press <span style="font-weight: bold;" class="mycode_b">Y</span> to continue<br />
</li>
</ul>
</li>
</ul>
<hr class="mycode_hr" />
? Step 5 — Reboot System<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>sudo reboot</code></div></div><hr class="mycode_hr" />
? Step 6 — Run Release Upgrade<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>sudo do-release-upgrade</code></div></div>? You will now see multiple interactive prompts:<br />
1. Checking for new release<ul class="mycode_list"><li>System checks availability of Ubuntu 24.04<br />
</li>
</ul>
2. Upgrade Summary Screen<ul class="mycode_list"><li>Shows:<ul class="mycode_list"><li>Packages to install<br />
</li>
<li>Packages to upgrade<br />
</li>
<li>Packages to remove<br />
</li>
</ul>
</li>
<li>Prompt:<ul class="mycode_list"><li>"Do you want to start the upgrade?"<br />
</li>
<li>Press <span style="font-weight: bold;" class="mycode_b">Y</span><br />
</li>
</ul>
</li>
</ul>
3. Download Packages<ul class="mycode_list"><li>Shows download progress<br />
</li>
<li>No input required unless interrupted<br />
</li>
</ul>
4. Configuration File Prompts<br />
You may see:<ul class="mycode_list"><li>"A new version of config file is available"<br />
</li>
</ul>
Options:<ul class="mycode_list"><li>Press <span style="font-weight: bold;" class="mycode_b">Y</span> → install new version<br />
</li>
<li>Press <span style="font-weight: bold;" class="mycode_b">N</span> → keep existing version<br />
</li>
</ul>
? Recommendation:<ul class="mycode_list"><li>Use <span style="font-weight: bold;" class="mycode_b">N</span> if unsure (safer)<br />
</li>
</ul>
5. Service Restart Prompt<ul class="mycode_list"><li>"Restart services during package upgrades without asking?"<br />
</li>
</ul>
Options:<ul class="mycode_list"><li>Select <span style="font-weight: bold;" class="mycode_b">Yes</span> → recommended<br />
</li>
</ul>
6. Obsolete Packages Prompt<ul class="mycode_list"><li>"Remove obsolete packages?"<br />
</li>
</ul>
Options:<ul class="mycode_list"><li>Press <span style="font-weight: bold;" class="mycode_b">Y</span> → clean system<br />
</li>
</ul>
7. Kernel/GRUB Prompt (if appears)<ul class="mycode_list"><li>Keep current selection unless you know otherwise<br />
</li>
</ul>
8. Final Prompt<ul class="mycode_list"><li>"System upgrade is complete. Restart required"<br />
</li>
<li>Press <span style="font-weight: bold;" class="mycode_b">Y</span><br />
</li>
</ul>
<hr class="mycode_hr" />
? Step 7 — Final Reboot<br />
? System reboots automatically or asks:<ul class="mycode_list"><li>Press <span style="font-weight: bold;" class="mycode_b">Y</span> to reboot<br />
</li>
</ul>
<hr class="mycode_hr" />
✅ Step 8 — Verify Upgrade<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>cat /etc/os-release</code></div></div>OR<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>lsb_release -a</code></div></div>? Confirm:<ul class="mycode_list"><li>VERSION="24.04.4 LTS"<br />
</li>
<li>CODENAME=noble<br />
</li>
</ul>
<hr class="mycode_hr" />
? Optional Cleanup<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>sudo apt autoremove -y</code></div></div><hr class="mycode_hr" />
⚠️ Important Notes<ul class="mycode_list"><li>Always take backup before upgrade<br />
</li>
<li>Ensure stable internet connection<br />
</li>
<li>Do not interrupt upgrade<br />
</li>
<li>Recommended downtime window<br />
</li>
<li>Ensure at least 5–10 GB free disk space<br />
</li>
</ul>
<hr class="mycode_hr" />
? Troubleshooting<br />
If upgrade not detected:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>sudo do-release-upgrade -d</code></div></div>If upgrade fails midway:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>sudo dpkg --configure -a<br />
sudo apt -f install</code></div></div><hr class="mycode_hr" />]]></description>
			<content:encoded><![CDATA[<span style="font-weight: bold;" class="mycode_b">Purpose:</span> Upgrade Ubuntu systems from 22.04 LTS to 24.04 LTS with full step-by-step procedure (including what appears on screen during upgrade)<br />
<span style="font-weight: bold;" class="mycode_b">Document Type:</span> Operational Runbook <br />
<hr class="mycode_hr" />
? Step 1 — Check Current Version<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>cat /etc/os-release</code></div></div>? Confirm:<ul class="mycode_list"><li>VERSION="22.04 LTS"<br />
</li>
<li>CODENAME=jammy<br />
</li>
</ul>
<hr class="mycode_hr" />
? Step 2 — Update Current System<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>sudo apt update &amp;&amp; sudo apt upgrade</code></div></div>? During this step:<ul class="mycode_list"><li>You may see package list fetching<br />
</li>
<li>If prompted:<ul class="mycode_list"><li>Press <span style="font-weight: bold;" class="mycode_b">Y</span> to continue<br />
</li>
</ul>
</li>
</ul>
<hr class="mycode_hr" />
? Step 3 — Install update-manager-core<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>sudo apt install update-manager-core</code></div></div>? If prompted:<ul class="mycode_list"><li>Press <span style="font-weight: bold;" class="mycode_b">Y</span> → continue installation<br />
</li>
</ul>
<hr class="mycode_hr" />
Edit Upgrade Configuration<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>sudo nano /etc/update-manager/release-upgrades</code></div></div>Find:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>Prompt=normal</code></div></div>Change to:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>Prompt=lts</code></div></div>? Save:<ul class="mycode_list"><li>CTRL + X<br />
</li>
<li>Press Y<br />
</li>
<li>Press ENTER<br />
</li>
</ul>
<hr class="mycode_hr" />
⚙️ Step 4 — Prepare System (dist-upgrade)<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>sudo apt dist-upgrade</code></div></div>? During this step:<ul class="mycode_list"><li>System may install/remove dependencies<br />
</li>
<li>If prompted:<ul class="mycode_list"><li>Press <span style="font-weight: bold;" class="mycode_b">Y</span> to continue<br />
</li>
</ul>
</li>
</ul>
<hr class="mycode_hr" />
? Step 5 — Reboot System<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>sudo reboot</code></div></div><hr class="mycode_hr" />
? Step 6 — Run Release Upgrade<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>sudo do-release-upgrade</code></div></div>? You will now see multiple interactive prompts:<br />
1. Checking for new release<ul class="mycode_list"><li>System checks availability of Ubuntu 24.04<br />
</li>
</ul>
2. Upgrade Summary Screen<ul class="mycode_list"><li>Shows:<ul class="mycode_list"><li>Packages to install<br />
</li>
<li>Packages to upgrade<br />
</li>
<li>Packages to remove<br />
</li>
</ul>
</li>
<li>Prompt:<ul class="mycode_list"><li>"Do you want to start the upgrade?"<br />
</li>
<li>Press <span style="font-weight: bold;" class="mycode_b">Y</span><br />
</li>
</ul>
</li>
</ul>
3. Download Packages<ul class="mycode_list"><li>Shows download progress<br />
</li>
<li>No input required unless interrupted<br />
</li>
</ul>
4. Configuration File Prompts<br />
You may see:<ul class="mycode_list"><li>"A new version of config file is available"<br />
</li>
</ul>
Options:<ul class="mycode_list"><li>Press <span style="font-weight: bold;" class="mycode_b">Y</span> → install new version<br />
</li>
<li>Press <span style="font-weight: bold;" class="mycode_b">N</span> → keep existing version<br />
</li>
</ul>
? Recommendation:<ul class="mycode_list"><li>Use <span style="font-weight: bold;" class="mycode_b">N</span> if unsure (safer)<br />
</li>
</ul>
5. Service Restart Prompt<ul class="mycode_list"><li>"Restart services during package upgrades without asking?"<br />
</li>
</ul>
Options:<ul class="mycode_list"><li>Select <span style="font-weight: bold;" class="mycode_b">Yes</span> → recommended<br />
</li>
</ul>
6. Obsolete Packages Prompt<ul class="mycode_list"><li>"Remove obsolete packages?"<br />
</li>
</ul>
Options:<ul class="mycode_list"><li>Press <span style="font-weight: bold;" class="mycode_b">Y</span> → clean system<br />
</li>
</ul>
7. Kernel/GRUB Prompt (if appears)<ul class="mycode_list"><li>Keep current selection unless you know otherwise<br />
</li>
</ul>
8. Final Prompt<ul class="mycode_list"><li>"System upgrade is complete. Restart required"<br />
</li>
<li>Press <span style="font-weight: bold;" class="mycode_b">Y</span><br />
</li>
</ul>
<hr class="mycode_hr" />
? Step 7 — Final Reboot<br />
? System reboots automatically or asks:<ul class="mycode_list"><li>Press <span style="font-weight: bold;" class="mycode_b">Y</span> to reboot<br />
</li>
</ul>
<hr class="mycode_hr" />
✅ Step 8 — Verify Upgrade<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>cat /etc/os-release</code></div></div>OR<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>lsb_release -a</code></div></div>? Confirm:<ul class="mycode_list"><li>VERSION="24.04.4 LTS"<br />
</li>
<li>CODENAME=noble<br />
</li>
</ul>
<hr class="mycode_hr" />
? Optional Cleanup<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>sudo apt autoremove -y</code></div></div><hr class="mycode_hr" />
⚠️ Important Notes<ul class="mycode_list"><li>Always take backup before upgrade<br />
</li>
<li>Ensure stable internet connection<br />
</li>
<li>Do not interrupt upgrade<br />
</li>
<li>Recommended downtime window<br />
</li>
<li>Ensure at least 5–10 GB free disk space<br />
</li>
</ul>
<hr class="mycode_hr" />
? Troubleshooting<br />
If upgrade not detected:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>sudo do-release-upgrade -d</code></div></div>If upgrade fails midway:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>sudo dpkg --configure -a<br />
sudo apt -f install</code></div></div><hr class="mycode_hr" />]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[How to fix "failed to authorize: failed to fetch oauth token: unauthorized" issue]]></title>
			<link>https://forums.geekssolutions.io/showthread.php?tid=25</link>
			<pubDate>Tue, 07 Apr 2026 16:20:13 +0530</pubDate>
			<dc:creator><![CDATA[<a href="https://forums.geekssolutions.io/member.php?action=profile&uid=2">rishi</a>]]></dc:creator>
			<guid isPermaLink="false">https://forums.geekssolutions.io/showthread.php?tid=25</guid>
			<description><![CDATA[<span style="font-size: medium;" class="mycode_size">[ERROR] failed to authorize: failed to fetch oauth token: unauthorized (Azure DevOps Pipeline)</span><br />
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Screenshot:</span></span><br />
<span style="font-size: medium;" class="mycode_size"><a href="https://prnt.sc/NjRe-qyltGbV" target="_blank" rel="noopener" class="mycode_url">https://prnt.sc/NjRe-qyltGbV</a></span><br />
<br />
<br />
<span style="font-size: medium;" class="mycode_size">---------------------------------------</span><br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">ROOT CAUSE:</span></span><br />
<span style="font-size: medium;" class="mycode_size">---------------------------------------</span><br />
<span style="font-size: medium;" class="mycode_size">The issue is caused due to an invalid or expired Docker Registry Service Connection (OAuth token) in the Azure DevOps pipeline.</span><br />
<br />
<br />
<span style="font-size: medium;" class="mycode_size">---------------------------------------</span><br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">RESOLUTION STEPS:</span></span><br />
<span style="font-size: medium;" class="mycode_size">---------------------------------------</span><br />
<br />
<span style="font-size: medium;" class="mycode_size">1. Login to Azure DevOps:</span><br />
<br />
<span style="font-size: medium;" class="mycode_size"><a href="https://dev.azure.com/" target="_blank" rel="noopener" class="mycode_url">https://dev.azure.com/</a></span><br />
<br />
<span style="font-size: medium;" class="mycode_size">2. Navigate to the failed pipeline.</span><br />
<br />
<span style="font-size: medium;" class="mycode_size">3. Click on the branch name</span><br />
<br />
<span style="font-size: medium;" class="mycode_size">  Example: master_preprod</span><br />
<span style="font-size: medium;" class="mycode_size">  Screenshot: <a href="https://prnt.sc/aG5XZoRORMpY" target="_blank" rel="noopener" class="mycode_url">https://prnt.sc/aG5XZoRORMpY</a></span><br />
<br />
<span style="font-size: medium;" class="mycode_size">4. It will open the repository files.</span><br />
<br />
<span style="font-size: medium;" class="mycode_size">5. Rename the existing pipeline file:</span><br />
<br />
<span style="font-size: medium;" class="mycode_size">azure-pipelines-preprod.yml → azure-pipelines-preprod.yml-bak </span><br />
<br />
<span style="font-size: medium;" class="mycode_size">6. Go back to "Repos" → Click on "Setup Build"</span><br />
<br />
<span style="font-size: medium;" class="mycode_size">7. Configure new pipeline:</span><br />
<br />
<span style="font-size: medium;" class="mycode_size">  - Select Subscription: Sadad Azure</span><br />
<span style="font-size: medium;" class="mycode_size">  - Select Repository: Sadaddevrepo</span><br />
<span style="font-size: medium;" class="mycode_size">  - Click "Create Pipeline"</span><br />
<br />
<span style="font-size: medium;" class="mycode_size">8. A new pipeline YAML file will be created automatically.</span><br />
<br />
<span style="font-size: medium;" class="mycode_size">9. From the newly created pipeline file, copy the following field:</span><br />
<br />
<span style="font-size: medium;" class="mycode_size">  Example:</span><br />
<span style="font-size: medium;" class="mycode_size">  dockerRegistryServiceConnection: 'bc53aa1f-3499-4d92-ab29-7df77c562ada'</span><br />
<br />
<span style="font-size: medium;" class="mycode_size">10. Paste this value into your original (renamed) pipeline YAML file.</span><br />
<br />
<span style="font-size: medium;" class="mycode_size">11. Rename the pipeline file back to original:</span><br />
<br />
<span style="font-size: medium;" class="mycode_size">    azure-pipelines-preprod.yml-bak → azure-pipelines-preprod.yml</span><br />
<br />
<span style="font-size: medium;" class="mycode_size">12. Commit the changes.</span><br />
<br />
<span style="font-size: medium;" class="mycode_size">13. This will trigger the pipeline again.</span><br />
<br />
<span style="font-size: medium;" class="mycode_size">14. Monitor the build progress and verify.</span><br />
<br />
<br />
<span style="font-size: medium;" class="mycode_size">---------------------------------------</span><br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">NOTES:</span></span><br />
<span style="font-size: medium;" class="mycode_size">---------------------------------------</span><br />
<span style="font-size: medium;" class="mycode_size">- This issue typically occurs when the service connection token expires or becomes invalid.</span><br />
<span style="font-size: medium;" class="mycode_size">- Recreating the pipeline helps regenerate a valid service connection reference.</span><br />
<br />
<br />
<span style="font-size: medium;" class="mycode_size">---------------------------------------</span><br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">STATUS:</span></span><br />
<span style="font-size: medium;" class="mycode_size">---------------------------------------</span><br />
<span style="font-size: medium;" class="mycode_size">After updating the service connection, the pipeline should run successfully.</span><br />
<br />
<span style="font-size: medium;" class="mycode_size">Let me know if anyone still faces the issue ?</span>]]></description>
			<content:encoded><![CDATA[<span style="font-size: medium;" class="mycode_size">[ERROR] failed to authorize: failed to fetch oauth token: unauthorized (Azure DevOps Pipeline)</span><br />
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Screenshot:</span></span><br />
<span style="font-size: medium;" class="mycode_size"><a href="https://prnt.sc/NjRe-qyltGbV" target="_blank" rel="noopener" class="mycode_url">https://prnt.sc/NjRe-qyltGbV</a></span><br />
<br />
<br />
<span style="font-size: medium;" class="mycode_size">---------------------------------------</span><br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">ROOT CAUSE:</span></span><br />
<span style="font-size: medium;" class="mycode_size">---------------------------------------</span><br />
<span style="font-size: medium;" class="mycode_size">The issue is caused due to an invalid or expired Docker Registry Service Connection (OAuth token) in the Azure DevOps pipeline.</span><br />
<br />
<br />
<span style="font-size: medium;" class="mycode_size">---------------------------------------</span><br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">RESOLUTION STEPS:</span></span><br />
<span style="font-size: medium;" class="mycode_size">---------------------------------------</span><br />
<br />
<span style="font-size: medium;" class="mycode_size">1. Login to Azure DevOps:</span><br />
<br />
<span style="font-size: medium;" class="mycode_size"><a href="https://dev.azure.com/" target="_blank" rel="noopener" class="mycode_url">https://dev.azure.com/</a></span><br />
<br />
<span style="font-size: medium;" class="mycode_size">2. Navigate to the failed pipeline.</span><br />
<br />
<span style="font-size: medium;" class="mycode_size">3. Click on the branch name</span><br />
<br />
<span style="font-size: medium;" class="mycode_size">  Example: master_preprod</span><br />
<span style="font-size: medium;" class="mycode_size">  Screenshot: <a href="https://prnt.sc/aG5XZoRORMpY" target="_blank" rel="noopener" class="mycode_url">https://prnt.sc/aG5XZoRORMpY</a></span><br />
<br />
<span style="font-size: medium;" class="mycode_size">4. It will open the repository files.</span><br />
<br />
<span style="font-size: medium;" class="mycode_size">5. Rename the existing pipeline file:</span><br />
<br />
<span style="font-size: medium;" class="mycode_size">azure-pipelines-preprod.yml → azure-pipelines-preprod.yml-bak </span><br />
<br />
<span style="font-size: medium;" class="mycode_size">6. Go back to "Repos" → Click on "Setup Build"</span><br />
<br />
<span style="font-size: medium;" class="mycode_size">7. Configure new pipeline:</span><br />
<br />
<span style="font-size: medium;" class="mycode_size">  - Select Subscription: Sadad Azure</span><br />
<span style="font-size: medium;" class="mycode_size">  - Select Repository: Sadaddevrepo</span><br />
<span style="font-size: medium;" class="mycode_size">  - Click "Create Pipeline"</span><br />
<br />
<span style="font-size: medium;" class="mycode_size">8. A new pipeline YAML file will be created automatically.</span><br />
<br />
<span style="font-size: medium;" class="mycode_size">9. From the newly created pipeline file, copy the following field:</span><br />
<br />
<span style="font-size: medium;" class="mycode_size">  Example:</span><br />
<span style="font-size: medium;" class="mycode_size">  dockerRegistryServiceConnection: 'bc53aa1f-3499-4d92-ab29-7df77c562ada'</span><br />
<br />
<span style="font-size: medium;" class="mycode_size">10. Paste this value into your original (renamed) pipeline YAML file.</span><br />
<br />
<span style="font-size: medium;" class="mycode_size">11. Rename the pipeline file back to original:</span><br />
<br />
<span style="font-size: medium;" class="mycode_size">    azure-pipelines-preprod.yml-bak → azure-pipelines-preprod.yml</span><br />
<br />
<span style="font-size: medium;" class="mycode_size">12. Commit the changes.</span><br />
<br />
<span style="font-size: medium;" class="mycode_size">13. This will trigger the pipeline again.</span><br />
<br />
<span style="font-size: medium;" class="mycode_size">14. Monitor the build progress and verify.</span><br />
<br />
<br />
<span style="font-size: medium;" class="mycode_size">---------------------------------------</span><br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">NOTES:</span></span><br />
<span style="font-size: medium;" class="mycode_size">---------------------------------------</span><br />
<span style="font-size: medium;" class="mycode_size">- This issue typically occurs when the service connection token expires or becomes invalid.</span><br />
<span style="font-size: medium;" class="mycode_size">- Recreating the pipeline helps regenerate a valid service connection reference.</span><br />
<br />
<br />
<span style="font-size: medium;" class="mycode_size">---------------------------------------</span><br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">STATUS:</span></span><br />
<span style="font-size: medium;" class="mycode_size">---------------------------------------</span><br />
<span style="font-size: medium;" class="mycode_size">After updating the service connection, the pipeline should run successfully.</span><br />
<br />
<span style="font-size: medium;" class="mycode_size">Let me know if anyone still faces the issue ?</span>]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[AKS Namespace Migration + Azure DevOps DR Deployment (UK Environment)]]></title>
			<link>https://forums.geekssolutions.io/showthread.php?tid=23</link>
			<pubDate>Tue, 07 Apr 2026 15:52:46 +0530</pubDate>
			<dc:creator><![CDATA[<a href="https://forums.geekssolutions.io/member.php?action=profile&uid=2">rishi</a>]]></dc:creator>
			<guid isPermaLink="false">https://forums.geekssolutions.io/showthread.php?tid=23</guid>
			<description><![CDATA[<hr class="mycode_hr" />
<span style="font-weight: bold;" class="mycode_b">Overview<br />
</span><br />
This document explains the complete process to:<ul class="mycode_list"><li>Migrate Kubernetes namespace resources<br />
</li>
<li>Configure Azure DevOps pipeline for DR (UK)<br />
</li>
<li>Deploy application in new AKS cluster<br />
</li>
<li>Validate and troubleshoot issues<br />
</li>
</ul>
<hr class="mycode_hr" />
<span style="font-weight: bold;" class="mycode_b">Step 1: Navigate to Project Directory</span><br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>cd /home/aks-live/24x7/AKS-Prod/sadad-POS-Queue-Consumer<br />
ls -ltr<br />
<br />
Identify the folder:<br />
pos-queue-consumer-fileshare/</code></div></div><br />
<br />
<hr class="mycode_hr" />
<span style="font-weight: bold;" class="mycode_b">Step 2: Go to Fileshare Directory</span><br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>cd pos-queue-consumer-fileshare/<br />
ls -ltr<br />
<br />
Important files:<br />
[list]<br />
[*]pos-queue-consumer-storage-secret.yaml<br />
[*]azure-file-pvc.yaml<br />
[*]azure-file-sc.yaml<br />
[/list]</code></div></div><br />
<hr class="mycode_hr" />
<span style="font-weight: bold;" class="mycode_b">Step 3: Update Storage Secret</span><br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>vi pos-queue-consumer-storage-secret.yaml<br />
<br />
Update:<br />
data:<br />
  azurestorageaccountkey: &lt;BASE64_KEY&gt;<br />
  azurestorageaccountname: &lt;BASE64_NAME&gt;</code></div></div><br />
<br />
<hr class="mycode_hr" />
<span style="font-weight: bold;" class="mycode_b">Step 4: Verify Base64 Values</span><br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>echo "&lt;value&gt;" | base64 -d</code></div></div><br />
<hr class="mycode_hr" />
<span style="font-weight: bold;" class="mycode_b">Step 5: Create Namespace</span><br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>kubectl create ns sadad-online-pos-queue-consumer</code></div></div><br />
<hr class="mycode_hr" />
<span style="font-weight: bold;" class="mycode_b">Step 6: Apply Resources (Order Important)</span><br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>1. Apply Secret<br />
kubectl apply -f pos-queue-consumer-storage-secret.yaml<br />
<br />
2. Apply Storage Class &amp; PVC<br />
kubectl apply -f azure-file-sc.yaml -f  azure-file-pvc.yaml</code></div></div> <br />
<br />
<hr class="mycode_hr" />
<span style="font-weight: bold;" class="mycode_b">Step 7: Apply Remaining Secrets</span><br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>cd ..<br />
<br />
kubectl apply -f az-repo-dev-secret.yaml<br />
<br />
kubectl apply -f pos-queue-consumer-env-azure-secrets.yaml &#92;<br />
              -f pos-queue-consumer-env-config-secrets.yaml &#92;<br />
              -f pos-queue-consumer-env-email-secrets.yaml &#92;<br />
              -f sadad-online-pos-queue-consumer-secrets.yaml</code></div></div><br />
<br />
<hr class="mycode_hr" />
<span style="font-weight: bold;" class="mycode_b">Step 8: Azure DevOps – Download Deployment File</span><br />
<br />
Go to:<br />
Repos → Sadad-POS-Queue-Consumer → manifests<br />
<br />
Download:<br />
deploy-live.yaml<br />
<br />
<hr class="mycode_hr" />
<span style="font-weight: bold;" class="mycode_b">Step 9: Create UK Deployment File</span><br />
<br />
Rename:<br />
deploy-live.yaml → deploy-live-uk.yaml<br />
<br />
Update DB:<br />
- name: DB_HOST<br />
  value: &lt;UK_DB_IP&gt;<br />
<br />
<hr class="mycode_hr" />
<span style="font-weight: bold;" class="mycode_b">Step 10: Upload File to Repo</span><br />
<br />
Upload to:<br />
manifests/<br />
<br />
Commit message:<br />
Added deploy-live-uk for DR UK<br />
<br />
<hr class="mycode_hr" />
<span style="font-weight: bold;" class="mycode_b">Step 11: Clone Release Pipeline</span><br />
<br />
Go to:<br />
Pipelines → Releases → sadad-pos-queue-consumer<ul class="mycode_list"><li>Click Edit<br />
</li>
<li>Clone Live Stage<br />
</li>
</ul>
<hr class="mycode_hr" />
<span style="font-weight: bold;" class="mycode_b">Step 12: Rename Stage</span><br />
<br />
Sadad-Live-Pos-Queue-Consumer-UK<br />
<br />
<hr class="mycode_hr" />
<span style="font-weight: bold;" class="mycode_b">Step 13: Configure Kubernetes Connection</span><br />
<br />
Update:<ul class="mycode_list"><li>Subscription: Sadad - Azure<br />
</li>
<li>Cluster: Sadad-Online-UK-AKS<br />
</li>
<li>Namespace: sadad-online-pos-queue-consumer<br />
</li>
<li>Service Connection: sadad-online-pos-queue-consumer-uk<br />
</li>
</ul>
<hr class="mycode_hr" />
<span style="font-weight: bold;" class="mycode_b">Step 14: Update Deployment File Path</span><br />
<br />
&#36;(System.DefaultWorkingDirectory)/Sadad-POS-Queue-Consumer/drop/deploy-live-uk.yaml<br />
<br />
<hr class="mycode_hr" />
<span style="font-weight: bold;" class="mycode_b">Step 15: Update Print Tag Script</span><br />
<br />
Replace:<br />
deploy-live.yaml → deploy-live-uk.yaml<br />
<br />
<hr class="mycode_hr" />
<span style="font-weight: bold;" class="mycode_b">Step 16: Run Pipeline</span><br />
<br />
After commit → pipeline triggers automatically<br />
<hr class="mycode_hr" />
<span style="font-weight: bold;" class="mycode_b">Step 17: Deploy Release</span><br />
<br />
Go to Releases → Select new release<br />
Click:<ul class="mycode_list"><li>Deploy<br />
</li>
<li>Approve<br />
</li>
</ul>
<hr class="mycode_hr" />
<span style="font-weight: bold;" class="mycode_b">Step 18: Verify Deployment</span><br />
<br />
kubectl get pods -n sadad-online-pos-queue-consumer<br />
kubectl logs &lt;pod&gt;<br />
<br />
<hr class="mycode_hr" />
<span style="font-weight: bold;" class="mycode_b">Common Issue: Volume Mount Error</span><br />
<br />
Error:<br />
MountVolume failed: No such file or directory<br />
<br />
Fix:<br />
az storage share create \<br />
  --name pos-queue-logs \<br />
  --account-name &lt;storage_account&gt; \<br />
  --account-key &lt;key&gt;<br />
<br />
Then restart pod:<br />
kubectl delete pod &lt;pod-name&gt;<br />
<br />
<hr class="mycode_hr" />
<span style="font-weight: bold;" class="mycode_b">Final Validation</span><br />
<br />
kubectl get pods<br />
<br />
Expected:<br />
Running<br />
<br />
<hr class="mycode_hr" />
<span style="font-weight: bold;" class="mycode_b">Summary</span><br />
<br />
<ol type="1" class="mycode_list"><li>Setup namespace<br />
</li>
<li>Apply secrets + PVC<br />
</li>
<li>Modify deployment YAML<br />
</li>
<li>Update Azure DevOps pipeline<br />
</li>
<li>Deploy via release<br />
</li>
<li>Approve and validate<br />
</li>
</ol>
<hr class="mycode_hr" />
<span style="font-weight: bold;" class="mycode_b">Best Practices</span><br />
<ul class="mycode_list"><li>Always clone existing pipeline<br />
</li>
<li>Verify secrets before deployment<br />
</li>
<li>Keep naming consistent across environments<br />
</li>
<li>Validate storage before pod start<br />
</li>
</ul>
<hr class="mycode_hr" />
<span style="font-weight: bold;" class="mycode_b">Migration Completed Successfully</span>]]></description>
			<content:encoded><![CDATA[<hr class="mycode_hr" />
<span style="font-weight: bold;" class="mycode_b">Overview<br />
</span><br />
This document explains the complete process to:<ul class="mycode_list"><li>Migrate Kubernetes namespace resources<br />
</li>
<li>Configure Azure DevOps pipeline for DR (UK)<br />
</li>
<li>Deploy application in new AKS cluster<br />
</li>
<li>Validate and troubleshoot issues<br />
</li>
</ul>
<hr class="mycode_hr" />
<span style="font-weight: bold;" class="mycode_b">Step 1: Navigate to Project Directory</span><br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>cd /home/aks-live/24x7/AKS-Prod/sadad-POS-Queue-Consumer<br />
ls -ltr<br />
<br />
Identify the folder:<br />
pos-queue-consumer-fileshare/</code></div></div><br />
<br />
<hr class="mycode_hr" />
<span style="font-weight: bold;" class="mycode_b">Step 2: Go to Fileshare Directory</span><br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>cd pos-queue-consumer-fileshare/<br />
ls -ltr<br />
<br />
Important files:<br />
[list]<br />
[*]pos-queue-consumer-storage-secret.yaml<br />
[*]azure-file-pvc.yaml<br />
[*]azure-file-sc.yaml<br />
[/list]</code></div></div><br />
<hr class="mycode_hr" />
<span style="font-weight: bold;" class="mycode_b">Step 3: Update Storage Secret</span><br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>vi pos-queue-consumer-storage-secret.yaml<br />
<br />
Update:<br />
data:<br />
  azurestorageaccountkey: &lt;BASE64_KEY&gt;<br />
  azurestorageaccountname: &lt;BASE64_NAME&gt;</code></div></div><br />
<br />
<hr class="mycode_hr" />
<span style="font-weight: bold;" class="mycode_b">Step 4: Verify Base64 Values</span><br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>echo "&lt;value&gt;" | base64 -d</code></div></div><br />
<hr class="mycode_hr" />
<span style="font-weight: bold;" class="mycode_b">Step 5: Create Namespace</span><br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>kubectl create ns sadad-online-pos-queue-consumer</code></div></div><br />
<hr class="mycode_hr" />
<span style="font-weight: bold;" class="mycode_b">Step 6: Apply Resources (Order Important)</span><br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>1. Apply Secret<br />
kubectl apply -f pos-queue-consumer-storage-secret.yaml<br />
<br />
2. Apply Storage Class &amp; PVC<br />
kubectl apply -f azure-file-sc.yaml -f  azure-file-pvc.yaml</code></div></div> <br />
<br />
<hr class="mycode_hr" />
<span style="font-weight: bold;" class="mycode_b">Step 7: Apply Remaining Secrets</span><br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>cd ..<br />
<br />
kubectl apply -f az-repo-dev-secret.yaml<br />
<br />
kubectl apply -f pos-queue-consumer-env-azure-secrets.yaml &#92;<br />
              -f pos-queue-consumer-env-config-secrets.yaml &#92;<br />
              -f pos-queue-consumer-env-email-secrets.yaml &#92;<br />
              -f sadad-online-pos-queue-consumer-secrets.yaml</code></div></div><br />
<br />
<hr class="mycode_hr" />
<span style="font-weight: bold;" class="mycode_b">Step 8: Azure DevOps – Download Deployment File</span><br />
<br />
Go to:<br />
Repos → Sadad-POS-Queue-Consumer → manifests<br />
<br />
Download:<br />
deploy-live.yaml<br />
<br />
<hr class="mycode_hr" />
<span style="font-weight: bold;" class="mycode_b">Step 9: Create UK Deployment File</span><br />
<br />
Rename:<br />
deploy-live.yaml → deploy-live-uk.yaml<br />
<br />
Update DB:<br />
- name: DB_HOST<br />
  value: &lt;UK_DB_IP&gt;<br />
<br />
<hr class="mycode_hr" />
<span style="font-weight: bold;" class="mycode_b">Step 10: Upload File to Repo</span><br />
<br />
Upload to:<br />
manifests/<br />
<br />
Commit message:<br />
Added deploy-live-uk for DR UK<br />
<br />
<hr class="mycode_hr" />
<span style="font-weight: bold;" class="mycode_b">Step 11: Clone Release Pipeline</span><br />
<br />
Go to:<br />
Pipelines → Releases → sadad-pos-queue-consumer<ul class="mycode_list"><li>Click Edit<br />
</li>
<li>Clone Live Stage<br />
</li>
</ul>
<hr class="mycode_hr" />
<span style="font-weight: bold;" class="mycode_b">Step 12: Rename Stage</span><br />
<br />
Sadad-Live-Pos-Queue-Consumer-UK<br />
<br />
<hr class="mycode_hr" />
<span style="font-weight: bold;" class="mycode_b">Step 13: Configure Kubernetes Connection</span><br />
<br />
Update:<ul class="mycode_list"><li>Subscription: Sadad - Azure<br />
</li>
<li>Cluster: Sadad-Online-UK-AKS<br />
</li>
<li>Namespace: sadad-online-pos-queue-consumer<br />
</li>
<li>Service Connection: sadad-online-pos-queue-consumer-uk<br />
</li>
</ul>
<hr class="mycode_hr" />
<span style="font-weight: bold;" class="mycode_b">Step 14: Update Deployment File Path</span><br />
<br />
&#36;(System.DefaultWorkingDirectory)/Sadad-POS-Queue-Consumer/drop/deploy-live-uk.yaml<br />
<br />
<hr class="mycode_hr" />
<span style="font-weight: bold;" class="mycode_b">Step 15: Update Print Tag Script</span><br />
<br />
Replace:<br />
deploy-live.yaml → deploy-live-uk.yaml<br />
<br />
<hr class="mycode_hr" />
<span style="font-weight: bold;" class="mycode_b">Step 16: Run Pipeline</span><br />
<br />
After commit → pipeline triggers automatically<br />
<hr class="mycode_hr" />
<span style="font-weight: bold;" class="mycode_b">Step 17: Deploy Release</span><br />
<br />
Go to Releases → Select new release<br />
Click:<ul class="mycode_list"><li>Deploy<br />
</li>
<li>Approve<br />
</li>
</ul>
<hr class="mycode_hr" />
<span style="font-weight: bold;" class="mycode_b">Step 18: Verify Deployment</span><br />
<br />
kubectl get pods -n sadad-online-pos-queue-consumer<br />
kubectl logs &lt;pod&gt;<br />
<br />
<hr class="mycode_hr" />
<span style="font-weight: bold;" class="mycode_b">Common Issue: Volume Mount Error</span><br />
<br />
Error:<br />
MountVolume failed: No such file or directory<br />
<br />
Fix:<br />
az storage share create \<br />
  --name pos-queue-logs \<br />
  --account-name &lt;storage_account&gt; \<br />
  --account-key &lt;key&gt;<br />
<br />
Then restart pod:<br />
kubectl delete pod &lt;pod-name&gt;<br />
<br />
<hr class="mycode_hr" />
<span style="font-weight: bold;" class="mycode_b">Final Validation</span><br />
<br />
kubectl get pods<br />
<br />
Expected:<br />
Running<br />
<br />
<hr class="mycode_hr" />
<span style="font-weight: bold;" class="mycode_b">Summary</span><br />
<br />
<ol type="1" class="mycode_list"><li>Setup namespace<br />
</li>
<li>Apply secrets + PVC<br />
</li>
<li>Modify deployment YAML<br />
</li>
<li>Update Azure DevOps pipeline<br />
</li>
<li>Deploy via release<br />
</li>
<li>Approve and validate<br />
</li>
</ol>
<hr class="mycode_hr" />
<span style="font-weight: bold;" class="mycode_b">Best Practices</span><br />
<ul class="mycode_list"><li>Always clone existing pipeline<br />
</li>
<li>Verify secrets before deployment<br />
</li>
<li>Keep naming consistent across environments<br />
</li>
<li>Validate storage before pod start<br />
</li>
</ul>
<hr class="mycode_hr" />
<span style="font-weight: bold;" class="mycode_b">Migration Completed Successfully</span>]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[HashiCorp Vault HA Deployment using Raft]]></title>
			<link>https://forums.geekssolutions.io/showthread.php?tid=22</link>
			<pubDate>Tue, 07 Apr 2026 15:31:40 +0530</pubDate>
			<dc:creator><![CDATA[<a href="https://forums.geekssolutions.io/member.php?action=profile&uid=5">aniket.pitre</a>]]></dc:creator>
			<guid isPermaLink="false">https://forums.geekssolutions.io/showthread.php?tid=22</guid>
			<description><![CDATA[<span style="font-weight: bold;" class="mycode_b">Purpose:</span> Deploy HashiCorp Vault in High Availability mode using Raft storage<br />
<br />
<hr class="mycode_hr" />
? Prerequisite Infrastructure<br />
Before deploying Vault, ensure:<ul class="mycode_list"><li>HAProxy (Load Balancer)<br />
</li>
<li>Keepalived (Failover)<br />
</li>
<li>Virtual IP (VIP)<br />
</li>
</ul>
These ensure a <span style="font-weight: bold;" class="mycode_b">single stable endpoint</span> for clients.<br />
<hr class="mycode_hr" />
? Overview<br />
Vault HA cluster using Raft:<ul class="mycode_list"><li>One node = <span style="font-weight: bold;" class="mycode_b">Leader</span><br />
</li>
<li>Others = <span style="font-weight: bold;" class="mycode_b">Standby replicas</span><br />
</li>
<li>Automatic failover<br />
</li>
</ul>
Provides:<ul class="mycode_list"><li>High availability<br />
</li>
<li>Secure secret storage<br />
</li>
<li>TLS encryption<br />
</li>
</ul>
Ports:<ul class="mycode_list"><li>8200 → API<br />
</li>
<li>8201 → Cluster communication<br />
</li>
</ul>
<hr class="mycode_hr" />
? Prerequisites<ul class="mycode_list"><li>Minimum 3 Linux servers<br />
</li>
<li>Network connectivity<br />
</li>
<li>Root/sudo access<br />
</li>
<li>Internet access<br />
</li>
<li>Basic Linux knowledge<br />
</li>
</ul>
<hr class="mycode_hr" />
? Phase 1 — Create Vault User<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>sudo useradd --system --home /etc/vault.d --shell /bin/false vault<br />
id vault</code></div></div><hr class="mycode_hr" />
? Phase 2 — Create Directories<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>sudo mkdir -p /etc/vault.d<br />
sudo mkdir -p /opt/vault/data<br />
sudo mkdir -p /etc/vault.d/tls<br />
sudo mkdir -p /var/log/vault<br />
sudo chown -R vault:vault /etc/vault.d<br />
sudo chown -R vault:vault /opt/vault<br />
sudo chown vault:vault /var/log/vault<br />
sudo chmod 750 /var/log/vault</code></div></div><hr class="mycode_hr" />
? Phase 3 — Install Vault<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>sudo apt update<br />
sudo apt install unzip -y<br />
cd /tmp<br />
wget [url=https://releases.hashicorp.com/vault/]https://releases.hashicorp.com/vault/[/url]/vault__linux_amd64.zip<br />
unzip vault__linux_amd64.zip<br />
sudo mv vault /usr/local/bin/<br />
sudo chmod +x /usr/local/bin/vault<br />
vault --version<br />
which vault</code></div></div><hr class="mycode_hr" />
? Phase 4 — Generate TLS Certificates<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>mkdir ~/vault-tls<br />
cd ~/vault-tls<br />
openssl genrsa -out vault-ca.key 4096<br />
openssl req -x509 -new -nodes<br />
-key vault-ca.key<br />
-out vault-ca.crt<br />
-days 3650<br />
openssl genrsa -out vault.key 2048</code></div></div><hr class="mycode_hr" />
? Phase 5 — Install TLS Certificates<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>sudo cp vault.crt vault.key vault-ca.crt /etc/vault.d/tls/<br />
sudo chown vault:vault /etc/vault.d/tls/*<br />
sudo chmod 600 /etc/vault.d/tls/vault.key</code></div></div><hr class="mycode_hr" />
? Phase 6 — Trust CA<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>sudo cp /etc/vault.d/tls/vault-ca.crt /usr/local/share/ca-certificates/<br />
sudo update-ca-certificates</code></div></div><hr class="mycode_hr" />
⚙️ Phase 7 — Configure Vault<br />
File: <br />
/etc/vault.d/vault.hcl<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>ui = true<br />
cluster_name = "vault-cluster"<br />
listener "tcp" {<br />
address = "0.0.0.0:8200"<br />
cluster_address = "0.0.0.0:8201"<br />
tls_cert_file = "/etc/vault.d/tls/vault.crt"<br />
tls_key_file = "/etc/vault.d/tls/vault.key"<br />
}<br />
storage "raft" {<br />
path = "/opt/vault/data"<br />
node_id = "node-1"<br />
}<br />
api_addr = "https://:8200"<br />
cluster_addr = "https://:8201"<br />
disable_mlock = true</code></div></div><div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>sudo chown vault:vault /etc/vault.d/vault.hcl<br />
sudo chmod 640 /etc/vault.d/vault.hcl</code></div></div><hr class="mycode_hr" />
⚙️ Phase 8 — Systemd Service<br />
File: <br />
/etc/systemd/system/vault.service<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>[Unit]<br />
Description=HashiCorp Vault<br />
After=network-online.target<br />
[Service]<br />
User=vault<br />
Group=vault<br />
ExecStart=/usr/local/bin/vault server -config=/etc/vault.d/vault.hcl<br />
Restart=on-failure<br />
LimitMEMLOCK=infinity<br />
[Install]<br />
WantedBy=multi-user.target</code></div></div><div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>sudo systemctl daemon-reload<br />
sudo systemctl enable vault<br />
sudo systemctl start vault<br />
sudo systemctl status vault</code></div></div><hr class="mycode_hr" />
? Phase 9 — Initialize Vault<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>export VAULT_ADDR=https://:8200<br />
export VAULT_CACERT=/etc/vault.d/tls/vault-ca.crt<br />
vault operator init</code></div></div>⚠️ Save:<ul class="mycode_list"><li>Unseal keys<br />
</li>
<li>Root token<br />
</li>
</ul>
<hr class="mycode_hr" />
? Phase 10 — Unseal Vault<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>vault operator unseal<br />
vault operator unseal<br />
vault operator unseal<br />
vault status</code></div></div><hr class="mycode_hr" />
? Phase 11 — Join Nodes<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>vault operator raft join https://:8200<br />
vault operator unseal<br />
vault operator unseal<br />
vault operator unseal</code></div></div><hr class="mycode_hr" />
? Phase 12 — Verify Cluster<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>vault operator raft list-peers</code></div></div><hr class="mycode_hr" />
? Phase 13 — Enable Audit Logging<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>vault audit enable file file_path=/var/log/vault/audit.log<br />
vault audit list</code></div></div><hr class="mycode_hr" />
? Phase 14 — Log Rotation<br />
File: <br />
/etc/logrotate.d/vault<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>/var/log/vault/audit.log {<br />
daily<br />
rotate 7<br />
compress<br />
missingok<br />
notifempty<br />
}</code></div></div><hr class="mycode_hr" />
? Common Commands<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>vault status<br />
vault operator raft list-peers<br />
vault operator unseal<br />
vault operator raft snapshot save backup.snap</code></div></div><hr class="mycode_hr" />
⚠️ Important Notes<ul class="mycode_list"><li>Store unseal keys securely<br />
</li>
<li>Protect root token<br />
</li>
<li>Vault seals after reboot<br />
</li>
<li>Must unseal manually after restart<br />
</li>
<li>Renew TLS certificates before expiry<br />
</li>
</ul>
<hr class="mycode_hr" />]]></description>
			<content:encoded><![CDATA[<span style="font-weight: bold;" class="mycode_b">Purpose:</span> Deploy HashiCorp Vault in High Availability mode using Raft storage<br />
<br />
<hr class="mycode_hr" />
? Prerequisite Infrastructure<br />
Before deploying Vault, ensure:<ul class="mycode_list"><li>HAProxy (Load Balancer)<br />
</li>
<li>Keepalived (Failover)<br />
</li>
<li>Virtual IP (VIP)<br />
</li>
</ul>
These ensure a <span style="font-weight: bold;" class="mycode_b">single stable endpoint</span> for clients.<br />
<hr class="mycode_hr" />
? Overview<br />
Vault HA cluster using Raft:<ul class="mycode_list"><li>One node = <span style="font-weight: bold;" class="mycode_b">Leader</span><br />
</li>
<li>Others = <span style="font-weight: bold;" class="mycode_b">Standby replicas</span><br />
</li>
<li>Automatic failover<br />
</li>
</ul>
Provides:<ul class="mycode_list"><li>High availability<br />
</li>
<li>Secure secret storage<br />
</li>
<li>TLS encryption<br />
</li>
</ul>
Ports:<ul class="mycode_list"><li>8200 → API<br />
</li>
<li>8201 → Cluster communication<br />
</li>
</ul>
<hr class="mycode_hr" />
? Prerequisites<ul class="mycode_list"><li>Minimum 3 Linux servers<br />
</li>
<li>Network connectivity<br />
</li>
<li>Root/sudo access<br />
</li>
<li>Internet access<br />
</li>
<li>Basic Linux knowledge<br />
</li>
</ul>
<hr class="mycode_hr" />
? Phase 1 — Create Vault User<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>sudo useradd --system --home /etc/vault.d --shell /bin/false vault<br />
id vault</code></div></div><hr class="mycode_hr" />
? Phase 2 — Create Directories<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>sudo mkdir -p /etc/vault.d<br />
sudo mkdir -p /opt/vault/data<br />
sudo mkdir -p /etc/vault.d/tls<br />
sudo mkdir -p /var/log/vault<br />
sudo chown -R vault:vault /etc/vault.d<br />
sudo chown -R vault:vault /opt/vault<br />
sudo chown vault:vault /var/log/vault<br />
sudo chmod 750 /var/log/vault</code></div></div><hr class="mycode_hr" />
? Phase 3 — Install Vault<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>sudo apt update<br />
sudo apt install unzip -y<br />
cd /tmp<br />
wget [url=https://releases.hashicorp.com/vault/]https://releases.hashicorp.com/vault/[/url]/vault__linux_amd64.zip<br />
unzip vault__linux_amd64.zip<br />
sudo mv vault /usr/local/bin/<br />
sudo chmod +x /usr/local/bin/vault<br />
vault --version<br />
which vault</code></div></div><hr class="mycode_hr" />
? Phase 4 — Generate TLS Certificates<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>mkdir ~/vault-tls<br />
cd ~/vault-tls<br />
openssl genrsa -out vault-ca.key 4096<br />
openssl req -x509 -new -nodes<br />
-key vault-ca.key<br />
-out vault-ca.crt<br />
-days 3650<br />
openssl genrsa -out vault.key 2048</code></div></div><hr class="mycode_hr" />
? Phase 5 — Install TLS Certificates<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>sudo cp vault.crt vault.key vault-ca.crt /etc/vault.d/tls/<br />
sudo chown vault:vault /etc/vault.d/tls/*<br />
sudo chmod 600 /etc/vault.d/tls/vault.key</code></div></div><hr class="mycode_hr" />
? Phase 6 — Trust CA<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>sudo cp /etc/vault.d/tls/vault-ca.crt /usr/local/share/ca-certificates/<br />
sudo update-ca-certificates</code></div></div><hr class="mycode_hr" />
⚙️ Phase 7 — Configure Vault<br />
File: <br />
/etc/vault.d/vault.hcl<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>ui = true<br />
cluster_name = "vault-cluster"<br />
listener "tcp" {<br />
address = "0.0.0.0:8200"<br />
cluster_address = "0.0.0.0:8201"<br />
tls_cert_file = "/etc/vault.d/tls/vault.crt"<br />
tls_key_file = "/etc/vault.d/tls/vault.key"<br />
}<br />
storage "raft" {<br />
path = "/opt/vault/data"<br />
node_id = "node-1"<br />
}<br />
api_addr = "https://:8200"<br />
cluster_addr = "https://:8201"<br />
disable_mlock = true</code></div></div><div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>sudo chown vault:vault /etc/vault.d/vault.hcl<br />
sudo chmod 640 /etc/vault.d/vault.hcl</code></div></div><hr class="mycode_hr" />
⚙️ Phase 8 — Systemd Service<br />
File: <br />
/etc/systemd/system/vault.service<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>[Unit]<br />
Description=HashiCorp Vault<br />
After=network-online.target<br />
[Service]<br />
User=vault<br />
Group=vault<br />
ExecStart=/usr/local/bin/vault server -config=/etc/vault.d/vault.hcl<br />
Restart=on-failure<br />
LimitMEMLOCK=infinity<br />
[Install]<br />
WantedBy=multi-user.target</code></div></div><div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>sudo systemctl daemon-reload<br />
sudo systemctl enable vault<br />
sudo systemctl start vault<br />
sudo systemctl status vault</code></div></div><hr class="mycode_hr" />
? Phase 9 — Initialize Vault<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>export VAULT_ADDR=https://:8200<br />
export VAULT_CACERT=/etc/vault.d/tls/vault-ca.crt<br />
vault operator init</code></div></div>⚠️ Save:<ul class="mycode_list"><li>Unseal keys<br />
</li>
<li>Root token<br />
</li>
</ul>
<hr class="mycode_hr" />
? Phase 10 — Unseal Vault<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>vault operator unseal<br />
vault operator unseal<br />
vault operator unseal<br />
vault status</code></div></div><hr class="mycode_hr" />
? Phase 11 — Join Nodes<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>vault operator raft join https://:8200<br />
vault operator unseal<br />
vault operator unseal<br />
vault operator unseal</code></div></div><hr class="mycode_hr" />
? Phase 12 — Verify Cluster<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>vault operator raft list-peers</code></div></div><hr class="mycode_hr" />
? Phase 13 — Enable Audit Logging<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>vault audit enable file file_path=/var/log/vault/audit.log<br />
vault audit list</code></div></div><hr class="mycode_hr" />
? Phase 14 — Log Rotation<br />
File: <br />
/etc/logrotate.d/vault<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>/var/log/vault/audit.log {<br />
daily<br />
rotate 7<br />
compress<br />
missingok<br />
notifempty<br />
}</code></div></div><hr class="mycode_hr" />
? Common Commands<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>vault status<br />
vault operator raft list-peers<br />
vault operator unseal<br />
vault operator raft snapshot save backup.snap</code></div></div><hr class="mycode_hr" />
⚠️ Important Notes<ul class="mycode_list"><li>Store unseal keys securely<br />
</li>
<li>Protect root token<br />
</li>
<li>Vault seals after reboot<br />
</li>
<li>Must unseal manually after restart<br />
</li>
<li>Renew TLS certificates before expiry<br />
</li>
</ul>
<hr class="mycode_hr" />]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Disaster Recovery (DR) Replica Setup for MariaDB Galera Cluster]]></title>
			<link>https://forums.geekssolutions.io/showthread.php?tid=21</link>
			<pubDate>Tue, 07 Apr 2026 15:17:27 +0530</pubDate>
			<dc:creator><![CDATA[<a href="https://forums.geekssolutions.io/member.php?action=profile&uid=5">aniket.pitre</a>]]></dc:creator>
			<guid isPermaLink="false">https://forums.geekssolutions.io/showthread.php?tid=21</guid>
			<description><![CDATA[<span style="font-weight: bold;" class="mycode_b">Purpose: Configure a standalone Disaster Recovery replica for a MariaDB Galera cluster to ensure data redundancy and failover capability.<br />
Applies To:</span> MariaDB 10.11 / Galera Cluster<br />
<span style="font-weight: bold;" class="mycode_b">Environment:</span> Ubuntu 24.04<br />
<hr class="mycode_hr" />
? Overview<br />
This guide explains how to configure a <span style="font-weight: bold;" class="mycode_b">Disaster Recovery (DR) replica node</span> from an existing Galera cluster.<br />
The DR node:<ul class="mycode_list"><li>Replicates from a <span style="font-weight: bold;" class="mycode_b">single Galera node</span><br />
</li>
<li>Does <span style="font-weight: bold;" class="mycode_b">NOT join</span> the cluster<br />
</li>
<li>Always remains <span style="font-weight: bold;" class="mycode_b">read-only</span><br />
</li>
<li>Used for <span style="font-weight: bold;" class="mycode_b">disaster recovery and reporting</span><br />
</li>
</ul>
<hr class="mycode_hr" />
⚙️ Key Characteristics<ul class="mycode_list"><li>Replicates from one Galera node<br />
</li>
<li>Never becomes a master<br />
</li>
<li>Always read-only<br />
</li>
<li>Standalone replica (not part of cluster)<br />
</li>
</ul>
<hr class="mycode_hr" />
? Prerequisites<ul class="mycode_list"><li>Ubuntu 24.04 VM<br />
</li>
<li>Disk space ≥ 2× database size<br />
</li>
<li>Network access to Galera node (port 3306)<br />
</li>
<li>Backup storage access<br />
</li>
<li>Backup encryption password<br />
</li>
<li>Replication user credentials<br />
</li>
<li>Private IP of Galera node<br />
</li>
</ul>
<hr class="mycode_hr" />
? Phase 1 — VM Setup<br />
Step 1.1 — Verify Disk<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>lsblk<br />
df -h</code></div></div>Step 1.2 — Update System<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>apt update<br />
apt upgrade -y<br />
apt install curl wget software-properties-common -y</code></div></div><hr class="mycode_hr" />
? Phase 2 — Install MariaDB<br />
Step 2.1 — Add Repository<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>curl -LsS [url=https://downloads.mariadb.com/MariaDB/mariadb_repo_setup]https://downloads.mariadb.com/MariaDB/mariadb_repo_setup[/url]<br />
| bash -s -- --mariadb-server-version="mariadb-10.11"</code></div></div>Step 2.2 — Install<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>apt update<br />
apt install mariadb-server mariadb-backup -y</code></div></div>Step 2.3 — Verify<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>mariadb --version<br />
systemctl status mariadb</code></div></div><hr class="mycode_hr" />
⚙️ Phase 3 — Configure DR Node<br />
Step 3.1 — Create Config File<br />
/etc/mysql/mariadb.conf.d/99-dr-replica.cnf<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>[mysqld]<br />
server_id = 100<br />
log_bin = mysql-bin<br />
binlog_format = ROW<br />
relay_log = relay-bin<br />
relay_log_recovery = ON<br />
log_slave_updates = ON<br />
read_only = ON<br />
skip_slave_start = ON</code></div></div>Step 3.2 — Disable Galera<br />
Edit:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>/etc/mysql/mariadb.conf.d/50-server.cnf</code></div></div>Ensure:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>[mariadb]<br />
wsrep_on = OFF</code></div></div>Step 3.3 — Restart<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>systemctl restart mariadb</code></div></div>Step 3.4 — Verify<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>SHOW VARIABLES LIKE 'server_id';<br />
SHOW VARIABLES LIKE 'wsrep_on';<br />
SHOW VARIABLES LIKE 'read_only';</code></div></div><hr class="mycode_hr" />
? Phase 4 — Verify Galera Source Node<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>SHOW VARIABLES LIKE 'log_bin';<br />
SHOW VARIABLES LIKE 'binlog_format';<br />
SHOW VARIABLES LIKE 'server_id';<br />
SHOW MASTER STATUS&#92;G</code></div></div>Grant Replication Permissions<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>GRANT REPLICATION SLAVE, BINLOG MONITOR ON [i].[/i]<br />
TO 'replication_user'@'&lt;dr_node_ip&gt;';<br />
FLUSH PRIVILEGES;</code></div></div><hr class="mycode_hr" />
? Phase 5 — Download &amp; Restore Backup<br />
Download<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>az storage blob download<br />
--account-name &lt;storage_account&gt;<br />
--container-name<br />
--name ".tar.zst.enc"<br />
--file "/mnt/.tar.zst.enc"<br />
--auth-mode login</code></div></div>Decrypt<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>openssl enc -d -aes-256-cbc -pbkdf2 -iter 200000<br />
-in /mnt/.tar.zst.enc<br />
-out /mnt/backup.tar.zst<br />
-pass pass:''</code></div></div>Extract<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>cd /mnt<br />
tar --use-compress-program=zstd -xf backup.tar.zst</code></div></div>Get Binlog Position<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>cat /mnt/xtrabackup_binlog_info</code></div></div>Example:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>mysql-bin.002064 385</code></div></div><hr class="mycode_hr" />
?️ Phase 6 — Restore Database<br />
⚠️ WARNING: This overwrites existing data<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>systemctl stop mariadb<br />
mv /var/lib/mysql /mnt/mysql_old<br />
mkdir -p /var/lib/mysql</code></div></div>Prepare Backup<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>mariabackup --prepare --target-dir=/mnt/</code></div></div>Restore<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>mariabackup --copy-back<br />
--target-dir=/mnt/<br />
--datadir=/var/lib/mysql/</code></div></div>Fix Permissions<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>chown -R mysql:mysql /var/lib/mysql/</code></div></div>Start DB<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>systemctl start mariadb</code></div></div><hr class="mycode_hr" />
? Phase 7 — Setup Replication<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>CHANGE MASTER TO<br />
MASTER_HOST='&lt;galera_node_ip&gt;',<br />
MASTER_USER='&lt;replication_user&gt;',<br />
MASTER_PASSWORD='',<br />
MASTER_PORT=3306,<br />
MASTER_LOG_FILE='&lt;binlog_file&gt;',<br />
MASTER_LOG_POS=&lt;binlog_position&gt;;</code></div></div><div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>START SLAVE;</code></div></div>Verify<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>SHOW SLAVE STATUS&#92;G</code></div></div><hr class="mycode_hr" />
❗ Phase 8 — Common Errors<br />
Error 1032<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>STOP SLAVE;<br />
SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;<br />
START SLAVE;</code></div></div>Error 1526<ul class="mycode_list"><li>Missing partition → add required partitions<br />
</li>
</ul>
Error 1146<ul class="mycode_list"><li>Missing temporary table<br />
</li>
</ul>
<hr class="mycode_hr" />
✅ Phase 9 — Final Verification<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>SHOW VARIABLES LIKE 'server_id';<br />
SHOW VARIABLES LIKE 'read_only';<br />
SHOW VARIABLES LIKE 'wsrep_on';<br />
SHOW SLAVE STATUS&#92;G</code></div></div><hr class="mycode_hr" />
? Key Rules<ul class="mycode_list"><li>✔ Unique server_id<br />
</li>
<li>✔ wsrep must be OFF<br />
</li>
<li>✔ Always read_only = ON<br />
</li>
<li>✔ Use correct binlog position from backup<br />
</li>
<li>✔ Replicate from only ONE Galera node<br />
</li>
<li>✔ Do NOT leave error skipping enabled<br />
</li>
</ul>
]]></description>
			<content:encoded><![CDATA[<span style="font-weight: bold;" class="mycode_b">Purpose: Configure a standalone Disaster Recovery replica for a MariaDB Galera cluster to ensure data redundancy and failover capability.<br />
Applies To:</span> MariaDB 10.11 / Galera Cluster<br />
<span style="font-weight: bold;" class="mycode_b">Environment:</span> Ubuntu 24.04<br />
<hr class="mycode_hr" />
? Overview<br />
This guide explains how to configure a <span style="font-weight: bold;" class="mycode_b">Disaster Recovery (DR) replica node</span> from an existing Galera cluster.<br />
The DR node:<ul class="mycode_list"><li>Replicates from a <span style="font-weight: bold;" class="mycode_b">single Galera node</span><br />
</li>
<li>Does <span style="font-weight: bold;" class="mycode_b">NOT join</span> the cluster<br />
</li>
<li>Always remains <span style="font-weight: bold;" class="mycode_b">read-only</span><br />
</li>
<li>Used for <span style="font-weight: bold;" class="mycode_b">disaster recovery and reporting</span><br />
</li>
</ul>
<hr class="mycode_hr" />
⚙️ Key Characteristics<ul class="mycode_list"><li>Replicates from one Galera node<br />
</li>
<li>Never becomes a master<br />
</li>
<li>Always read-only<br />
</li>
<li>Standalone replica (not part of cluster)<br />
</li>
</ul>
<hr class="mycode_hr" />
? Prerequisites<ul class="mycode_list"><li>Ubuntu 24.04 VM<br />
</li>
<li>Disk space ≥ 2× database size<br />
</li>
<li>Network access to Galera node (port 3306)<br />
</li>
<li>Backup storage access<br />
</li>
<li>Backup encryption password<br />
</li>
<li>Replication user credentials<br />
</li>
<li>Private IP of Galera node<br />
</li>
</ul>
<hr class="mycode_hr" />
? Phase 1 — VM Setup<br />
Step 1.1 — Verify Disk<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>lsblk<br />
df -h</code></div></div>Step 1.2 — Update System<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>apt update<br />
apt upgrade -y<br />
apt install curl wget software-properties-common -y</code></div></div><hr class="mycode_hr" />
? Phase 2 — Install MariaDB<br />
Step 2.1 — Add Repository<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>curl -LsS [url=https://downloads.mariadb.com/MariaDB/mariadb_repo_setup]https://downloads.mariadb.com/MariaDB/mariadb_repo_setup[/url]<br />
| bash -s -- --mariadb-server-version="mariadb-10.11"</code></div></div>Step 2.2 — Install<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>apt update<br />
apt install mariadb-server mariadb-backup -y</code></div></div>Step 2.3 — Verify<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>mariadb --version<br />
systemctl status mariadb</code></div></div><hr class="mycode_hr" />
⚙️ Phase 3 — Configure DR Node<br />
Step 3.1 — Create Config File<br />
/etc/mysql/mariadb.conf.d/99-dr-replica.cnf<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>[mysqld]<br />
server_id = 100<br />
log_bin = mysql-bin<br />
binlog_format = ROW<br />
relay_log = relay-bin<br />
relay_log_recovery = ON<br />
log_slave_updates = ON<br />
read_only = ON<br />
skip_slave_start = ON</code></div></div>Step 3.2 — Disable Galera<br />
Edit:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>/etc/mysql/mariadb.conf.d/50-server.cnf</code></div></div>Ensure:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>[mariadb]<br />
wsrep_on = OFF</code></div></div>Step 3.3 — Restart<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>systemctl restart mariadb</code></div></div>Step 3.4 — Verify<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>SHOW VARIABLES LIKE 'server_id';<br />
SHOW VARIABLES LIKE 'wsrep_on';<br />
SHOW VARIABLES LIKE 'read_only';</code></div></div><hr class="mycode_hr" />
? Phase 4 — Verify Galera Source Node<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>SHOW VARIABLES LIKE 'log_bin';<br />
SHOW VARIABLES LIKE 'binlog_format';<br />
SHOW VARIABLES LIKE 'server_id';<br />
SHOW MASTER STATUS&#92;G</code></div></div>Grant Replication Permissions<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>GRANT REPLICATION SLAVE, BINLOG MONITOR ON [i].[/i]<br />
TO 'replication_user'@'&lt;dr_node_ip&gt;';<br />
FLUSH PRIVILEGES;</code></div></div><hr class="mycode_hr" />
? Phase 5 — Download &amp; Restore Backup<br />
Download<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>az storage blob download<br />
--account-name &lt;storage_account&gt;<br />
--container-name<br />
--name ".tar.zst.enc"<br />
--file "/mnt/.tar.zst.enc"<br />
--auth-mode login</code></div></div>Decrypt<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>openssl enc -d -aes-256-cbc -pbkdf2 -iter 200000<br />
-in /mnt/.tar.zst.enc<br />
-out /mnt/backup.tar.zst<br />
-pass pass:''</code></div></div>Extract<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>cd /mnt<br />
tar --use-compress-program=zstd -xf backup.tar.zst</code></div></div>Get Binlog Position<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>cat /mnt/xtrabackup_binlog_info</code></div></div>Example:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>mysql-bin.002064 385</code></div></div><hr class="mycode_hr" />
?️ Phase 6 — Restore Database<br />
⚠️ WARNING: This overwrites existing data<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>systemctl stop mariadb<br />
mv /var/lib/mysql /mnt/mysql_old<br />
mkdir -p /var/lib/mysql</code></div></div>Prepare Backup<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>mariabackup --prepare --target-dir=/mnt/</code></div></div>Restore<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>mariabackup --copy-back<br />
--target-dir=/mnt/<br />
--datadir=/var/lib/mysql/</code></div></div>Fix Permissions<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>chown -R mysql:mysql /var/lib/mysql/</code></div></div>Start DB<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>systemctl start mariadb</code></div></div><hr class="mycode_hr" />
? Phase 7 — Setup Replication<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>CHANGE MASTER TO<br />
MASTER_HOST='&lt;galera_node_ip&gt;',<br />
MASTER_USER='&lt;replication_user&gt;',<br />
MASTER_PASSWORD='',<br />
MASTER_PORT=3306,<br />
MASTER_LOG_FILE='&lt;binlog_file&gt;',<br />
MASTER_LOG_POS=&lt;binlog_position&gt;;</code></div></div><div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>START SLAVE;</code></div></div>Verify<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>SHOW SLAVE STATUS&#92;G</code></div></div><hr class="mycode_hr" />
❗ Phase 8 — Common Errors<br />
Error 1032<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>STOP SLAVE;<br />
SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;<br />
START SLAVE;</code></div></div>Error 1526<ul class="mycode_list"><li>Missing partition → add required partitions<br />
</li>
</ul>
Error 1146<ul class="mycode_list"><li>Missing temporary table<br />
</li>
</ul>
<hr class="mycode_hr" />
✅ Phase 9 — Final Verification<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>SHOW VARIABLES LIKE 'server_id';<br />
SHOW VARIABLES LIKE 'read_only';<br />
SHOW VARIABLES LIKE 'wsrep_on';<br />
SHOW SLAVE STATUS&#92;G</code></div></div><hr class="mycode_hr" />
? Key Rules<ul class="mycode_list"><li>✔ Unique server_id<br />
</li>
<li>✔ wsrep must be OFF<br />
</li>
<li>✔ Always read_only = ON<br />
</li>
<li>✔ Use correct binlog position from backup<br />
</li>
<li>✔ Replicate from only ONE Galera node<br />
</li>
<li>✔ Do NOT leave error skipping enabled<br />
</li>
</ul>
]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Git Pull Script — Repo Secrets Update Guide (DEV Environment)]]></title>
			<link>https://forums.geekssolutions.io/showthread.php?tid=20</link>
			<pubDate>Tue, 07 Apr 2026 14:04:30 +0530</pubDate>
			<dc:creator><![CDATA[<a href="https://forums.geekssolutions.io/member.php?action=profile&uid=4">Amey Bhargave</a>]]></dc:creator>
			<guid isPermaLink="false">https://forums.geekssolutions.io/showthread.php?tid=20</guid>
			<description><![CDATA[================================================================================<br />
        <span style="font-weight: bold;" class="mycode_b">Git Pull Script — Repo Secrets Update Guide (DEV Environment)</span><br />
================================================================================<br />
<br />
<br />
================================================================================<br />
OVERVIEW<br />
================================================================================ <br />
<br />
This guide explains the process for updating repository credentials (repo secrets) <br />
used in the automated git pull script running via cron jobs.<br />
<br />
================================================================================<br />
ISSUE<br />
================================================================================<br />
Developers' code changes are not getting updated in the DEV environment.<br />
<br />
Root cause is usually:<br />
- Expired / invalid repository credentials<br />
- Git pull cron job failing due to authentication issues<br />
<br />
================================================================================<br />
STEP-BY-STEP PROCEDURE<br />
================================================================================<br />
<br />
--- Step 1: Login to DEV Server (Linode) ---<br />
Login to the DEV server using SSH.<br />
<br />
================================================================================<br />
<br />
--- Step 2: Identify the Application Container ---<br />
All projects are running inside Docker containers.<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>docker ps -a</code></div></div><br />
Find the appropriate container for your application.<br />
<br />
================================================================================<br />
<br />
--- Step 3: Access the Container ---<br />
Exec into the application container:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>docker exec -it &lt;container_name&gt; bash</code></div></div><br />
================================================================================<br />
<br />
--- Step 4: Locate Git Pull Cron Job ---<br />
Check existing cron jobs:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>crontab -l</code></div></div><br />
Also check system cron directory:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>ls -l /etc/cron.d/</code></div></div><br />
Look for file:<br />
git-pull-cron<br />
<br />
================================================================================<br />
<br />
--- Step 5: Verify Cron Script and Logs ---<br />
Read the cron configuration:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>cat /etc/cron.d/git-pull-cron</code></div></div><br />
Check logs for failures:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>cat /var/log/git-pull.log</code></div></div><br />
? If logs show authentication errors → credentials need update.<br />
<br />
================================================================================<br />
<br />
--- Step 6: Update Git Credentials ---<br />
Open the git pull script:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>vi /usr/local/bin/git-pull.sh</code></div></div><br />
Replace old credentials with new ones.<br />
<br />
================================================================================<br />
<br />
--- Step 7: Generate New Repo Credentials (Azure DevOps) ---<br />
<br />
1. Login to Azure DevOps<br />
2. Navigate to the appropriate project<br />
3. Open the required repository<br />
4. Click on **Clone**<br />
<br />
Reference:<br />
<a href="https://prnt.sc/X5RGff0Z8pLG" target="_blank" rel="noopener" class="mycode_url">https://prnt.sc/X5RGff0Z8pLG</a><br />
<br />
5. Click on **Generate Credentials**<br />
<br />
Reference:<br />
<a href="https://prnt.sc/FA7t5X-oPgge" target="_blank" rel="noopener" class="mycode_url">https://prnt.sc/FA7t5X-oPgge</a><br />
<br />
6. Copy the generated credentials<br />
<br />
================================================================================<br />
<br />
--- Step 8: Update Script with New Credentials ---<br />
<br />
Update credentials in:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>/usr/local/bin/git-pull.sh</code></div></div><br />
Reference:<br />
<a href="https://prnt.sc/BSdafqM5zDdk" target="_blank" rel="noopener" class="mycode_url">https://prnt.sc/BSdafqM5zDdk</a><br />
<br />
Save the file.<br />
<br />
================================================================================<br />
<br />
--- Step 9: Re-run Script and Verify ---<br />
<br />
Manually execute the script:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>bash /usr/local/bin/git-pull.sh</code></div></div><br />
Check logs:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>cat /var/log/git-pull.log</code></div></div><br />
Ensure:<br />
- Git pull is successful<br />
- No authentication errors<br />
<br />
================================================================================<br />
TROUBLESHOOTING<br />
================================================================================<br />
<br />
--- Git pull still failing ---<br />
- Verify credentials are correct<br />
- Ensure repo URL is correct<br />
- Check network connectivity<br />
<br />
--- Cron not running ---<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>systemctl status cron</code></div></div><br />
--- Permission issues ---<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>chmod +x /usr/local/bin/git-pull.sh</code></div></div><br />
================================================================================<br />
QUICK SUMMARY<br />
================================================================================<br />
<br />
Issue: Code not updating in DEV  <br />
Cause: Expired repo credentials  <br />
Fix: Update credentials in git-pull script  <br />
<br />
Key Files:<br />
- /etc/cron.d/git-pull-cron<br />
- /usr/local/bin/git-pull.sh<br />
- /var/log/git-pull.log<br />
<br />
================================================================================]]></description>
			<content:encoded><![CDATA[================================================================================<br />
        <span style="font-weight: bold;" class="mycode_b">Git Pull Script — Repo Secrets Update Guide (DEV Environment)</span><br />
================================================================================<br />
<br />
<br />
================================================================================<br />
OVERVIEW<br />
================================================================================ <br />
<br />
This guide explains the process for updating repository credentials (repo secrets) <br />
used in the automated git pull script running via cron jobs.<br />
<br />
================================================================================<br />
ISSUE<br />
================================================================================<br />
Developers' code changes are not getting updated in the DEV environment.<br />
<br />
Root cause is usually:<br />
- Expired / invalid repository credentials<br />
- Git pull cron job failing due to authentication issues<br />
<br />
================================================================================<br />
STEP-BY-STEP PROCEDURE<br />
================================================================================<br />
<br />
--- Step 1: Login to DEV Server (Linode) ---<br />
Login to the DEV server using SSH.<br />
<br />
================================================================================<br />
<br />
--- Step 2: Identify the Application Container ---<br />
All projects are running inside Docker containers.<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>docker ps -a</code></div></div><br />
Find the appropriate container for your application.<br />
<br />
================================================================================<br />
<br />
--- Step 3: Access the Container ---<br />
Exec into the application container:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>docker exec -it &lt;container_name&gt; bash</code></div></div><br />
================================================================================<br />
<br />
--- Step 4: Locate Git Pull Cron Job ---<br />
Check existing cron jobs:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>crontab -l</code></div></div><br />
Also check system cron directory:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>ls -l /etc/cron.d/</code></div></div><br />
Look for file:<br />
git-pull-cron<br />
<br />
================================================================================<br />
<br />
--- Step 5: Verify Cron Script and Logs ---<br />
Read the cron configuration:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>cat /etc/cron.d/git-pull-cron</code></div></div><br />
Check logs for failures:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>cat /var/log/git-pull.log</code></div></div><br />
? If logs show authentication errors → credentials need update.<br />
<br />
================================================================================<br />
<br />
--- Step 6: Update Git Credentials ---<br />
Open the git pull script:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>vi /usr/local/bin/git-pull.sh</code></div></div><br />
Replace old credentials with new ones.<br />
<br />
================================================================================<br />
<br />
--- Step 7: Generate New Repo Credentials (Azure DevOps) ---<br />
<br />
1. Login to Azure DevOps<br />
2. Navigate to the appropriate project<br />
3. Open the required repository<br />
4. Click on **Clone**<br />
<br />
Reference:<br />
<a href="https://prnt.sc/X5RGff0Z8pLG" target="_blank" rel="noopener" class="mycode_url">https://prnt.sc/X5RGff0Z8pLG</a><br />
<br />
5. Click on **Generate Credentials**<br />
<br />
Reference:<br />
<a href="https://prnt.sc/FA7t5X-oPgge" target="_blank" rel="noopener" class="mycode_url">https://prnt.sc/FA7t5X-oPgge</a><br />
<br />
6. Copy the generated credentials<br />
<br />
================================================================================<br />
<br />
--- Step 8: Update Script with New Credentials ---<br />
<br />
Update credentials in:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>/usr/local/bin/git-pull.sh</code></div></div><br />
Reference:<br />
<a href="https://prnt.sc/BSdafqM5zDdk" target="_blank" rel="noopener" class="mycode_url">https://prnt.sc/BSdafqM5zDdk</a><br />
<br />
Save the file.<br />
<br />
================================================================================<br />
<br />
--- Step 9: Re-run Script and Verify ---<br />
<br />
Manually execute the script:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>bash /usr/local/bin/git-pull.sh</code></div></div><br />
Check logs:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>cat /var/log/git-pull.log</code></div></div><br />
Ensure:<br />
- Git pull is successful<br />
- No authentication errors<br />
<br />
================================================================================<br />
TROUBLESHOOTING<br />
================================================================================<br />
<br />
--- Git pull still failing ---<br />
- Verify credentials are correct<br />
- Ensure repo URL is correct<br />
- Check network connectivity<br />
<br />
--- Cron not running ---<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>systemctl status cron</code></div></div><br />
--- Permission issues ---<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>chmod +x /usr/local/bin/git-pull.sh</code></div></div><br />
================================================================================<br />
QUICK SUMMARY<br />
================================================================================<br />
<br />
Issue: Code not updating in DEV  <br />
Cause: Expired repo credentials  <br />
Fix: Update credentials in git-pull script  <br />
<br />
Key Files:<br />
- /etc/cron.d/git-pull-cron<br />
- /usr/local/bin/git-pull.sh<br />
- /var/log/git-pull.log<br />
<br />
================================================================================]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[ArgoCD + Image Updater + GHCR Setup]]></title>
			<link>https://forums.geekssolutions.io/showthread.php?tid=19</link>
			<pubDate>Tue, 07 Apr 2026 12:24:18 +0530</pubDate>
			<dc:creator><![CDATA[<a href="https://forums.geekssolutions.io/member.php?action=profile&uid=4">Amey Bhargave</a>]]></dc:creator>
			<guid isPermaLink="false">https://forums.geekssolutions.io/showthread.php?tid=19</guid>
			<description><![CDATA[Thread Title: ArgoCD + GHCR + Image Updater Setup (Production Guide)<br />
? ArgoCD + Image Updater + GHCR Setup (Production)<br />
This guide covers:<ul class="mycode_list"><li>GHCR secret setup<br />
</li>
<li>ArgoCD repo registration<br />
</li>
<li>Application deployment<br />
</li>
<li>Image updater configuration<br />
</li>
<li>RBAC setup<br />
</li>
</ul>
<hr class="mycode_hr" />
⚠️ Important<br />
Never expose real GitHub tokens in public threads.<br />
Replace all tokens with placeholders before sharing.<br />
<hr class="mycode_hr" />
? Step 1: Create GHCR Secret (App Namespace)<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>kubectl -n &lt;APP_NAMESPACE&gt; create secret docker-registry ghcr-regcred<br />
--docker-server=ghcr.io<br />
--docker-username='&lt;GITHUB_USERNAME&gt;'<br />
--docker-password='&lt;GITHUB_TOKEN&gt;'</code></div></div><hr class="mycode_hr" />
? Step 2: Create GHCR Secret (ArgoCD Namespace)<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>kubectl -n &lt;ARGOCD_NAMESPACE&gt; create secret docker-registry ghcr-regcred<br />
--docker-server=ghcr.io<br />
--docker-username='&lt;GITHUB_USERNAME&gt;'<br />
--docker-password='&lt;GITHUB_TOKEN&gt;'</code></div></div><hr class="mycode_hr" />
? Step 3: Create Git Credentials Secret<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>kubectl -n &lt;ARGOCD_NAMESPACE&gt; create secret generic argocd-image-updater-git-creds<br />
--from-literal=username='&lt;GITHUB_USERNAME&gt;'<br />
--from-literal=password='&lt;GITHUB_TOKEN&gt;'</code></div></div><hr class="mycode_hr" />
? Step 4: Register Git Repository in ArgoCD<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>apiVersion: v1<br />
kind: Secret<br />
metadata:<br />
name: &lt;REPO_SECRET_NAME&gt;<br />
labels:<br />
argocd.argoproj.io/secret-type: repository<br />
type: Opaque<br />
stringData:<br />
type: git<br />
url: [url=https://github.com/]https://github.com/[/url]/.git<br />
username: '&lt;GITHUB_USERNAME&gt;'<br />
password: '&lt;GITHUB_TOKEN&gt;'</code></div></div>Apply using:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>kubectl -n &lt;ARGOCD_NAMESPACE&gt; apply -f repo-secret.yaml</code></div></div><hr class="mycode_hr" />
? Step 5: Create ArgoCD Application<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>apiVersion: argoproj.io/v1alpha1<br />
kind: Application<br />
metadata:<br />
name: &lt;APPLICATION_NAME&gt;<br />
namespace: &lt;ARGOCD_NAMESPACE&gt;<br />
spec:<br />
project: &lt;PROJECT_NAME&gt;<br />
source:<br />
repoURL: [url=https://github.com/]https://github.com/[/url]/.git<br />
targetRevision:<br />
path:<br />
destination:<br />
server: [url=https://kubernetes.default.svc/]https://kubernetes.default.svc[/url]<br />
namespace: &lt;APP_NAMESPACE&gt;<br />
syncPolicy:<br />
automated:<br />
prune: true<br />
selfHeal: true<br />
syncOptions:<br />
- CreateNamespace=true</code></div></div><hr class="mycode_hr" />
? Step 6: Configure ArgoCD Image Updater<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>apiVersion: argocd-image-updater.argoproj.io/v1alpha1<br />
kind: ImageUpdater<br />
metadata:<br />
name: &lt;IMAGE_UPDATER_NAME&gt;<br />
namespace: &lt;ARGOCD_NAMESPACE&gt;<br />
spec:<br />
namespace: &lt;ARGOCD_NAMESPACE&gt;<br />
applicationRefs:<br />
- namePattern: &lt;APPLICATION_NAME&gt;<br />
images:<br />
- alias:<br />
imageName: ghcr.io//&lt;IMAGE_NAME&gt;<br />
commonUpdateSettings:<br />
updateStrategy: newest-build<br />
allowTags: regexp:^(sha-)?[0-9a-f]{7,40}&#36;<br />
pullSecret: pullsecret:&lt;ARGOCD_NAMESPACE&gt;/ghcr-regcred<br />
manifestTargets:<br />
kustomize:<br />
name: ghcr.io//&lt;IMAGE_NAME&gt;<br />
writeBackConfig:<br />
method: git<br />
gitConfig:<br />
branch:<br />
writeBackTarget: kustomization:.</code></div></div><hr class="mycode_hr" />
? Step 7: Create RBAC Role<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>apiVersion: rbac.authorization.k8s.io/v1<br />
kind: Role<br />
metadata:<br />
name: argocd-image-updater-secret-reader<br />
namespace: &lt;APP_NAMESPACE&gt;<br />
rules:<br />
[list]<br />
[*]apiGroups: [""]<br />
resources: ["secrets"]<br />
verbs: ["get", "list"]</code></div></div>[/list]<br />
<hr class="mycode_hr" />
? Step 8: Create RBAC RoleBinding<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>apiVersion: rbac.authorization.k8s.io/v1<br />
kind: RoleBinding<br />
metadata:<br />
name: argocd-image-updater-secret-reader<br />
namespace: &lt;APP_NAMESPACE&gt;<br />
roleRef:<br />
apiGroup: rbac.authorization.k8s.io<br />
kind: Role<br />
name: argocd-image-updater-secret-reader<br />
subjects:<br />
[list]<br />
[*]kind: ServiceAccount<br />
name: argocd-image-updater-controller<br />
namespace: &lt;ARGOCD_NAMESPACE&gt;</code></div></div>[/list]<br />
<hr class="mycode_hr" />
✅ Final Notes<br />
<br />
<br />
<br />
Verify:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>kubectl get applications -n &lt;ARGOCD_NAMESPACE&gt;<br />
kubectl logs -n &lt;ARGOCD_NAMESPACE&gt; deploy/argocd-image-updater</code></div></div>]]></description>
			<content:encoded><![CDATA[Thread Title: ArgoCD + GHCR + Image Updater Setup (Production Guide)<br />
? ArgoCD + Image Updater + GHCR Setup (Production)<br />
This guide covers:<ul class="mycode_list"><li>GHCR secret setup<br />
</li>
<li>ArgoCD repo registration<br />
</li>
<li>Application deployment<br />
</li>
<li>Image updater configuration<br />
</li>
<li>RBAC setup<br />
</li>
</ul>
<hr class="mycode_hr" />
⚠️ Important<br />
Never expose real GitHub tokens in public threads.<br />
Replace all tokens with placeholders before sharing.<br />
<hr class="mycode_hr" />
? Step 1: Create GHCR Secret (App Namespace)<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>kubectl -n &lt;APP_NAMESPACE&gt; create secret docker-registry ghcr-regcred<br />
--docker-server=ghcr.io<br />
--docker-username='&lt;GITHUB_USERNAME&gt;'<br />
--docker-password='&lt;GITHUB_TOKEN&gt;'</code></div></div><hr class="mycode_hr" />
? Step 2: Create GHCR Secret (ArgoCD Namespace)<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>kubectl -n &lt;ARGOCD_NAMESPACE&gt; create secret docker-registry ghcr-regcred<br />
--docker-server=ghcr.io<br />
--docker-username='&lt;GITHUB_USERNAME&gt;'<br />
--docker-password='&lt;GITHUB_TOKEN&gt;'</code></div></div><hr class="mycode_hr" />
? Step 3: Create Git Credentials Secret<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>kubectl -n &lt;ARGOCD_NAMESPACE&gt; create secret generic argocd-image-updater-git-creds<br />
--from-literal=username='&lt;GITHUB_USERNAME&gt;'<br />
--from-literal=password='&lt;GITHUB_TOKEN&gt;'</code></div></div><hr class="mycode_hr" />
? Step 4: Register Git Repository in ArgoCD<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>apiVersion: v1<br />
kind: Secret<br />
metadata:<br />
name: &lt;REPO_SECRET_NAME&gt;<br />
labels:<br />
argocd.argoproj.io/secret-type: repository<br />
type: Opaque<br />
stringData:<br />
type: git<br />
url: [url=https://github.com/]https://github.com/[/url]/.git<br />
username: '&lt;GITHUB_USERNAME&gt;'<br />
password: '&lt;GITHUB_TOKEN&gt;'</code></div></div>Apply using:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>kubectl -n &lt;ARGOCD_NAMESPACE&gt; apply -f repo-secret.yaml</code></div></div><hr class="mycode_hr" />
? Step 5: Create ArgoCD Application<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>apiVersion: argoproj.io/v1alpha1<br />
kind: Application<br />
metadata:<br />
name: &lt;APPLICATION_NAME&gt;<br />
namespace: &lt;ARGOCD_NAMESPACE&gt;<br />
spec:<br />
project: &lt;PROJECT_NAME&gt;<br />
source:<br />
repoURL: [url=https://github.com/]https://github.com/[/url]/.git<br />
targetRevision:<br />
path:<br />
destination:<br />
server: [url=https://kubernetes.default.svc/]https://kubernetes.default.svc[/url]<br />
namespace: &lt;APP_NAMESPACE&gt;<br />
syncPolicy:<br />
automated:<br />
prune: true<br />
selfHeal: true<br />
syncOptions:<br />
- CreateNamespace=true</code></div></div><hr class="mycode_hr" />
? Step 6: Configure ArgoCD Image Updater<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>apiVersion: argocd-image-updater.argoproj.io/v1alpha1<br />
kind: ImageUpdater<br />
metadata:<br />
name: &lt;IMAGE_UPDATER_NAME&gt;<br />
namespace: &lt;ARGOCD_NAMESPACE&gt;<br />
spec:<br />
namespace: &lt;ARGOCD_NAMESPACE&gt;<br />
applicationRefs:<br />
- namePattern: &lt;APPLICATION_NAME&gt;<br />
images:<br />
- alias:<br />
imageName: ghcr.io//&lt;IMAGE_NAME&gt;<br />
commonUpdateSettings:<br />
updateStrategy: newest-build<br />
allowTags: regexp:^(sha-)?[0-9a-f]{7,40}&#36;<br />
pullSecret: pullsecret:&lt;ARGOCD_NAMESPACE&gt;/ghcr-regcred<br />
manifestTargets:<br />
kustomize:<br />
name: ghcr.io//&lt;IMAGE_NAME&gt;<br />
writeBackConfig:<br />
method: git<br />
gitConfig:<br />
branch:<br />
writeBackTarget: kustomization:.</code></div></div><hr class="mycode_hr" />
? Step 7: Create RBAC Role<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>apiVersion: rbac.authorization.k8s.io/v1<br />
kind: Role<br />
metadata:<br />
name: argocd-image-updater-secret-reader<br />
namespace: &lt;APP_NAMESPACE&gt;<br />
rules:<br />
[list]<br />
[*]apiGroups: [""]<br />
resources: ["secrets"]<br />
verbs: ["get", "list"]</code></div></div>[/list]<br />
<hr class="mycode_hr" />
? Step 8: Create RBAC RoleBinding<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>apiVersion: rbac.authorization.k8s.io/v1<br />
kind: RoleBinding<br />
metadata:<br />
name: argocd-image-updater-secret-reader<br />
namespace: &lt;APP_NAMESPACE&gt;<br />
roleRef:<br />
apiGroup: rbac.authorization.k8s.io<br />
kind: Role<br />
name: argocd-image-updater-secret-reader<br />
subjects:<br />
[list]<br />
[*]kind: ServiceAccount<br />
name: argocd-image-updater-controller<br />
namespace: &lt;ARGOCD_NAMESPACE&gt;</code></div></div>[/list]<br />
<hr class="mycode_hr" />
✅ Final Notes<br />
<br />
<br />
<br />
Verify:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>kubectl get applications -n &lt;ARGOCD_NAMESPACE&gt;<br />
kubectl logs -n &lt;ARGOCD_NAMESPACE&gt; deploy/argocd-image-updater</code></div></div>]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[AKS Namespace Access Control – minesec (RBAC Implementation)]]></title>
			<link>https://forums.geekssolutions.io/showthread.php?tid=18</link>
			<pubDate>Tue, 07 Apr 2026 12:02:46 +0530</pubDate>
			<dc:creator><![CDATA[<a href="https://forums.geekssolutions.io/member.php?action=profile&uid=3">rana</a>]]></dc:creator>
			<guid isPermaLink="false">https://forums.geekssolutions.io/showthread.php?tid=18</guid>
			<description><![CDATA[<span style="font-weight: bold;" class="mycode_b"><span style="font-size: large;" class="mycode_size">AKS Namespace-Restricted Access (minesec) — Production Implementation Guide</span></span><br />
<br />
<hr class="mycode_hr" />
<br />
<span style="font-weight: bold;" class="mycode_b">Objective</span><br />
Provide a secure, production-ready method to grant a Linux user access strictly limited to the <span style="font-weight: bold;" class="mycode_b">minesec</span> namespace in an AKS cluster using Kubernetes RBAC and kubeconfig.<br />
<br />
This approach ensures:<ul class="mycode_list"><li>Zero cluster-wide exposure<br />
</li>
<li>Controlled namespace isolation<br />
</li>
<li>Auditable access model<br />
</li>
</ul>
<br />
<hr class="mycode_hr" />
<br />
<span style="font-weight: bold;" class="mycode_b">Architecture Overview</span><br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>Linux User (minesecuser)<br />
│<br />
▼<br />
kubeconfig (Token-based auth)<br />
│<br />
▼<br />
ServiceAccount (minesec namespace)<br />
│<br />
▼<br />
Role (Namespace scoped permissions)<br />
│<br />
▼<br />
RoleBinding (Access enforcement)</code></div></div><br />
<span style="font-weight: bold;" class="mycode_b">Key Principle:</span><br />
Access is not tied to Linux user directly — it is mapped via <span style="font-weight: bold;" class="mycode_b">ServiceAccount + Token</span>.<br />
<br />
<hr class="mycode_hr" />
<br />
<span style="font-weight: bold;" class="mycode_b">Step 1: Create Linux User</span><br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>sudo useradd -m minesecuser<br />
sudo chsh -s /bin/bash minesecuser</code></div></div><br />
<span style="font-weight: bold;" class="mycode_b">Why this matters:</span><br />
Separates OS-level identity from cluster-level permissions.<br />
<br />
<hr class="mycode_hr" />
<br />
<span style="font-weight: bold;" class="mycode_b">Step 2: Create ServiceAccount</span><br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>apiVersion: v1<br />
kind: ServiceAccount<br />
metadata:<br />
  name: minesecuser<br />
  namespace: minesec</code></div></div><br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>kubectl apply -f serviceaccount.yaml</code></div></div><br />
<span style="font-weight: bold;" class="mycode_b">Important:</span><br />
Never reuse ServiceAccounts across users. One identity = one ServiceAccount.<br />
<br />
<hr class="mycode_hr" />
<br />
<span style="font-weight: bold;" class="mycode_b">Step 3: Create Role (Namespace Scoped)</span><br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>apiVersion: rbac.authorization.k8s.io/v1<br />
kind: Role<br />
metadata:<br />
  name: minesecuser-role<br />
  namespace: minesec<br />
rules:<br />
- apiGroups: ["*"]<br />
  resources: ["*"]<br />
  verbs: ["*"]</code></div></div><br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>kubectl apply -f role.yaml</code></div></div><br />
<span style="font-weight: bold;" class="mycode_b">Production Warning:</span><br />
This gives <span style="font-weight: bold;" class="mycode_b">full access</span> inside the namespace.<br />
<br />
In real environments, restrict it like:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>resources: ["pods","deployments","services"]<br />
verbs: ["get","list","watch"]</code></div></div><br />
<hr class="mycode_hr" />
<br />
<span style="font-weight: bold;" class="mycode_b">Step 4: Create RoleBinding</span><br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>apiVersion: rbac.authorization.k8s.io/v1<br />
kind: RoleBinding<br />
metadata:<br />
  name: minesecuser-binding<br />
  namespace: minesec<br />
subjects:<br />
- kind: ServiceAccount<br />
  name: minesecuser<br />
  namespace: minesec<br />
roleRef:<br />
  kind: Role<br />
  name: minesecuser-role<br />
  apiGroup: rbac.authorization.k8s.io</code></div></div><br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>kubectl apply -f rolebinding.yaml</code></div></div><br />
<span style="font-weight: bold;" class="mycode_b">What this does:</span><br />
This is the enforcement layer — without RoleBinding, access = zero.<br />
<br />
<hr class="mycode_hr" />
<br />
<span style="font-weight: bold;" class="mycode_b">Step 5: Generate Token</span><br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>kubectl -n minesec create token minesecuser --duration=8760h &gt; /root/minesecuser.token<br />
chmod 600 /root/minesecuser.token</code></div></div><br />
<span style="font-weight: bold;" class="mycode_b">Critical Insight:</span><br />
This token is effectively a password to your cluster. Treat it as a secret.<br />
<br />
<hr class="mycode_hr" />
<br />
<span style="font-weight: bold;" class="mycode_b">Step 6: Extract Cluster Details</span><br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>kubectl config view --minify -o jsonpath='{.clusters[0].cluster.server}'</code></div></div><br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>kubectl config view --minify --raw -o jsonpath='{.clusters[0].cluster.certificate-authority-data}'</code></div></div><br />
<hr class="mycode_hr" />
<br />
<span style="font-weight: bold;" class="mycode_b">Step 7: Create kubeconfig file</span><br />
<br />
<span style="font-weight: bold;" class="mycode_b">Configure Linux User</span> <br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>mkdir -p /home/minesecuser/.kube<br />
cp config /home/minesecuser/.kube/config<br />
chown -R minesecuser:minesecuser /home/minesecuser/.kube<br />
chmod 600 /home/minesecuser/.kube/config</code></div></div><br />
<span style="font-weight: bold;" class="mycode_b">Contents</span><br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>apiVersion: v1<br />
kind: Config<br />
<br />
clusters:<br />
- name: aks-cluster<br />
  cluster:<br />
    server: https://&lt;AKS-API-SERVER&gt;<br />
    certificate-authority-data: &lt;BASE-64-CA&gt;<br />
<br />
users:<br />
- name: minesecuser<br />
  user:<br />
    token: &lt;TOKEN&gt;<br />
<br />
contexts:<br />
- name: minesec-context<br />
  context:<br />
    cluster: aks-cluster<br />
    user: minesecuser<br />
    namespace: minesec<br />
<br />
current-context: minesec-context</code></div></div><br />
<span style="font-weight: bold;" class="mycode_b">Key Design Point:</span><br />
Namespace is hardcoded → prevents accidental cross-namespace access.<br />
<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Step 8: Validation</span><br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>su - minesecuser<br />
kubectl get pods</code></div></div><br />
<span style="font-weight: bold;" class="mycode_b">Negative Testing (Important):</span><br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>kubectl get pods -n default<br />
kubectl get ns<br />
kubectl get nodes</code></div></div><br />
<span style="font-weight: bold;" class="mycode_b">Expected:</span><br />
All above should return <span style="font-weight: bold;" class="mycode_b">Forbidden</span><br />
<br />
<hr class="mycode_hr" />
<br />
<span style="font-weight: bold;" class="mycode_b">Security Best Practices</span><br />
<ul class="mycode_list"><li>Never share kubeconfig over email or chat<br />
</li>
<li>Rotate tokens periodically (recommended: 30–90 days)[]Avoid wildcard "" permissions in production<br />
</li>
<li>Use Azure AD + RBAC for enterprise identity integration<br />
</li>
<li>Audit access via Kubernetes audit logs / Azure Monitor<br />
</li>
<li>Store tokens securely (Azure Key Vault preferred)<br />
</li>
</ul>
<br />
<br />
<hr class="mycode_hr" />
<br />
<span style="font-weight: bold;" class="mycode_b">Production Risks (Do Not Ignore)</span><br />
<ul class="mycode_list"><li>Leaked token = full namespace compromise<br />
</li>
<li>Wildcard RBAC = privilege escalation risk<br />
</li>
<li>Long-duration tokens = security exposure<br />
</li>
<li>Manual kubeconfig distribution = audit gap<br />
</li>
</ul>
<br />
<hr class="mycode_hr" />
<br />
<span style="font-weight: bold;" class="mycode_b">Recommended Enterprise Upgrade Path</span><br />
<ul class="mycode_list"><li>Replace token-based auth with Azure AD RBAC<br />
</li>
<li>Use AAD Groups instead of ServiceAccounts<br />
</li>
<li>Use short-lived tokens (OIDC)<br />
</li>
<li>Implement Just-in-Time (JIT) access<br />
</li>
</ul>
<br />
<hr class="mycode_hr" />
<br />
<span style="font-weight: bold;" class="mycode_b">Summary</span><br />
<ul class="mycode_list"><li>Achieved strict namespace isolation using RBAC<br />
</li>
<li>Mapped Linux user → ServiceAccount via kubeconfig<br />
</li>
<li>Prevented cluster-wide access<br />
</li>
<li>Established secure and auditable access pattern<br />
</li>
</ul>
]]></description>
			<content:encoded><![CDATA[<span style="font-weight: bold;" class="mycode_b"><span style="font-size: large;" class="mycode_size">AKS Namespace-Restricted Access (minesec) — Production Implementation Guide</span></span><br />
<br />
<hr class="mycode_hr" />
<br />
<span style="font-weight: bold;" class="mycode_b">Objective</span><br />
Provide a secure, production-ready method to grant a Linux user access strictly limited to the <span style="font-weight: bold;" class="mycode_b">minesec</span> namespace in an AKS cluster using Kubernetes RBAC and kubeconfig.<br />
<br />
This approach ensures:<ul class="mycode_list"><li>Zero cluster-wide exposure<br />
</li>
<li>Controlled namespace isolation<br />
</li>
<li>Auditable access model<br />
</li>
</ul>
<br />
<hr class="mycode_hr" />
<br />
<span style="font-weight: bold;" class="mycode_b">Architecture Overview</span><br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>Linux User (minesecuser)<br />
│<br />
▼<br />
kubeconfig (Token-based auth)<br />
│<br />
▼<br />
ServiceAccount (minesec namespace)<br />
│<br />
▼<br />
Role (Namespace scoped permissions)<br />
│<br />
▼<br />
RoleBinding (Access enforcement)</code></div></div><br />
<span style="font-weight: bold;" class="mycode_b">Key Principle:</span><br />
Access is not tied to Linux user directly — it is mapped via <span style="font-weight: bold;" class="mycode_b">ServiceAccount + Token</span>.<br />
<br />
<hr class="mycode_hr" />
<br />
<span style="font-weight: bold;" class="mycode_b">Step 1: Create Linux User</span><br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>sudo useradd -m minesecuser<br />
sudo chsh -s /bin/bash minesecuser</code></div></div><br />
<span style="font-weight: bold;" class="mycode_b">Why this matters:</span><br />
Separates OS-level identity from cluster-level permissions.<br />
<br />
<hr class="mycode_hr" />
<br />
<span style="font-weight: bold;" class="mycode_b">Step 2: Create ServiceAccount</span><br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>apiVersion: v1<br />
kind: ServiceAccount<br />
metadata:<br />
  name: minesecuser<br />
  namespace: minesec</code></div></div><br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>kubectl apply -f serviceaccount.yaml</code></div></div><br />
<span style="font-weight: bold;" class="mycode_b">Important:</span><br />
Never reuse ServiceAccounts across users. One identity = one ServiceAccount.<br />
<br />
<hr class="mycode_hr" />
<br />
<span style="font-weight: bold;" class="mycode_b">Step 3: Create Role (Namespace Scoped)</span><br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>apiVersion: rbac.authorization.k8s.io/v1<br />
kind: Role<br />
metadata:<br />
  name: minesecuser-role<br />
  namespace: minesec<br />
rules:<br />
- apiGroups: ["*"]<br />
  resources: ["*"]<br />
  verbs: ["*"]</code></div></div><br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>kubectl apply -f role.yaml</code></div></div><br />
<span style="font-weight: bold;" class="mycode_b">Production Warning:</span><br />
This gives <span style="font-weight: bold;" class="mycode_b">full access</span> inside the namespace.<br />
<br />
In real environments, restrict it like:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>resources: ["pods","deployments","services"]<br />
verbs: ["get","list","watch"]</code></div></div><br />
<hr class="mycode_hr" />
<br />
<span style="font-weight: bold;" class="mycode_b">Step 4: Create RoleBinding</span><br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>apiVersion: rbac.authorization.k8s.io/v1<br />
kind: RoleBinding<br />
metadata:<br />
  name: minesecuser-binding<br />
  namespace: minesec<br />
subjects:<br />
- kind: ServiceAccount<br />
  name: minesecuser<br />
  namespace: minesec<br />
roleRef:<br />
  kind: Role<br />
  name: minesecuser-role<br />
  apiGroup: rbac.authorization.k8s.io</code></div></div><br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>kubectl apply -f rolebinding.yaml</code></div></div><br />
<span style="font-weight: bold;" class="mycode_b">What this does:</span><br />
This is the enforcement layer — without RoleBinding, access = zero.<br />
<br />
<hr class="mycode_hr" />
<br />
<span style="font-weight: bold;" class="mycode_b">Step 5: Generate Token</span><br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>kubectl -n minesec create token minesecuser --duration=8760h &gt; /root/minesecuser.token<br />
chmod 600 /root/minesecuser.token</code></div></div><br />
<span style="font-weight: bold;" class="mycode_b">Critical Insight:</span><br />
This token is effectively a password to your cluster. Treat it as a secret.<br />
<br />
<hr class="mycode_hr" />
<br />
<span style="font-weight: bold;" class="mycode_b">Step 6: Extract Cluster Details</span><br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>kubectl config view --minify -o jsonpath='{.clusters[0].cluster.server}'</code></div></div><br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>kubectl config view --minify --raw -o jsonpath='{.clusters[0].cluster.certificate-authority-data}'</code></div></div><br />
<hr class="mycode_hr" />
<br />
<span style="font-weight: bold;" class="mycode_b">Step 7: Create kubeconfig file</span><br />
<br />
<span style="font-weight: bold;" class="mycode_b">Configure Linux User</span> <br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>mkdir -p /home/minesecuser/.kube<br />
cp config /home/minesecuser/.kube/config<br />
chown -R minesecuser:minesecuser /home/minesecuser/.kube<br />
chmod 600 /home/minesecuser/.kube/config</code></div></div><br />
<span style="font-weight: bold;" class="mycode_b">Contents</span><br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>apiVersion: v1<br />
kind: Config<br />
<br />
clusters:<br />
- name: aks-cluster<br />
  cluster:<br />
    server: https://&lt;AKS-API-SERVER&gt;<br />
    certificate-authority-data: &lt;BASE-64-CA&gt;<br />
<br />
users:<br />
- name: minesecuser<br />
  user:<br />
    token: &lt;TOKEN&gt;<br />
<br />
contexts:<br />
- name: minesec-context<br />
  context:<br />
    cluster: aks-cluster<br />
    user: minesecuser<br />
    namespace: minesec<br />
<br />
current-context: minesec-context</code></div></div><br />
<span style="font-weight: bold;" class="mycode_b">Key Design Point:</span><br />
Namespace is hardcoded → prevents accidental cross-namespace access.<br />
<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Step 8: Validation</span><br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>su - minesecuser<br />
kubectl get pods</code></div></div><br />
<span style="font-weight: bold;" class="mycode_b">Negative Testing (Important):</span><br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>kubectl get pods -n default<br />
kubectl get ns<br />
kubectl get nodes</code></div></div><br />
<span style="font-weight: bold;" class="mycode_b">Expected:</span><br />
All above should return <span style="font-weight: bold;" class="mycode_b">Forbidden</span><br />
<br />
<hr class="mycode_hr" />
<br />
<span style="font-weight: bold;" class="mycode_b">Security Best Practices</span><br />
<ul class="mycode_list"><li>Never share kubeconfig over email or chat<br />
</li>
<li>Rotate tokens periodically (recommended: 30–90 days)[]Avoid wildcard "" permissions in production<br />
</li>
<li>Use Azure AD + RBAC for enterprise identity integration<br />
</li>
<li>Audit access via Kubernetes audit logs / Azure Monitor<br />
</li>
<li>Store tokens securely (Azure Key Vault preferred)<br />
</li>
</ul>
<br />
<br />
<hr class="mycode_hr" />
<br />
<span style="font-weight: bold;" class="mycode_b">Production Risks (Do Not Ignore)</span><br />
<ul class="mycode_list"><li>Leaked token = full namespace compromise<br />
</li>
<li>Wildcard RBAC = privilege escalation risk<br />
</li>
<li>Long-duration tokens = security exposure<br />
</li>
<li>Manual kubeconfig distribution = audit gap<br />
</li>
</ul>
<br />
<hr class="mycode_hr" />
<br />
<span style="font-weight: bold;" class="mycode_b">Recommended Enterprise Upgrade Path</span><br />
<ul class="mycode_list"><li>Replace token-based auth with Azure AD RBAC<br />
</li>
<li>Use AAD Groups instead of ServiceAccounts<br />
</li>
<li>Use short-lived tokens (OIDC)<br />
</li>
<li>Implement Just-in-Time (JIT) access<br />
</li>
</ul>
<br />
<hr class="mycode_hr" />
<br />
<span style="font-weight: bold;" class="mycode_b">Summary</span><br />
<ul class="mycode_list"><li>Achieved strict namespace isolation using RBAC<br />
</li>
<li>Mapped Linux user → ServiceAccount via kubeconfig<br />
</li>
<li>Prevented cluster-wide access<br />
</li>
<li>Established secure and auditable access pattern<br />
</li>
</ul>
]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[How to do OPENVAS migration (Docker Volume + Domain + SSL)]]></title>
			<link>https://forums.geekssolutions.io/showthread.php?tid=17</link>
			<pubDate>Tue, 07 Apr 2026 11:57:21 +0530</pubDate>
			<dc:creator><![CDATA[<a href="https://forums.geekssolutions.io/member.php?action=profile&uid=2">rishi</a>]]></dc:creator>
			<guid isPermaLink="false">https://forums.geekssolutions.io/showthread.php?tid=17</guid>
			<description><![CDATA[<span style="font-weight: bold;" class="mycode_b">Environment</span><br />
<hr class="mycode_hr" />
Source Server: Old server where OpenVAS container existed Destination Server: sadad-centralized-logging (Public IP: 20.21.137.88) Domain: online-openvas.sadadqa.com Container Image: immauss/openvas:latest Ports: 9392 (Web UI), 9390 (GMP)<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Goal</span><br />
<hr class="mycode_hr" />
1) Migrate OpenVAS Docker volume data from old server to new server 2) Run OpenVAS container on destination using same volume 3) Configure domain access via Nginx reverse proxy 4) Enable SSL using Let's Encrypt (Certbot) on Nginx 5) Validate OpenVAS users and reset passwords if needed<br />
<br />
<span style="font-weight: bold;" class="mycode_b">PART A — SOURCE SERVER (Backup OpenVAS Volume)</span><br />
<hr class="mycode_hr" />
1) Check OpenVAS container docker ps -a | grep openvas<br />
2) Confirm Docker volume docker volume ls | grep openvas<br />
3) Inspect volume path docker volume inspect openvas<br />
4) Create backup cd /var/lib/docker/volumes tar -czvf /root/openvas-volume-backup.tar.gz openvas<br />
5) Transfer backup scp /root/openvas-volume-backup.tar.gz root@DESTINATION_IP:/home/rishi/<br />
<br />
<span style="font-weight: bold;" class="mycode_b">PART B — DESTINATION SERVER (Restore Volume)</span><br />
<hr class="mycode_hr" />
1) Stop old container docker stop openvas<br />
2) Rename old container docker rename openvas openvas-old<br />
3) Remove old container docker rm openvas-old<br />
4) Remove old volume docker volume rm openvas<br />
5) Create new volume docker volume create openvas<br />
6) Restore volume data cd /var/lib/docker/volumes tar -xzvf /home/rishi/openvas-volume-backup.tar.gz<br />
7) Verify data ls -lah /var/lib/docker/volumes/openvas/_data<br />
<br />
<span style="font-weight: bold;" class="mycode_b">PART C — Start OpenVAS Container</span><br />
<hr class="mycode_hr" />
docker run -d --name openvas --restart unless-stopped --ipc=host -p 9392:9392 -p 9390:9390 -e GMP=9390 -v openvas:/data immauss/openvas:latest<br />
Verify container: docker ps<br />
Check logs: docker logs -f openvas<br />
Verify ports: ss -tulpn | grep 939<br />
<br />
<span style="font-weight: bold;" class="mycode_b">PART D — Nginx Reverse Proxy Setup</span><br />
<hr class="mycode_hr" />
Create config: /etc/nginx/sites-available/online-openvas.sadadqa.com.conf<br />
server {<br />
  listen 80;<br />
  server_name online-openvas.sadadqa.com;<br />
  location / {<br />
      proxy_pass <a href="http://127.0.0.1:9392/" target="_blank" rel="noopener" class="mycode_url">http://127.0.0.1:9392</a>;<br />
      proxy_http_version 1.1;<br />
      proxy_set_header Upgrade &#36;http_upgrade;<br />
      proxy_set_header Connection "upgrade";<br />
      proxy_set_header Host &#36;host;<br />
      proxy_set_header X-Real-IP &#36;remote_addr;<br />
      proxy_set_header X-Forwarded-For &#36;proxy_add_x_forwarded_for;<br />
      proxy_set_header X-Forwarded-Proto &#36;scheme;<br />
      proxy_connect_timeout 300;<br />
      proxy_send_timeout 300;<br />
      proxy_read_timeout 300;<br />
      client_max_body_size 50M;<br />
  }<br />
}<br />
Enable site: ln -s /etc/nginx/sites-available/online-openvas.sadadqa.com.conf /etc/nginx/sites-enabled/<br />
Reload Nginx: nginx -t systemctl reload nginx<br />
<br />
<span style="font-weight: bold;" class="mycode_b">PART E — DNS Setup</span><br />
<hr class="mycode_hr" />
Create DNS A record: online-openvas.sadadqa.com -&gt; 20.21.137.88<br />
Verify: nslookup online-openvas.sadadqa.com<br />
<br />
<span style="font-weight: bold;" class="mycode_b">PART F — SSL Setup using Certbot</span><br />
<hr class="mycode_hr" />
certbot --nginx -d online-openvas.sadadqa.com<br />
Certificate paths: /etc/letsencrypt/live/online-openvas.sadadqa.com/fullchain.pem /etc/letsencrypt/live/online-openvas.sadadqa.com/privkey.pem<br />
Test renewal: certbot renew --dry-run<br />
<br />
<span style="font-weight: bold;" class="mycode_b">PART G — OpenVAS User Management</span><br />
<hr class="mycode_hr" />
Enter container: docker exec -it openvas bash<br />
List users: sudo -u gvm gvmd --get-users<br />
Example users: admin rana akshay faisal sameer santosh harshal.kamble<br />
Reset password: sudo -u gvm gvmd --user=admin --new-password='StrongPassword123'<br />
Login URL: <a href="https://online-openvas.sadadqa.com/login" target="_blank" rel="noopener" class="mycode_url">https://online-openvas.sadadqa.com/login</a><br />
<br />
<span style="font-weight: bold;" class="mycode_b">PART H — Security Recommendations</span><br />
<hr class="mycode_hr" />
1) Do not expose port 9392 publicly. 2) Allow only Nginx (80/443) to internet. 3) Restrict portal access by office/VPN IP if required. 4) Enable firewall rules in Azure NSG accordingly.]]></description>
			<content:encoded><![CDATA[<span style="font-weight: bold;" class="mycode_b">Environment</span><br />
<hr class="mycode_hr" />
Source Server: Old server where OpenVAS container existed Destination Server: sadad-centralized-logging (Public IP: 20.21.137.88) Domain: online-openvas.sadadqa.com Container Image: immauss/openvas:latest Ports: 9392 (Web UI), 9390 (GMP)<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Goal</span><br />
<hr class="mycode_hr" />
1) Migrate OpenVAS Docker volume data from old server to new server 2) Run OpenVAS container on destination using same volume 3) Configure domain access via Nginx reverse proxy 4) Enable SSL using Let's Encrypt (Certbot) on Nginx 5) Validate OpenVAS users and reset passwords if needed<br />
<br />
<span style="font-weight: bold;" class="mycode_b">PART A — SOURCE SERVER (Backup OpenVAS Volume)</span><br />
<hr class="mycode_hr" />
1) Check OpenVAS container docker ps -a | grep openvas<br />
2) Confirm Docker volume docker volume ls | grep openvas<br />
3) Inspect volume path docker volume inspect openvas<br />
4) Create backup cd /var/lib/docker/volumes tar -czvf /root/openvas-volume-backup.tar.gz openvas<br />
5) Transfer backup scp /root/openvas-volume-backup.tar.gz root@DESTINATION_IP:/home/rishi/<br />
<br />
<span style="font-weight: bold;" class="mycode_b">PART B — DESTINATION SERVER (Restore Volume)</span><br />
<hr class="mycode_hr" />
1) Stop old container docker stop openvas<br />
2) Rename old container docker rename openvas openvas-old<br />
3) Remove old container docker rm openvas-old<br />
4) Remove old volume docker volume rm openvas<br />
5) Create new volume docker volume create openvas<br />
6) Restore volume data cd /var/lib/docker/volumes tar -xzvf /home/rishi/openvas-volume-backup.tar.gz<br />
7) Verify data ls -lah /var/lib/docker/volumes/openvas/_data<br />
<br />
<span style="font-weight: bold;" class="mycode_b">PART C — Start OpenVAS Container</span><br />
<hr class="mycode_hr" />
docker run -d --name openvas --restart unless-stopped --ipc=host -p 9392:9392 -p 9390:9390 -e GMP=9390 -v openvas:/data immauss/openvas:latest<br />
Verify container: docker ps<br />
Check logs: docker logs -f openvas<br />
Verify ports: ss -tulpn | grep 939<br />
<br />
<span style="font-weight: bold;" class="mycode_b">PART D — Nginx Reverse Proxy Setup</span><br />
<hr class="mycode_hr" />
Create config: /etc/nginx/sites-available/online-openvas.sadadqa.com.conf<br />
server {<br />
  listen 80;<br />
  server_name online-openvas.sadadqa.com;<br />
  location / {<br />
      proxy_pass <a href="http://127.0.0.1:9392/" target="_blank" rel="noopener" class="mycode_url">http://127.0.0.1:9392</a>;<br />
      proxy_http_version 1.1;<br />
      proxy_set_header Upgrade &#36;http_upgrade;<br />
      proxy_set_header Connection "upgrade";<br />
      proxy_set_header Host &#36;host;<br />
      proxy_set_header X-Real-IP &#36;remote_addr;<br />
      proxy_set_header X-Forwarded-For &#36;proxy_add_x_forwarded_for;<br />
      proxy_set_header X-Forwarded-Proto &#36;scheme;<br />
      proxy_connect_timeout 300;<br />
      proxy_send_timeout 300;<br />
      proxy_read_timeout 300;<br />
      client_max_body_size 50M;<br />
  }<br />
}<br />
Enable site: ln -s /etc/nginx/sites-available/online-openvas.sadadqa.com.conf /etc/nginx/sites-enabled/<br />
Reload Nginx: nginx -t systemctl reload nginx<br />
<br />
<span style="font-weight: bold;" class="mycode_b">PART E — DNS Setup</span><br />
<hr class="mycode_hr" />
Create DNS A record: online-openvas.sadadqa.com -&gt; 20.21.137.88<br />
Verify: nslookup online-openvas.sadadqa.com<br />
<br />
<span style="font-weight: bold;" class="mycode_b">PART F — SSL Setup using Certbot</span><br />
<hr class="mycode_hr" />
certbot --nginx -d online-openvas.sadadqa.com<br />
Certificate paths: /etc/letsencrypt/live/online-openvas.sadadqa.com/fullchain.pem /etc/letsencrypt/live/online-openvas.sadadqa.com/privkey.pem<br />
Test renewal: certbot renew --dry-run<br />
<br />
<span style="font-weight: bold;" class="mycode_b">PART G — OpenVAS User Management</span><br />
<hr class="mycode_hr" />
Enter container: docker exec -it openvas bash<br />
List users: sudo -u gvm gvmd --get-users<br />
Example users: admin rana akshay faisal sameer santosh harshal.kamble<br />
Reset password: sudo -u gvm gvmd --user=admin --new-password='StrongPassword123'<br />
Login URL: <a href="https://online-openvas.sadadqa.com/login" target="_blank" rel="noopener" class="mycode_url">https://online-openvas.sadadqa.com/login</a><br />
<br />
<span style="font-weight: bold;" class="mycode_b">PART H — Security Recommendations</span><br />
<hr class="mycode_hr" />
1) Do not expose port 9392 publicly. 2) Allow only Nginx (80/443) to internet. 3) Restrict portal access by office/VPN IP if required. 4) Enable firewall rules in Azure NSG accordingly.]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[MariaDB Galera Cluster — Backup & Restore Guide]]></title>
			<link>https://forums.geekssolutions.io/showthread.php?tid=16</link>
			<pubDate>Tue, 07 Apr 2026 11:56:56 +0530</pubDate>
			<dc:creator><![CDATA[<a href="https://forums.geekssolutions.io/member.php?action=profile&uid=4">Amey Bhargave</a>]]></dc:creator>
			<guid isPermaLink="false">https://forums.geekssolutions.io/showthread.php?tid=16</guid>
			<description><![CDATA[================================================================================<br />
                MariaDB Galera Cluster — Backup Restore Guide                  <br />
                Step-by-Step Recovery Procedure for Ubuntu VMs                <br />
================================================================================<br />
<br />
================================================================================<br />
OVERVIEW<br />
================================================================================<br />
This guide explains how to restore a MariaDB Galera Cluster backup to a fresh Ubuntu VM. The backup is stored as an encrypted ZIP file in Azure Blob Storage.<br />
<br />
--- Backup Details ---<br />
Backup tool: mariabackup with Galera support<br />
Compression: ZIP with password encryption<br />
Storage: Azure Blob Storage<br />
Retention: 7 daily backups<br />
Original DB version: MariaDB 10.8.8<br />
<br />
--- What This Guide Covers ---<br />
- Preparing a fresh Ubuntu VM<br />
- Mounting and using a secondary data disk<br />
- Installing MariaDB 10.11<br />
- Installing phpMyAdmin<br />
- Extracting backup ZIP<br />
- Disk space planning<br />
- Restore using mariabackup<br />
- Verification<br />
- Troubleshooting<br />
<br />
[!] WARNING: Never run this on a production server.<br />
<br />
================================================================================<br />
PREREQUISITES<br />
================================================================================<br />
* Ubuntu VM (20.04 / 22.04)<br />
* 512GB data disk<br />
* Backup ZIP file<br />
* Root/sudo access<br />
* Backup password<br />
<br />
================================================================================<br />
SECTION 1: PREPARE THE VM<br />
================================================================================<br />
<br />
--- Step 1.1 — Check disks ---<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>lsblk</code></div></div><br />
--- Step 1.2 — Check filesystem ---<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>file -s /dev/sda1</code></div></div><br />
If empty:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>mkfs.ext4 /dev/sda1</code></div></div><br />
--- Step 1.3 — Mount disk ---<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>mkdir -p /mnt/data<br />
mount /dev/sda1 /mnt/data<br />
df -h</code></div></div><br />
--- Step 1.4 — Make persistent ---<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>echo '/dev/sda1 /mnt/data ext4 defaults 0 2' &gt;&gt; /etc/fstab<br />
cat /etc/fstab</code></div></div><br />
--- Step 1.5 — Check files ---<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>ls -lh /mnt/data/</code></div></div><br />
--- Step 1.6 — Cleanup OS disk ---<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>apt clean<br />
apt autoremove -y</code></div></div><br />
================================================================================<br />
SECTION 2: INSTALL MARIADB<br />
================================================================================<br />
<br />
--- Step 2.1 ---<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>apt update &amp;&amp; apt upgrade -y</code></div></div><br />
--- Step 2.2 ---<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>apt install curl wget unzip software-properties-common -y</code></div></div><br />
--- Step 2.3 ---<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>curl -LsS https://downloads.mariadb.com/MariaDB/mariadb_repo_setup | &#92;<br />
bash -s -- --mariadb-server-version="mariadb-10.11"</code></div></div><br />
--- Step 2.4 ---<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>apt update<br />
apt install mariadb-server mariadb-backup -y</code></div></div><br />
--- Step 2.5 ---<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>mariadb --version<br />
systemctl status mariadb</code></div></div><br />
================================================================================<br />
SECTION 3: INSTALL PHPMYADMIN (OPTIONAL)<br />
================================================================================<br />
<br />
--- Step 3.1 ---<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>apt install apache2 -y</code></div></div><br />
--- Step 3.2 ---<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>apt install phpmyadmin -y</code></div></div><br />
--- Step 3.3 ---<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>systemctl status apache2</code></div></div><br />
--- Step 3.4 ---<br />
Open port 80 in Azure NSG<br />
<br />
--- Step 3.5 ---<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>mysql -u root<br />
ALTER USER 'root'@'localhost' IDENTIFIED BY 'YourPassword123';<br />
FLUSH PRIVILEGES;<br />
EXIT;</code></div></div><br />
--- Step 3.6 ---<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>curl ifconfig.me</code></div></div><br />
Access:<br />
<a href="http://YOUR_PUBLIC_IP/phpmyadmin" target="_blank" rel="noopener" class="mycode_url">http://YOUR_PUBLIC_IP/phpmyadmin</a><br />
<br />
================================================================================<br />
SECTION 4: EXTRACT BACKUP<br />
================================================================================<br />
<br />
--- Step 4.1 ---<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>cd /mnt/data/24x7<br />
ls -lh</code></div></div><br />
--- Step 4.2 ---<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>df -h /mnt/data</code></div></div><br />
--- Step 4.3 ---<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>unzip -P 'YOUR_PASSWORD' backup.zip -d /mnt/data/restored</code></div></div><br />
--- Step 4.4 ---<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>watch -n 10 'du -sh /mnt/data/restored/'</code></div></div><br />
--- Step 4.5 ---<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>ls -lh /mnt/data/restored/backup/mysql/</code></div></div><br />
================================================================================<br />
SECTION 5: DISK SPACE PLANNING<br />
================================================================================<br />
<br />
--- Step 5.1 ---<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>du -sh /mnt/data/restored/backup/mysql/</code></div></div><br />
--- Step 5.2 ---<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>df -h /<br />
df -h /var/lib/mysql</code></div></div><br />
--- Option A (copy) ---<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>mariabackup --copy-back &#92;<br />
--target-dir=/mnt/data/restored/backup/mysql/ &#92;<br />
--datadir=/var/lib/mysql/</code></div></div><br />
--- Option B (move) ---<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>mariabackup --move-back &#92;<br />
--target-dir=/mnt/data/restored/backup/mysql/ &#92;<br />
--datadir=/var/lib/mysql/</code></div></div><br />
--- Option C (recommended) ---<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>mkdir -p /mnt/data/mysql<br />
chown mysql:mysql /mnt/data/mysql</code></div></div><br />
Edit config:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>nano /etc/mysql/mariadb.conf.d/50-server.cnf</code></div></div><br />
Set:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>datadir = /mnt/data/mysql</code></div></div><br />
================================================================================<br />
SECTION 6: RESTORE DATABASE<br />
================================================================================<br />
<br />
--- Step 6.1 ---<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>systemctl stop mariadb</code></div></div><br />
--- Step 6.2 ---<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>rm -rf /var/lib/mysql/*</code></div></div><br />
--- Step 6.3 ---<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>mariabackup --copy-back &#92;<br />
--target-dir=/mnt/data/restored/backup/mysql/ &#92;<br />
--datadir=/var/lib/mysql/</code></div></div><br />
--- Step 6.4 ---<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>chown -R mysql:mysql /var/lib/mysql/</code></div></div><br />
--- Step 6.5 ---<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>nano /etc/mysql/mariadb.conf.d/50-server.cnf</code></div></div><br />
Add:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>[mariadb]<br />
wsrep_on=OFF</code></div></div><br />
--- Step 6.6 ---<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>systemctl start mariadb</code></div></div><br />
================================================================================<br />
SECTION 7: VERIFY RESTORE<br />
================================================================================<br />
<br />
--- Step 7.1 ---<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>mysql -u root -e "SHOW DATABASES;"</code></div></div><br />
--- Step 7.2 ---<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>SELECT TABLE_SCHEMA, TABLE_NAME<br />
FROM information_schema.TABLES<br />
WHERE TABLE_NAME LIKE '%transaction%';</code></div></div><br />
================================================================================<br />
SECTION 8: SHUTDOWN<br />
================================================================================<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>systemctl stop mariadb<br />
systemctl stop apache2<br />
shutdown -h now</code></div></div><br />
================================================================================<br />
SECTION 9: TROUBLESHOOTING<br />
================================================================================<br />
<br />
--- MariaDB not starting ---<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>journalctl -xe | grep mariadb<br />
tail -100 /var/log/mysql/error.log</code></div></div><br />
Fix:<br />
- chown -R mysql:mysql /var/lib/mysql/<br />
- wsrep_on=OFF<br />
- re-run restore<br />
<br />
--- Disk full ---<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>df -h</code></div></div><br />
Fix:<br />
- use --move-back<br />
- use /mnt/data/mysql<br />
<br />
--- Unzip error ---<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>unzip -P 'PASSWORD' file.zip</code></div></div><br />
--- phpMyAdmin issue ---<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>systemctl status apache2<br />
curl ifconfig.me</code></div></div><br />
================================================================================<br />
QUICK REFERENCE<br />
================================================================================<br />
<br />
Data disk: /dev/sda1<br />
Mount: /mnt/data<br />
Backup: /mnt/data/24x7/<br />
Extract: /mnt/data/restored/<br />
Datadir: /var/lib/mysql OR /mnt/data/mysql<br />
MariaDB: 10.11]]></description>
			<content:encoded><![CDATA[================================================================================<br />
                MariaDB Galera Cluster — Backup Restore Guide                  <br />
                Step-by-Step Recovery Procedure for Ubuntu VMs                <br />
================================================================================<br />
<br />
================================================================================<br />
OVERVIEW<br />
================================================================================<br />
This guide explains how to restore a MariaDB Galera Cluster backup to a fresh Ubuntu VM. The backup is stored as an encrypted ZIP file in Azure Blob Storage.<br />
<br />
--- Backup Details ---<br />
Backup tool: mariabackup with Galera support<br />
Compression: ZIP with password encryption<br />
Storage: Azure Blob Storage<br />
Retention: 7 daily backups<br />
Original DB version: MariaDB 10.8.8<br />
<br />
--- What This Guide Covers ---<br />
- Preparing a fresh Ubuntu VM<br />
- Mounting and using a secondary data disk<br />
- Installing MariaDB 10.11<br />
- Installing phpMyAdmin<br />
- Extracting backup ZIP<br />
- Disk space planning<br />
- Restore using mariabackup<br />
- Verification<br />
- Troubleshooting<br />
<br />
[!] WARNING: Never run this on a production server.<br />
<br />
================================================================================<br />
PREREQUISITES<br />
================================================================================<br />
* Ubuntu VM (20.04 / 22.04)<br />
* 512GB data disk<br />
* Backup ZIP file<br />
* Root/sudo access<br />
* Backup password<br />
<br />
================================================================================<br />
SECTION 1: PREPARE THE VM<br />
================================================================================<br />
<br />
--- Step 1.1 — Check disks ---<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>lsblk</code></div></div><br />
--- Step 1.2 — Check filesystem ---<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>file -s /dev/sda1</code></div></div><br />
If empty:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>mkfs.ext4 /dev/sda1</code></div></div><br />
--- Step 1.3 — Mount disk ---<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>mkdir -p /mnt/data<br />
mount /dev/sda1 /mnt/data<br />
df -h</code></div></div><br />
--- Step 1.4 — Make persistent ---<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>echo '/dev/sda1 /mnt/data ext4 defaults 0 2' &gt;&gt; /etc/fstab<br />
cat /etc/fstab</code></div></div><br />
--- Step 1.5 — Check files ---<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>ls -lh /mnt/data/</code></div></div><br />
--- Step 1.6 — Cleanup OS disk ---<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>apt clean<br />
apt autoremove -y</code></div></div><br />
================================================================================<br />
SECTION 2: INSTALL MARIADB<br />
================================================================================<br />
<br />
--- Step 2.1 ---<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>apt update &amp;&amp; apt upgrade -y</code></div></div><br />
--- Step 2.2 ---<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>apt install curl wget unzip software-properties-common -y</code></div></div><br />
--- Step 2.3 ---<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>curl -LsS https://downloads.mariadb.com/MariaDB/mariadb_repo_setup | &#92;<br />
bash -s -- --mariadb-server-version="mariadb-10.11"</code></div></div><br />
--- Step 2.4 ---<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>apt update<br />
apt install mariadb-server mariadb-backup -y</code></div></div><br />
--- Step 2.5 ---<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>mariadb --version<br />
systemctl status mariadb</code></div></div><br />
================================================================================<br />
SECTION 3: INSTALL PHPMYADMIN (OPTIONAL)<br />
================================================================================<br />
<br />
--- Step 3.1 ---<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>apt install apache2 -y</code></div></div><br />
--- Step 3.2 ---<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>apt install phpmyadmin -y</code></div></div><br />
--- Step 3.3 ---<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>systemctl status apache2</code></div></div><br />
--- Step 3.4 ---<br />
Open port 80 in Azure NSG<br />
<br />
--- Step 3.5 ---<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>mysql -u root<br />
ALTER USER 'root'@'localhost' IDENTIFIED BY 'YourPassword123';<br />
FLUSH PRIVILEGES;<br />
EXIT;</code></div></div><br />
--- Step 3.6 ---<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>curl ifconfig.me</code></div></div><br />
Access:<br />
<a href="http://YOUR_PUBLIC_IP/phpmyadmin" target="_blank" rel="noopener" class="mycode_url">http://YOUR_PUBLIC_IP/phpmyadmin</a><br />
<br />
================================================================================<br />
SECTION 4: EXTRACT BACKUP<br />
================================================================================<br />
<br />
--- Step 4.1 ---<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>cd /mnt/data/24x7<br />
ls -lh</code></div></div><br />
--- Step 4.2 ---<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>df -h /mnt/data</code></div></div><br />
--- Step 4.3 ---<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>unzip -P 'YOUR_PASSWORD' backup.zip -d /mnt/data/restored</code></div></div><br />
--- Step 4.4 ---<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>watch -n 10 'du -sh /mnt/data/restored/'</code></div></div><br />
--- Step 4.5 ---<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>ls -lh /mnt/data/restored/backup/mysql/</code></div></div><br />
================================================================================<br />
SECTION 5: DISK SPACE PLANNING<br />
================================================================================<br />
<br />
--- Step 5.1 ---<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>du -sh /mnt/data/restored/backup/mysql/</code></div></div><br />
--- Step 5.2 ---<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>df -h /<br />
df -h /var/lib/mysql</code></div></div><br />
--- Option A (copy) ---<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>mariabackup --copy-back &#92;<br />
--target-dir=/mnt/data/restored/backup/mysql/ &#92;<br />
--datadir=/var/lib/mysql/</code></div></div><br />
--- Option B (move) ---<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>mariabackup --move-back &#92;<br />
--target-dir=/mnt/data/restored/backup/mysql/ &#92;<br />
--datadir=/var/lib/mysql/</code></div></div><br />
--- Option C (recommended) ---<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>mkdir -p /mnt/data/mysql<br />
chown mysql:mysql /mnt/data/mysql</code></div></div><br />
Edit config:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>nano /etc/mysql/mariadb.conf.d/50-server.cnf</code></div></div><br />
Set:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>datadir = /mnt/data/mysql</code></div></div><br />
================================================================================<br />
SECTION 6: RESTORE DATABASE<br />
================================================================================<br />
<br />
--- Step 6.1 ---<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>systemctl stop mariadb</code></div></div><br />
--- Step 6.2 ---<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>rm -rf /var/lib/mysql/*</code></div></div><br />
--- Step 6.3 ---<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>mariabackup --copy-back &#92;<br />
--target-dir=/mnt/data/restored/backup/mysql/ &#92;<br />
--datadir=/var/lib/mysql/</code></div></div><br />
--- Step 6.4 ---<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>chown -R mysql:mysql /var/lib/mysql/</code></div></div><br />
--- Step 6.5 ---<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>nano /etc/mysql/mariadb.conf.d/50-server.cnf</code></div></div><br />
Add:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>[mariadb]<br />
wsrep_on=OFF</code></div></div><br />
--- Step 6.6 ---<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>systemctl start mariadb</code></div></div><br />
================================================================================<br />
SECTION 7: VERIFY RESTORE<br />
================================================================================<br />
<br />
--- Step 7.1 ---<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>mysql -u root -e "SHOW DATABASES;"</code></div></div><br />
--- Step 7.2 ---<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>SELECT TABLE_SCHEMA, TABLE_NAME<br />
FROM information_schema.TABLES<br />
WHERE TABLE_NAME LIKE '%transaction%';</code></div></div><br />
================================================================================<br />
SECTION 8: SHUTDOWN<br />
================================================================================<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>systemctl stop mariadb<br />
systemctl stop apache2<br />
shutdown -h now</code></div></div><br />
================================================================================<br />
SECTION 9: TROUBLESHOOTING<br />
================================================================================<br />
<br />
--- MariaDB not starting ---<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>journalctl -xe | grep mariadb<br />
tail -100 /var/log/mysql/error.log</code></div></div><br />
Fix:<br />
- chown -R mysql:mysql /var/lib/mysql/<br />
- wsrep_on=OFF<br />
- re-run restore<br />
<br />
--- Disk full ---<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>df -h</code></div></div><br />
Fix:<br />
- use --move-back<br />
- use /mnt/data/mysql<br />
<br />
--- Unzip error ---<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>unzip -P 'PASSWORD' file.zip</code></div></div><br />
--- phpMyAdmin issue ---<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>systemctl status apache2<br />
curl ifconfig.me</code></div></div><br />
================================================================================<br />
QUICK REFERENCE<br />
================================================================================<br />
<br />
Data disk: /dev/sda1<br />
Mount: /mnt/data<br />
Backup: /mnt/data/24x7/<br />
Extract: /mnt/data/restored/<br />
Datadir: /var/lib/mysql OR /mnt/data/mysql<br />
MariaDB: 10.11]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[How to install Wazuh and Auditd on agent host]]></title>
			<link>https://forums.geekssolutions.io/showthread.php?tid=15</link>
			<pubDate>Tue, 07 Apr 2026 11:55:24 +0530</pubDate>
			<dc:creator><![CDATA[<a href="https://forums.geekssolutions.io/member.php?action=profile&uid=2">rishi</a>]]></dc:creator>
			<guid isPermaLink="false">https://forums.geekssolutions.io/showthread.php?tid=15</guid>
			<description><![CDATA[<span style="font-weight: bold;" class="mycode_b">1) Install Wazuh agent prerequisites</span><br />
apt-get update &amp;&amp; apt-get install -y curl gnupg apt-transport-https<br />
<br />
<span style="font-weight: bold;" class="mycode_b">2) Add Wazuh repository key</span><br />
curl -s <a href="https://packages.wazuh.com/key/GPG-KEY-WAZUH" target="_blank" rel="noopener" class="mycode_url">https://packages.wazuh.com/key/GPG-KEY-WAZUH</a> | gpg --dearmor | tee /usr/share/keyrings/wazuh.gpg &gt; /dev/null<br />
<br />
<span style="font-weight: bold;" class="mycode_b">3) Add Wazuh repository</span><br />
echo "deb [signed-by=/usr/share/keyrings/wazuh.gpg] <a href="https://packages.wazuh.com/4.x/apt/" target="_blank" rel="noopener" class="mycode_url">https://packages.wazuh.com/4.x/apt/</a> stable main" | tee /etc/apt/sources.list.d/wazuh.list<br />
apt-get update<br />
<br />
<span style="font-weight: bold;" class="mycode_b">4) Install Wazuh agent</span><br />
WAZUH_MANAGER="10.200.10.38" apt-get install -y wazuh-agent<br />
<br />
<span style="font-weight: bold;" class="mycode_b">5) Start and enable Wazuh agent</span><br />
systemctl daemon-reexec &amp;&amp; systemctl enable wazuh-agent &amp;&amp; systemctl start wazuh-agent &amp;&amp; systemctl status wazuh-agent<br />
<hr class="mycode_hr" />
<span style="font-weight: bold;" class="mycode_b">6) Install auditd</span><br />
apt-get install -y auditd audispd-plugins<br />
<br />
<span style="font-weight: bold;" class="mycode_b">7) Start and enable auditd</span><br />
systemctl enable auditd &amp;&amp; systemctl start auditd &amp;&amp; systemctl status auditd<br />
<br />
<span style="font-weight: bold;" class="mycode_b">8) Verify audit log exists</span><br />
ls -l /var/log/audit/audit.log<br />
<hr class="mycode_hr" />
<br />
<span style="font-weight: bold;" class="mycode_b">9) Create audit rules file</span><br />
cat &gt; /etc/audit/rules.d/wazuh.rules &lt;&lt;'EOF'<br />
-w /etc/localtime -p wa -k audit_time_rules<br />
-a always,exit -F arch=b32 -S stime,settimeofday,adjtimex -F key=audit_time_rules<br />
-a always,exit -F arch=b64 -S adjtimex,settimeofday -F key=audit_time_rules<br />
-a always,exit -F arch=b32 -S clock_settime -F a0=0x0 -F key=time-change<br />
-a always,exit -F arch=b64 -S clock_settime -F a0=0x0 -F key=time-change<br />
-w /etc/group -p wa -k usergroup_mod<br />
-w /etc/passwd -p wa -k usergroup_mod<br />
-w /etc/gshadow -p wa -k usergroup_mod<br />
-w /etc/shadow -p wa -k usergroup_mod<br />
-w /etc/security/opasswd -p wa -k usergroup_mod<br />
-a always,exit -F arch=b64 -S execve -F exe=/usr/sbin/useradd -F key=user_mgmt<br />
-a always,exit -F arch=b64 -S execve -F exe=/usr/sbin/userdel -F key=user_mgmt<br />
-a always,exit -F arch=b64 -S execve -F exe=/usr/sbin/usermod -F key=user_mgmt<br />
-a always,exit -F arch=b64 -S execve -F exe=/usr/sbin/groupadd -F key=user_mgmt<br />
-a always,exit -F arch=b64 -S execve -F exe=/usr/sbin/groupdel -F key=user_mgmt<br />
-a always,exit -F arch=b64 -S execve -F exe=/usr/sbin/groupmod -F key=user_mgmt<br />
-w /etc/issue.net -p wa -k netconfig<br />
-w /etc/issue -p wa -k netconfig<br />
-w /etc/hosts -p wa -k netconfig<br />
-w /etc/netplan -p wa -k netconfig<br />
-a always,exit -F arch=b32 -S sethostname,setdomainname -F key=netconfig<br />
-a always,exit -F arch=b64 -S sethostname,setdomainname -F key=netconfig<br />
-w /etc/apparmor -p wa -k MAC-policy<br />
-w /etc/selinux -p wa -k MAC-policy<br />
-w /var/log/tallylog -p wa -k logins<br />
-w /var/log/lastlog -p wa -k logins<br />
-w /var/log/faillog -p wa -k logins<br />
-w /var/log/btmp -p wa -k session<br />
-w /var/log/wtmp -p wa -k session<br />
-w /var/run/utmp -p wa -k session<br />
-w /usr/sbin/insmod -p x -k modules<br />
-w /usr/sbin/modprobe -p x -k modules<br />
-w /usr/sbin/rmmod -p x -k modules<br />
-a always,exit -F arch=b64 -S init_module,delete_module -F key=modules<br />
-w /etc/sudoers -p wa -k sudoers<br />
-w /etc/sudoers.d -p wa -k sudoers<br />
-a always,exit -F arch=b32 -S open,creat,truncate,ftruncate,openat,open_by_handle_at -F exit=-EACCES -F auid&gt;=1000 -F auid!=-1 -F key=access<br />
-a always,exit -F arch=b32 -S open,creat,truncate,ftruncate,openat,open_by_handle_at -F exit=-EPERM -F auid&gt;=1000 -F auid!=-1 -F key=access<br />
-a always,exit -F arch=b64 -S open,truncate,ftruncate,creat,openat,open_by_handle_at -F exit=-EACCES -F auid&gt;=1000 -F auid!=-1 -F key=access<br />
-a always,exit -F arch=b64 -S open,truncate,ftruncate,creat,openat,open_by_handle_at -F exit=-EPERM -F auid&gt;=1000 -F auid!=-1 -F key=access<br />
-a always,exit -F arch=b32 -S unlink,rename,rmdir,unlinkat,renameat -F auid&gt;=1000 -F auid!=-1 -F key=delete<br />
-a always,exit -F arch=b64 -S rename,rmdir,unlink,unlinkat,renameat -F auid&gt;=1000 -F auid!=-1 -F key=delete<br />
EOF<br />
<br />
<span style="font-weight: bold;" class="mycode_b">10) Load audit rules</span><br />
augenrules --load<br />
<br />
<span style="font-weight: bold;" class="mycode_b">11) Verify audit rules are active</span><br />
auditctl -l<br />
<br />
<hr class="mycode_hr" />
<span style="font-weight: bold;" class="mycode_b">12) Back up Wazuh agent config</span><br />
cp -a /var/ossec/etc/ossec.conf /var/ossec/etc/ossec.conf.bak.&#36;(date +%F-%H%M%S)<br />
<br />
<span style="font-weight: bold;" class="mycode_b">13) Edit Wazuh config</span><br />
vim /var/ossec/etc/ossec.conf<br />
Add this block inside an &lt;ossec_config&gt; section:<br />
&lt;localfile&gt;<br />
 &lt;log_format&gt;audit&lt;/log_format&gt;<br />
 &lt;location&gt;/var/log/audit/audit.log&lt;/location&gt;<br />
&lt;/localfile&gt;<br />
A safe place is near the other &lt;localfile&gt; entries.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">14) Verify the audit block is present</span><br />
grep -nA3 -B3 '/var/log/audit/audit.log\|&lt;log_format&gt;audit&lt;/log_format&gt;' /var/ossec/etc/ossec.conf<br />
<br />
<span style="font-weight: bold;" class="mycode_b">15) Restart Wazuh agent</span><br />
systemctl restart wazuh-agent &amp;&amp; systemctl status wazuh-agent<br />
<br />
<span style="font-weight: bold;" class="mycode_b">16) Confirm Wazuh is reading audit log</span><br />
grep -i audit /var/ossec/logs/ossec.log | tail -n 20<br />
You want to see:<br />
Analyzing file: '/var/log/audit/audit.log'<br />
<hr class="mycode_hr" />
<br />
<span style="font-weight: bold;" class="mycode_b">17) Optional validation</span><br />
Generate an audit event:<br />
cat /etc/shadow &gt;/dev/null<br />
Check audit log:<br />
tail -n 20 /var/log/audit/audit.log<br />
Check Wazuh agent log again:<br />
grep -i audit /var/ossec/logs/ossec.log | tail -n 20<br />
<hr class="mycode_hr" />
<br />
<span style="font-weight: bold;" class="mycode_b">Minimal post-checks on every server</span><br />
systemctl is-active wazuh-agent &amp;&amp; systemctl is-active auditd<br />
auditctl -l | head<br />
grep -i audit /var/ossec/logs/ossec.log | tail -n 5]]></description>
			<content:encoded><![CDATA[<span style="font-weight: bold;" class="mycode_b">1) Install Wazuh agent prerequisites</span><br />
apt-get update &amp;&amp; apt-get install -y curl gnupg apt-transport-https<br />
<br />
<span style="font-weight: bold;" class="mycode_b">2) Add Wazuh repository key</span><br />
curl -s <a href="https://packages.wazuh.com/key/GPG-KEY-WAZUH" target="_blank" rel="noopener" class="mycode_url">https://packages.wazuh.com/key/GPG-KEY-WAZUH</a> | gpg --dearmor | tee /usr/share/keyrings/wazuh.gpg &gt; /dev/null<br />
<br />
<span style="font-weight: bold;" class="mycode_b">3) Add Wazuh repository</span><br />
echo "deb [signed-by=/usr/share/keyrings/wazuh.gpg] <a href="https://packages.wazuh.com/4.x/apt/" target="_blank" rel="noopener" class="mycode_url">https://packages.wazuh.com/4.x/apt/</a> stable main" | tee /etc/apt/sources.list.d/wazuh.list<br />
apt-get update<br />
<br />
<span style="font-weight: bold;" class="mycode_b">4) Install Wazuh agent</span><br />
WAZUH_MANAGER="10.200.10.38" apt-get install -y wazuh-agent<br />
<br />
<span style="font-weight: bold;" class="mycode_b">5) Start and enable Wazuh agent</span><br />
systemctl daemon-reexec &amp;&amp; systemctl enable wazuh-agent &amp;&amp; systemctl start wazuh-agent &amp;&amp; systemctl status wazuh-agent<br />
<hr class="mycode_hr" />
<span style="font-weight: bold;" class="mycode_b">6) Install auditd</span><br />
apt-get install -y auditd audispd-plugins<br />
<br />
<span style="font-weight: bold;" class="mycode_b">7) Start and enable auditd</span><br />
systemctl enable auditd &amp;&amp; systemctl start auditd &amp;&amp; systemctl status auditd<br />
<br />
<span style="font-weight: bold;" class="mycode_b">8) Verify audit log exists</span><br />
ls -l /var/log/audit/audit.log<br />
<hr class="mycode_hr" />
<br />
<span style="font-weight: bold;" class="mycode_b">9) Create audit rules file</span><br />
cat &gt; /etc/audit/rules.d/wazuh.rules &lt;&lt;'EOF'<br />
-w /etc/localtime -p wa -k audit_time_rules<br />
-a always,exit -F arch=b32 -S stime,settimeofday,adjtimex -F key=audit_time_rules<br />
-a always,exit -F arch=b64 -S adjtimex,settimeofday -F key=audit_time_rules<br />
-a always,exit -F arch=b32 -S clock_settime -F a0=0x0 -F key=time-change<br />
-a always,exit -F arch=b64 -S clock_settime -F a0=0x0 -F key=time-change<br />
-w /etc/group -p wa -k usergroup_mod<br />
-w /etc/passwd -p wa -k usergroup_mod<br />
-w /etc/gshadow -p wa -k usergroup_mod<br />
-w /etc/shadow -p wa -k usergroup_mod<br />
-w /etc/security/opasswd -p wa -k usergroup_mod<br />
-a always,exit -F arch=b64 -S execve -F exe=/usr/sbin/useradd -F key=user_mgmt<br />
-a always,exit -F arch=b64 -S execve -F exe=/usr/sbin/userdel -F key=user_mgmt<br />
-a always,exit -F arch=b64 -S execve -F exe=/usr/sbin/usermod -F key=user_mgmt<br />
-a always,exit -F arch=b64 -S execve -F exe=/usr/sbin/groupadd -F key=user_mgmt<br />
-a always,exit -F arch=b64 -S execve -F exe=/usr/sbin/groupdel -F key=user_mgmt<br />
-a always,exit -F arch=b64 -S execve -F exe=/usr/sbin/groupmod -F key=user_mgmt<br />
-w /etc/issue.net -p wa -k netconfig<br />
-w /etc/issue -p wa -k netconfig<br />
-w /etc/hosts -p wa -k netconfig<br />
-w /etc/netplan -p wa -k netconfig<br />
-a always,exit -F arch=b32 -S sethostname,setdomainname -F key=netconfig<br />
-a always,exit -F arch=b64 -S sethostname,setdomainname -F key=netconfig<br />
-w /etc/apparmor -p wa -k MAC-policy<br />
-w /etc/selinux -p wa -k MAC-policy<br />
-w /var/log/tallylog -p wa -k logins<br />
-w /var/log/lastlog -p wa -k logins<br />
-w /var/log/faillog -p wa -k logins<br />
-w /var/log/btmp -p wa -k session<br />
-w /var/log/wtmp -p wa -k session<br />
-w /var/run/utmp -p wa -k session<br />
-w /usr/sbin/insmod -p x -k modules<br />
-w /usr/sbin/modprobe -p x -k modules<br />
-w /usr/sbin/rmmod -p x -k modules<br />
-a always,exit -F arch=b64 -S init_module,delete_module -F key=modules<br />
-w /etc/sudoers -p wa -k sudoers<br />
-w /etc/sudoers.d -p wa -k sudoers<br />
-a always,exit -F arch=b32 -S open,creat,truncate,ftruncate,openat,open_by_handle_at -F exit=-EACCES -F auid&gt;=1000 -F auid!=-1 -F key=access<br />
-a always,exit -F arch=b32 -S open,creat,truncate,ftruncate,openat,open_by_handle_at -F exit=-EPERM -F auid&gt;=1000 -F auid!=-1 -F key=access<br />
-a always,exit -F arch=b64 -S open,truncate,ftruncate,creat,openat,open_by_handle_at -F exit=-EACCES -F auid&gt;=1000 -F auid!=-1 -F key=access<br />
-a always,exit -F arch=b64 -S open,truncate,ftruncate,creat,openat,open_by_handle_at -F exit=-EPERM -F auid&gt;=1000 -F auid!=-1 -F key=access<br />
-a always,exit -F arch=b32 -S unlink,rename,rmdir,unlinkat,renameat -F auid&gt;=1000 -F auid!=-1 -F key=delete<br />
-a always,exit -F arch=b64 -S rename,rmdir,unlink,unlinkat,renameat -F auid&gt;=1000 -F auid!=-1 -F key=delete<br />
EOF<br />
<br />
<span style="font-weight: bold;" class="mycode_b">10) Load audit rules</span><br />
augenrules --load<br />
<br />
<span style="font-weight: bold;" class="mycode_b">11) Verify audit rules are active</span><br />
auditctl -l<br />
<br />
<hr class="mycode_hr" />
<span style="font-weight: bold;" class="mycode_b">12) Back up Wazuh agent config</span><br />
cp -a /var/ossec/etc/ossec.conf /var/ossec/etc/ossec.conf.bak.&#36;(date +%F-%H%M%S)<br />
<br />
<span style="font-weight: bold;" class="mycode_b">13) Edit Wazuh config</span><br />
vim /var/ossec/etc/ossec.conf<br />
Add this block inside an &lt;ossec_config&gt; section:<br />
&lt;localfile&gt;<br />
 &lt;log_format&gt;audit&lt;/log_format&gt;<br />
 &lt;location&gt;/var/log/audit/audit.log&lt;/location&gt;<br />
&lt;/localfile&gt;<br />
A safe place is near the other &lt;localfile&gt; entries.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">14) Verify the audit block is present</span><br />
grep -nA3 -B3 '/var/log/audit/audit.log\|&lt;log_format&gt;audit&lt;/log_format&gt;' /var/ossec/etc/ossec.conf<br />
<br />
<span style="font-weight: bold;" class="mycode_b">15) Restart Wazuh agent</span><br />
systemctl restart wazuh-agent &amp;&amp; systemctl status wazuh-agent<br />
<br />
<span style="font-weight: bold;" class="mycode_b">16) Confirm Wazuh is reading audit log</span><br />
grep -i audit /var/ossec/logs/ossec.log | tail -n 20<br />
You want to see:<br />
Analyzing file: '/var/log/audit/audit.log'<br />
<hr class="mycode_hr" />
<br />
<span style="font-weight: bold;" class="mycode_b">17) Optional validation</span><br />
Generate an audit event:<br />
cat /etc/shadow &gt;/dev/null<br />
Check audit log:<br />
tail -n 20 /var/log/audit/audit.log<br />
Check Wazuh agent log again:<br />
grep -i audit /var/ossec/logs/ossec.log | tail -n 20<br />
<hr class="mycode_hr" />
<br />
<span style="font-weight: bold;" class="mycode_b">Minimal post-checks on every server</span><br />
systemctl is-active wazuh-agent &amp;&amp; systemctl is-active auditd<br />
auditctl -l | head<br />
grep -i audit /var/ossec/logs/ossec.log | tail -n 5]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[How to Connect Azure Storage Explorer Using SAS URL]]></title>
			<link>https://forums.geekssolutions.io/showthread.php?tid=14</link>
			<pubDate>Tue, 07 Apr 2026 11:47:05 +0530</pubDate>
			<dc:creator><![CDATA[<a href="https://forums.geekssolutions.io/member.php?action=profile&uid=2">rishi</a>]]></dc:creator>
			<guid isPermaLink="false">https://forums.geekssolutions.io/showthread.php?tid=14</guid>
			<description><![CDATA[<span style="font-weight: bold;" class="mycode_b">For e.g. <br />
<br />
Storage Account: </span>sadaddevapplogs<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Step 1: Generate SAS URL from Azure Portal</span><br />
<br />
1. Login to Microsoft Azure Portal<br />
2. Search for your Storage Account: sadaddevapplogs<br />
<br />
<a href="https://prnt.sc/g4vjm8Q__Lcx" target="_blank" rel="noopener" class="mycode_url">https://prnt.sc/g4vjm8Q__Lcx</a><br />
<br />
3. Open the Storage Account<br />
<br />
4. Navigate to:<br />
  Security + networking → Shared access signature<br />
<br />
5. Configure the following:<br />
<br />
<a href="https://prnt.sc/3PN24EGyoSCZ" target="_blank" rel="noopener" class="mycode_url">https://prnt.sc/3PN24EGyoSCZ</a><br />
<br />
  Allowed Services:<br />
  - File<br />
<br />
  Allowed Resource Types:<br />
  - Service<br />
  - Container<br />
  - Object<br />
<br />
  Permissions:<br />
  - Read<br />
  - List<br />
<br />
  Start Time:<br />
  - Set current time<br />
<br />
  Expiry Time:<br />
  - Set as per requirement (recommended: short duration)<br />
<br />
  Allowed Protocol:<br />
  - HTTPS only<br />
<br />
6. Click:<br />
  Generate SAS and connection string<br />
<br />
7. Copy:<br />
  File service SAS URL<br />
<br />
---<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Step 2: Connect Using Azure Storage Explorer</span><br />
<br />
1. Open Azure Storage Explorer<br />
<br />
2. Click:<br />
  Open Connect Dialog (Plug icon)<br />
<br />
3. Select:<br />
 Storage Account or directory<br />
<br />
4. Choose:<br />
  Shared access signature (SAS)<br />
<br />
5. Paste the SAS URL<br />
<br />
6. Click:<br />
  Next → Connect<br />
<br />
---<br />
<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Common Issues &amp; Fix</span><br />
<br />
- Access Denied:<br />
  Ensure Read and List permissions are enabled<br />
<br />
- Unable to view containers:<br />
  Ensure Service, Container, and Object are selected<br />
<br />
- SAS expired:<br />
  Regenerate SAS token<br />
<br />
- Firewall blocked:<br />
  Allow your IP in Azure Storage firewall settings<br />
<br />
---<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Best Practices</span><br />
<br />
- Use short expiry duration for SAS<br />
- Restrict access using IP whitelisting<br />
- Avoid Write/Delete permissions unless required<br />
- Rotate SAS tokens periodically]]></description>
			<content:encoded><![CDATA[<span style="font-weight: bold;" class="mycode_b">For e.g. <br />
<br />
Storage Account: </span>sadaddevapplogs<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Step 1: Generate SAS URL from Azure Portal</span><br />
<br />
1. Login to Microsoft Azure Portal<br />
2. Search for your Storage Account: sadaddevapplogs<br />
<br />
<a href="https://prnt.sc/g4vjm8Q__Lcx" target="_blank" rel="noopener" class="mycode_url">https://prnt.sc/g4vjm8Q__Lcx</a><br />
<br />
3. Open the Storage Account<br />
<br />
4. Navigate to:<br />
  Security + networking → Shared access signature<br />
<br />
5. Configure the following:<br />
<br />
<a href="https://prnt.sc/3PN24EGyoSCZ" target="_blank" rel="noopener" class="mycode_url">https://prnt.sc/3PN24EGyoSCZ</a><br />
<br />
  Allowed Services:<br />
  - File<br />
<br />
  Allowed Resource Types:<br />
  - Service<br />
  - Container<br />
  - Object<br />
<br />
  Permissions:<br />
  - Read<br />
  - List<br />
<br />
  Start Time:<br />
  - Set current time<br />
<br />
  Expiry Time:<br />
  - Set as per requirement (recommended: short duration)<br />
<br />
  Allowed Protocol:<br />
  - HTTPS only<br />
<br />
6. Click:<br />
  Generate SAS and connection string<br />
<br />
7. Copy:<br />
  File service SAS URL<br />
<br />
---<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Step 2: Connect Using Azure Storage Explorer</span><br />
<br />
1. Open Azure Storage Explorer<br />
<br />
2. Click:<br />
  Open Connect Dialog (Plug icon)<br />
<br />
3. Select:<br />
 Storage Account or directory<br />
<br />
4. Choose:<br />
  Shared access signature (SAS)<br />
<br />
5. Paste the SAS URL<br />
<br />
6. Click:<br />
  Next → Connect<br />
<br />
---<br />
<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Common Issues &amp; Fix</span><br />
<br />
- Access Denied:<br />
  Ensure Read and List permissions are enabled<br />
<br />
- Unable to view containers:<br />
  Ensure Service, Container, and Object are selected<br />
<br />
- SAS expired:<br />
  Regenerate SAS token<br />
<br />
- Firewall blocked:<br />
  Allow your IP in Azure Storage firewall settings<br />
<br />
---<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Best Practices</span><br />
<br />
- Use short expiry duration for SAS<br />
- Restrict access using IP whitelisting<br />
- Avoid Write/Delete permissions unless required<br />
- Rotate SAS tokens periodically]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[EDB PostgreSQL Advanced Server v15 Setup on Azure RHEL 9.4 with pgAdmin]]></title>
			<link>https://forums.geekssolutions.io/showthread.php?tid=13</link>
			<pubDate>Tue, 07 Apr 2026 09:38:37 +0530</pubDate>
			<dc:creator><![CDATA[<a href="https://forums.geekssolutions.io/member.php?action=profile&uid=1">santosh</a>]]></dc:creator>
			<guid isPermaLink="false">https://forums.geekssolutions.io/showthread.php?tid=13</guid>
			<description><![CDATA[<span style="font-weight: bold;" class="mycode_b">EDB PostgreSQL Advanced Server v15 Setup on Azure RHEL 9.4 with pgAdmin</span><br />
<br />
<span style="font-weight: bold;" class="mycode_b">Overview</span><br />
This guide covers installing and configuring EDB PostgreSQL Advanced Server v15 on Azure RHEL 9.4, setting up systemd service, configuring remote connections and connecting via pgAdmin.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Environment</span><ul class="mycode_list"><li><span style="font-weight: bold;" class="mycode_b">OS:</span> Red Hat Enterprise Linux 9.4 on Azure<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Database:</span> EDB PostgreSQL Advanced Server v15<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Port:</span> 5444<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">pgAdmin:</span> Web-based pgAdmin interface<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Database User:</span> enterprisedb<br />
</li>
</ul>
<br />
<span style="font-weight: bold;" class="mycode_b">Table of Contents</span><ul class="mycode_list"><li>Step 1 - Install EDB PostgreSQL<br />
</li>
<li>Step 2 - Initialize the Database<br />
</li>
<li>Step 3 - Create Systemd Service<br />
</li>
<li>Step 4 - Configure Remote Connections<br />
</li>
<li>Step 5 - Setup Firewall Rules<br />
</li>
<li>Step 6 - Install PostgreSQL Client<br />
</li>
<li>Step 7 - Configure pgAdmin<br />
</li>
<li>Step 8 - Test Connectivity<br />
</li>
</ul>
<br />
<span style="font-weight: bold;" class="mycode_b">Step 1 - Install EDB PostgreSQL Advanced Server</span><br />
<span style="font-style: italic;" class="mycode_i">Run on: Azure RHEL 9.4 Server</span><br />
<br />
Add the EDB repository:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>curl -1sLf 'https://downloads.enterprisedb.com/YOUR_REPO_TOKEN/enterprise/setup.rpm.sh' | sudo -E bash</code></div></div><br />
Install EDB PostgreSQL Advanced Server v15:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>sudo dnf install edb-as15-server</code></div></div><br />
Verify installation:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>/usr/edb/as15/bin/postgres --version</code></div></div><br />
<span style="font-weight: bold;" class="mycode_b">Step 2 - Initialize the Database</span><br />
<span style="font-style: italic;" class="mycode_i">Run on: Azure RHEL 9.4 Server</span><br />
<br />
Create the data directory:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>sudo mkdir -p /usr/edb/as15/data<br />
sudo mkdir -p /usr/edb/as15/logs</code></div></div><br />
Switch to enterprisedb user and initialize:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>sudo su - enterprisedb<br />
/usr/edb/as15/bin/initdb -D /usr/edb/as15/data<br />
exit</code></div></div><br />
<span style="font-weight: bold;" class="mycode_b">Step 3 - Create Systemd Service</span><br />
<span style="font-style: italic;" class="mycode_i">Run on: Azure RHEL 9.4 Server</span><br />
<br />
Create the service file:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>sudo nano /etc/systemd/system/edb-as15.service</code></div></div><br />
Add the following configuration:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>[Unit]<br />
Description=EDB PostgreSQL Advanced Server 15<br />
After=network.target<br />
<br />
[Service]<br />
Type=forking<br />
User=enterprisedb<br />
ExecStart=/usr/edb/as15/bin/pg_ctl -D /usr/edb/as15/data -l /usr/edb/as15/logs/server.log start<br />
ExecStop=/usr/edb/as15/bin/pg_ctl -D /usr/edb/as15/data stop<br />
ExecReload=/usr/edb/as15/bin/pg_ctl -D /usr/edb/as15/data reload<br />
PIDFile=/usr/edb/as15/data/postmaster.pid<br />
<br />
[Install]<br />
WantedBy=multi-user.target</code></div></div><br />
Reload systemd and start service:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>sudo systemctl daemon-reload<br />
sudo systemctl start edb-as15<br />
sudo systemctl enable edb-as15</code></div></div><br />
Verify service status:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>sudo systemctl status edb-as15</code></div></div><br />
Expected output:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>edb-as15.service - EDB PostgreSQL Advanced Server 15<br />
  Active: active (running)</code></div></div><br />
<span style="font-weight: bold;" class="mycode_b">Step 4 - Configure Remote Connections</span><br />
<span style="font-style: italic;" class="mycode_i">Run on: Azure RHEL 9.4 Server</span><br />
<br />
Edit postgresql.conf:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>sudo nano /usr/edb/as15/data/postgresql.conf</code></div></div><br />
Set the following values:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>listen_addresses = '*'<br />
port = 5444</code></div></div><br />
Edit pg_hba.conf to allow remote access:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>sudo nano /usr/edb/as15/data/pg_hba.conf</code></div></div><br />
Add your bastion or client IP:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code># Allow specific IP access<br />
host    all    all    YOUR_BASTION_IP/32    md5<br />
<br />
# Or allow entire subnet<br />
host    all    all    10.170.0.0/24    md5</code></div></div><br />
Reload PostgreSQL to apply changes:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>sudo systemctl reload edb-as15</code></div></div><br />
<span style="font-weight: bold;" class="mycode_b">Step 5 - Setup Firewall Rules</span><br />
<span style="font-style: italic;" class="mycode_i">Run on: Azure RHEL 9.4 Server</span><br />
<br />
Open port 5444 in firewalld:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>sudo firewall-cmd --permanent --add-port=5444/tcp<br />
sudo firewall-cmd --reload</code></div></div><br />
Verify port is open:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>sudo firewall-cmd --list-all</code></div></div><br />
Verify PostgreSQL is listening:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>netstat -tuln | grep 5444</code></div></div><br />
Expected output:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>tcp    0    0 0.0.0.0:5444    0.0.0.0:*    LISTEN</code></div></div><br />
<span style="font-weight: bold;" class="mycode_b">Step 6 - Install PostgreSQL Client</span><br />
<span style="font-style: italic;" class="mycode_i">Run on: Bastion Server</span><br />
<br />
Install psql client:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>sudo dnf install postgresql</code></div></div><br />
Verify client installation:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>psql --version</code></div></div><br />
<span style="font-weight: bold;" class="mycode_b">Step 7 - Configure pgAdmin</span><br />
<span style="font-style: italic;" class="mycode_i">Run on: Web Browser</span><br />
<br />
<span style="font-weight: bold;" class="mycode_b">7.1 Access pgAdmin</span><ul class="mycode_list"><li>Open your pgAdmin URL in browser<br />
</li>
<li>Login with your pgAdmin credentials<br />
</li>
</ul>
<br />
<span style="font-weight: bold;" class="mycode_b">7.2 Add New Server</span><ul class="mycode_list"><li>In left sidebar right-click on <span style="font-weight: bold;" class="mycode_b">Servers</span><br />
</li>
<li>Select <span style="font-weight: bold;" class="mycode_b">Create &gt; Server</span><br />
</li>
</ul>
<br />
<span style="font-weight: bold;" class="mycode_b">7.3 General Tab Settings</span><ul class="mycode_list"><li><span style="font-weight: bold;" class="mycode_b">Name:</span> EDB-Advanced-Server<br />
</li>
</ul>
<br />
<span style="font-weight: bold;" class="mycode_b">7.4 Connection Tab Settings</span><ul class="mycode_list"><li><span style="font-weight: bold;" class="mycode_b">Host name/address:</span> YOUR_EDB_SERVER_IP<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Port:</span> 5444<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Maintenance database:</span> edb<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Username:</span> enterprisedb<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Password:</span> YOUR_ENTERPRISEDB_PASSWORD<br />
</li>
<li>Check Save password if desired<br />
</li>
</ul>
<br />
<span style="font-weight: bold;" class="mycode_b">7.5 Save and Connect</span><ul class="mycode_list"><li>Click <span style="font-weight: bold;" class="mycode_b">Save</span><br />
</li>
<li>Server should appear under Servers in sidebar<br />
</li>
<li>Expand to browse databases<br />
</li>
</ul>
<br />
<span style="font-weight: bold;" class="mycode_b">Step 8 - Test Connectivity</span><br />
<span style="font-style: italic;" class="mycode_i">Run on: Bastion Server</span><br />
<br />
Test connection using psql:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>psql -h YOUR_EDB_SERVER_IP -p 5444 -U enterprisedb -d edb</code></div></div><br />
If successful you will see the psql prompt:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>edb=#</code></div></div><br />
Test basic query:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>SELECT version();<br />
&#92;l<br />
&#92;du<br />
&#92;q</code></div></div><br />
<span style="font-weight: bold;" class="mycode_b">Troubleshooting</span><ul class="mycode_list"><li><span style="font-weight: bold;" class="mycode_b">Connection refused:</span> Check firewall rules and port 5444 is open<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Auth failed:</span> Verify pg_hba.conf has correct IP and auth method<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Service not starting:</span> Check logs at /usr/edb/as15/logs/server.log<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">pgAdmin can't connect:</span> Verify network connectivity between pgAdmin and EDB server<br />
</li>
</ul>
<br />
Check service logs:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>sudo journalctl -u edb-as15 -f<br />
tail -f /usr/edb/as15/logs/server.log</code></div></div><br />
<span style="font-weight: bold;" class="mycode_b">Additional Resources</span><ul class="mycode_list"><li>pgAdmin Documentation: <a href="https://www.pgadmin.org/docs/" target="_blank" rel="noopener" class="mycode_url">https://www.pgadmin.org/docs/</a><br />
</li>
<li>EDB Documentation: <a href="https://www.enterprisedb.com/docs/" target="_blank" rel="noopener" class="mycode_url">https://www.enterprisedb.com/docs/</a><br />
</li>
<li>EDB PostgreSQL Advanced Server v15 Release Notes<br />
</li>
</ul>
<br />
<span style="font-weight: bold;" class="mycode_b">Summary</span><ul class="mycode_list"><li>EDB PostgreSQL Advanced Server v15 installed on Azure RHEL 9.4<br />
</li>
<li>Database initialized and systemd service created<br />
</li>
<li>Remote connections configured on port 5444<br />
</li>
<li>Firewall rules configured to allow port 5444<br />
</li>
<li>pgAdmin configured to connect to EDB server<br />
</li>
<li>Connectivity tested successfully via psql<br />
</li>
<li>Always use strong passwords for database users<br />
</li>
<li>Restrict pg_hba.conf to specific IPs only<br />
</li>
<li>Monitor logs regularly for security and performance<br />
</li>
</ul>
]]></description>
			<content:encoded><![CDATA[<span style="font-weight: bold;" class="mycode_b">EDB PostgreSQL Advanced Server v15 Setup on Azure RHEL 9.4 with pgAdmin</span><br />
<br />
<span style="font-weight: bold;" class="mycode_b">Overview</span><br />
This guide covers installing and configuring EDB PostgreSQL Advanced Server v15 on Azure RHEL 9.4, setting up systemd service, configuring remote connections and connecting via pgAdmin.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Environment</span><ul class="mycode_list"><li><span style="font-weight: bold;" class="mycode_b">OS:</span> Red Hat Enterprise Linux 9.4 on Azure<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Database:</span> EDB PostgreSQL Advanced Server v15<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Port:</span> 5444<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">pgAdmin:</span> Web-based pgAdmin interface<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Database User:</span> enterprisedb<br />
</li>
</ul>
<br />
<span style="font-weight: bold;" class="mycode_b">Table of Contents</span><ul class="mycode_list"><li>Step 1 - Install EDB PostgreSQL<br />
</li>
<li>Step 2 - Initialize the Database<br />
</li>
<li>Step 3 - Create Systemd Service<br />
</li>
<li>Step 4 - Configure Remote Connections<br />
</li>
<li>Step 5 - Setup Firewall Rules<br />
</li>
<li>Step 6 - Install PostgreSQL Client<br />
</li>
<li>Step 7 - Configure pgAdmin<br />
</li>
<li>Step 8 - Test Connectivity<br />
</li>
</ul>
<br />
<span style="font-weight: bold;" class="mycode_b">Step 1 - Install EDB PostgreSQL Advanced Server</span><br />
<span style="font-style: italic;" class="mycode_i">Run on: Azure RHEL 9.4 Server</span><br />
<br />
Add the EDB repository:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>curl -1sLf 'https://downloads.enterprisedb.com/YOUR_REPO_TOKEN/enterprise/setup.rpm.sh' | sudo -E bash</code></div></div><br />
Install EDB PostgreSQL Advanced Server v15:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>sudo dnf install edb-as15-server</code></div></div><br />
Verify installation:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>/usr/edb/as15/bin/postgres --version</code></div></div><br />
<span style="font-weight: bold;" class="mycode_b">Step 2 - Initialize the Database</span><br />
<span style="font-style: italic;" class="mycode_i">Run on: Azure RHEL 9.4 Server</span><br />
<br />
Create the data directory:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>sudo mkdir -p /usr/edb/as15/data<br />
sudo mkdir -p /usr/edb/as15/logs</code></div></div><br />
Switch to enterprisedb user and initialize:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>sudo su - enterprisedb<br />
/usr/edb/as15/bin/initdb -D /usr/edb/as15/data<br />
exit</code></div></div><br />
<span style="font-weight: bold;" class="mycode_b">Step 3 - Create Systemd Service</span><br />
<span style="font-style: italic;" class="mycode_i">Run on: Azure RHEL 9.4 Server</span><br />
<br />
Create the service file:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>sudo nano /etc/systemd/system/edb-as15.service</code></div></div><br />
Add the following configuration:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>[Unit]<br />
Description=EDB PostgreSQL Advanced Server 15<br />
After=network.target<br />
<br />
[Service]<br />
Type=forking<br />
User=enterprisedb<br />
ExecStart=/usr/edb/as15/bin/pg_ctl -D /usr/edb/as15/data -l /usr/edb/as15/logs/server.log start<br />
ExecStop=/usr/edb/as15/bin/pg_ctl -D /usr/edb/as15/data stop<br />
ExecReload=/usr/edb/as15/bin/pg_ctl -D /usr/edb/as15/data reload<br />
PIDFile=/usr/edb/as15/data/postmaster.pid<br />
<br />
[Install]<br />
WantedBy=multi-user.target</code></div></div><br />
Reload systemd and start service:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>sudo systemctl daemon-reload<br />
sudo systemctl start edb-as15<br />
sudo systemctl enable edb-as15</code></div></div><br />
Verify service status:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>sudo systemctl status edb-as15</code></div></div><br />
Expected output:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>edb-as15.service - EDB PostgreSQL Advanced Server 15<br />
  Active: active (running)</code></div></div><br />
<span style="font-weight: bold;" class="mycode_b">Step 4 - Configure Remote Connections</span><br />
<span style="font-style: italic;" class="mycode_i">Run on: Azure RHEL 9.4 Server</span><br />
<br />
Edit postgresql.conf:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>sudo nano /usr/edb/as15/data/postgresql.conf</code></div></div><br />
Set the following values:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>listen_addresses = '*'<br />
port = 5444</code></div></div><br />
Edit pg_hba.conf to allow remote access:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>sudo nano /usr/edb/as15/data/pg_hba.conf</code></div></div><br />
Add your bastion or client IP:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code># Allow specific IP access<br />
host    all    all    YOUR_BASTION_IP/32    md5<br />
<br />
# Or allow entire subnet<br />
host    all    all    10.170.0.0/24    md5</code></div></div><br />
Reload PostgreSQL to apply changes:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>sudo systemctl reload edb-as15</code></div></div><br />
<span style="font-weight: bold;" class="mycode_b">Step 5 - Setup Firewall Rules</span><br />
<span style="font-style: italic;" class="mycode_i">Run on: Azure RHEL 9.4 Server</span><br />
<br />
Open port 5444 in firewalld:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>sudo firewall-cmd --permanent --add-port=5444/tcp<br />
sudo firewall-cmd --reload</code></div></div><br />
Verify port is open:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>sudo firewall-cmd --list-all</code></div></div><br />
Verify PostgreSQL is listening:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>netstat -tuln | grep 5444</code></div></div><br />
Expected output:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>tcp    0    0 0.0.0.0:5444    0.0.0.0:*    LISTEN</code></div></div><br />
<span style="font-weight: bold;" class="mycode_b">Step 6 - Install PostgreSQL Client</span><br />
<span style="font-style: italic;" class="mycode_i">Run on: Bastion Server</span><br />
<br />
Install psql client:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>sudo dnf install postgresql</code></div></div><br />
Verify client installation:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>psql --version</code></div></div><br />
<span style="font-weight: bold;" class="mycode_b">Step 7 - Configure pgAdmin</span><br />
<span style="font-style: italic;" class="mycode_i">Run on: Web Browser</span><br />
<br />
<span style="font-weight: bold;" class="mycode_b">7.1 Access pgAdmin</span><ul class="mycode_list"><li>Open your pgAdmin URL in browser<br />
</li>
<li>Login with your pgAdmin credentials<br />
</li>
</ul>
<br />
<span style="font-weight: bold;" class="mycode_b">7.2 Add New Server</span><ul class="mycode_list"><li>In left sidebar right-click on <span style="font-weight: bold;" class="mycode_b">Servers</span><br />
</li>
<li>Select <span style="font-weight: bold;" class="mycode_b">Create &gt; Server</span><br />
</li>
</ul>
<br />
<span style="font-weight: bold;" class="mycode_b">7.3 General Tab Settings</span><ul class="mycode_list"><li><span style="font-weight: bold;" class="mycode_b">Name:</span> EDB-Advanced-Server<br />
</li>
</ul>
<br />
<span style="font-weight: bold;" class="mycode_b">7.4 Connection Tab Settings</span><ul class="mycode_list"><li><span style="font-weight: bold;" class="mycode_b">Host name/address:</span> YOUR_EDB_SERVER_IP<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Port:</span> 5444<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Maintenance database:</span> edb<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Username:</span> enterprisedb<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Password:</span> YOUR_ENTERPRISEDB_PASSWORD<br />
</li>
<li>Check Save password if desired<br />
</li>
</ul>
<br />
<span style="font-weight: bold;" class="mycode_b">7.5 Save and Connect</span><ul class="mycode_list"><li>Click <span style="font-weight: bold;" class="mycode_b">Save</span><br />
</li>
<li>Server should appear under Servers in sidebar<br />
</li>
<li>Expand to browse databases<br />
</li>
</ul>
<br />
<span style="font-weight: bold;" class="mycode_b">Step 8 - Test Connectivity</span><br />
<span style="font-style: italic;" class="mycode_i">Run on: Bastion Server</span><br />
<br />
Test connection using psql:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>psql -h YOUR_EDB_SERVER_IP -p 5444 -U enterprisedb -d edb</code></div></div><br />
If successful you will see the psql prompt:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>edb=#</code></div></div><br />
Test basic query:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>SELECT version();<br />
&#92;l<br />
&#92;du<br />
&#92;q</code></div></div><br />
<span style="font-weight: bold;" class="mycode_b">Troubleshooting</span><ul class="mycode_list"><li><span style="font-weight: bold;" class="mycode_b">Connection refused:</span> Check firewall rules and port 5444 is open<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Auth failed:</span> Verify pg_hba.conf has correct IP and auth method<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Service not starting:</span> Check logs at /usr/edb/as15/logs/server.log<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">pgAdmin can't connect:</span> Verify network connectivity between pgAdmin and EDB server<br />
</li>
</ul>
<br />
Check service logs:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>sudo journalctl -u edb-as15 -f<br />
tail -f /usr/edb/as15/logs/server.log</code></div></div><br />
<span style="font-weight: bold;" class="mycode_b">Additional Resources</span><ul class="mycode_list"><li>pgAdmin Documentation: <a href="https://www.pgadmin.org/docs/" target="_blank" rel="noopener" class="mycode_url">https://www.pgadmin.org/docs/</a><br />
</li>
<li>EDB Documentation: <a href="https://www.enterprisedb.com/docs/" target="_blank" rel="noopener" class="mycode_url">https://www.enterprisedb.com/docs/</a><br />
</li>
<li>EDB PostgreSQL Advanced Server v15 Release Notes<br />
</li>
</ul>
<br />
<span style="font-weight: bold;" class="mycode_b">Summary</span><ul class="mycode_list"><li>EDB PostgreSQL Advanced Server v15 installed on Azure RHEL 9.4<br />
</li>
<li>Database initialized and systemd service created<br />
</li>
<li>Remote connections configured on port 5444<br />
</li>
<li>Firewall rules configured to allow port 5444<br />
</li>
<li>pgAdmin configured to connect to EDB server<br />
</li>
<li>Connectivity tested successfully via psql<br />
</li>
<li>Always use strong passwords for database users<br />
</li>
<li>Restrict pg_hba.conf to specific IPs only<br />
</li>
<li>Monitor logs regularly for security and performance<br />
</li>
</ul>
]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[NGINX Ingress + cert-manager + Let's Encrypt Setup on AKS Cluster]]></title>
			<link>https://forums.geekssolutions.io/showthread.php?tid=11</link>
			<pubDate>Tue, 07 Apr 2026 09:34:59 +0530</pubDate>
			<dc:creator><![CDATA[<a href="https://forums.geekssolutions.io/member.php?action=profile&uid=1">santosh</a>]]></dc:creator>
			<guid isPermaLink="false">https://forums.geekssolutions.io/showthread.php?tid=11</guid>
			<description><![CDATA[<span style="font-weight: bold;" class="mycode_b">NGINX Ingress + cert-manager + Let's Encrypt Setup on AKS Cluster</span><br />
<br />
<span style="font-weight: bold;" class="mycode_b">Overview</span><br />
This guide covers installing NGINX Ingress Controller, cert-manager and Let's Encrypt ClusterIssuer on Azure Kubernetes Service (AKS). This is specifically configured for AKS single-node clusters with CriticalAddonsOnly=true taint.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Environment</span><ul class="mycode_list"><li><span style="font-weight: bold;" class="mycode_b">Platform:</span> Azure Kubernetes Service (AKS)<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Ingress:</span> NGINX Ingress Controller<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">TLS:</span> cert-manager with Let's Encrypt<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Node Taint:</span> CriticalAddonsOnly=true<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">OS:</span> Linux nodes<br />
</li>
</ul>
<br />
<span style="font-weight: bold;" class="mycode_b">Prerequisites</span><ul class="mycode_list"><li>kubectl installed and configured<br />
</li>
<li>Helm v3 installed<br />
</li>
<li>AKS cluster running and accessible<br />
</li>
<li>Domain names pointed to cluster external IP<br />
</li>
<li>Valid email address for Let's Encrypt notifications<br />
</li>
</ul>
<br />
<span style="font-weight: bold;" class="mycode_b">Step 1 - Add Helm Repositories</span><br />
<span style="font-style: italic;" class="mycode_i">Run on: Local machine or CI/CD pipeline</span><br />
<br />
Add required Helm repos:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx<br />
helm repo add jetstack https://charts.jetstack.io<br />
helm repo update</code></div></div><br />
Verify repos added:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>helm repo list</code></div></div><br />
<span style="font-weight: bold;" class="mycode_b">Step 2 - Install NGINX Ingress Controller</span><br />
<span style="font-style: italic;" class="mycode_i">Run on: Local machine with kubectl access</span><br />
<br />
Create namespace:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>kubectl create namespace ingress-basic</code></div></div><br />
Install NGINX Ingress with tolerations for CriticalAddonsOnly taint:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>helm upgrade --install ingress-nginx ingress-nginx/ingress-nginx &#92;<br />
  --namespace ingress-basic &#92;<br />
  --set controller.nodeSelector."kubernetes&#92;.io/os"=linux &#92;<br />
  --set controller.tolerations[0].key="CriticalAddonsOnly" &#92;<br />
  --set controller.tolerations[0].operator="Exists" &#92;<br />
  --set controller.admissionWebhooks.patch.nodeSelector."kubernetes&#92;.io/os"=linux &#92;<br />
  --set controller.admissionWebhooks.patch.tolerations[0].key="CriticalAddonsOnly" &#92;<br />
  --set controller.admissionWebhooks.patch.tolerations[0].operator="Exists"</code></div></div><br />
Check Ingress Controller status:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>kubectl get svc -n ingress-basic<br />
kubectl get pods -n ingress-basic</code></div></div><br />
Expected output:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>NAME                                TYPE          CLUSTER-IP    EXTERNAL-IP      PORT(S)<br />
ingress-nginx-controller            LoadBalancer  10.0.x.x      YOUR_EXTERNAL_IP 80:xxx/TCP,443:xxx/TCP</code></div></div><br />
<span style="font-weight: bold;" class="mycode_b">Important:</span> Copy the EXTERNAL-IP and point your domain DNS records to it.<br />
Example: yourdomain.com -&gt; YOUR_EXTERNAL_IP<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Step 3 - Install cert-manager</span><br />
<span style="font-style: italic;" class="mycode_i">Run on: Local machine with kubectl access</span><br />
<br />
Create namespace:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>kubectl create namespace cert-manager</code></div></div><br />
Install cert-manager with CRDs and tolerations:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>helm install cert-manager jetstack/cert-manager &#92;<br />
  --namespace cert-manager &#92;<br />
  --set installCRDs=true &#92;<br />
  --set nodeSelector."kubernetes&#92;.io/os"=linux &#92;<br />
  --set tolerations[0].key="CriticalAddonsOnly" &#92;<br />
  --set tolerations[0].operator="Exists" &#92;<br />
  --set cainjector.nodeSelector."kubernetes&#92;.io/os"=linux &#92;<br />
  --set cainjector.tolerations[0].key="CriticalAddonsOnly" &#92;<br />
  --set cainjector.tolerations[0].operator="Exists" &#92;<br />
  --set webhook.nodeSelector."kubernetes&#92;.io/os"=linux &#92;<br />
  --set webhook.tolerations[0].key="CriticalAddonsOnly" &#92;<br />
  --set webhook.tolerations[0].operator="Exists" &#92;<br />
  --set startupapicheck.tolerations[0].key="CriticalAddonsOnly" &#92;<br />
  --set startupapicheck.tolerations[0].operator="Exists" &#92;<br />
  --set startupapicheck.nodeSelector."kubernetes&#92;.io/os"=linux</code></div></div><br />
Verify all cert-manager pods are running:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>kubectl get pods -n cert-manager</code></div></div><br />
Expected outpu]]></description>
			<content:encoded><![CDATA[<span style="font-weight: bold;" class="mycode_b">NGINX Ingress + cert-manager + Let's Encrypt Setup on AKS Cluster</span><br />
<br />
<span style="font-weight: bold;" class="mycode_b">Overview</span><br />
This guide covers installing NGINX Ingress Controller, cert-manager and Let's Encrypt ClusterIssuer on Azure Kubernetes Service (AKS). This is specifically configured for AKS single-node clusters with CriticalAddonsOnly=true taint.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Environment</span><ul class="mycode_list"><li><span style="font-weight: bold;" class="mycode_b">Platform:</span> Azure Kubernetes Service (AKS)<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Ingress:</span> NGINX Ingress Controller<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">TLS:</span> cert-manager with Let's Encrypt<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Node Taint:</span> CriticalAddonsOnly=true<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">OS:</span> Linux nodes<br />
</li>
</ul>
<br />
<span style="font-weight: bold;" class="mycode_b">Prerequisites</span><ul class="mycode_list"><li>kubectl installed and configured<br />
</li>
<li>Helm v3 installed<br />
</li>
<li>AKS cluster running and accessible<br />
</li>
<li>Domain names pointed to cluster external IP<br />
</li>
<li>Valid email address for Let's Encrypt notifications<br />
</li>
</ul>
<br />
<span style="font-weight: bold;" class="mycode_b">Step 1 - Add Helm Repositories</span><br />
<span style="font-style: italic;" class="mycode_i">Run on: Local machine or CI/CD pipeline</span><br />
<br />
Add required Helm repos:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx<br />
helm repo add jetstack https://charts.jetstack.io<br />
helm repo update</code></div></div><br />
Verify repos added:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>helm repo list</code></div></div><br />
<span style="font-weight: bold;" class="mycode_b">Step 2 - Install NGINX Ingress Controller</span><br />
<span style="font-style: italic;" class="mycode_i">Run on: Local machine with kubectl access</span><br />
<br />
Create namespace:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>kubectl create namespace ingress-basic</code></div></div><br />
Install NGINX Ingress with tolerations for CriticalAddonsOnly taint:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>helm upgrade --install ingress-nginx ingress-nginx/ingress-nginx &#92;<br />
  --namespace ingress-basic &#92;<br />
  --set controller.nodeSelector."kubernetes&#92;.io/os"=linux &#92;<br />
  --set controller.tolerations[0].key="CriticalAddonsOnly" &#92;<br />
  --set controller.tolerations[0].operator="Exists" &#92;<br />
  --set controller.admissionWebhooks.patch.nodeSelector."kubernetes&#92;.io/os"=linux &#92;<br />
  --set controller.admissionWebhooks.patch.tolerations[0].key="CriticalAddonsOnly" &#92;<br />
  --set controller.admissionWebhooks.patch.tolerations[0].operator="Exists"</code></div></div><br />
Check Ingress Controller status:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>kubectl get svc -n ingress-basic<br />
kubectl get pods -n ingress-basic</code></div></div><br />
Expected output:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>NAME                                TYPE          CLUSTER-IP    EXTERNAL-IP      PORT(S)<br />
ingress-nginx-controller            LoadBalancer  10.0.x.x      YOUR_EXTERNAL_IP 80:xxx/TCP,443:xxx/TCP</code></div></div><br />
<span style="font-weight: bold;" class="mycode_b">Important:</span> Copy the EXTERNAL-IP and point your domain DNS records to it.<br />
Example: yourdomain.com -&gt; YOUR_EXTERNAL_IP<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Step 3 - Install cert-manager</span><br />
<span style="font-style: italic;" class="mycode_i">Run on: Local machine with kubectl access</span><br />
<br />
Create namespace:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>kubectl create namespace cert-manager</code></div></div><br />
Install cert-manager with CRDs and tolerations:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>helm install cert-manager jetstack/cert-manager &#92;<br />
  --namespace cert-manager &#92;<br />
  --set installCRDs=true &#92;<br />
  --set nodeSelector."kubernetes&#92;.io/os"=linux &#92;<br />
  --set tolerations[0].key="CriticalAddonsOnly" &#92;<br />
  --set tolerations[0].operator="Exists" &#92;<br />
  --set cainjector.nodeSelector."kubernetes&#92;.io/os"=linux &#92;<br />
  --set cainjector.tolerations[0].key="CriticalAddonsOnly" &#92;<br />
  --set cainjector.tolerations[0].operator="Exists" &#92;<br />
  --set webhook.nodeSelector."kubernetes&#92;.io/os"=linux &#92;<br />
  --set webhook.tolerations[0].key="CriticalAddonsOnly" &#92;<br />
  --set webhook.tolerations[0].operator="Exists" &#92;<br />
  --set startupapicheck.tolerations[0].key="CriticalAddonsOnly" &#92;<br />
  --set startupapicheck.tolerations[0].operator="Exists" &#92;<br />
  --set startupapicheck.nodeSelector."kubernetes&#92;.io/os"=linux</code></div></div><br />
Verify all cert-manager pods are running:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>kubectl get pods -n cert-manager</code></div></div><br />
Expected outpu]]></content:encoded>
		</item>
	</channel>
</rss>