<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Bikiran Blogs]]></title><description><![CDATA[bikiran]]></description><link>https://blog.bikiran.com</link><image><url>https://cdn.hashnode.com/res/hashnode/image/upload/v1747129064519/f3f80d86-e80e-4cf5-aa9c-4972256206c4.png</url><title>Bikiran Blogs</title><link>https://blog.bikiran.com</link></image><generator>RSS for Node</generator><lastBuildDate>Tue, 07 Apr 2026 10:00:05 GMT</lastBuildDate><atom:link href="https://blog.bikiran.com/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[DriveCLI — Manage Google Drive From Your Terminal]]></title><description><![CDATA[Why Another Google Drive Tool?
Google Drive is great — until you need to manage files on a remote server, automate uploads in a script, or just prefer working in a terminal. The web UI doesn't help wh]]></description><link>https://blog.bikiran.com/drivecli-manage-google-drive-from-your-terminal</link><guid isPermaLink="true">https://blog.bikiran.com/drivecli-manage-google-drive-from-your-terminal</guid><category><![CDATA[googe]]></category><category><![CDATA[Google Drive]]></category><category><![CDATA[cli]]></category><category><![CDATA[drive]]></category><dc:creator><![CDATA[KUMAR BISHOJIT]]></dc:creator><pubDate>Mon, 23 Mar 2026 05:34:22 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/6822dc3534fa475ed9fb2d80/90da2ddf-284c-489f-ad24-956a81102b37.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2>Why Another Google Drive Tool?</h2>
<p>Google Drive is great — until you need to manage files on a remote server, automate uploads in a script, or just prefer working in a terminal. The web UI doesn't help when you're SSH'd into a Linux box, and the official desktop client isn't designed for automation or headless environments.</p>
<p>That's why I built <strong>DriveCLI</strong> — a single-binary command-line tool that brings Google Drive directly into your terminal. No installation wizards, no runtime dependencies, no GUI required.</p>
<hr />
<h2>What Is DriveCLI?</h2>
<p>DriveCLI is an open-source Google Drive CLI written in C# on <strong>.NET 9</strong>. It compiles to a <strong>single self-contained executable</strong> that runs on Windows, Linux, and macOS — you just download one file and start using it.</p>
<p>It covers the operations you use most:</p>
<ul>
<li><p><strong>Authentication</strong> — OAuth 2.0 with browser-based and manual code-paste flows</p>
</li>
<li><p><strong>Browse &amp; Search</strong> — List folders, search files by name or MIME type</p>
</li>
<li><p><strong>Upload &amp; Download</strong> — With real-time progress bars, transfer speed, and ETA</p>
</li>
<li><p><strong>File Management</strong> — Move, rename, trash, permanently delete, and share files</p>
</li>
<li><p><strong>Background Transfers</strong> — Uploads and downloads continue even if you close the terminal</p>
</li>
</ul>
<hr />
<h2>Key Features</h2>
<h3>Single Binary, Zero Dependencies</h3>
<p>DriveCLI ships as one executable file. There's no .NET runtime to install, no package manager to configure. Download it, put it on your PATH, and you're ready to go.</p>
<h3>Works Over SSH and Headless Servers</h3>
<p>DriveCLI auto-detects headless environments (no display server, SSH sessions, containers) and switches to a manual code-paste authentication flow. You can authenticate from any device with a browser — even your phone — and paste the code back into your terminal.</p>
<pre><code class="language-bash">drivecli login --manual
</code></pre>
<h3>Resumable Uploads</h3>
<p>Large file uploads use Google Drive's <strong>resumable upload protocol</strong>, sending data in 1 MB chunks. If the connection drops, the upload can resume from where it left off instead of starting over.</p>
<h3>MD5 Integrity Verification</h3>
<p>Every file transfer — upload or download — is verified against Google Drive's stored MD5 checksum. If something goes wrong during transfer, you'll know immediately.</p>
<h3>Background Transfers</h3>
<p>When you start an upload or download, DriveCLI spawns a background worker process. Press <strong>Ctrl+C</strong> or close the terminal, and the transfer keeps running. Check on it anytime:</p>
<pre><code class="language-bash">drivecli ps           # List all active transfers
drivecli ps aae34     # Inspect a specific transfer
drivecli ps-stop aae34  # Cancel a transfer
</code></pre>
<h3>Rich Terminal UI</h3>
<p>Built with <strong>Spectre.Console</strong>, DriveCLI renders formatted tables, progress bars with speed and ETA, icons, and colour — making the terminal experience pleasant and informative.</p>
<h3>JSON Output for Scripting</h3>
<p>Every listing command supports <code>--json</code> output, making it easy to pipe results into <code>jq</code>, scripts, or other tools:</p>
<pre><code class="language-bash">drivecli ls --json | jq '.[].name'
drivecli find "report" --json
</code></pre>
<hr />
<h2>Quick Start</h2>
<h3>1. Set Up Google Cloud Credentials</h3>
<ol>
<li><p>Go to the <a href="https://console.cloud.google.com/">Google Cloud Console</a></p>
</li>
<li><p>Create a project and enable the <strong>Google Drive API</strong></p>
</li>
<li><p>Create an <strong>OAuth 2.0 Desktop</strong> client credential</p>
</li>
<li><p>Copy the <strong>Client ID</strong> and <strong>Client Secret</strong></p>
</li>
</ol>
<h3>2. Install DriveCLI</h3>
<p>Download the binary for your platform from the <a href="https://github.com/bishojit/DriveCLI/releases">GitHub releases page</a> and add it to your PATH.</p>
<p>Or build from source:</p>
<pre><code class="language-bash">git clone https://github.com/bishojit/DriveCLI.git
cd DriveCLI
dotnet build
</code></pre>
<h3>3. Sign In</h3>
<pre><code class="language-bash">drivecli login
</code></pre>
<p>Enter your Client ID and Secret when prompted. Your browser opens for Google authorization. Once approved, you're authenticated — no need to log in again unless you explicitly log out.</p>
<h3>4. Start Using It</h3>
<pre><code class="language-bash"># List your Drive files
drivecli ls

# Search for a file
drivecli find "quarterly-report"

# Upload a file
drivecli upload ./presentation.pptx

# Upload an entire folder
drivecli upload ./project-files --recursive

# Download a file
drivecli download FILE_ID --output ./downloads

# Share a file
drivecli share FILE_ID
</code></pre>
<hr />
<h2>Full Command Reference</h2>
<table>
<thead>
<tr>
<th>Command</th>
<th>Description</th>
</tr>
</thead>
<tbody><tr>
<td><code>drivecli login</code></td>
<td>Sign in (browser-based or manual flow)</td>
</tr>
<tr>
<td><code>drivecli logout</code></td>
<td>Revoke tokens and clear credentials</td>
</tr>
<tr>
<td><code>drivecli ls [folder-id]</code></td>
<td>List files in a folder</td>
</tr>
<tr>
<td><code>drivecli find &lt;query&gt;</code></td>
<td>Search files by name</td>
</tr>
<tr>
<td><code>drivecli upload &lt;path&gt;</code></td>
<td>Upload a file or folder</td>
</tr>
<tr>
<td><code>drivecli download &lt;id&gt;</code></td>
<td>Download a file or folder</td>
</tr>
<tr>
<td><code>drivecli mv &lt;id&gt; &lt;folder-id&gt;</code></td>
<td>Move a file</td>
</tr>
<tr>
<td><code>drivecli rename &lt;id&gt; &lt;name&gt;</code></td>
<td>Rename a file or folder</td>
</tr>
<tr>
<td><code>drivecli rm &lt;id&gt;</code></td>
<td>Trash or permanently delete</td>
</tr>
<tr>
<td><code>drivecli share &lt;id&gt;</code></td>
<td>Generate a shareable link</td>
</tr>
<tr>
<td><code>drivecli ps</code></td>
<td>List background transfers</td>
</tr>
<tr>
<td><code>drivecli ps-stop &lt;id&gt;</code></td>
<td>Stop a background transfer</td>
</tr>
</tbody></table>
<hr />
<h2>Built With</h2>
<table>
<thead>
<tr>
<th>Component</th>
<th>Technology</th>
</tr>
</thead>
<tbody><tr>
<td>Language</td>
<td>C# / .NET 9</td>
</tr>
<tr>
<td>Google Drive API</td>
<td>Google.Apis.Drive.v3</td>
</tr>
<tr>
<td>CLI Framework</td>
<td>Spectre.Console.Cli</td>
</tr>
<tr>
<td>Terminal Rendering</td>
<td>Spectre.Console</td>
</tr>
<tr>
<td>Authentication</td>
<td>Google.Apis.Auth (OAuth 2.0)</td>
</tr>
<tr>
<td>Distribution</td>
<td>Trimmed, self-contained single-file binary</td>
</tr>
</tbody></table>
<hr />
<h2>Who Is This For?</h2>
<ul>
<li><p><strong>Developers</strong> who manage files on remote servers via SSH</p>
</li>
<li><p><strong>DevOps / SysAdmins</strong> who need automated Drive backups or deployments</p>
</li>
<li><p><strong>Power users</strong> who prefer the terminal over browser-based file management</p>
</li>
<li><p><strong>Anyone</strong> who wants a lightweight, portable Google Drive client without heavy desktop apps</p>
</li>
</ul>
<hr />
<h2>Open Source</h2>
<p>DriveCLI is open source under the <strong>MIT License</strong>. Contributions, issues, and feature requests are welcome.</p>
<ul>
<li><strong>GitHub:</strong> <a href="https://github.com/bishojit/DriveCLI">https://github.com/bishojit/DriveCLI</a></li>
</ul>
<hr />
<h2>What's Next?</h2>
<p>I'm actively working on DriveCLI and plan to add more features based on community feedback. If you have ideas or run into issues, feel free to open an issue on GitHub.</p>
<p>Give it a try, and let me know what you think!</p>
<hr />
<h2>🏢 About Bikiran</h2>
<p><strong><a href="https://bikiran.com/">Bikiran</a></strong> is a software development and cloud infrastructure company founded in 2012, headquartered in Khulna, Bangladesh. With 15,000+ clients and over a decade of experience, Bikiran builds and operates a suite of products spanning domain services, cloud hosting, app deployment, workflow automation, and developer tools.</p>
<table>
<thead>
<tr>
<th>SL</th>
<th>Topic</th>
<th>Product</th>
<th>Description</th>
</tr>
</thead>
<tbody><tr>
<td>1</td>
<td>Website</td>
<td><a href="https://bikiran.com/">Bikiran</a></td>
<td>Main platform — Domain, hosting &amp; cloud services</td>
</tr>
<tr>
<td>2</td>
<td>Website</td>
<td><a href="https://www.edusoft.com.bd/">Edusoft</a></td>
<td>Education management software for institutions</td>
</tr>
<tr>
<td>3</td>
<td>Website</td>
<td><a href="https://n8nclouds.com/">n8n Clouds</a></td>
<td>Managed n8n workflow automation hosting</td>
</tr>
<tr>
<td>4</td>
<td>Website</td>
<td><a href="https://www.timestamp.zone/">Timestamp Zone</a></td>
<td>Unix timestamp converter &amp; timezone tool</td>
</tr>
<tr>
<td>5</td>
<td>Website</td>
<td><a href="https://pdfpi.bikiran.com/">PDFpi</a></td>
<td>Online PDF processing &amp; manipulation tool</td>
</tr>
<tr>
<td>6</td>
<td>Website</td>
<td><a href="https://blog.bikiran.com/">Blog</a></td>
<td>Technical articles, guides &amp; tutorials</td>
</tr>
<tr>
<td>7</td>
<td>Website</td>
<td><a href="https://support.bikiran.com/">Support</a></td>
<td>24/7 customer support portal</td>
</tr>
<tr>
<td>8</td>
<td>Website</td>
<td><a href="https://probackup.bikiran.com/">Probackup</a></td>
<td>Automated database backup for SQL, PostgreSQL &amp; MongoDB</td>
</tr>
<tr>
<td>9</td>
<td>Service</td>
<td><a href="https://www.bikiran.com/domain">Domain</a></td>
<td>Domain registration, transfer &amp; DNS management</td>
</tr>
<tr>
<td>10</td>
<td>Service</td>
<td><a href="https://www.bikiran.com/services/hosting/web">Hosting</a></td>
<td>Web, app &amp; email hosting on NVMe SSD</td>
</tr>
<tr>
<td>11</td>
<td>Service</td>
<td>Email &amp; SMS</td>
<td>Bulk email &amp; SMS notification service</td>
</tr>
<tr>
<td>12</td>
<td>npm</td>
<td><a href="https://www.npmjs.com/package/@bikiran/chronopick">Chronopick</a></td>
<td>Date &amp; time picker React component</td>
</tr>
<tr>
<td>13</td>
<td>npm</td>
<td><a href="https://www.npmjs.com/package/@bikiran/editor">Rich Editor</a></td>
<td>WYSIWYG rich text editor for React</td>
</tr>
<tr>
<td>14</td>
<td>npm</td>
<td><a href="https://www.npmjs.com/package/@bikiran/button">Button</a></td>
<td>Reusable React button component library</td>
</tr>
<tr>
<td>15</td>
<td>npm</td>
<td><a href="https://www.npmjs.com/package/create-edx-app">Electron Boilerplate</a></td>
<td>CLI to scaffold Electron.js project templates</td>
</tr>
<tr>
<td>16</td>
<td>NuGet</td>
<td><a href="https://www.nuget.org/packages/Bikiran.Payment.Bkash">Bkash</a></td>
<td>bKash payment gateway integration for .NET</td>
</tr>
<tr>
<td>17</td>
<td>NuGet</td>
<td><a href="https://www.nuget.org/packages/Bikiran.Engine">Bikiran Engine</a></td>
<td>Core .NET engine library for Bikiran services</td>
</tr>
<tr>
<td>18</td>
<td>Open Source</td>
<td><a href="https://github.com/bikirandev/pdfpi">PDFpi</a></td>
<td>PDF processing tool — open source</td>
</tr>
<tr>
<td>19</td>
<td>Open Source</td>
<td><a href="https://github.com/bikirandev/Bikiran.Engine">Bikiran Engine</a></td>
<td>Core .NET engine — open source</td>
</tr>
<tr>
<td>20</td>
<td>Open Source</td>
<td><a href="https://github.com/bikirandev/DriveCLI">Drive CLI</a></td>
<td>CLI tool to manage Google Drive from terminal</td>
</tr>
<tr>
<td>21</td>
<td>Docker</td>
<td><a href="https://github.com/bikirandev/docker-pgsql">Pgsql</a></td>
<td>Docker setup for PostgreSQL</td>
</tr>
<tr>
<td>22</td>
<td>Docker</td>
<td><a href="https://github.com/bikirandev/docker-n8n">n8n</a></td>
<td>Docker setup for n8n automation</td>
</tr>
<tr>
<td>23</td>
<td>Docker</td>
<td><a href="https://github.com/bikirandev/docker-pgadmin">Pgadmin</a></td>
<td>Docker setup for pgAdmin</td>
</tr>
<tr>
<td>24</td>
<td>Social Media</td>
<td><a href="https://www.linkedin.com/company/bikiran12">LinkedIn</a></td>
<td>Bikiran on LinkedIn</td>
</tr>
<tr>
<td>25</td>
<td>Social Media</td>
<td><a href="https://www.facebook.com/bikiran12">Facebook</a></td>
<td>Bikiran on Facebook</td>
</tr>
<tr>
<td>26</td>
<td>Social Media</td>
<td><a href="https://www.youtube.com/@bikiranofficial">YouTube</a></td>
<td>Bikiran on YouTube</td>
</tr>
<tr>
<td>27</td>
<td>Social Media</td>
<td><a href="https://www.facebook.com/n8nclouds">FB n8nClouds</a></td>
<td>n8n Clouds on Facebook</td>
</tr>
</tbody></table>
]]></content:encoded></item><item><title><![CDATA[IMAP vs POP3 Explained: Which Email Protocol Should You Use and How to Configure]]></title><description><![CDATA[Email remains a fundamental tool for communication, and understanding how your email client retrieves messages from the server can help you make the best choice for your needs. The two most common pro]]></description><link>https://blog.bikiran.com/imap-vs-pop3-explained-which-email-protocol-should-you-use-and-how-to-configure</link><guid isPermaLink="true">https://blog.bikiran.com/imap-vs-pop3-explained-which-email-protocol-should-you-use-and-how-to-configure</guid><dc:creator><![CDATA[KUMAR BISHOJIT]]></dc:creator><pubDate>Sun, 17 Aug 2025 05:53:03 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/uGcDWKN91Fs/upload/cb1e12b4b7d771bc04e300cfe3bdb068.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Email remains a fundamental tool for communication, and understanding how your email client retrieves messages from the server can help you make the best choice for your needs. The two most common protocols for retrieving mail are <strong>IMAP</strong> (Internet Message Access Protocol) and <strong>POP3</strong> (Post Office Protocol version 3). This post explains their differences, provides configuration guides, and offers recommendations for typical use cases.</p>
<hr />
<h2><strong>What is IMAP?</strong></h2>
<p><strong>IMAP</strong> allows you to access emails directly on the mail server. When you read, move, or delete an email in your client (like Outlook, Thunderbird, or a mobile app), those actions are reflected on the server and thus on all other devices accessing that account.</p>
<h3><strong>Key Features of IMAP</strong></h3>
<ul>
<li><p><strong>Synchronizes emails across all devices</strong></p>
</li>
<li><p><strong>Emails stored on the server</strong>: No need to worry about losing messages if your device fails</p>
</li>
<li><p><strong>Folders and organization</strong>: Create, rename, and delete folders that sync everywhere</p>
</li>
<li><p><strong>Partial downloads</strong>: Quickly preview emails without downloading attachments</p>
</li>
</ul>
<hr />
<h2><strong>What is POP3?</strong></h2>
<p><strong>POP3</strong> downloads emails from the server to your device and often removes them from the server (though some clients let you leave a copy on the server). Your email client becomes the main (sometimes only) place to store your messages.</p>
<h3><strong>Key Features of POP3</strong></h3>
<ul>
<li><p><strong>Emails stored locally</strong>: Once downloaded, emails are on your device</p>
</li>
<li><p><strong>Limited server storage needs</strong></p>
</li>
<li><p><strong>No synchronization of read/unread status or folders across devices</strong></p>
</li>
<li><p><strong>Ideal for single-device access</strong>: Not recommended if you check mail on multiple devices</p>
</li>
</ul>
<hr />
<h2><strong>IMAP vs. POP3: Feature Comparison</strong></h2>
<table>
<thead>
<tr>
<th><strong>Feature</strong></th>
<th><strong>IMAP</strong></th>
<th><strong>POP3</strong></th>
</tr>
</thead>
<tbody><tr>
<td><strong>Storage</strong></td>
<td>Server</td>
<td>Local device</td>
</tr>
<tr>
<td><strong>Sync across devices</strong></td>
<td>Yes</td>
<td>No</td>
</tr>
<tr>
<td><strong>Multiple devices</strong></td>
<td>Fully supported</td>
<td>Not ideal</td>
</tr>
<tr>
<td><strong>Folders</strong></td>
<td>Supported</td>
<td>Not supported</td>
</tr>
<tr>
<td><strong>Offline access</strong></td>
<td>Cached (recent mail available)</td>
<td>Full access to downloaded mail</td>
</tr>
<tr>
<td><strong>Recommended for</strong></td>
<td>Users with multiple devices</td>
<td>Users with one device</td>
</tr>
</tbody></table>
<hr />
<h2><strong>Which Protocol Should You Use?</strong></h2>
<h3><strong>Recommended: IMAP</strong></h3>
<ul>
<li><p><strong>Best for:</strong> Anyone who uses multiple devices (phone, tablet, laptop, webmail)</p>
</li>
<li><p><strong>Why:</strong> Keeps your inbox organized and consistent everywhere. If you lose a device, your emails are still safe on the server.</p>
</li>
</ul>
<h3><strong>When to Use POP3</strong></h3>
<ul>
<li><p><strong>Best for:</strong> Users with limited server storage or those who only check email on one device</p>
</li>
<li><p><strong>Why:</strong> Downloads and removes emails from the server, freeing up server space. However, you risk losing emails if your device fails.</p>
</li>
</ul>
<hr />
<h2><strong>How to Configure IMAP and POP3</strong></h2>
<p>Below are general settings for most email providers. Always check your provider's help pages for specifics.</p>
<h3><strong>IMAP Configuration</strong></h3>
<table>
<thead>
<tr>
<th><strong>Setting</strong></th>
<th><strong>Value</strong></th>
</tr>
</thead>
<tbody><tr>
<td><strong>Incoming Server</strong></td>
<td>(Your provider’s IMAP server, e.g., <a href="http://imap.example.com">imap.example.com</a>)</td>
</tr>
<tr>
<td><strong>Port</strong></td>
<td>993 (SSL/TLS)</td>
</tr>
<tr>
<td><strong>Encryption</strong></td>
<td>SSL/TLS</td>
</tr>
<tr>
<td><strong>Username</strong></td>
<td>Your full email address</td>
</tr>
<tr>
<td><strong>Password</strong></td>
<td>Your email password</td>
</tr>
</tbody></table>
<h3><strong>POP3 Configuration</strong></h3>
<table>
<thead>
<tr>
<th><strong>Setting</strong></th>
<th><strong>Value</strong></th>
</tr>
</thead>
<tbody><tr>
<td><strong>Incoming Server</strong></td>
<td>(Your provider’s POP3 server, e.g., <a href="http://pop.example.com">pop.example.com</a>)</td>
</tr>
<tr>
<td><strong>Port</strong></td>
<td>995 (SSL/TLS)</td>
</tr>
<tr>
<td><strong>Encryption</strong></td>
<td>SSL/TLS</td>
</tr>
<tr>
<td><strong>Username</strong></td>
<td>Your full email address</td>
</tr>
<tr>
<td><strong>Password</strong></td>
<td>Your email password</td>
</tr>
</tbody></table>
<h3><strong>Outgoing (SMTP) Configuration (For Both)</strong></h3>
<table>
<thead>
<tr>
<th><strong>Setting</strong></th>
<th><strong>Value</strong></th>
</tr>
</thead>
<tbody><tr>
<td><strong>Outgoing Server</strong></td>
<td>(Your provider’s SMTP server, e.g., <a href="http://smtp.example.com">smtp.example.com</a>)</td>
</tr>
<tr>
<td><strong>Port</strong></td>
<td>587 (STARTTLS) or 465 (SSL)</td>
</tr>
<tr>
<td><strong>Encryption</strong></td>
<td>STARTTLS or SSL/TLS</td>
</tr>
<tr>
<td><strong>Username</strong></td>
<td>Your full email address</td>
</tr>
<tr>
<td><strong>Password</strong></td>
<td>Your email password</td>
</tr>
</tbody></table>
<hr />
<h2><strong>Step-by-Step Guide: Setting Up in Outlook</strong></h2>
<ol>
<li><p><strong>Open Outlook</strong> and go to <strong>File</strong> &gt; <strong>Account Settings</strong> &gt; <strong>Add Account</strong>.</p>
</li>
<li><p>Choose <strong>Manual setup or additional server types</strong>.</p>
</li>
<li><p>Select <strong>IMAP</strong> or <strong>POP</strong> according to your preference.</p>
</li>
<li><p>Enter your name and email address.</p>
</li>
<li><p>For <strong>Incoming mail server</strong>, enter the IMAP or POP3 server (see configuration tables above).</p>
</li>
<li><p>For <strong>Outgoing mail server (SMTP)</strong>, enter the SMTP server.</p>
</li>
<li><p>Enter your full email address as the username and your password.</p>
</li>
<li><p>Click <strong>More Settings</strong>:</p>
<ul>
<li><p>Under the <strong>Outgoing Server</strong> tab, check “My outgoing server (SMTP) requires authentication.”</p>
</li>
<li><p>Under the <strong>Advanced</strong> tab, enter the correct ports and select SSL/TLS as the encryption type.</p>
</li>
</ul>
</li>
<li><p>Click <strong>OK</strong>, then <strong>Next</strong> to test the settings.</p>
</li>
<li><p>Click <strong>Finish</strong> if the test is successful.</p>
</li>
</ol>
<hr />
<h2><strong>Summary</strong></h2>
<ul>
<li><p><strong>IMAP</strong> is recommended for most users, especially if you use multiple devices.</p>
</li>
<li><p><strong>POP3</strong> is suitable for users needing local storage or with limited server space.</p>
</li>
<li><p>Always use secure ports and encryption (SSL/TLS) for safety.</p>
</li>
<li><p>Double-check your provider’s documentation for server addresses and settings.</p>
</li>
</ul>
<p>If you have any questions or need help troubleshooting your mail setup, leave a comment below!</p>
<h3>CONTACT:</h3>
<p>I’m Kumar Bishojit Paul, the Founder and CEO of <a href="https://www.bikiran.com/">BIKIRAN</a>. If you need further assistance, please leave a comment. I’m interested in helping you.</p>
<hr />
<h2>🏢 About Bikiran</h2>
<p><strong><a href="https://bikiran.com/">Bikiran</a></strong> is a software development and cloud infrastructure company founded in 2012, headquartered in Khulna, Bangladesh. With 15,000+ clients and over a decade of experience, Bikiran builds and operates a suite of products spanning domain services, cloud hosting, app deployment, workflow automation, and developer tools.</p>
<table>
<thead>
<tr>
<th>SL</th>
<th>Topic</th>
<th>Product</th>
<th>Description</th>
</tr>
</thead>
<tbody><tr>
<td>1</td>
<td>Website</td>
<td><a href="https://bikiran.com/">Bikiran</a></td>
<td>Main platform — Domain, hosting &amp; cloud services</td>
</tr>
<tr>
<td>2</td>
<td>Website</td>
<td><a href="https://www.edusoft.com.bd/">Edusoft</a></td>
<td>Education management software for institutions</td>
</tr>
<tr>
<td>3</td>
<td>Website</td>
<td><a href="https://n8nclouds.com/">n8n Clouds</a></td>
<td>Managed n8n workflow automation hosting</td>
</tr>
<tr>
<td>4</td>
<td>Website</td>
<td><a href="https://www.timestamp.zone/">Timestamp Zone</a></td>
<td>Unix timestamp converter &amp; timezone tool</td>
</tr>
<tr>
<td>5</td>
<td>Website</td>
<td><a href="https://pdfpi.bikiran.com/">PDFpi</a></td>
<td>Online PDF processing &amp; manipulation tool</td>
</tr>
<tr>
<td>6</td>
<td>Website</td>
<td><a href="https://blog.bikiran.com/">Blog</a></td>
<td>Technical articles, guides &amp; tutorials</td>
</tr>
<tr>
<td>7</td>
<td>Website</td>
<td><a href="https://support.bikiran.com/">Support</a></td>
<td>24/7 customer support portal</td>
</tr>
<tr>
<td>8</td>
<td>Website</td>
<td><a href="https://probackup.bikiran.com/">Probackup</a></td>
<td>Automated database backup for SQL, PostgreSQL &amp; MongoDB</td>
</tr>
<tr>
<td>9</td>
<td>Service</td>
<td><a href="https://www.bikiran.com/domain">Domain</a></td>
<td>Domain registration, transfer &amp; DNS management</td>
</tr>
<tr>
<td>10</td>
<td>Service</td>
<td><a href="https://www.bikiran.com/services/hosting/web">Hosting</a></td>
<td>Web, app &amp; email hosting on NVMe SSD</td>
</tr>
<tr>
<td>11</td>
<td>Service</td>
<td>Email &amp; SMS</td>
<td>Bulk email &amp; SMS notification service</td>
</tr>
<tr>
<td>12</td>
<td>npm</td>
<td><a href="https://www.npmjs.com/package/@bikiran/chronopick">Chronopick</a></td>
<td>Date &amp; time picker React component</td>
</tr>
<tr>
<td>13</td>
<td>npm</td>
<td><a href="https://www.npmjs.com/package/@bikiran/editor">Rich Editor</a></td>
<td>WYSIWYG rich text editor for React</td>
</tr>
<tr>
<td>14</td>
<td>npm</td>
<td><a href="https://www.npmjs.com/package/@bikiran/button">Button</a></td>
<td>Reusable React button component library</td>
</tr>
<tr>
<td>15</td>
<td>npm</td>
<td><a href="https://www.npmjs.com/package/create-edx-app">Electron Boilerplate</a></td>
<td>CLI to scaffold Electron.js project templates</td>
</tr>
<tr>
<td>16</td>
<td>NuGet</td>
<td><a href="https://www.nuget.org/packages/Bikiran.Payment.Bkash">Bkash</a></td>
<td>bKash payment gateway integration for .NET</td>
</tr>
<tr>
<td>17</td>
<td>NuGet</td>
<td><a href="https://www.nuget.org/packages/Bikiran.Engine">Bikiran Engine</a></td>
<td>Core .NET engine library for Bikiran services</td>
</tr>
<tr>
<td>18</td>
<td>Open Source</td>
<td><a href="https://github.com/bikirandev/pdfpi">PDFpi</a></td>
<td>PDF processing tool — open source</td>
</tr>
<tr>
<td>19</td>
<td>Open Source</td>
<td><a href="https://github.com/bikirandev/Bikiran.Engine">Bikiran Engine</a></td>
<td>Core .NET engine — open source</td>
</tr>
<tr>
<td>20</td>
<td>Open Source</td>
<td><a href="https://github.com/bikirandev/DriveCLI">Drive CLI</a></td>
<td>CLI tool to manage Google Drive from terminal</td>
</tr>
<tr>
<td>21</td>
<td>Docker</td>
<td><a href="https://github.com/bikirandev/docker-pgsql">Pgsql</a></td>
<td>Docker setup for PostgreSQL</td>
</tr>
<tr>
<td>22</td>
<td>Docker</td>
<td><a href="https://github.com/bikirandev/docker-n8n">n8n</a></td>
<td>Docker setup for n8n automation</td>
</tr>
<tr>
<td>23</td>
<td>Docker</td>
<td><a href="https://github.com/bikirandev/docker-pgadmin">Pgadmin</a></td>
<td>Docker setup for pgAdmin</td>
</tr>
<tr>
<td>24</td>
<td>Social Media</td>
<td><a href="https://www.linkedin.com/company/bikiran12">LinkedIn</a></td>
<td>Bikiran on LinkedIn</td>
</tr>
<tr>
<td>25</td>
<td>Social Media</td>
<td><a href="https://www.facebook.com/bikiran12">Facebook</a></td>
<td>Bikiran on Facebook</td>
</tr>
<tr>
<td>26</td>
<td>Social Media</td>
<td><a href="https://www.youtube.com/@bikiranofficial">YouTube</a></td>
<td>Bikiran on YouTube</td>
</tr>
<tr>
<td>27</td>
<td>Social Media</td>
<td><a href="https://www.facebook.com/n8nclouds">FB n8nClouds</a></td>
<td>n8n Clouds on Facebook</td>
</tr>
</tbody></table>
]]></content:encoded></item><item><title><![CDATA[How to Migrate a Linux VM from VMware ESXi 8 to SolusVM2 (KVM) with LVM: Step-by-Step Using QCOW2 and Troubleshooting Dracut/LVM Boot Errors]]></title><description><![CDATA[Migrating a Linux VM from ESXi 8 to SolusVM2 (KVM) can involve a few tricky steps, especially if your guest system uses LVM for storage. This blog post demonstrates the full migration workflow using d]]></description><link>https://blog.bikiran.com/how-to-migrate-a-linux-vm-from-vmware-esxi-8-to-solusvm2-kvm-with-lvm-step-by-step-using-qcow2-and-troubleshooting-dracutlvm-boot-errors</link><guid isPermaLink="true">https://blog.bikiran.com/how-to-migrate-a-linux-vm-from-vmware-esxi-8-to-solusvm2-kvm-with-lvm-step-by-step-using-qcow2-and-troubleshooting-dracutlvm-boot-errors</guid><category><![CDATA[solusvm]]></category><category><![CDATA[bikiran]]></category><category><![CDATA[Linux]]></category><category><![CDATA[server]]></category><category><![CDATA[migration]]></category><category><![CDATA[esxi]]></category><dc:creator><![CDATA[KUMAR BISHOJIT]]></dc:creator><pubDate>Tue, 22 Jul 2025 06:35:55 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/pgdaAwf6IJg/upload/29cd95a610b419f11e18caabbc61bd92.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Migrating a Linux VM from ESXi 8 to SolusVM2 (KVM) can involve a few tricky steps, especially if your guest system uses LVM for storage. This blog post demonstrates the full migration workflow using demo filenames, and covers how to resolve common boot issues like dracut-initqueue timeouts related to missing LVM volumes.</p>
<hr />
<h2><strong>1. Understanding the ESXi VM Disk Files</strong></h2>
<p>In your ESXi VM folder, you’ll typically see files such as:</p>
<ul>
<li><p><code>demo-vm_1.vmdk</code> (small descriptor file)</p>
</li>
<li><p><code>demo-vm_1-flat.vmdk</code> (large disk data file)</p>
</li>
</ul>
<p>For migration, you only need the matching descriptor and flat file for the active disk.</p>
<hr />
<h2><strong>2. Preparing the Migration</strong></h2>
<h3><strong>Step 1: Copy VMDK Files to a Linux Machine</strong></h3>
<p>First, transfer the disk files from your ESXi server to a local Linux system using SCP/NFS:</p>
<pre><code class="language-bash">scp root@esxi-host:/vmfs/volumes/.../demo-vm_1.vmdk /tmp/
scp root@esxi-host:/vmfs/volumes/.../demo-vm_1-flat.vmdk /tmp/
</code></pre>
<blockquote>
<p>The descriptor (<code>demo-vm_1.vmdk</code>) must reference the <code>demo-vm_1-flat.vmdk</code> file and both should be in the same directory for conversion.</p>
</blockquote>
<hr />
<h3><strong>Step 2: Convert VMDK to QCOW2 Format</strong></h3>
<p>SolusVM2 (KVM) works best with QCOW2 disk images. Use <code>qemu-img</code> to convert:</p>
<pre><code class="language-bash">sudo apt update
sudo apt install qemu-utils
cd /tmp
qemu-img convert -f vmdk -O qcow2 demo-vm_1.vmdk demo-vm_1.qcow2
</code></pre>
<p>The resulting <code>demo-vm_1.qcow2</code> contains your VM’s disk, ready for import.</p>
<hr />
<h2><strong>3. Importing to SolusVM2</strong></h2>
<h3><strong>Step 3: Upload QCOW2 Image to SolusVM2 Node</strong></h3>
<p>Transfer your QCOW2 disk to the KVM node’s image directory:</p>
<pre><code class="language-bash">scp demo-vm_1.qcow2 root@solusvm-kvm-node:/var/lib/libvirt/images/
</code></pre>
<h3><strong>Step 4: Create the VM in SolusVM2</strong></h3>
<ul>
<li><p>Log in to the SolusVM2 admin panel.</p>
</li>
<li><p>Create a new KVM VM, setting CPU, RAM, and Network as needed.</p>
</li>
<li><p>For disk, select “use existing image” if available, or create a VM with a blank disk and <strong>replace that disk file</strong> with your <code>demo-vm_1.qcow2</code> via SSH.</p>
</li>
<li><p>Ensure the disk file ownership is correct (e.g., <code>chown qemu:qemu demo-vm_1.qcow2</code>).</p>
</li>
</ul>
<hr />
<h2><strong>4. Troubleshooting Dracut Initqueue Timeout (LVM Boot Issues)</strong></h2>
<h3><strong>The Problem</strong></h3>
<p>After migration, you may encounter errors like:</p>
<pre><code class="language-bash">dracut-initqueue: timeout, still waiting for following initqueue hooks: /dev/mapper/demo-root /dev/demo-vg/swap
</code></pre>
<p>This means the initramfs (dracut) cannot find the root and swap LVM volumes.</p>
<h3><strong>Step 5: Recovery Workflow</strong></h3>
<h4><strong>A. Boot into Rescue Mode</strong></h4>
<ul>
<li><p>If you’re dropped into a <code>dracut:/#</code> shell, you can start recovery directly.</p>
</li>
<li><p>Otherwise, boot from a rescue ISO (CentOS, AlmaLinux, Rocky, Fedora, etc.)</p>
</li>
</ul>
<h4><strong>B. Check Disk Detection</strong></h4>
<pre><code class="language-bash">lsblk
fdisk -l
</code></pre>
<p>If the disk isn’t detected, try changing the VM’s disk controller (Virtio, SATA, SCSI) in SolusVM2.</p>
<h4><strong>C. Scan and Activate LVM Volumes</strong></h4>
<pre><code class="language-bash">vgscan
lvscan
vgchange -ay
</code></pre>
<p>If <code>/dev/mapper/demo-root</code> and <code>/dev/demo-vg/swap</code> appear, your volumes are present.</p>
<h4><strong>D. Inspect and Fix /etc/fstab and GRUB</strong></h4>
<p>Mount your root volume:</p>
<pre><code class="language-bash">mount /dev/demo-vg/root /mnt
cat /mnt/etc/fstab
</code></pre>
<ul>
<li><p>Ensure device names or UUIDs match the actual LVM devices (<code>blkid</code> helps).</p>
</li>
<li><p>Update <code>/etc/fstab</code> if needed.</p>
</li>
</ul>
<h4><strong>E. Rebuild Initramfs</strong></h4>
<p>Chroot into your root volume and rebuild the initramfs for new hardware config:</p>
<pre><code class="language-bash">mount --bind /dev /mnt/dev
mount --bind /proc /mnt/proc
mount --bind /sys /mnt/sys
chroot /mnt
dracut --force
exit
umount /mnt/{dev,proc,sys}
umount /mnt
</code></pre>
<h4><strong>F. Update GRUB Bootloader (Optional)</strong></h4>
<pre><code class="language-bash">chroot /mnt
grub2-mkconfig -o /boot/grub2/grub.cfg
grub2-install /dev/vda  # or your disk device
exit
</code></pre>
<h4><strong>G. Reboot and Test</strong></h4>
<p>Reboot the VM. If boot fails, repeat the checks above.</p>
<hr />
<h2><strong>5. Tips and Common Pitfalls</strong></h2>
<ul>
<li><p><strong>Disk Not Detected?</strong> Change SolusVM2 disk bus to Virtio, SATA, or SCSI.</p>
</li>
<li><p><strong>LVM Names Changed?</strong> Check with <code>vgs</code> and <code>lvs</code> and update <code>/etc/fstab</code>.</p>
</li>
<li><p><strong>UUID Mismatch?</strong> Use <code>blkid</code> to verify and fix <code>/etc/fstab</code>.</p>
</li>
<li><p><strong>LVM Not Activating?</strong> Force scan or review <code>/etc/lvm/lvm.conf</code>.</p>
</li>
</ul>
<hr />
<h2><strong>6. Conclusion</strong></h2>
<p>Migrating a Linux VM from ESXi to SolusVM2 using QCOW2 is a reliable process if you prepare disk files properly and understand storage layers. The most common post-migration issue is dracut failing to find your LVM root volume—address this by scanning/activating LVM, rebuilding initramfs, and verifying disk controller compatibility.</p>
<h3>CONTACT:</h3>
<p>I’m Kumar Bishojit Paul, the Founder and CEO of <a href="https://www.bikiran.com/">BIKIRAN</a>. If you need further assistance, please leave a comment. I’m interested in helping you.</p>
<p>Follow these steps for a seamless migration and fast recovery from boot issues!</p>
<hr />
<hr />
<h2>🏢 About Bikiran</h2>
<p><strong><a href="https://bikiran.com/">Bikiran</a></strong> is a software development and cloud infrastructure company founded in 2012, headquartered in Khulna, Bangladesh. With 15,000+ clients and over a decade of experience, Bikiran builds and operates a suite of products spanning domain services, cloud hosting, app deployment, workflow automation, and developer tools.</p>
<table>
<thead>
<tr>
<th>SL</th>
<th>Topic</th>
<th>Product</th>
<th>Description</th>
</tr>
</thead>
<tbody><tr>
<td>1</td>
<td>Website</td>
<td><a href="https://bikiran.com/">Bikiran</a></td>
<td>Main platform — Domain, hosting &amp; cloud services</td>
</tr>
<tr>
<td>2</td>
<td>Website</td>
<td><a href="https://www.edusoft.com.bd/">Edusoft</a></td>
<td>Education management software for institutions</td>
</tr>
<tr>
<td>3</td>
<td>Website</td>
<td><a href="https://n8nclouds.com/">n8n Clouds</a></td>
<td>Managed n8n workflow automation hosting</td>
</tr>
<tr>
<td>4</td>
<td>Website</td>
<td><a href="https://www.timestamp.zone/">Timestamp Zone</a></td>
<td>Unix timestamp converter &amp; timezone tool</td>
</tr>
<tr>
<td>5</td>
<td>Website</td>
<td><a href="https://pdfpi.bikiran.com/">PDFpi</a></td>
<td>Online PDF processing &amp; manipulation tool</td>
</tr>
<tr>
<td>6</td>
<td>Website</td>
<td><a href="https://blog.bikiran.com/">Blog</a></td>
<td>Technical articles, guides &amp; tutorials</td>
</tr>
<tr>
<td>7</td>
<td>Website</td>
<td><a href="https://support.bikiran.com/">Support</a></td>
<td>24/7 customer support portal</td>
</tr>
<tr>
<td>8</td>
<td>Website</td>
<td><a href="https://probackup.bikiran.com/">Probackup</a></td>
<td>Automated database backup for SQL, PostgreSQL &amp; MongoDB</td>
</tr>
<tr>
<td>9</td>
<td>Service</td>
<td><a href="https://www.bikiran.com/domain">Domain</a></td>
<td>Domain registration, transfer &amp; DNS management</td>
</tr>
<tr>
<td>10</td>
<td>Service</td>
<td><a href="https://www.bikiran.com/services/hosting/web">Hosting</a></td>
<td>Web, app &amp; email hosting on NVMe SSD</td>
</tr>
<tr>
<td>11</td>
<td>Service</td>
<td>Email &amp; SMS</td>
<td>Bulk email &amp; SMS notification service</td>
</tr>
<tr>
<td>12</td>
<td>npm</td>
<td><a href="https://www.npmjs.com/package/@bikiran/chronopick">Chronopick</a></td>
<td>Date &amp; time picker React component</td>
</tr>
<tr>
<td>13</td>
<td>npm</td>
<td><a href="https://www.npmjs.com/package/@bikiran/editor">Rich Editor</a></td>
<td>WYSIWYG rich text editor for React</td>
</tr>
<tr>
<td>14</td>
<td>npm</td>
<td><a href="https://www.npmjs.com/package/@bikiran/button">Button</a></td>
<td>Reusable React button component library</td>
</tr>
<tr>
<td>15</td>
<td>npm</td>
<td><a href="https://www.npmjs.com/package/create-edx-app">Electron Boilerplate</a></td>
<td>CLI to scaffold Electron.js project templates</td>
</tr>
<tr>
<td>16</td>
<td>NuGet</td>
<td><a href="https://www.nuget.org/packages/Bikiran.Payment.Bkash">Bkash</a></td>
<td>bKash payment gateway integration for .NET</td>
</tr>
<tr>
<td>17</td>
<td>NuGet</td>
<td><a href="https://www.nuget.org/packages/Bikiran.Engine">Bikiran Engine</a></td>
<td>Core .NET engine library for Bikiran services</td>
</tr>
<tr>
<td>18</td>
<td>Open Source</td>
<td><a href="https://github.com/bikirandev/pdfpi">PDFpi</a></td>
<td>PDF processing tool — open source</td>
</tr>
<tr>
<td>19</td>
<td>Open Source</td>
<td><a href="https://github.com/bikirandev/Bikiran.Engine">Bikiran Engine</a></td>
<td>Core .NET engine — open source</td>
</tr>
<tr>
<td>20</td>
<td>Open Source</td>
<td><a href="https://github.com/bikirandev/DriveCLI">Drive CLI</a></td>
<td>CLI tool to manage Google Drive from terminal</td>
</tr>
<tr>
<td>21</td>
<td>Docker</td>
<td><a href="https://github.com/bikirandev/docker-pgsql">Pgsql</a></td>
<td>Docker setup for PostgreSQL</td>
</tr>
<tr>
<td>22</td>
<td>Docker</td>
<td><a href="https://github.com/bikirandev/docker-n8n">n8n</a></td>
<td>Docker setup for n8n automation</td>
</tr>
<tr>
<td>23</td>
<td>Docker</td>
<td><a href="https://github.com/bikirandev/docker-pgadmin">Pgadmin</a></td>
<td>Docker setup for pgAdmin</td>
</tr>
<tr>
<td>24</td>
<td>Social Media</td>
<td><a href="https://www.linkedin.com/company/bikiran12">LinkedIn</a></td>
<td>Bikiran on LinkedIn</td>
</tr>
<tr>
<td>25</td>
<td>Social Media</td>
<td><a href="https://www.facebook.com/bikiran12">Facebook</a></td>
<td>Bikiran on Facebook</td>
</tr>
<tr>
<td>26</td>
<td>Social Media</td>
<td><a href="https://www.youtube.com/@bikiranofficial">YouTube</a></td>
<td>Bikiran on YouTube</td>
</tr>
<tr>
<td>27</td>
<td>Social Media</td>
<td><a href="https://www.facebook.com/n8nclouds">FB n8nClouds</a></td>
<td>n8n Clouds on Facebook</td>
</tr>
</tbody></table>
<p><strong>Questions, comments, or troubleshooting tips? Add them below!</strong></p>
]]></content:encoded></item><item><title><![CDATA[How to Set Up Static IP Address and Custom Routing on Ubuntu: The Complete Guide]]></title><description><![CDATA[Configuring a static IP address and custom routes is an essential skill for anyone managing Ubuntu servers, workstations, or cloud instances. This comprehensive guide will walk you through every step ]]></description><link>https://blog.bikiran.com/how-to-set-up-static-ip-address-and-custom-routing-on-ubuntu-the-complete-guide</link><guid isPermaLink="true">https://blog.bikiran.com/how-to-set-up-static-ip-address-and-custom-routing-on-ubuntu-the-complete-guide</guid><category><![CDATA[Ubuntu]]></category><category><![CDATA[networking]]></category><category><![CDATA[network]]></category><category><![CDATA[Network configuration,]]></category><dc:creator><![CDATA[KUMAR BISHOJIT]]></dc:creator><pubDate>Mon, 21 Jul 2025 06:45:12 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/T9rKvI3N0NM/upload/c6d0ec1b32a3b403ea34199c61f7811b.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Configuring a static IP address and custom routes is an essential skill for anyone managing Ubuntu servers, workstations, or cloud instances. This comprehensive guide will walk you through every step of the process, explain key concepts behind network routing, and provide troubleshooting tips to ensure your configuration is robust and reliable.</p>
<hr />
<h2><strong>Why Configure a Static IP and Custom Routes?</strong></h2>
<ul>
<li><p><strong>Static IP:</strong> Ensures your system always has the same address, which is crucial for remote access, web hosting, and network services.</p>
</li>
<li><p><strong>Custom Routes:</strong> Control how traffic moves through your network, optimize connections, or access specific remote hosts.</p>
</li>
</ul>
<hr />
<h2><strong>Step 1: Identify Your Network Interface</strong></h2>
<p>The first step is to determine which network interface you want to configure. Interface names on Ubuntu can be <code>eth0</code>, <code>ens3</code>, <code>enp0s3</code>, etc.</p>
<pre><code class="language-bash">ip link show
</code></pre>
<p>Look for an interface that is <strong>UP</strong> and connected. Example output:</p>
<pre><code class="language-bash">2: ens3: &lt;BROADCAST,MULTICAST,UP,LOWER_UP&gt; mtu 1500 ...
</code></pre>
<p>Here, <code>ens3</code> is our interface.</p>
<hr />
<h2><strong>Step 2: Prepare Your Static IP Details</strong></h2>
<p>Before configuring, gather the following information (using demo values):</p>
<ul>
<li><p><strong>IP Address</strong>: <code>192.0.2.10</code></p>
</li>
<li><p><strong>Subnet Mask/CIDR</strong>: <code>/24</code></p>
</li>
<li><p><strong>Gateway</strong>: <code>192.0.2.1</code></p>
</li>
<li><p><strong>DNS Server(s)</strong>: <code>8.8.8.8</code> (Google Public DNS)</p>
</li>
</ul>
<hr />
<h2><strong>Step 3: Configure Netplan (Ubuntu 18.04+)</strong></h2>
<p>Ubuntu uses <strong>Netplan</strong> for network configuration. Netplan files are found in <code>/etc/netplan/</code>. List them:</p>
<pre><code class="language-bash">ls /etc/netplan/
</code></pre>
<p>Open the appropriate file (e.g., <code>01-netcfg.yaml</code>) for editing:</p>
<pre><code class="language-bash">sudo nano /etc/netplan/01-netcfg.yaml
</code></pre>
<p>Add or update with your configuration (<strong>using demo IPs</strong>):</p>
<pre><code class="language-bash">network:
  version: 2
  ethernets:
    ens3:
      dhcp4: no
      addresses:
        - 192.0.2.10/24
      gateway4: 192.0.2.1
      nameservers:
        addresses: [8.8.8.8]
      routes:
        - to: 192.0.2.1/32
          scope: link
          via: 0.0.0.0
          on-link: true
        - to: default
          via: 192.0.2.1
          on-link: true
</code></pre>
<p><strong>Explanation:</strong></p>
<ul>
<li><p><strong>dhcp4: no:</strong> Disables DHCP, enables static IP.</p>
</li>
<li><p><strong>addresses:</strong> Sets the IP and subnet mask.</p>
</li>
<li><p><strong>gateway4:</strong> Sets the gateway for outbound traffic.</p>
</li>
<li><p><strong>nameservers:</strong> DNS servers for resolving domain names.</p>
</li>
<li><p><strong>routes:</strong></p>
<ul>
<li><p><strong>to:</strong> Destination for the route (single IP or default).</p>
</li>
<li><p><strong>scope:</strong> <code>link</code> means route is directly reachable on the local interface.</p>
</li>
<li><p><strong>via:</strong> Next hop; <code>0.0.0.0</code> means direct, no gateway.</p>
</li>
<li><p><strong>on-link:</strong> Tells the system this address is directly reachable.</p>
</li>
<li><p><strong>default route:</strong> For all traffic not matched by other routes, use the specified gateway.</p>
</li>
</ul>
</li>
</ul>
<hr />
<h2><strong>Step 4: Apply Your Configuration</strong></h2>
<p>Run the following to activate your changes:</p>
<pre><code class="language-bash">sudo netplan apply
</code></pre>
<hr />
<h2><strong>Step 5: Verify Your Network Configuration</strong></h2>
<p>Check your IP address:</p>
<pre><code class="language-bash">ip a
</code></pre>
<p>Check your routing table:</p>
<pre><code class="language-bash">ip route
</code></pre>
<p>Sample output:</p>
<pre><code class="language-bash">192.0.2.1 dev ens3  scope link
default via 192.0.2.1 dev ens3
</code></pre>
<p>Check your DNS:</p>
<pre><code class="language-bash">cat /etc/resolv.conf
</code></pre>
<p>Test connectivity:</p>
<pre><code class="language-bash">ping -c 4 8.8.8.8
ping -c 4 example.com
</code></pre>
<hr />
<h2><strong>Understanding Routes in Detail</strong></h2>
<h3><strong>What is a Route?</strong></h3>
<p>A <strong>route</strong> tells your system how to reach networks or hosts. The routing table contains rules that determine which interface and gateway traffic uses.</p>
<h3><strong>Key Route Fields</strong></h3>
<ul>
<li><p><strong>scope: link:</strong> The destination is directly reachable on the local network (no gateway needed).</p>
</li>
<li><p><strong>to:</strong> The target IP or network (e.g., <code>192.0.2.1/32</code> for one host, or <code>default</code> for all traffic).</p>
</li>
<li><p><strong>via:</strong> The next hop (gateway) for reaching the destination. <code>0.0.0.0</code> means direct (no gateway).</p>
</li>
<li><p><strong>on-link:</strong> Marks the destination as directly reachable on the local segment.</p>
</li>
</ul>
<h4><strong>Example 1: Link-Scoped Route</strong></h4>
<pre><code class="language-bash">- to: 192.0.2.1/32
  scope: link
  via: 0.0.0.0
  on-link: true
</code></pre>
<ul>
<li>Packets destined for <code>192.0.2.1</code> are sent directly via <code>ens3</code>, with no gateway.</li>
</ul>
<h4><strong>Example 2: Default Route</strong></h4>
<pre><code class="language-bash">- to: default
  via: 192.0.2.1
  on-link: true
</code></pre>
<ul>
<li>All traffic not matching a more specific rule goes to the gateway <code>192.0.2.1</code>.</li>
</ul>
<hr />
<h2><strong>Summary Table: Route Fields</strong></h2>
<table>
<thead>
<tr>
<th><strong>Field</strong></th>
<th><strong>Example Value</strong></th>
<th><strong>Meaning</strong></th>
</tr>
</thead>
<tbody><tr>
<td>scope</td>
<td>link</td>
<td>Route is valid on the local link/interface</td>
</tr>
<tr>
<td>to</td>
<td>192.0.2.1/32</td>
<td>Target IP address (single host)</td>
</tr>
<tr>
<td>via</td>
<td>0.0.0.0 / gateway IP</td>
<td>Next hop (gateway) for traffic, 0.0.0.0 = direct</td>
</tr>
<tr>
<td>on-link</td>
<td>true</td>
<td>Target is directly reachable on local network</td>
</tr>
<tr>
<td>to</td>
<td>default</td>
<td>This route applies to all destinations not matched elsewhere</td>
</tr>
</tbody></table>
<hr />
<h2><strong>Visual Example (Routing Table)</strong></h2>
<p>Imagine your routing table looks like this:</p>
<pre><code class="language-bash">Destination        Gateway         Genmask         Flags Iface
192.0.2.1          0.0.0.0         255.255.255.255 UGH   ens3
0.0.0.0            192.0.2.1       0.0.0.0         UG    ens3
</code></pre>
<ul>
<li><p><strong>First row:</strong> Direct route to <code>192.0.2.1</code> via <code>ens3</code> (no gateway).</p>
</li>
<li><p><strong>Second row:</strong> Default route—send everything else via <code>192.0.2.1</code>.</p>
</li>
</ul>
<hr />
<h2><strong>Troubleshooting</strong></h2>
<ul>
<li><p><strong>Network unreachable:</strong> Double-check IP, gateway, and interface name.</p>
</li>
<li><p><strong>YAML errors:</strong> Make sure you use spaces (not tabs) and correct indentation in Netplan files.</p>
</li>
<li><p><strong>DNS not working:</strong> Some systems may overwrite <code>/etc/resolv.conf</code>. Use Netplan to set DNS or configure <code>systemd-resolved</code>.</p>
</li>
<li><p><strong>Connectivity issues:</strong> Use <code>ip a</code>, <code>ip route</code>, and <code>ping</code> to diagnose.</p>
</li>
</ul>
<hr />
<h2><strong>Advanced: Temporary Network Changes (No Reboot Needed)</strong></h2>
<p>If you want to test settings without editing Netplan, use these commands (<strong>using demo IPs</strong>):</p>
<pre><code class="language-bash">sudo ip addr flush dev ens3
sudo ip addr add 192.0.2.10/24 dev ens3
sudo ip link set ens3 up
sudo ip route add 192.0.2.1 dev ens3
sudo ip route add default via 192.0.2.1
echo "nameserver 8.8.8.8" | sudo tee /etc/resolv.conf
</code></pre>
<p><strong>Note:</strong> These changes are lost after reboot.</p>
<hr />
<h2><strong>Conclusion</strong></h2>
<p>Configuring a static IP address and custom routes on Ubuntu is straightforward once you understand the concepts and configuration syntax. Whether you’re running a server, a cloud VM, or a desktop, these steps ensure your system is reliably reachable and communicates efficiently on your network.</p>
<h3>CONTACT:</h3>
<p>I’m Kumar Bishojit Paul, the Founder and CEO of <a href="https://www.bikiran.com/">BIKIRAN</a>. If you need further assistance, please leave a comment. I’m interested in helping you.</p>
<p><strong>Key Takeaways:</strong></p>
<ul>
<li><p>Know your network interface name.</p>
</li>
<li><p>Use Netplan for permanent configuration.</p>
</li>
<li><p>Understand how routes work—especially link scope and default routes.</p>
</li>
<li><p>Test and verify your setup for reliability.</p>
</li>
</ul>
<p>Have questions or want to learn more about advanced routing? Comment below or explore Ubuntu’s <a href="https://ubuntu.com/server/docs/network-configuration">official networking documentation</a>!</p>
<hr />
<h2>🏢 About Bikiran</h2>
<p><strong><a href="https://bikiran.com/">Bikiran</a></strong> is a software development and cloud infrastructure company founded in 2012, headquartered in Khulna, Bangladesh. With 15,000+ clients and over a decade of experience, Bikiran builds and operates a suite of products spanning domain services, cloud hosting, app deployment, workflow automation, and developer tools.</p>
<table>
<thead>
<tr>
<th>SL</th>
<th>Topic</th>
<th>Product</th>
<th>Description</th>
</tr>
</thead>
<tbody><tr>
<td>1</td>
<td>Website</td>
<td><a href="https://bikiran.com/">Bikiran</a></td>
<td>Main platform — Domain, hosting &amp; cloud services</td>
</tr>
<tr>
<td>2</td>
<td>Website</td>
<td><a href="https://www.edusoft.com.bd/">Edusoft</a></td>
<td>Education management software for institutions</td>
</tr>
<tr>
<td>3</td>
<td>Website</td>
<td><a href="https://n8nclouds.com/">n8n Clouds</a></td>
<td>Managed n8n workflow automation hosting</td>
</tr>
<tr>
<td>4</td>
<td>Website</td>
<td><a href="https://www.timestamp.zone/">Timestamp Zone</a></td>
<td>Unix timestamp converter &amp; timezone tool</td>
</tr>
<tr>
<td>5</td>
<td>Website</td>
<td><a href="https://pdfpi.bikiran.com/">PDFpi</a></td>
<td>Online PDF processing &amp; manipulation tool</td>
</tr>
<tr>
<td>6</td>
<td>Website</td>
<td><a href="https://blog.bikiran.com/">Blog</a></td>
<td>Technical articles, guides &amp; tutorials</td>
</tr>
<tr>
<td>7</td>
<td>Website</td>
<td><a href="https://support.bikiran.com/">Support</a></td>
<td>24/7 customer support portal</td>
</tr>
<tr>
<td>8</td>
<td>Website</td>
<td><a href="https://probackup.bikiran.com/">Probackup</a></td>
<td>Automated database backup for SQL, PostgreSQL &amp; MongoDB</td>
</tr>
<tr>
<td>9</td>
<td>Service</td>
<td><a href="https://www.bikiran.com/domain">Domain</a></td>
<td>Domain registration, transfer &amp; DNS management</td>
</tr>
<tr>
<td>10</td>
<td>Service</td>
<td><a href="https://www.bikiran.com/services/hosting/web">Hosting</a></td>
<td>Web, app &amp; email hosting on NVMe SSD</td>
</tr>
<tr>
<td>11</td>
<td>Service</td>
<td>Email &amp; SMS</td>
<td>Bulk email &amp; SMS notification service</td>
</tr>
<tr>
<td>12</td>
<td>npm</td>
<td><a href="https://www.npmjs.com/package/@bikiran/chronopick">Chronopick</a></td>
<td>Date &amp; time picker React component</td>
</tr>
<tr>
<td>13</td>
<td>npm</td>
<td><a href="https://www.npmjs.com/package/@bikiran/editor">Rich Editor</a></td>
<td>WYSIWYG rich text editor for React</td>
</tr>
<tr>
<td>14</td>
<td>npm</td>
<td><a href="https://www.npmjs.com/package/@bikiran/button">Button</a></td>
<td>Reusable React button component library</td>
</tr>
<tr>
<td>15</td>
<td>npm</td>
<td><a href="https://www.npmjs.com/package/create-edx-app">Electron Boilerplate</a></td>
<td>CLI to scaffold Electron.js project templates</td>
</tr>
<tr>
<td>16</td>
<td>NuGet</td>
<td><a href="https://www.nuget.org/packages/Bikiran.Payment.Bkash">Bkash</a></td>
<td>bKash payment gateway integration for .NET</td>
</tr>
<tr>
<td>17</td>
<td>NuGet</td>
<td><a href="https://www.nuget.org/packages/Bikiran.Engine">Bikiran Engine</a></td>
<td>Core .NET engine library for Bikiran services</td>
</tr>
<tr>
<td>18</td>
<td>Open Source</td>
<td><a href="https://github.com/bikirandev/pdfpi">PDFpi</a></td>
<td>PDF processing tool — open source</td>
</tr>
<tr>
<td>19</td>
<td>Open Source</td>
<td><a href="https://github.com/bikirandev/Bikiran.Engine">Bikiran Engine</a></td>
<td>Core .NET engine — open source</td>
</tr>
<tr>
<td>20</td>
<td>Open Source</td>
<td><a href="https://github.com/bikirandev/DriveCLI">Drive CLI</a></td>
<td>CLI tool to manage Google Drive from terminal</td>
</tr>
<tr>
<td>21</td>
<td>Docker</td>
<td><a href="https://github.com/bikirandev/docker-pgsql">Pgsql</a></td>
<td>Docker setup for PostgreSQL</td>
</tr>
<tr>
<td>22</td>
<td>Docker</td>
<td><a href="https://github.com/bikirandev/docker-n8n">n8n</a></td>
<td>Docker setup for n8n automation</td>
</tr>
<tr>
<td>23</td>
<td>Docker</td>
<td><a href="https://github.com/bikirandev/docker-pgadmin">Pgadmin</a></td>
<td>Docker setup for pgAdmin</td>
</tr>
<tr>
<td>24</td>
<td>Social Media</td>
<td><a href="https://www.linkedin.com/company/bikiran12">LinkedIn</a></td>
<td>Bikiran on LinkedIn</td>
</tr>
<tr>
<td>25</td>
<td>Social Media</td>
<td><a href="https://www.facebook.com/bikiran12">Facebook</a></td>
<td>Bikiran on Facebook</td>
</tr>
<tr>
<td>26</td>
<td>Social Media</td>
<td><a href="https://www.youtube.com/@bikiranofficial">YouTube</a></td>
<td>Bikiran on YouTube</td>
</tr>
<tr>
<td>27</td>
<td>Social Media</td>
<td><a href="https://www.facebook.com/n8nclouds">FB n8nClouds</a></td>
<td>n8n Clouds on Facebook</td>
</tr>
</tbody></table>
]]></content:encoded></item><item><title><![CDATA[Temporary Network Configuration Guideline (Linux)]]></title><description><![CDATA[This guideline describes how to set up a temporary network configuration on a Linux server using ip commands. These changes will only persist until the next reboot.

1. Identify Your Network Interface]]></description><link>https://blog.bikiran.com/temporary-network-configuration-guideline-linux</link><guid isPermaLink="true">https://blog.bikiran.com/temporary-network-configuration-guideline-linux</guid><category><![CDATA[Linux]]></category><category><![CDATA[networking]]></category><category><![CDATA[IP]]></category><category><![CDATA[ip address]]></category><dc:creator><![CDATA[KUMAR BISHOJIT]]></dc:creator><pubDate>Mon, 21 Jul 2025 06:30:08 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/ZiQkhI7417A/upload/12af4374abce16f074984e3347ae78f6.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>This guideline describes how to set up a temporary network configuration on a Linux server using <code>ip</code> commands. These changes will only persist until the next reboot.</p>
<hr />
<h2><strong>1. Identify Your Network Interface</strong></h2>
<p>Check available network interfaces and note the one you want to configure (e.g., <code>ens3</code>).</p>
<pre><code class="language-bash">ip link show
</code></pre>
<hr />
<h2><strong>2. Flush Existing IP Addresses</strong></h2>
<p>Remove all current IP addresses from your interface to avoid conflicts.</p>
<pre><code class="language-bash">sudo ip addr flush dev ens3
</code></pre>
<blockquote>
<p>Replace <code>ens3</code> with your actual interface name.</p>
</blockquote>
<hr />
<h2><strong>3. Assign a New IP Address</strong></h2>
<p>Set the desired IP address and subnet mask.</p>
<pre><code class="language-bash">sudo ip addr add 51.1.1.51/24 dev ens3
</code></pre>
<ul>
<li><p><code>51.1.1.51</code> is the new IP.</p>
</li>
<li><p><code>/24</code> is the subnet mask (255.255.255.0).</p>
</li>
</ul>
<hr />
<h2><strong>4. Bring the Interface Up</strong></h2>
<p>Activate the interface if it is down.</p>
<pre><code class="language-bash">sudo ip link set ens3 up
</code></pre>
<hr />
<h2><strong>5. Set Up Routing</strong></h2>
<h3><strong>a. Add a Static Route (Optional)</strong></h3>
<p>If you need to reach a specific host directly:</p>
<pre><code class="language-bash">sudo ip route add 15.2.2.15 dev ens3
</code></pre>
<h3><strong>b. Set the Default Gateway</strong></h3>
<p>Direct all traffic through the gateway:</p>
<pre><code class="language-bash">sudo ip route add default via 15.2.2.15
</code></pre>
<hr />
<h2><strong>6. Configure DNS</strong></h2>
<p>Set a DNS server to resolve domain names.</p>
<pre><code class="language-bash">echo "nameserver 8.8.8.8" | sudo tee /etc/resolv.conf
</code></pre>
<blockquote>
<p>This replaces your <code>/etc/resolv.conf</code> with Google’s DNS.<br /><strong>Note:</strong> Changes to <code>/etc/resolv.conf</code> are also temporary and may be overwritten by network managers.</p>
</blockquote>
<hr />
<h2><strong>7. Automatic Setup Script</strong></h2>
<p>You can use the following shell script to automate this temporary network setup.<br />This script will prompt you for the required details and apply the configuration.</p>
<pre><code class="language-bash">#!/bin/bash

# Temporary Linux Network Configuration (Interactive Script)

echo "=== Temporary Network Configuration ==="

# Prompt for network interface
read -p "Enter the network interface name (e.g., ens3): " IFACE

# Prompt for new IP address (with CIDR)
read -p "Enter the new IP address with CIDR (e.g., 192.168.1.100/24): " IPADDR

# Prompt for Gateway
read -p "Enter the gateway IP address (e.g., 192.168.1.1): " GATEWAY

# Prompt for DNS
read -p "Enter the DNS server IP (e.g., 8.8.8.8): " DNS

echo ""
echo "Applying network changes..."

# Flush existing IP addresses
sudo ip addr flush dev "$IFACE"

# Assign new IP address
sudo ip addr add "\(IPADDR" dev "\)IFACE"

# Bring the interface up
sudo ip link set "$IFACE" up

# Add default gateway
sudo ip route add default via "$GATEWAY"

# Set DNS server
echo "nameserver $DNS" | sudo tee /etc/resolv.conf

echo ""
echo "Network configuration applied (temporarily, until reboot)."
echo "Current network status:"
ip addr show "$IFACE"
ip route

echo ""
echo "Test connectivity (ping DNS server):"
ping -c 4 "$DNS"

echo ""
echo "Done."
</code></pre>
<p><strong>Usage:</strong></p>
<ol>
<li><p>Save as <code>network_setup_</code><a href="http://prompt.sh"><code>prompt.sh</code></a>.</p>
</li>
<li><p>Make executable: <code>chmod +x network_setup_</code><a href="http://prompt.sh"><code>prompt.sh</code></a></p>
</li>
<li><p>Run: <code>./network_setup_</code><a href="http://prompt.sh"><code>prompt.sh</code></a></p>
</li>
<li><p>Follow prompts to input interface, IP address, gateway, and DNS.</p>
</li>
</ol>
<p><strong>Note:</strong><br />This configuration is temporary and will be lost after a reboot. For permanent changes, edit your network configuration files.</p>
<hr />
<h2><strong>8. Verify Configuration</strong></h2>
<h3><strong>a. Check IP Address</strong></h3>
<pre><code class="language-bash">ip a
</code></pre>
<h3><strong>b. Check Routing Table</strong></h3>
<pre><code class="language-bash">ip route
</code></pre>
<h3><strong>c. Test Connectivity</strong></h3>
<ul>
<li><p>Ping gateway or external IP:</p>
<pre><code class="language-bash">ping -c 4 8.8.8.8
</code></pre>
</li>
<li><p>Test DNS:</p>
<pre><code class="language-bash">ping -c 4 google.com
</code></pre>
</li>
</ul>
<hr />
<h2><strong>9. (Optional) Install Open vSwitch</strong></h2>
<p>If you need Open vSwitch for virtual networking:</p>
<pre><code class="language-bash">sudo apt update
sudo apt install openvswitch-switch
</code></pre>
<hr />
<h2><strong>10. Notes</strong></h2>
<ul>
<li><p><strong>Temporary:</strong> These changes will be lost after a reboot. For permanent changes, edit your network configuration files (e.g., <code>/etc/network/interfaces</code>, Netplan, or NetworkManager settings).</p>
</li>
<li><p><strong>Permissions:</strong> All commands require root privileges (<code>sudo</code>).</p>
</li>
<li><p><strong>Interface Name:</strong> Replace <code>ens3</code> with your actual interface name.</p>
</li>
</ul>
<hr />
<h2><strong>11. Troubleshooting</strong></h2>
<ul>
<li><p>If network is not working, check:</p>
<ul>
<li><p>IP address assignment: <code>ip a</code></p>
</li>
<li><p>Routing table: <code>ip route</code></p>
</li>
<li><p>DNS settings: <code>cat /etc/resolv.conf</code></p>
</li>
<li><p>Interface status: <code>ip link show ens3</code></p>
</li>
</ul>
</li>
<li><p>Re-run commands if you made a mistake or want to reset.</p>
</li>
</ul>
<h3>CONTACT:</h3>
<p>I’m Kumar Bishojit Paul, the Founder and CEO of <a href="https://www.bikiran.com/">BIKIRAN</a>. If you need further assistance, please leave a comment. I’m interested in helping you.</p>
<hr />
<h2>🏢 About Bikiran</h2>
<p><strong><a href="https://bikiran.com/">Bikiran</a></strong> is a software development and cloud infrastructure company founded in 2012, headquartered in Khulna, Bangladesh. With 15,000+ clients and over a decade of experience, Bikiran builds and operates a suite of products spanning domain services, cloud hosting, app deployment, workflow automation, and developer tools.</p>
<table>
<thead>
<tr>
<th>SL</th>
<th>Topic</th>
<th>Product</th>
<th>Description</th>
</tr>
</thead>
<tbody><tr>
<td>1</td>
<td>Website</td>
<td><a href="https://bikiran.com/">Bikiran</a></td>
<td>Main platform — Domain, hosting &amp; cloud services</td>
</tr>
<tr>
<td>2</td>
<td>Website</td>
<td><a href="https://www.edusoft.com.bd/">Edusoft</a></td>
<td>Education management software for institutions</td>
</tr>
<tr>
<td>3</td>
<td>Website</td>
<td><a href="https://n8nclouds.com/">n8n Clouds</a></td>
<td>Managed n8n workflow automation hosting</td>
</tr>
<tr>
<td>4</td>
<td>Website</td>
<td><a href="https://www.timestamp.zone/">Timestamp Zone</a></td>
<td>Unix timestamp converter &amp; timezone tool</td>
</tr>
<tr>
<td>5</td>
<td>Website</td>
<td><a href="https://pdfpi.bikiran.com/">PDFpi</a></td>
<td>Online PDF processing &amp; manipulation tool</td>
</tr>
<tr>
<td>6</td>
<td>Website</td>
<td><a href="https://blog.bikiran.com/">Blog</a></td>
<td>Technical articles, guides &amp; tutorials</td>
</tr>
<tr>
<td>7</td>
<td>Website</td>
<td><a href="https://support.bikiran.com/">Support</a></td>
<td>24/7 customer support portal</td>
</tr>
<tr>
<td>8</td>
<td>Website</td>
<td><a href="https://probackup.bikiran.com/">Probackup</a></td>
<td>Automated database backup for SQL, PostgreSQL &amp; MongoDB</td>
</tr>
<tr>
<td>9</td>
<td>Service</td>
<td><a href="https://www.bikiran.com/domain">Domain</a></td>
<td>Domain registration, transfer &amp; DNS management</td>
</tr>
<tr>
<td>10</td>
<td>Service</td>
<td><a href="https://www.bikiran.com/services/hosting/web">Hosting</a></td>
<td>Web, app &amp; email hosting on NVMe SSD</td>
</tr>
<tr>
<td>11</td>
<td>Service</td>
<td>Email &amp; SMS</td>
<td>Bulk email &amp; SMS notification service</td>
</tr>
<tr>
<td>12</td>
<td>npm</td>
<td><a href="https://www.npmjs.com/package/@bikiran/chronopick">Chronopick</a></td>
<td>Date &amp; time picker React component</td>
</tr>
<tr>
<td>13</td>
<td>npm</td>
<td><a href="https://www.npmjs.com/package/@bikiran/editor">Rich Editor</a></td>
<td>WYSIWYG rich text editor for React</td>
</tr>
<tr>
<td>14</td>
<td>npm</td>
<td><a href="https://www.npmjs.com/package/@bikiran/button">Button</a></td>
<td>Reusable React button component library</td>
</tr>
<tr>
<td>15</td>
<td>npm</td>
<td><a href="https://www.npmjs.com/package/create-edx-app">Electron Boilerplate</a></td>
<td>CLI to scaffold Electron.js project templates</td>
</tr>
<tr>
<td>16</td>
<td>NuGet</td>
<td><a href="https://www.nuget.org/packages/Bikiran.Payment.Bkash">Bkash</a></td>
<td>bKash payment gateway integration for .NET</td>
</tr>
<tr>
<td>17</td>
<td>NuGet</td>
<td><a href="https://www.nuget.org/packages/Bikiran.Engine">Bikiran Engine</a></td>
<td>Core .NET engine library for Bikiran services</td>
</tr>
<tr>
<td>18</td>
<td>Open Source</td>
<td><a href="https://github.com/bikirandev/pdfpi">PDFpi</a></td>
<td>PDF processing tool — open source</td>
</tr>
<tr>
<td>19</td>
<td>Open Source</td>
<td><a href="https://github.com/bikirandev/Bikiran.Engine">Bikiran Engine</a></td>
<td>Core .NET engine — open source</td>
</tr>
<tr>
<td>20</td>
<td>Open Source</td>
<td><a href="https://github.com/bikirandev/DriveCLI">Drive CLI</a></td>
<td>CLI tool to manage Google Drive from terminal</td>
</tr>
<tr>
<td>21</td>
<td>Docker</td>
<td><a href="https://github.com/bikirandev/docker-pgsql">Pgsql</a></td>
<td>Docker setup for PostgreSQL</td>
</tr>
<tr>
<td>22</td>
<td>Docker</td>
<td><a href="https://github.com/bikirandev/docker-n8n">n8n</a></td>
<td>Docker setup for n8n automation</td>
</tr>
<tr>
<td>23</td>
<td>Docker</td>
<td><a href="https://github.com/bikirandev/docker-pgadmin">Pgadmin</a></td>
<td>Docker setup for pgAdmin</td>
</tr>
<tr>
<td>24</td>
<td>Social Media</td>
<td><a href="https://www.linkedin.com/company/bikiran12">LinkedIn</a></td>
<td>Bikiran on LinkedIn</td>
</tr>
<tr>
<td>25</td>
<td>Social Media</td>
<td><a href="https://www.facebook.com/bikiran12">Facebook</a></td>
<td>Bikiran on Facebook</td>
</tr>
<tr>
<td>26</td>
<td>Social Media</td>
<td><a href="https://www.youtube.com/@bikiranofficial">YouTube</a></td>
<td>Bikiran on YouTube</td>
</tr>
<tr>
<td>27</td>
<td>Social Media</td>
<td><a href="https://www.facebook.com/n8nclouds">FB n8nClouds</a></td>
<td>n8n Clouds on Facebook</td>
</tr>
</tbody></table>
]]></content:encoded></item><item><title><![CDATA[Mastering hostnamectl: The Modern Way to Manage Linux Hostnames]]></title><description><![CDATA[When it comes to managing your Linux system’s hostname, gone are the days of manually editing /etc/hostname and relying solely on the old hostname command. With the advent of systemd, hostnamectl has ]]></description><link>https://blog.bikiran.com/mastering-hostnamectl-the-modern-way-to-manage-linux-hostnames</link><guid isPermaLink="true">https://blog.bikiran.com/mastering-hostnamectl-the-modern-way-to-manage-linux-hostnames</guid><category><![CDATA[hostnamectl]]></category><category><![CDATA[hostname]]></category><category><![CDATA[Linux]]></category><dc:creator><![CDATA[KUMAR BISHOJIT]]></dc:creator><pubDate>Mon, 21 Jul 2025 03:58:43 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/MNd-Rka1o0Q/upload/064758950e33530b6f5a71b984aa1744.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>When it comes to managing your Linux system’s hostname, gone are the days of manually editing <code>/etc/hostname</code> and relying solely on the old <code>hostname</code> command. With the advent of <code>systemd</code>, <code>hostnamectl</code> has become the standard tool for hostname configuration and more. In this post, we'll explore what <code>hostnamectl</code> is, how it works, and why it's essential for modern Linux administration.</p>
<hr />
<h2><strong>What is</strong> <code>hostnamectl</code>?</h2>
<p><code>hostnamectl</code> is a command-line utility introduced with <code>systemd</code> that allows users to query and change the system hostname and related metadata. It provides a unified interface for managing not just the hostname but also additional system descriptors like chassis type, deployment environment, and location.</p>
<p><strong>Key Features:</strong></p>
<ul>
<li><p>Query current hostname and system metadata</p>
</li>
<li><p>Change static, transient, or pretty hostnames</p>
</li>
<li><p>Set additional system metadata</p>
</li>
<li><p>Standardized interface on all systemd-based distributions</p>
</li>
</ul>
<hr />
<h2><strong>Hostname Types Explained</strong></h2>
<p>Linux systems now recognize several types of hostnames:</p>
<ol>
<li><p><strong>Static Hostname</strong></p>
<ul>
<li><p>Stored in <code>/etc/hostname</code></p>
</li>
<li><p>Persistent across reboots</p>
</li>
</ul>
</li>
<li><p><strong>Transient Hostname</strong></p>
<ul>
<li><p>Set by the kernel, DHCP, or manually for the current session</p>
</li>
<li><p>Not persistent after reboot</p>
</li>
</ul>
</li>
<li><p><strong>Pretty Hostname</strong></p>
<ul>
<li><p>A user-friendly version (can include spaces and special characters)</p>
</li>
<li><p>Used for display in GUIs</p>
</li>
</ul>
</li>
</ol>
<hr />
<h2><strong>How to Use</strong> <code>hostnamectl</code></h2>
<h3><strong>1. Viewing Hostname and System Metadata</strong></h3>
<p>Simply run:</p>
<pre><code class="language-bash">hostnamectl
</code></pre>
<p>This displays information like:</p>
<ul>
<li><p>Static, transient, and pretty hostnames</p>
</li>
<li><p>Icon name</p>
</li>
<li><p>Chassis type (desktop, server, vm, etc.)</p>
</li>
<li><p>Deployment environment (production, testing, etc.)</p>
</li>
<li><p>Location</p>
</li>
<li><p>Machine and boot IDs</p>
</li>
<li><p>Operating system and kernel</p>
</li>
</ul>
<p><strong>Sample Output:</strong></p>
<pre><code class="language-bash">   Static hostname: myserver
         Icon name: computer-server
           Chassis: server
        Machine ID: 1234567890abcdef
           Boot ID: abcdef1234567890
  Operating System: Ubuntu 22.04 LTS
            Kernel: Linux 5.15.0-72-generic
      Architecture: x86-64
</code></pre>
<h3><strong>2. Setting the Hostname</strong></h3>
<p>To set the static hostname:</p>
<pre><code class="language-bash">sudo hostnamectl set-hostname new-hostname
</code></pre>
<p>Set a pretty hostname:</p>
<pre><code class="language-bash">sudo hostnamectl set-hostname "My Workstation" --pretty
</code></pre>
<p>Set a transient hostname:</p>
<pre><code class="language-bash">sudo hostnamectl set-hostname temp-host --transient
</code></pre>
<h3><strong>3. Setting System Metadata</strong></h3>
<p>You can also set metadata for better system identification:</p>
<pre><code class="language-bash">sudo hostnamectl set-chassis laptop
sudo hostnamectl set-deployment production
sudo hostnamectl set-location "Rack 2, DC1"
</code></pre>
<hr />
<h2><strong>Advanced Usage</strong></h2>
<h3><strong>Scripting with</strong> <code>hostnamectl</code></h3>
<p>Automate hostname and metadata setup in deployment scripts:</p>
<pre><code class="language-bash">#!/bin/bash
sudo hostnamectl set-hostname "$1"
sudo hostnamectl set-chassis "$2"
sudo hostnamectl set-location "$3"
</code></pre>
<p>Run: <code>./sethost.sh myhost server "Room 27"</code></p>
<h3><strong>Integration with Networking</strong></h3>
<p>Transient hostnames may be set by DHCP servers—ideal for cloud or dynamic environments. If your hostname keeps changing, review your DHCP client configuration.</p>
<h3><strong>Troubleshooting</strong></h3>
<ul>
<li><p><strong>Hostname not changing?</strong> Use <code>sudo</code> and verify that your distribution uses <code>systemd</code>.</p>
</li>
<li><p><strong>DHCP resets hostname?</strong> Adjust DHCP client settings to prevent overwriting.</p>
</li>
<li><p><strong>Change not recognized?</strong> Try logging out or rebooting if some applications don’t pick up the new hostname immediately.</p>
</li>
</ul>
<hr />
<h2><strong>Why Use</strong> <code>hostnamectl</code>?</h2>
<ul>
<li><p><strong>Consistency:</strong> Works across all systemd-based distributions.</p>
</li>
<li><p><strong>Safety:</strong> Avoids manual file edits and possible misconfigurations.</p>
</li>
<li><p><strong>Integration:</strong> Metadata is available to other tools and GUIs.</p>
</li>
<li><p><strong>Flexibility:</strong> Set hostnames for different purposes and environments.</p>
</li>
</ul>
<hr />
<h2><strong>Resources</strong></h2>
<ul>
<li><p><a href="https://man7.org/linux/man-pages/man1/hostnamectl.1.html">hostnamectl man page</a></p>
</li>
<li><p><a href="https://www.freedesktop.org/software/systemd/man/systemd-hostnamed.service.html">systemd-hostnamed documentation</a></p>
</li>
</ul>
<hr />
<h2><strong>Conclusion</strong></h2>
<p>Whether you’re managing a single desktop or thousands of servers, <code>hostnamectl</code> streamlines hostname management and adds a layer of metadata that’s invaluable for automation, monitoring, and inventory. Give it a try—and modernize your Linux workflow!</p>
<h3>CONTACT:</h3>
<p>I’m Kumar Bishojit Paul, the Founder and CEO of <a href="https://www.bikiran.com/">BIKIRAN</a>. If you need further assistance, please leave a comment. I’m interested in helping you.</p>
<hr />
<h2>🏢 About Bikiran</h2>
<p><strong><a href="https://bikiran.com/">Bikiran</a></strong> is a software development and cloud infrastructure company founded in 2012, headquartered in Khulna, Bangladesh. With 15,000+ clients and over a decade of experience, Bikiran builds and operates a suite of products spanning domain services, cloud hosting, app deployment, workflow automation, and developer tools.</p>
<table>
<thead>
<tr>
<th>SL</th>
<th>Topic</th>
<th>Product</th>
<th>Description</th>
</tr>
</thead>
<tbody><tr>
<td>1</td>
<td>Website</td>
<td><a href="https://bikiran.com/">Bikiran</a></td>
<td>Main platform — Domain, hosting &amp; cloud services</td>
</tr>
<tr>
<td>2</td>
<td>Website</td>
<td><a href="https://www.edusoft.com.bd/">Edusoft</a></td>
<td>Education management software for institutions</td>
</tr>
<tr>
<td>3</td>
<td>Website</td>
<td><a href="https://n8nclouds.com/">n8n Clouds</a></td>
<td>Managed n8n workflow automation hosting</td>
</tr>
<tr>
<td>4</td>
<td>Website</td>
<td><a href="https://www.timestamp.zone/">Timestamp Zone</a></td>
<td>Unix timestamp converter &amp; timezone tool</td>
</tr>
<tr>
<td>5</td>
<td>Website</td>
<td><a href="https://pdfpi.bikiran.com/">PDFpi</a></td>
<td>Online PDF processing &amp; manipulation tool</td>
</tr>
<tr>
<td>6</td>
<td>Website</td>
<td><a href="https://blog.bikiran.com/">Blog</a></td>
<td>Technical articles, guides &amp; tutorials</td>
</tr>
<tr>
<td>7</td>
<td>Website</td>
<td><a href="https://support.bikiran.com/">Support</a></td>
<td>24/7 customer support portal</td>
</tr>
<tr>
<td>8</td>
<td>Website</td>
<td><a href="https://probackup.bikiran.com/">Probackup</a></td>
<td>Automated database backup for SQL, PostgreSQL &amp; MongoDB</td>
</tr>
<tr>
<td>9</td>
<td>Service</td>
<td><a href="https://www.bikiran.com/domain">Domain</a></td>
<td>Domain registration, transfer &amp; DNS management</td>
</tr>
<tr>
<td>10</td>
<td>Service</td>
<td><a href="https://www.bikiran.com/services/hosting/web">Hosting</a></td>
<td>Web, app &amp; email hosting on NVMe SSD</td>
</tr>
<tr>
<td>11</td>
<td>Service</td>
<td>Email &amp; SMS</td>
<td>Bulk email &amp; SMS notification service</td>
</tr>
<tr>
<td>12</td>
<td>npm</td>
<td><a href="https://www.npmjs.com/package/@bikiran/chronopick">Chronopick</a></td>
<td>Date &amp; time picker React component</td>
</tr>
<tr>
<td>13</td>
<td>npm</td>
<td><a href="https://www.npmjs.com/package/@bikiran/editor">Rich Editor</a></td>
<td>WYSIWYG rich text editor for React</td>
</tr>
<tr>
<td>14</td>
<td>npm</td>
<td><a href="https://www.npmjs.com/package/@bikiran/button">Button</a></td>
<td>Reusable React button component library</td>
</tr>
<tr>
<td>15</td>
<td>npm</td>
<td><a href="https://www.npmjs.com/package/create-edx-app">Electron Boilerplate</a></td>
<td>CLI to scaffold Electron.js project templates</td>
</tr>
<tr>
<td>16</td>
<td>NuGet</td>
<td><a href="https://www.nuget.org/packages/Bikiran.Payment.Bkash">Bkash</a></td>
<td>bKash payment gateway integration for .NET</td>
</tr>
<tr>
<td>17</td>
<td>NuGet</td>
<td><a href="https://www.nuget.org/packages/Bikiran.Engine">Bikiran Engine</a></td>
<td>Core .NET engine library for Bikiran services</td>
</tr>
<tr>
<td>18</td>
<td>Open Source</td>
<td><a href="https://github.com/bikirandev/pdfpi">PDFpi</a></td>
<td>PDF processing tool — open source</td>
</tr>
<tr>
<td>19</td>
<td>Open Source</td>
<td><a href="https://github.com/bikirandev/Bikiran.Engine">Bikiran Engine</a></td>
<td>Core .NET engine — open source</td>
</tr>
<tr>
<td>20</td>
<td>Open Source</td>
<td><a href="https://github.com/bikirandev/DriveCLI">Drive CLI</a></td>
<td>CLI tool to manage Google Drive from terminal</td>
</tr>
<tr>
<td>21</td>
<td>Docker</td>
<td><a href="https://github.com/bikirandev/docker-pgsql">Pgsql</a></td>
<td>Docker setup for PostgreSQL</td>
</tr>
<tr>
<td>22</td>
<td>Docker</td>
<td><a href="https://github.com/bikirandev/docker-n8n">n8n</a></td>
<td>Docker setup for n8n automation</td>
</tr>
<tr>
<td>23</td>
<td>Docker</td>
<td><a href="https://github.com/bikirandev/docker-pgadmin">Pgadmin</a></td>
<td>Docker setup for pgAdmin</td>
</tr>
<tr>
<td>24</td>
<td>Social Media</td>
<td><a href="https://www.linkedin.com/company/bikiran12">LinkedIn</a></td>
<td>Bikiran on LinkedIn</td>
</tr>
<tr>
<td>25</td>
<td>Social Media</td>
<td><a href="https://www.facebook.com/bikiran12">Facebook</a></td>
<td>Bikiran on Facebook</td>
</tr>
<tr>
<td>26</td>
<td>Social Media</td>
<td><a href="https://www.youtube.com/@bikiranofficial">YouTube</a></td>
<td>Bikiran on YouTube</td>
</tr>
<tr>
<td>27</td>
<td>Social Media</td>
<td><a href="https://www.facebook.com/n8nclouds">FB n8nClouds</a></td>
<td>n8n Clouds on Facebook</td>
</tr>
</tbody></table>
]]></content:encoded></item><item><title><![CDATA[How to Safely Convert a UEFI Bootable Linux VM Disk to BIOS (SeaBIOS) for KVM]]></title><description><![CDATA[Migrating virtual machines between hypervisors often presents challenges, especially when moving from VMware ESXi (which often uses UEFI firmware) to KVM-based platforms like SolusVM, which typically ]]></description><link>https://blog.bikiran.com/how-to-safely-convert-a-uefi-bootable-linux-vm-disk-to-bios-seabios-for-kvm</link><guid isPermaLink="true">https://blog.bikiran.com/how-to-safely-convert-a-uefi-bootable-linux-vm-disk-to-bios-seabios-for-kvm</guid><category><![CDATA[SeaBIOS]]></category><category><![CDATA[convert]]></category><category><![CDATA[uefi]]></category><category><![CDATA[bios]]></category><category><![CDATA[Linux]]></category><category><![CDATA[Boot]]></category><category><![CDATA[virtual disk]]></category><dc:creator><![CDATA[KUMAR BISHOJIT]]></dc:creator><pubDate>Sun, 20 Jul 2025 16:21:11 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/505eectW54k/upload/fc5663c68834533f9502f81c3f1eaa96.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Migrating virtual machines between hypervisors often presents challenges, especially when moving from VMware ESXi (which often uses UEFI firmware) to KVM-based platforms like SolusVM, which typically default to legacy BIOS (SeaBIOS). If you simply convert and import the disk, you may encounter frustrating boot errors such as "Booting from Hard Disk..." with no further progress.</p>
<p>This guide provides a safe, step-by-step process to convert a Linux VM disk from UEFI boot to BIOS, preserving your data and minimizing downtime.</p>
<hr />
<h2><strong>Why Does This Happen?</strong></h2>
<ul>
<li><p><strong>UEFI and BIOS are different firmware types.</strong><br />A VM created on VMware may use UEFI, but KVM (and SolusVM) often expect BIOS (SeaBIOS).</p>
</li>
<li><p><strong>OS bootloaders are installed differently for UEFI and BIOS.</strong><br />UEFI boots from an EFI System Partition (<code>/boot/efi</code>), while BIOS boots from the MBR using GRUB or similar bootloaders.</p>
</li>
<li><p><strong>A disk converted from VMDK to QCOW2 may be unbootable if the boot mode/fimware doesn’t match.</strong></p>
</li>
</ul>
<hr />
<h2><strong>Identifying Your Boot Mode</strong></h2>
<h3><strong>On the Original VMware Host</strong></h3>
<ol>
<li><p><strong>Check VM Settings in vSphere/ESXi:</strong></p>
<ul>
<li><p>Edit the VM.</p>
</li>
<li><p>Look for "Boot Options" or "Firmware."</p>
</li>
<li><p>If set to "EFI" or "UEFI," your VM uses UEFI. If "BIOS," it uses legacy BIOS.</p>
</li>
</ul>
</li>
<li><p><strong>Check the Filesystem:</strong></p>
<ul>
<li><p>Mount the disk image (VMDK/QCOW2) on another Linux machine or VM.</p>
</li>
<li><p>Look for <code>/boot/efi</code>. If this folder exists and is populated, your VM likely used UEFI.</p>
</li>
</ul>
<pre><code class="language-bash">guestmount -a server-48.bikiran.net-flat.qcow2 -i --ro /mnt
ls /mnt/boot/efi
</code></pre>
<p>If you see files here, it's UEFI.</p>
</li>
</ol>
<hr />
<h2><strong>Steps to Convert UEFI to BIOS Boot</strong></h2>
<p><strong>Warning:</strong></p>
<ul>
<li><p>Always back up your VM's disk image before proceeding.</p>
</li>
<li><p>These steps assume a Linux guest. For Windows, the process is significantly different.</p>
</li>
</ul>
<h3><strong>1. Prepare a Rescue Environment</strong></h3>
<ul>
<li><p>Boot the VM using a Linux live CD/ISO (e.g., Ubuntu Live).</p>
</li>
<li><p>Attach the converted QCOW2 disk if it isn't already.</p>
</li>
</ul>
<h3><strong>2. Use an Automated Script</strong></h3>
<p>To simplify and reduce risk, use the following bash script. This script will:</p>
<ul>
<li><p>Detect your root partition.</p>
</li>
<li><p>Mount it and chroot into your system.</p>
</li>
<li><p>Install GRUB for legacy BIOS boot.</p>
</li>
<li><p>Remove <code>/boot/efi</code> mount from <code>/etc/fstab</code>.</p>
</li>
<li><p>Clean up and unmount everything.</p>
</li>
</ul>
<p><strong>Save this as</strong> <a href="http://convert-uefi-to-seabios.sh"><code>convert-uefi-to-seabios.sh</code></a>:</p>
<pre><code class="language-bash">#!/bin/bash
# convert-uefi-to-seabios.sh: Convert a Linux VM from UEFI boot to legacy BIOS boot (SeaBIOS).
# Usage: sudo bash convert-uefi-to-seabios.sh /dev/vda

set -e

DISK="$1"

if [[ -z "$DISK" ]]; then
  echo "Usage: $0 /dev/vdX (replace with your disk device, e.g., /dev/vda)"
  exit 1
fi

# Find Linux root partition (assume it's the largest Linux partition)
ROOT_PART=\((lsblk -lnpo NAME,SIZE,TYPE,FSTYPE | grep -E "ext4|xfs|btrfs" | sort -rk2 | head -n1 | awk '{print \)1}')
if [[ -z "$ROOT_PART" ]]; then
  echo "Could not detect Linux root partition. Please specify manually."
  exit 1
fi

echo "Mounting root partition: $ROOT_PART"
mkdir -p /mnt/root
mount "$ROOT_PART" /mnt/root

if [ -d /mnt/root/boot/efi ]; then
  echo "/boot/efi detected. Proceeding with UEFI to BIOS conversion."
else
  echo "No /boot/efi found. The system may already use BIOS boot."
  umount /mnt/root
  exit 0
fi

echo "Binding system filesystems..."
mount --bind /dev /mnt/root/dev
mount --bind /proc /mnt/root/proc
mount --bind /sys /mnt/root/sys

echo "Chrooting into system..."
chroot /mnt/root /bin/bash &lt;&lt;'EOT'
set -e
echo "Installing GRUB for BIOS..."
grub-install --target=i386-pc --recheck /dev/vda
echo "Updating GRUB config..."
update-grub || grub2-mkconfig -o /boot/grub2/grub.cfg
echo "Removing /boot/efi entry from /etc/fstab..."
sed -i '/\/boot\/efi/d' /etc/fstab
echo "UEFI to BIOS conversion completed inside chroot."
EOT

echo "Cleaning up /boot/efi..."
rm -rf /mnt/root/boot/efi

echo "Unmounting filesystems..."
umount /mnt/root/sys
umount /mnt/root/proc
umount /mnt/root/dev
umount /mnt/root

echo "Done. Please detach the ISO and try to boot with SeaBIOS (legacy boot)."
</code></pre>
<hr />
<h3><strong>3. Run the Script</strong></h3>
<ol>
<li><p><strong>Make it executable:</strong></p>
<pre><code class="language-bash">chmod +x convert-uefi-to-seabios.sh
</code></pre>
</li>
<li><p><strong>Execute (replace</strong> <code>/dev/vda</code> as needed):</p>
<pre><code class="language-bash">sudo ./convert-uefi-to-seabios.sh /dev/vda
</code></pre>
</li>
</ol>
<h3><strong>4. Switch the VM Firmware to SeaBIOS</strong></h3>
<ul>
<li>In SolusVM/KVM, ensure the VM firmware is set to BIOS/SeaBIOS (not UEFI/OVMF).</li>
</ul>
<h3><strong>5. Reboot and Test</strong></h3>
<ul>
<li><p>Reboot the VM.</p>
</li>
<li><p>The VM should boot from the hard disk using BIOS/SeaBIOS.</p>
</li>
</ul>
<hr />
<h2><strong>Troubleshooting</strong></h2>
<ul>
<li><p><strong>Disk Uses GPT Instead of MBR:</strong><br />BIOS boot with GPT is possible (with a BIOS boot partition), but many tools expect MBR. Seek advanced guidance if you’re using GPT.</p>
</li>
<li><p><strong>OS Is Windows:</strong><br />This script is for Linux guests. For Windows, the process is very different and more complex.</p>
</li>
<li><p><strong>No OS Found:</strong><br />Double-check that GRUB is installed to the correct disk and that the root partition is correct.</p>
</li>
<li><p><strong>Still Not Booting?</strong><br />Attach the disk to another VM, check <code>/boot/grub</code> contents, or review <code>/var/log/libvirt/qemu/&lt;vmname&gt;.log</code> for errors.</p>
</li>
</ul>
<hr />
<h2><strong>Conclusion</strong></h2>
<p>Migrating VMs between platforms is never truly "plug and play," especially when firmware and boot mechanisms differ. This guide and script should make converting your Linux VM from UEFI to BIOS for KVM much easier and safer. Always back up your data, and proceed with caution!</p>
<h3>CONTACT:</h3>
<p>I’m Kumar Bishojit Paul, the Founder and CEO of <a href="https://www.bikiran.com/">BIKIRAN</a>. If you need further assistance, please leave a comment. I’m interested in helping you.</p>
<p><strong>Have questions or need a version for GPT partitioned disks or Windows? Leave a comment!</strong></p>
<hr />
<h2>🏢 About Bikiran</h2>
<p><strong><a href="https://bikiran.com/">Bikiran</a></strong> is a software development and cloud infrastructure company founded in 2012, headquartered in Khulna, Bangladesh. With 15,000+ clients and over a decade of experience, Bikiran builds and operates a suite of products spanning domain services, cloud hosting, app deployment, workflow automation, and developer tools.</p>
<table>
<thead>
<tr>
<th>SL</th>
<th>Topic</th>
<th>Product</th>
<th>Description</th>
</tr>
</thead>
<tbody><tr>
<td>1</td>
<td>Website</td>
<td><a href="https://bikiran.com/">Bikiran</a></td>
<td>Main platform — Domain, hosting &amp; cloud services</td>
</tr>
<tr>
<td>2</td>
<td>Website</td>
<td><a href="https://www.edusoft.com.bd/">Edusoft</a></td>
<td>Education management software for institutions</td>
</tr>
<tr>
<td>3</td>
<td>Website</td>
<td><a href="https://n8nclouds.com/">n8n Clouds</a></td>
<td>Managed n8n workflow automation hosting</td>
</tr>
<tr>
<td>4</td>
<td>Website</td>
<td><a href="https://www.timestamp.zone/">Timestamp Zone</a></td>
<td>Unix timestamp converter &amp; timezone tool</td>
</tr>
<tr>
<td>5</td>
<td>Website</td>
<td><a href="https://pdfpi.bikiran.com/">PDFpi</a></td>
<td>Online PDF processing &amp; manipulation tool</td>
</tr>
<tr>
<td>6</td>
<td>Website</td>
<td><a href="https://blog.bikiran.com/">Blog</a></td>
<td>Technical articles, guides &amp; tutorials</td>
</tr>
<tr>
<td>7</td>
<td>Website</td>
<td><a href="https://support.bikiran.com/">Support</a></td>
<td>24/7 customer support portal</td>
</tr>
<tr>
<td>8</td>
<td>Website</td>
<td><a href="https://probackup.bikiran.com/">Probackup</a></td>
<td>Automated database backup for SQL, PostgreSQL &amp; MongoDB</td>
</tr>
<tr>
<td>9</td>
<td>Service</td>
<td><a href="https://www.bikiran.com/domain">Domain</a></td>
<td>Domain registration, transfer &amp; DNS management</td>
</tr>
<tr>
<td>10</td>
<td>Service</td>
<td><a href="https://www.bikiran.com/services/hosting/web">Hosting</a></td>
<td>Web, app &amp; email hosting on NVMe SSD</td>
</tr>
<tr>
<td>11</td>
<td>Service</td>
<td>Email &amp; SMS</td>
<td>Bulk email &amp; SMS notification service</td>
</tr>
<tr>
<td>12</td>
<td>npm</td>
<td><a href="https://www.npmjs.com/package/@bikiran/chronopick">Chronopick</a></td>
<td>Date &amp; time picker React component</td>
</tr>
<tr>
<td>13</td>
<td>npm</td>
<td><a href="https://www.npmjs.com/package/@bikiran/editor">Rich Editor</a></td>
<td>WYSIWYG rich text editor for React</td>
</tr>
<tr>
<td>14</td>
<td>npm</td>
<td><a href="https://www.npmjs.com/package/@bikiran/button">Button</a></td>
<td>Reusable React button component library</td>
</tr>
<tr>
<td>15</td>
<td>npm</td>
<td><a href="https://www.npmjs.com/package/create-edx-app">Electron Boilerplate</a></td>
<td>CLI to scaffold Electron.js project templates</td>
</tr>
<tr>
<td>16</td>
<td>NuGet</td>
<td><a href="https://www.nuget.org/packages/Bikiran.Payment.Bkash">Bkash</a></td>
<td>bKash payment gateway integration for .NET</td>
</tr>
<tr>
<td>17</td>
<td>NuGet</td>
<td><a href="https://www.nuget.org/packages/Bikiran.Engine">Bikiran Engine</a></td>
<td>Core .NET engine library for Bikiran services</td>
</tr>
<tr>
<td>18</td>
<td>Open Source</td>
<td><a href="https://github.com/bikirandev/pdfpi">PDFpi</a></td>
<td>PDF processing tool — open source</td>
</tr>
<tr>
<td>19</td>
<td>Open Source</td>
<td><a href="https://github.com/bikirandev/Bikiran.Engine">Bikiran Engine</a></td>
<td>Core .NET engine — open source</td>
</tr>
<tr>
<td>20</td>
<td>Open Source</td>
<td><a href="https://github.com/bikirandev/DriveCLI">Drive CLI</a></td>
<td>CLI tool to manage Google Drive from terminal</td>
</tr>
<tr>
<td>21</td>
<td>Docker</td>
<td><a href="https://github.com/bikirandev/docker-pgsql">Pgsql</a></td>
<td>Docker setup for PostgreSQL</td>
</tr>
<tr>
<td>22</td>
<td>Docker</td>
<td><a href="https://github.com/bikirandev/docker-n8n">n8n</a></td>
<td>Docker setup for n8n automation</td>
</tr>
<tr>
<td>23</td>
<td>Docker</td>
<td><a href="https://github.com/bikirandev/docker-pgadmin">Pgadmin</a></td>
<td>Docker setup for pgAdmin</td>
</tr>
<tr>
<td>24</td>
<td>Social Media</td>
<td><a href="https://www.linkedin.com/company/bikiran12">LinkedIn</a></td>
<td>Bikiran on LinkedIn</td>
</tr>
<tr>
<td>25</td>
<td>Social Media</td>
<td><a href="https://www.facebook.com/bikiran12">Facebook</a></td>
<td>Bikiran on Facebook</td>
</tr>
<tr>
<td>26</td>
<td>Social Media</td>
<td><a href="https://www.youtube.com/@bikiranofficial">YouTube</a></td>
<td>Bikiran on YouTube</td>
</tr>
<tr>
<td>27</td>
<td>Social Media</td>
<td><a href="https://www.facebook.com/n8nclouds">FB n8nClouds</a></td>
<td>n8n Clouds on Facebook</td>
</tr>
</tbody></table>
]]></content:encoded></item><item><title><![CDATA[Full Guide to qemu-img convert: Convert, Compress, and Manage Virtual Disk Images]]></title><description><![CDATA[qemu-img convert is a powerful utility for converting virtual disk images between different formats, resizing them, compressing, and even copying them efficiently. Whether you work with KVM, QEMU, Vir]]></description><link>https://blog.bikiran.com/full-guide-to-qemu-img-convert-convert-compress-and-manage-virtual-disk-images</link><guid isPermaLink="true">https://blog.bikiran.com/full-guide-to-qemu-img-convert-convert-compress-and-manage-virtual-disk-images</guid><category><![CDATA[qemu-img]]></category><category><![CDATA[virtual disk]]></category><category><![CDATA[convert]]></category><dc:creator><![CDATA[KUMAR BISHOJIT]]></dc:creator><pubDate>Sun, 20 Jul 2025 14:35:00 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/1_CMoFsPfso/upload/904ca1c6a87f08a530b3ae21d41507cc.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><code>qemu-img convert</code> is a powerful utility for converting virtual disk images between different formats, resizing them, compressing, and even copying them efficiently. Whether you work with KVM, QEMU, VirtualBox, or VMware, understanding this tool can save you time and disk space. Here’s a comprehensive guide for beginners and advanced users alike.</p>
<hr />
<h2><strong>What is</strong> <code>qemu-img convert</code>?</h2>
<p><code>qemu-img convert</code> is part of the <code>qemu-img</code> suite. Its main function is to convert one disk image format to another, but it can also compress, sparsify, and resize images in the process.</p>
<p>Common formats supported:</p>
<ul>
<li><p><strong>qcow2</strong> (QEMU/KVM native)</p>
</li>
<li><p><strong>raw</strong></p>
</li>
<li><p><strong>vmdk</strong> (VMware)</p>
</li>
<li><p><strong>vdi</strong> (VirtualBox)</p>
</li>
<li><p><strong>vhd/vhdx</strong> (Microsoft Hyper-V)</p>
</li>
<li><p><strong>parallels</strong> (Parallels Desktop)</p>
</li>
</ul>
<hr />
<h2><strong>Basic Syntax</strong></h2>
<pre><code class="language-bash">qemu-img convert [options] -O &lt;output_format&gt; &lt;input_image&gt; &lt;output_image&gt;
</code></pre>
<p>Examples:</p>
<ul>
<li><p>Convert a raw image to qcow2:</p>
<pre><code class="language-bash">qemu-img convert -O qcow2 disk.raw disk.qcow2
</code></pre>
</li>
<li><p>Convert a vmdk (VMware) to qcow2:</p>
<pre><code class="language-bash">qemu-img convert -O qcow2 disk.vmdk disk.qcow2
</code></pre>
</li>
</ul>
<hr />
<h2><strong>Common Use Cases</strong></h2>
<h3><strong>1. Convert Between Formats</strong></h3>
<ul>
<li><p><strong>VMware VMDK to QCOW2 (KVM):</strong></p>
<pre><code class="language-bash">qemu-img convert -O qcow2 source.vmdk dest.qcow2
</code></pre>
</li>
<li><p><strong>VirtualBox VDI to RAW:</strong></p>
<pre><code class="language-bash">qemu-img convert -O raw source.vdi dest.raw
</code></pre>
</li>
<li><p><strong>RAW to VHDX (Hyper-V):</strong></p>
<pre><code class="language-bash">qemu-img convert -O vhdx source.raw dest.vhdx
</code></pre>
</li>
</ul>
<h3><strong>2. Compress Disk Images</strong></h3>
<p>Use the <code>-c</code> flag to compress supported formats (like qcow2):</p>
<pre><code class="language-bash">qemu-img convert -c -O qcow2 source.qcow2 dest.qcow2
</code></pre>
<h3><strong>3. Create a Sparse Image</strong></h3>
<p>If your input image is thick provisioned (all blocks allocated), you can make the output sparse (only actual data blocks allocated):</p>
<pre><code class="language-bash">qemu-img convert -O qcow2 thick.qcow2 sparse.qcow2
</code></pre>
<h3><strong>4. Resize During Conversion</strong></h3>
<p>Use the <code>-S</code> (sparsify) option to ignore data blocks with only zeros, making the target image smaller:</p>
<pre><code class="language-bash">qemu-img convert -O qcow2 -S 0 source.qcow2 dest.qcow2
</code></pre>
<h3><strong>5. Convert and Encrypt Disk Images</strong></h3>
<p>You can encrypt the output qcow2 image:</p>
<pre><code class="language-bash">qemu-img convert -O qcow2 --object secret,id=sec0,data=YOURPASSWORD \
  -o encrypt.format=luks,encrypt.key-secret=sec0 source.raw dest.qcow2
</code></pre>
<p><em>Replace</em> <code>YOURPASSWORD</code> with a strong password or use secret files as recommended by QEMU docs.</p>
<hr />
<h2><strong>Advanced Examples</strong></h2>
<h3><strong>Convert and Change Size</strong></h3>
<p>You can resize images after conversion with <code>qemu-img resize</code>:</p>
<pre><code class="language-bash">qemu-img convert -O qcow2 source.raw dest.qcow2
qemu-img resize dest.qcow2 100G
</code></pre>
<h3><strong>Convert Multiple Images (Snapshots)</strong></h3>
<p>For images with snapshots or backing files, use <code>--backing-chain</code> to include the entire chain:</p>
<pre><code class="language-bash">qemu-img convert -O qcow2 --backing-chain snap.qcow2 full.qcow2
</code></pre>
<hr />
<h2><strong>Full List of Key Options</strong></h2>
<ul>
<li><p><code>-O &lt;fmt&gt;</code>: Output format (qcow2, raw, vmdk, vdi, vhdx, etc.)</p>
</li>
<li><p><code>-c</code>: Compress the output image (for supported formats)</p>
</li>
<li><p><code>-p</code>: Show progress bar</p>
</li>
<li><p><code>-S &lt;size&gt;</code>: Sparsify zeros (ignore zeroed blocks above this size)</p>
</li>
<li><p><code>-f &lt;fmt&gt;</code>: Input format (auto-detected if omitted)</p>
</li>
<li><p><code>--backing-chain</code>: Convert the entire snapshot/backing chain</p>
</li>
<li><p><code>-o &lt;options&gt;</code>: Format-specific options (e.g., cluster_size for qcow2, preallocation, encryption)</p>
</li>
<li><p><code>-n</code>: Do not create the output file, just test conversion</p>
</li>
</ul>
<hr />
<h2><strong>Tips and Best Practices</strong></h2>
<ul>
<li><p><strong>Always backup your disk images before converting or overwriting!</strong></p>
</li>
<li><p>For best compaction, zero-fill free space inside the guest OS before converting (e.g., with <code>dd</code> or SDelete).</p>
</li>
<li><p>After conversion, use <code>qemu-img info &lt;image&gt;</code> to inspect the result.</p>
</li>
<li><p>When moving VMs between hypervisors, check for driver and hardware compatibility after conversion.</p>
</li>
</ul>
<hr />
<h2><strong>Troubleshooting</strong></h2>
<ul>
<li><p><strong>Error: “format not supported”</strong><br />Make sure you have the necessary QEMU modules/libraries for your source/target formats.</p>
</li>
<li><p><strong>Image won’t boot after conversion</strong><br />Check that your VM configuration matches the new format (bus type, drivers, etc.)</p>
</li>
</ul>
<hr />
<h2><strong>References</strong></h2>
<ul>
<li><p><a href="https://wiki.qemu.org/Documentation/Tools/qemu-img">QEMU Documentation: qemu-img</a></p>
</li>
<li><p><a href="https://libvirt.org/formatdomain.html#elementsDisks">libvirt Disk Images</a></p>
</li>
</ul>
<hr />
<h2><strong>Conclusion</strong></h2>
<p><code>qemu-img convert</code> is your Swiss Army knife for virtual disk image management—whether you’re migrating between platforms, reclaiming space, or compressing images for backups. Experiment in a safe environment and take regular backups to make the most of this essential tool!</p>
<h3>CONTACT:</h3>
<p>I’m Kumar Bishojit Paul, the Founder and CEO of <a href="https://www.bikiran.com/">BIKIRAN</a>. If you need further assistance, please leave a comment. I’m interested in helping you.</p>
<hr />
<h2>🏢 About Bikiran</h2>
<p><strong><a href="https://bikiran.com/">Bikiran</a></strong> is a software development and cloud infrastructure company founded in 2012, headquartered in Khulna, Bangladesh. With 15,000+ clients and over a decade of experience, Bikiran builds and operates a suite of products spanning domain services, cloud hosting, app deployment, workflow automation, and developer tools.</p>
<table>
<thead>
<tr>
<th>SL</th>
<th>Topic</th>
<th>Product</th>
<th>Description</th>
</tr>
</thead>
<tbody><tr>
<td>1</td>
<td>Website</td>
<td><a href="https://bikiran.com/">Bikiran</a></td>
<td>Main platform — Domain, hosting &amp; cloud services</td>
</tr>
<tr>
<td>2</td>
<td>Website</td>
<td><a href="https://www.edusoft.com.bd/">Edusoft</a></td>
<td>Education management software for institutions</td>
</tr>
<tr>
<td>3</td>
<td>Website</td>
<td><a href="https://n8nclouds.com/">n8n Clouds</a></td>
<td>Managed n8n workflow automation hosting</td>
</tr>
<tr>
<td>4</td>
<td>Website</td>
<td><a href="https://www.timestamp.zone/">Timestamp Zone</a></td>
<td>Unix timestamp converter &amp; timezone tool</td>
</tr>
<tr>
<td>5</td>
<td>Website</td>
<td><a href="https://pdfpi.bikiran.com/">PDFpi</a></td>
<td>Online PDF processing &amp; manipulation tool</td>
</tr>
<tr>
<td>6</td>
<td>Website</td>
<td><a href="https://blog.bikiran.com/">Blog</a></td>
<td>Technical articles, guides &amp; tutorials</td>
</tr>
<tr>
<td>7</td>
<td>Website</td>
<td><a href="https://support.bikiran.com/">Support</a></td>
<td>24/7 customer support portal</td>
</tr>
<tr>
<td>8</td>
<td>Website</td>
<td><a href="https://probackup.bikiran.com/">Probackup</a></td>
<td>Automated database backup for SQL, PostgreSQL &amp; MongoDB</td>
</tr>
<tr>
<td>9</td>
<td>Service</td>
<td><a href="https://www.bikiran.com/domain">Domain</a></td>
<td>Domain registration, transfer &amp; DNS management</td>
</tr>
<tr>
<td>10</td>
<td>Service</td>
<td><a href="https://www.bikiran.com/services/hosting/web">Hosting</a></td>
<td>Web, app &amp; email hosting on NVMe SSD</td>
</tr>
<tr>
<td>11</td>
<td>Service</td>
<td>Email &amp; SMS</td>
<td>Bulk email &amp; SMS notification service</td>
</tr>
<tr>
<td>12</td>
<td>npm</td>
<td><a href="https://www.npmjs.com/package/@bikiran/chronopick">Chronopick</a></td>
<td>Date &amp; time picker React component</td>
</tr>
<tr>
<td>13</td>
<td>npm</td>
<td><a href="https://www.npmjs.com/package/@bikiran/editor">Rich Editor</a></td>
<td>WYSIWYG rich text editor for React</td>
</tr>
<tr>
<td>14</td>
<td>npm</td>
<td><a href="https://www.npmjs.com/package/@bikiran/button">Button</a></td>
<td>Reusable React button component library</td>
</tr>
<tr>
<td>15</td>
<td>npm</td>
<td><a href="https://www.npmjs.com/package/create-edx-app">Electron Boilerplate</a></td>
<td>CLI to scaffold Electron.js project templates</td>
</tr>
<tr>
<td>16</td>
<td>NuGet</td>
<td><a href="https://www.nuget.org/packages/Bikiran.Payment.Bkash">Bkash</a></td>
<td>bKash payment gateway integration for .NET</td>
</tr>
<tr>
<td>17</td>
<td>NuGet</td>
<td><a href="https://www.nuget.org/packages/Bikiran.Engine">Bikiran Engine</a></td>
<td>Core .NET engine library for Bikiran services</td>
</tr>
<tr>
<td>18</td>
<td>Open Source</td>
<td><a href="https://github.com/bikirandev/pdfpi">PDFpi</a></td>
<td>PDF processing tool — open source</td>
</tr>
<tr>
<td>19</td>
<td>Open Source</td>
<td><a href="https://github.com/bikirandev/Bikiran.Engine">Bikiran Engine</a></td>
<td>Core .NET engine — open source</td>
</tr>
<tr>
<td>20</td>
<td>Open Source</td>
<td><a href="https://github.com/bikirandev/DriveCLI">Drive CLI</a></td>
<td>CLI tool to manage Google Drive from terminal</td>
</tr>
<tr>
<td>21</td>
<td>Docker</td>
<td><a href="https://github.com/bikirandev/docker-pgsql">Pgsql</a></td>
<td>Docker setup for PostgreSQL</td>
</tr>
<tr>
<td>22</td>
<td>Docker</td>
<td><a href="https://github.com/bikirandev/docker-n8n">n8n</a></td>
<td>Docker setup for n8n automation</td>
</tr>
<tr>
<td>23</td>
<td>Docker</td>
<td><a href="https://github.com/bikirandev/docker-pgadmin">Pgadmin</a></td>
<td>Docker setup for pgAdmin</td>
</tr>
<tr>
<td>24</td>
<td>Social Media</td>
<td><a href="https://www.linkedin.com/company/bikiran12">LinkedIn</a></td>
<td>Bikiran on LinkedIn</td>
</tr>
<tr>
<td>25</td>
<td>Social Media</td>
<td><a href="https://www.facebook.com/bikiran12">Facebook</a></td>
<td>Bikiran on Facebook</td>
</tr>
<tr>
<td>26</td>
<td>Social Media</td>
<td><a href="https://www.youtube.com/@bikiranofficial">YouTube</a></td>
<td>Bikiran on YouTube</td>
</tr>
<tr>
<td>27</td>
<td>Social Media</td>
<td><a href="https://www.facebook.com/n8nclouds">FB n8nClouds</a></td>
<td>n8n Clouds on Facebook</td>
</tr>
</tbody></table>
]]></content:encoded></item><item><title><![CDATA[How to Safely Expand Your VM Disk for LVM-Based Ubuntu Servers]]></title><description><![CDATA[If you've ever upgraded your virtual server’s disk size from your hosting control panel (like SolusVM, VMware, Proxmox, etc.), you might have noticed that your Linux system doesn’t automatically see t]]></description><link>https://blog.bikiran.com/how-to-safely-expand-your-vm-disk-for-lvm-based-ubuntu-servers</link><guid isPermaLink="true">https://blog.bikiran.com/how-to-safely-expand-your-vm-disk-for-lvm-based-ubuntu-servers</guid><category><![CDATA[#resize-disk]]></category><category><![CDATA[Linux]]></category><category><![CDATA[Ubuntu]]></category><category><![CDATA[LVM]]></category><category><![CDATA[risk management]]></category><category><![CDATA[sysadmin]]></category><category><![CDATA[Cloud]]></category><category><![CDATA[virtualization]]></category><category><![CDATA[vps]]></category><category><![CDATA[bash script]]></category><category><![CDATA[storage]]></category><category><![CDATA[server management]]></category><category><![CDATA[automation]]></category><category><![CDATA[Cloud Hosting]]></category><dc:creator><![CDATA[KUMAR BISHOJIT]]></dc:creator><pubDate>Sat, 19 Jul 2025 11:51:45 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1753002859294/a7ece66a-44d1-418f-99f7-43277925ed1d.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>If you've ever upgraded your virtual server’s disk size from your hosting control panel (like SolusVM, VMware, Proxmox, etc.), you might have noticed that your Linux system doesn’t automatically see the new space. This is especially true if you’re using LVM (Logical Volume Manager): the extra space is available on the virtual disk, but the OS and filesystem can’t use it until you take some extra steps.</p>
<p>This blog walks you through using a safe, interactive Bash script (<code>auto_disk_resize_</code><a href="http://fixed.sh"><code>fixed.sh</code></a>) that automates these steps for Ubuntu/Debian systems. You’ll learn how it works, how to run it, and what’s happening behind the scenes.</p>
<hr />
<h2>Why Isn't the New Space Available Right Away?</h2>
<p>When you expand the disk in your VPS control panel, the underlying <em>virtual disk</em> grows instantly. However:</p>
<ul>
<li><p>Your existing <strong>partition</strong> (e.g., <code>/dev/sda3</code>) doesn’t automatically expand to fill the new space.</p>
</li>
<li><p>LVM’s <strong>physical volume</strong> (PV), <strong>volume group</strong> (VG), and <strong>logical volume</strong> (LV) are all still the same size as before.</p>
</li>
<li><p>Your <strong>filesystem</strong> (ext4, xfs, etc.) can only use the space allocated to the LV.</p>
</li>
</ul>
<p><strong>Result:</strong> Even though your disk is bigger, <code>df -h</code> still shows the old size for your root filesystem.</p>
<hr />
<h2>What Does the Script Do?</h2>
<p>The script <code>auto_disk_resize_</code><a href="http://fixed.sh"><code>fixed.sh</code></a> guides you through the safest way to expand your root partition and filesystem:</p>
<ol>
<li><p><strong>Detects</strong> your LVM setup, disk devices, partition numbers, and logical volumes.</p>
</li>
<li><p><strong>Prompts</strong> you for confirmation before making any changes.</p>
</li>
<li><p><strong>Grows the partition</strong> using <code>growpart</code> to fill the new disk.</p>
</li>
<li><p><strong>Resizes the LVM PV</strong> so LVM can use the new space.</p>
</li>
<li><p><strong>Extends the LV</strong> (root filesystem) to use all available space.</p>
</li>
<li><p><strong>Expands the filesystem</strong> (ext4 or xfs) to match the new LV size.</p>
</li>
<li><p><strong>Shows you the results</strong> with a final <code>df -h</code>.</p>
</li>
</ol>
<hr />
<h2>Step-by-Step: How to Use the Script</h2>
<h3>1. Prepare the Script</h3>
<p>Copy the following script and save it as <code>auto_disk_resize_</code><a href="http://fixed.sh"><code>fixed.sh</code></a>:</p>
<pre><code class="language-bash">#!/bin/bash
set -euo pipefail

# ==============================================================================
# SAFE AUTO DISK RESIZE SCRIPT (FIXED)
# This script safely expands an LVM root filesystem after resizing a VM disk.
# - Automatically detects the correct disk, partition, and LVM layout.
# - Uses growpart, pvresize, lvextend, and resize2fs/xfs_growfs as appropriate.
# - Prompts user for confirmation before making changes.
# - Intended for Ubuntu/Debian systems using LVM.
# ==============================================================================

echo "==== SAFE AUTO DISK RESIZE SCRIPT (FIXED) ===="

# Step 1: Show current block devices so the user can visually confirm layout
echo "[1] Block devices:"
lsblk
echo

# Step 2: Detect the LVM physical volume (PV) partition (e.g., /dev/sda3)
# This is the partition we want to resize to fill the new disk size
PV_PATH=\((pvs --noheadings -o pv_name | awk '{print \)1}' | head -1)
if [[ -z "$PV_PATH" ]]; then
  echo "ERROR: Could not detect LVM physical volume. Exiting."
  exit 1
fi

# Step 3: Detect the underlying disk device (e.g., /dev/sda) for the PV
DISK_DEV=\((lsblk -no PKNAME "\)PV_PATH" | head -1)
if [[ -z "$DISK_DEV" ]]; then
  echo "ERROR: Could not detect underlying disk for $PV_PATH. Exiting."
  exit 1
fi
DISK="/dev/$DISK_DEV"

# Step 4: Extract the partition number (e.g., 3 for /dev/sda3)
PART_NUM=\((echo "\)PV_PATH" | grep -o '[0-9]*$')
if [[ -z "$PART_NUM" ]]; then
  echo "ERROR: Could not determine partition number from $PV_PATH. Exiting."
  exit 1
fi

# Show current partition table for the detected disk
echo "[2] Partition table for $DISK:"
sudo fdisk -l "$DISK"
echo

echo "Detected:"
echo "  LVM PV      : $PV_PATH"
echo "  Disk device : $DISK"
echo "  Part number : $PART_NUM"
echo

# Step 5: Prompt user to confirm values before making any changes
read -rp "Are these values correct and do you want to proceed with resizing? (yes/no): " confirm
if [[ "$confirm" != "yes" ]]; then
  echo "Aborting for safety."
  exit 1
fi

# Step 6: Install growpart if not already available
echo "[3] Installing growpart if needed..."
if ! command -v growpart &amp;&gt;/dev/null; then
  sudo apt-get update
  sudo apt-get install -y cloud-guest-utils
fi

# Step 7: Grow the LVM partition to occupy the new disk space
echo "[4] Growing partition \(PART_NUM on \)DISK using growpart..."
sudo growpart "\(DISK" "\)PART_NUM"

# Step 8: Resize the LVM physical volume to utilize the expanded partition
echo "[5] Resizing LVM physical volume $PV_PATH..."
sudo pvresize "$PV_PATH"

# Step 9: Find the logical volume (LV) path for the root filesystem (e.g., /dev/ubuntu-vg/ubuntu-lv)
ROOT_LV_PATH=$(findmnt -n -o SOURCE /)
VG=\((lvs --noheadings -o vg_name "\)ROOT_LV_PATH" | awk '{print $1}' | head -1)
LV=\((lvs --noheadings -o lv_name "\)ROOT_LV_PATH" | awk '{print $1}' | head -1)
LV_PATH="/dev/\(VG/\)LV"

echo
echo "Root LV Path  : $LV_PATH"
read -rp "Ready to extend LV ($LV_PATH) and resize filesystem. Proceed? (yes/no): " confirm2
if [[ "$confirm2" != "yes" ]]; then
  echo "Aborting for safety."
  exit 1
fi

# Step 10: Extend the logical volume to use all newly available space
echo "[6] Extending logical volume to use all free space..."
sudo lvextend -l +100%FREE "$LV_PATH"

# Step 11: Resize the filesystem on the logical volume to match the new size
echo "[7] Resizing filesystem..."
FS_TYPE=\((df -T / | tail -1 | awk '{print \)2}')
if [[ "$FS_TYPE" == "xfs" ]]; then
  sudo xfs_growfs /
else
  sudo resize2fs "$LV_PATH"
fi

# Step 12: Show the new disk usage to confirm success
echo
echo "[8] Disk usage after resize:"
df -h

echo "==== Done. Your disk should now show the full size. ===="
</code></pre>
<h3>2. Make the Script Executable</h3>
<pre><code class="language-bash">chmod +x auto_disk_resize_fixed.sh
</code></pre>
<h3>3. Run the Script as Root</h3>
<pre><code class="language-bash">sudo ./auto_disk_resize_fixed.sh
</code></pre>
<h3>4. Follow the Prompts</h3>
<ul>
<li><p>The script will show you the detected disk, LVM, and partition details.</p>
</li>
<li><p><strong>Carefully review</strong> these before answering "yes" to proceed.</p>
</li>
<li><p>The script will pause before each major change for your confirmation.</p>
</li>
</ul>
<hr />
<h2>What’s Happening Behind the Scenes?</h2>
<ul>
<li><p><strong>growpart</strong> expands the partition table entry for your LVM partition to fill the whole virtual disk.</p>
</li>
<li><p><strong>pvresize</strong> tells LVM that new space is available in the physical volume.</p>
</li>
<li><p><strong>lvextend</strong> grows the logical volume (LV) so your root filesystem can use the new space.</p>
</li>
<li><p><strong>resize2fs</strong> or <strong>xfs_growfs</strong> grows the filesystem itself to match the new LV size.</p>
</li>
</ul>
<hr />
<h2>Safety Tips</h2>
<ul>
<li><p><strong>Always backup any critical data</strong> before resizing disks or filesystems.</p>
</li>
<li><p>This script is interactive. If anything looks wrong in the detected devices, abort and double-check your server’s layout!</p>
</li>
<li><p>Only run this if your root filesystem is on LVM (most Ubuntu "Guided - use entire disk and set up LVM" installs use this layout).</p>
</li>
</ul>
<hr />
<h2>Troubleshooting</h2>
<ul>
<li><p>If the script aborts with an error, check that your system uses LVM and that you’ve actually expanded the disk in your VPS control panel.</p>
</li>
<li><p>If your system uses standard partitions (not LVM), this script will not work for you.</p>
</li>
<li><p>If you see any error, copy the error message and seek advice before retrying.</p>
</li>
</ul>
<hr />
<h2>Conclusion</h2>
<p>Expanding a disk on a virtual server isn’t finished after you click “resize” in your cloud control panel. Use this script to safely automate the process for LVM-based Ubuntu systems, with full visibility and control at each step.</p>
<h3>CONTACT:</h3>
<p>I’m Kumar Bishojit Paul, the Founder and CEO of <a href="https://www.bikiran.com/">BIKIRAN</a>. If you need further assistance, please leave a comment. I’m interested in helping you.</p>
<p>Have questions or feedback? Leave a comment below!</p>
<hr />
<h2>🏢 About Bikiran</h2>
<p><strong><a href="https://bikiran.com/">Bikiran</a></strong> is a software development and cloud infrastructure company founded in 2012, headquartered in Khulna, Bangladesh. With 15,000+ clients and over a decade of experience, Bikiran builds and operates a suite of products spanning domain services, cloud hosting, app deployment, workflow automation, and developer tools.</p>
<table>
<thead>
<tr>
<th>SL</th>
<th>Topic</th>
<th>Product</th>
<th>Description</th>
</tr>
</thead>
<tbody><tr>
<td>1</td>
<td>Website</td>
<td><a href="https://bikiran.com/">Bikiran</a></td>
<td>Main platform — Domain, hosting &amp; cloud services</td>
</tr>
<tr>
<td>2</td>
<td>Website</td>
<td><a href="https://www.edusoft.com.bd/">Edusoft</a></td>
<td>Education management software for institutions</td>
</tr>
<tr>
<td>3</td>
<td>Website</td>
<td><a href="https://n8nclouds.com/">n8n Clouds</a></td>
<td>Managed n8n workflow automation hosting</td>
</tr>
<tr>
<td>4</td>
<td>Website</td>
<td><a href="https://www.timestamp.zone/">Timestamp Zone</a></td>
<td>Unix timestamp converter &amp; timezone tool</td>
</tr>
<tr>
<td>5</td>
<td>Website</td>
<td><a href="https://pdfpi.bikiran.com/">PDFpi</a></td>
<td>Online PDF processing &amp; manipulation tool</td>
</tr>
<tr>
<td>6</td>
<td>Website</td>
<td><a href="https://blog.bikiran.com/">Blog</a></td>
<td>Technical articles, guides &amp; tutorials</td>
</tr>
<tr>
<td>7</td>
<td>Website</td>
<td><a href="https://support.bikiran.com/">Support</a></td>
<td>24/7 customer support portal</td>
</tr>
<tr>
<td>8</td>
<td>Website</td>
<td><a href="https://probackup.bikiran.com/">Probackup</a></td>
<td>Automated database backup for SQL, PostgreSQL &amp; MongoDB</td>
</tr>
<tr>
<td>9</td>
<td>Service</td>
<td><a href="https://www.bikiran.com/domain">Domain</a></td>
<td>Domain registration, transfer &amp; DNS management</td>
</tr>
<tr>
<td>10</td>
<td>Service</td>
<td><a href="https://www.bikiran.com/services/hosting/web">Hosting</a></td>
<td>Web, app &amp; email hosting on NVMe SSD</td>
</tr>
<tr>
<td>11</td>
<td>Service</td>
<td>Email &amp; SMS</td>
<td>Bulk email &amp; SMS notification service</td>
</tr>
<tr>
<td>12</td>
<td>npm</td>
<td><a href="https://www.npmjs.com/package/@bikiran/chronopick">Chronopick</a></td>
<td>Date &amp; time picker React component</td>
</tr>
<tr>
<td>13</td>
<td>npm</td>
<td><a href="https://www.npmjs.com/package/@bikiran/editor">Rich Editor</a></td>
<td>WYSIWYG rich text editor for React</td>
</tr>
<tr>
<td>14</td>
<td>npm</td>
<td><a href="https://www.npmjs.com/package/@bikiran/button">Button</a></td>
<td>Reusable React button component library</td>
</tr>
<tr>
<td>15</td>
<td>npm</td>
<td><a href="https://www.npmjs.com/package/create-edx-app">Electron Boilerplate</a></td>
<td>CLI to scaffold Electron.js project templates</td>
</tr>
<tr>
<td>16</td>
<td>NuGet</td>
<td><a href="https://www.nuget.org/packages/Bikiran.Payment.Bkash">Bkash</a></td>
<td>bKash payment gateway integration for .NET</td>
</tr>
<tr>
<td>17</td>
<td>NuGet</td>
<td><a href="https://www.nuget.org/packages/Bikiran.Engine">Bikiran Engine</a></td>
<td>Core .NET engine library for Bikiran services</td>
</tr>
<tr>
<td>18</td>
<td>Open Source</td>
<td><a href="https://github.com/bikirandev/pdfpi">PDFpi</a></td>
<td>PDF processing tool — open source</td>
</tr>
<tr>
<td>19</td>
<td>Open Source</td>
<td><a href="https://github.com/bikirandev/Bikiran.Engine">Bikiran Engine</a></td>
<td>Core .NET engine — open source</td>
</tr>
<tr>
<td>20</td>
<td>Open Source</td>
<td><a href="https://github.com/bikirandev/DriveCLI">Drive CLI</a></td>
<td>CLI tool to manage Google Drive from terminal</td>
</tr>
<tr>
<td>21</td>
<td>Docker</td>
<td><a href="https://github.com/bikirandev/docker-pgsql">Pgsql</a></td>
<td>Docker setup for PostgreSQL</td>
</tr>
<tr>
<td>22</td>
<td>Docker</td>
<td><a href="https://github.com/bikirandev/docker-n8n">n8n</a></td>
<td>Docker setup for n8n automation</td>
</tr>
<tr>
<td>23</td>
<td>Docker</td>
<td><a href="https://github.com/bikirandev/docker-pgadmin">Pgadmin</a></td>
<td>Docker setup for pgAdmin</td>
</tr>
<tr>
<td>24</td>
<td>Social Media</td>
<td><a href="https://www.linkedin.com/company/bikiran12">LinkedIn</a></td>
<td>Bikiran on LinkedIn</td>
</tr>
<tr>
<td>25</td>
<td>Social Media</td>
<td><a href="https://www.facebook.com/bikiran12">Facebook</a></td>
<td>Bikiran on Facebook</td>
</tr>
<tr>
<td>26</td>
<td>Social Media</td>
<td><a href="https://www.youtube.com/@bikiranofficial">YouTube</a></td>
<td>Bikiran on YouTube</td>
</tr>
<tr>
<td>27</td>
<td>Social Media</td>
<td><a href="https://www.facebook.com/n8nclouds">FB n8nClouds</a></td>
<td>n8n Clouds on Facebook</td>
</tr>
</tbody></table>
]]></content:encoded></item><item><title><![CDATA[Setting Up MySQL on a Remote Server and Connecting via PHP]]></title><description><![CDATA[Introduction
Deploying MySQL on a remote server unlocks scalable application architecture but introduces security and configuration challenges. This guide walks through:

Secure MySQL installation

Re]]></description><link>https://blog.bikiran.com/setting-up-mysql-on-a-remote-server-and-connecting-via-php</link><guid isPermaLink="true">https://blog.bikiran.com/setting-up-mysql-on-a-remote-server-and-connecting-via-php</guid><category><![CDATA[MySQL]]></category><category><![CDATA[server]]></category><category><![CDATA[configuration]]></category><category><![CDATA[setup]]></category><dc:creator><![CDATA[KUMAR BISHOJIT]]></dc:creator><pubDate>Sun, 22 Jun 2025 16:57:48 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1750739419353/5e03a821-a8f6-4af8-bf94-94102923562e.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2>Introduction</h2>
<p>Deploying MySQL on a remote server unlocks scalable application architecture but introduces security and configuration challenges. This guide walks through:</p>
<ul>
<li><p>Secure MySQL installation</p>
</li>
<li><p>Remote access configuration</p>
</li>
<li><p>Database migration strategies</p>
</li>
<li><p>PHP connectivity</p>
</li>
<li><p>Production hardening</p>
</li>
<li><p>Performance tuning</p>
</li>
</ul>
<p><em>Tested on Ubuntu 22.04 LTS | MySQL 8.0 | PHP 8.1</em></p>
<h3><strong>🔑 Prerequisites</strong></h3>
<ol>
<li><p><strong>Server Specifications</strong>:</p>
<ul>
<li><p>Ubuntu 22.04 LTS (2+ vCPU, 4GB RAM recommended)</p>
</li>
<li><p>Public IP address (<code>139.1.1.101</code> in this example)</p>
</li>
</ul>
</li>
<li><p><strong>Local Environment</strong>:</p>
<ul>
<li><p>MySQL Workbench or <code>mysqldump</code></p>
</li>
<li><p>SSH client (OpenSSH)</p>
</li>
</ul>
</li>
<li><p><strong>Security Essentials</strong>:</p>
<ul>
<li><p>Firewall (UFW) enabled</p>
</li>
<li><p>SSH key authentication</p>
</li>
</ul>
</li>
</ol>
<h3><strong>🚀 Step-by-Step Implementation</strong></h3>
<h4><strong>🔐 1. Secure Server Initialization</strong></h4>
<pre><code class="language-bash"># SSH with key authentication (recommended)
ssh -i ~/.ssh/your_key.pem karimtrd@139.1.1.101

# Create sudo user (if not exists)
sudo adduser deploy --gecos "" &amp;&amp; sudo usermod -aG sudo deploy
</code></pre>
<p><em>Security Tip: Disable root SSH in</em> <code>/etc/ssh/sshd_config</code></p>
<h4><strong>🛠️ 2. MySQL Installation &amp; Hardening</strong></h4>
<p><strong>Install with TLS Support</strong>:</p>
<pre><code class="language-bash">sudo apt update &amp;&amp; sudo apt install mysql-server -y
sudo systemctl enable --now mysql
</code></pre>
<p><strong>Configure Security</strong>:</p>
<pre><code class="language-bash">sudo mysql_secure_installation
</code></pre>
<p><em>Follow these choices:</em></p>
<ol>
<li><p>VALIDATE PASSWORD COMPONENT → Strong</p>
</li>
<li><p>Root password: Hello@Unlock!24Mysql</p>
</li>
<li><p>Remove anonymous users? → Yes</p>
</li>
<li><p>Disallow root login remotely? → Yes</p>
</li>
<li><p>Remove test database? → Yes</p>
</li>
<li><p>Reload privileges? → Yes</p>
</li>
</ol>
<p><strong>Verify Installation</strong>:</p>
<pre><code class="language-bash">sudo mysql -u root -p
SHOW VARIABLES LIKE '%tls%';  # Confirm TLS active
</code></pre>
<h4><strong>🌐 3. Remote Access Configuration</strong></h4>
<p><strong>Update MySQL Config</strong>:</p>
<pre><code class="language-bash">sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
</code></pre>
<pre><code class="language-plaintext">[mysqld]
bind-address = 0.0.0.0
# Enable binary logging for point-in-time recovery
log-bin = /var/log/mysql/mysql-bin.log
server-id = 1
</code></pre>
<p><strong>Firewall Rules</strong>:</p>
<pre><code class="language-bash">sudo ufw allow proto tcp from 192.168.1.0/24 to any port 3306  # Limit to your network
sudo ufw limit 22/tcp  # Protect SSH from brute-force
sudo ufw enable
</code></pre>
<p><strong>Restart Service</strong>:</p>
<pre><code class="language-bash">sudo systemctl restart mysql
</code></pre>
<h4><strong>👤 4. Database User &amp; Privileges</strong></h4>
<pre><code class="language-sql">CREATE DATABASE postech22_karimtraders
  CHARACTER SET utf8mb4
  COLLATE utf8mb4_unicode_ci;

CREATE USER 'vm_karimtraders'@'192.168.1.%' 
  IDENTIFIED WITH mysql_native_password BY 'Unlock!24Mysql@Do'
  REQUIRE SSL;  # Enforce TLS

GRANT SELECT, INSERT, UPDATE, DELETE, EXECUTE 
  ON postech22_karimtraders.* 
  TO 'vm_karimtraders'@'192.168.1.%';

USE postech22_karimtraders;

FLUSH PRIVILEGES;
</code></pre>
<p><em>Note: Avoid</em> <code>GRANT ALL</code> and <code>'%'</code> wildcards in production</p>
<h3><strong>🚚 Database Migration Strategies</strong></h3>
<pre><code class="language-bash"># Local export with compression
mysqldump -u root -p --single-transaction --routines \
  --triggers postech22_karimtraders | gzip &gt; db_$(date +%F).sql.gz

# Secure transfer
scp -i ~/.ssh/key.pem db_2023-10-05.sql.gz karimtrd@139.1.1.101:~

# Remote import
gunzip &lt; db_2023-10-05.sql.gz | mysql -u vm_karimtraders -p postech22_karimtraders
</code></pre>
<p><strong>Method 2: MySQL Replication (Large Databases)</strong></p>
<ol>
<li><p>Configure master-slave replication</p>
</li>
<li><p>Promote the slave to primary after cutover</p>
</li>
<li><p>Update application connection strings</p>
</li>
</ol>
<h3><strong>🔌 PHP Connectivity &amp; Best Practices</strong></h3>
<p><strong>PDO Connection with Error Handling</strong>:</p>
<pre><code class="language-php">&lt;?php
$servername = "139.1.1.101";
$username = "vm_karimtraders";
$password = "Unlock!24Mysql@Do";
$dbname = "postech22_karimtraders";
$ssl = [
    PDO::MYSQL_ATTR_SSL_CA =&gt; '/etc/ssl/certs/ca-certificates.crt',
    PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT =&gt; true
];

try {
    $conn = new PDO(
        "mysql:host=\(servername;dbname=\)dbname;charset=utf8mb4",
        $username,
        $password,
        [
            PDO::ATTR_ERRMODE =&gt; PDO::ERRMODE_EXCEPTION,
            PDO::ATTR_EMULATE_PREPARES =&gt; false,
            PDO::ATTR_PERSISTENT =&gt; true
        ] + $ssl
    );
    
    echo "Connected successfully with TLS encryption";
} catch (PDOException $e) {
    error_log("Connection failed: " . $e-&gt;getMessage());
    http_response_code(503);
    exit("Database maintenance in progress");
}
?&gt;
</code></pre>
<p><em>Key Features:</em></p>
<ul>
<li><p>TLS encryption enforcement</p>
</li>
<li><p>Prepared statements</p>
</li>
<li><p>Persistent connections</p>
</li>
<li><p>Graceful error handling</p>
</li>
</ul>
<h3><strong>🔥 Production Hardening Checklist</strong></h3>
<ol>
<li><p><strong>Encryption</strong>:</p>
<pre><code class="language-sql">ALTER DATABASE postech22_karimtraders ENCRYPTION = 'Y';  # InnoDB tablespace encryption
</code></pre>
</li>
<li><p><strong>Auditing</strong>:</p>
<pre><code class="language-bash">sudo apt install mysql-audit-plugin
</code></pre>
</li>
<li><p><strong>Backup Automation</strong>:</p>
<pre><code class="language-bash"># Daily compressed backups with retention
0 2 * * * /usr/bin/mysqldump -u bkpuser -p[Password] --single-transaction \
  --routines postech22_karimtraders | gzip &gt; /backups/db_$(date +\%F).sql.gz \
  &amp;&amp; find /backups -type f -mtime +30 -delete
</code></pre>
</li>
<li><p><strong>Monitoring</strong>:</p>
<ul>
<li><p>Enable Performance Schema: <code>SET GLOBAL performance_schema=ON;</code></p>
</li>
<li><p>Install Percona Monitoring Plugins</p>
</li>
</ul>
</li>
</ol>
<h3><strong>⚡ Performance Tuning</strong></h3>
<p><strong>my.cnf Optimizations</strong>:</p>
<pre><code class="language-plaintext">[mysqld]
innodb_buffer_pool_size = 2G  # 70-80% of RAM
innodb_log_file_size = 256M
max_connections = 200
thread_cache_size = 50
query_cache_type = 0  # Disable on MySQL 8+
</code></pre>
<p><strong>Connection Pooling in PHP</strong>:</p>
<pre><code class="language-php">$conn-&gt;setAttribute(PDO::ATTR_PERSISTENT, true);  # Reuse connections
</code></pre>
<p><strong>Index Optimization</strong>:</p>
<pre><code class="language-sql">EXPLAIN SELECT * FROM orders WHERE status = 'processing';
CREATE INDEX idx_orders_status ON orders(status);
</code></pre>
<h3><strong>🚨 Troubleshooting Guide</strong></h3>
<table>
<thead>
<tr>
<th><strong>Issue</strong></th>
<th><strong>Diagnosis Command</strong></th>
<th><strong>Solution</strong></th>
</tr>
</thead>
<tbody><tr>
<td>Connection timeout</td>
<td><code>telnet 139.1.1.101 3306</code></td>
<td>Check UFW rules and bind-address</td>
</tr>
<tr>
<td>"Access Denied" errors</td>
<td><code>SELECT host FROM mysql.user WHERE user='vm_karimtraders';</code></td>
<td>Verify user privileges</td>
</tr>
<tr>
<td>High CPU usage</td>
<td><code>SHOW PROCESSLIST;</code></td>
<td>Optimize slow queries</td>
</tr>
<tr>
<td>Replication lag</td>
<td><code>SHOW SLAVE STATUS\G</code></td>
<td>Increase <code>innodb_buffer_pool_size</code></td>
</tr>
<tr>
<td>Can't connect via PHP</td>
<td>`php -m</td>
<td>grep mysql`</td>
</tr>
</tbody></table>
<h3><strong>✅ Deployment Validation Checklist</strong></h3>
<ol>
<li><p>Test local → remote connection: <code>mysql -h 139.1.1.101 -u vm_karimtraders -p</code></p>
</li>
<li><p>Verify TLS: <code>\s</code> in MySQL client shows "SSL: Cipher in use"</p>
</li>
<li><p>Load test with <code>sysbench</code></p>
</li>
<li><p>Validate backups: Restore to test instance</p>
</li>
<li><p>Test failover procedure (if replicated)</p>
</li>
</ol>
<h3><strong>🌈 Conclusion</strong></h3>
<p>You've now deployed a production-grade MySQL server with:</p>
<ul>
<li><p>Encrypted network connections</p>
</li>
<li><p>Least-privilege access control</p>
</li>
<li><p>Automated backups</p>
</li>
<li><p>Performance monitoring</p>
</li>
<li><p>PHP connectivity best practices</p>
</li>
</ul>
<p><strong>Next Steps</strong>:</p>
<ol>
<li><p>Implement read replicas for high-traffic apps</p>
</li>
<li><p>Set up automated failover with ProxySQL</p>
</li>
<li><p>Enable slow query logging for optimization</p>
</li>
</ol>
<h3>CONTACT:</h3>
<p>I’m Kumar Bishojit Paul, the Founder and CEO of <a href="https://www.bikiran.com/">BIKIRAN</a>. If you need further assistance, please leave a comment. I’m interested in helping you.</p>
<blockquote>
<p>✨ <strong>Pro Tip</strong>: Use infrastructure-as-code tools like Ansible to automate this setup!</p>
</blockquote>
<hr />
<p><strong>Enjoyed this guide?</strong><br />✅ <a href="https://yourprofile/"><strong>Follow me</strong></a> for more DevOps tutorials<br />🔁 <strong>Share</strong> with your engineering team<br />💬 <strong>Comment</strong> your deployment challenges!</p>
<hr />
<h2>🏢 About Bikiran</h2>
<p><strong><a href="https://bikiran.com/">Bikiran</a></strong> is a software development and cloud infrastructure company founded in 2012, headquartered in Khulna, Bangladesh. With 15,000+ clients and over a decade of experience, Bikiran builds and operates a suite of products spanning domain services, cloud hosting, app deployment, workflow automation, and developer tools.</p>
<table>
<thead>
<tr>
<th>SL</th>
<th>Topic</th>
<th>Product</th>
<th>Description</th>
</tr>
</thead>
<tbody><tr>
<td>1</td>
<td>Website</td>
<td><a href="https://bikiran.com/">Bikiran</a></td>
<td>Main platform — Domain, hosting &amp; cloud services</td>
</tr>
<tr>
<td>2</td>
<td>Website</td>
<td><a href="https://www.edusoft.com.bd/">Edusoft</a></td>
<td>Education management software for institutions</td>
</tr>
<tr>
<td>3</td>
<td>Website</td>
<td><a href="https://n8nclouds.com/">n8n Clouds</a></td>
<td>Managed n8n workflow automation hosting</td>
</tr>
<tr>
<td>4</td>
<td>Website</td>
<td><a href="https://www.timestamp.zone/">Timestamp Zone</a></td>
<td>Unix timestamp converter &amp; timezone tool</td>
</tr>
<tr>
<td>5</td>
<td>Website</td>
<td><a href="https://pdfpi.bikiran.com/">PDFpi</a></td>
<td>Online PDF processing &amp; manipulation tool</td>
</tr>
<tr>
<td>6</td>
<td>Website</td>
<td><a href="https://blog.bikiran.com/">Blog</a></td>
<td>Technical articles, guides &amp; tutorials</td>
</tr>
<tr>
<td>7</td>
<td>Website</td>
<td><a href="https://support.bikiran.com/">Support</a></td>
<td>24/7 customer support portal</td>
</tr>
<tr>
<td>8</td>
<td>Website</td>
<td><a href="https://probackup.bikiran.com/">Probackup</a></td>
<td>Automated database backup for SQL, PostgreSQL &amp; MongoDB</td>
</tr>
<tr>
<td>9</td>
<td>Service</td>
<td><a href="https://www.bikiran.com/domain">Domain</a></td>
<td>Domain registration, transfer &amp; DNS management</td>
</tr>
<tr>
<td>10</td>
<td>Service</td>
<td><a href="https://www.bikiran.com/services/hosting/web">Hosting</a></td>
<td>Web, app &amp; email hosting on NVMe SSD</td>
</tr>
<tr>
<td>11</td>
<td>Service</td>
<td>Email &amp; SMS</td>
<td>Bulk email &amp; SMS notification service</td>
</tr>
<tr>
<td>12</td>
<td>npm</td>
<td><a href="https://www.npmjs.com/package/@bikiran/chronopick">Chronopick</a></td>
<td>Date &amp; time picker React component</td>
</tr>
<tr>
<td>13</td>
<td>npm</td>
<td><a href="https://www.npmjs.com/package/@bikiran/editor">Rich Editor</a></td>
<td>WYSIWYG rich text editor for React</td>
</tr>
<tr>
<td>14</td>
<td>npm</td>
<td><a href="https://www.npmjs.com/package/@bikiran/button">Button</a></td>
<td>Reusable React button component library</td>
</tr>
<tr>
<td>15</td>
<td>npm</td>
<td><a href="https://www.npmjs.com/package/create-edx-app">Electron Boilerplate</a></td>
<td>CLI to scaffold Electron.js project templates</td>
</tr>
<tr>
<td>16</td>
<td>NuGet</td>
<td><a href="https://www.nuget.org/packages/Bikiran.Payment.Bkash">Bkash</a></td>
<td>bKash payment gateway integration for .NET</td>
</tr>
<tr>
<td>17</td>
<td>NuGet</td>
<td><a href="https://www.nuget.org/packages/Bikiran.Engine">Bikiran Engine</a></td>
<td>Core .NET engine library for Bikiran services</td>
</tr>
<tr>
<td>18</td>
<td>Open Source</td>
<td><a href="https://github.com/bikirandev/pdfpi">PDFpi</a></td>
<td>PDF processing tool — open source</td>
</tr>
<tr>
<td>19</td>
<td>Open Source</td>
<td><a href="https://github.com/bikirandev/Bikiran.Engine">Bikiran Engine</a></td>
<td>Core .NET engine — open source</td>
</tr>
<tr>
<td>20</td>
<td>Open Source</td>
<td><a href="https://github.com/bikirandev/DriveCLI">Drive CLI</a></td>
<td>CLI tool to manage Google Drive from terminal</td>
</tr>
<tr>
<td>21</td>
<td>Docker</td>
<td><a href="https://github.com/bikirandev/docker-pgsql">Pgsql</a></td>
<td>Docker setup for PostgreSQL</td>
</tr>
<tr>
<td>22</td>
<td>Docker</td>
<td><a href="https://github.com/bikirandev/docker-n8n">n8n</a></td>
<td>Docker setup for n8n automation</td>
</tr>
<tr>
<td>23</td>
<td>Docker</td>
<td><a href="https://github.com/bikirandev/docker-pgadmin">Pgadmin</a></td>
<td>Docker setup for pgAdmin</td>
</tr>
<tr>
<td>24</td>
<td>Social Media</td>
<td><a href="https://www.linkedin.com/company/bikiran12">LinkedIn</a></td>
<td>Bikiran on LinkedIn</td>
</tr>
<tr>
<td>25</td>
<td>Social Media</td>
<td><a href="https://www.facebook.com/bikiran12">Facebook</a></td>
<td>Bikiran on Facebook</td>
</tr>
<tr>
<td>26</td>
<td>Social Media</td>
<td><a href="https://www.youtube.com/@bikiranofficial">YouTube</a></td>
<td>Bikiran on YouTube</td>
</tr>
<tr>
<td>27</td>
<td>Social Media</td>
<td><a href="https://www.facebook.com/n8nclouds">FB n8nClouds</a></td>
<td>n8n Clouds on Facebook</td>
</tr>
</tbody></table>
]]></content:encoded></item><item><title><![CDATA[How to Test NuGet Packages Locally Before Publishing to NuGet Feed]]></title><description><![CDATA[When developing NuGet packages, testing them in real projects before official publication is crucial. Here's a comprehensive guide to setting up local testing:
STEP-1: Configure Local Package Source
A]]></description><link>https://blog.bikiran.com/how-to-test-nuget-packages-locally-before-publishing-to-nuget-feed</link><guid isPermaLink="true">https://blog.bikiran.com/how-to-test-nuget-packages-locally-before-publishing-to-nuget-feed</guid><category><![CDATA[Nuget]]></category><category><![CDATA[dotnet]]></category><category><![CDATA[package]]></category><category><![CDATA[Testing]]></category><dc:creator><![CDATA[KUMAR BISHOJIT]]></dc:creator><pubDate>Wed, 21 May 2025 11:59:30 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1747897119045/cd7b2bea-f88b-4c10-8d83-3ae6769a814e.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>When developing NuGet packages, testing them in real projects before official publication is crucial. Here's a comprehensive guide to setting up local testing:</p>
<h2><strong>STEP-1: Configure Local Package Source</strong></h2>
<p>Add to your <code>.csproj</code> file:</p>
<pre><code class="language-xml">&lt;Project Sdk="Microsoft.NET.Sdk.Web"&gt;
    &lt;PropertyGroup&gt;
        &lt;TargetFramework&gt;net9.0&lt;/TargetFramework&gt;
        &lt;!-- Add local package source --&gt;
        &lt;RestoreAdditionalProjectSources&gt;
            $(RestoreAdditionalProjectSources);
            D:\P_Bikiran\Bikiran.Validation\bin\Release\
        &lt;/RestoreAdditionalProjectSources&gt;
    &lt;/PropertyGroup&gt;

    &lt;ItemGroup&gt;
        &lt;PackageReference Include="Bikiran.Validation" Version="1.0.7" /&gt;
    &lt;/ItemGroup&gt;
&lt;/Project&gt;
</code></pre>
<h2><strong>2. Package Development Workflow</strong></h2>
<ol>
<li><p><strong>Build your package</strong></p>
<p>Ensure your package project is built in the Release configuration</p>
<pre><code class="language-bash">dotnet build -c Release
</code></pre>
</li>
<li><p><strong>Generate a</strong> <code>.nupkg</code> <strong>file</strong></p>
<pre><code class="language-bash">dotnet pack --configuration Release
</code></pre>
</li>
<li><p><strong>Verify package structure</strong></p>
<p>Confirm the .nupkg file exists in your output directory:</p>
<pre><code class="language-bash">D:\P_Bikiran\Bikiran.Validation\bin\Release\Bikiran.Validation.1.0.7.nupkg
</code></pre>
</li>
</ol>
<h2><strong>3. Consumption in Live Projects</strong></h2>
<pre><code class="language-csharp">using Bikiran.Validation; // Your local package
using Bikiran.Utils.ApiResp;

public class DomainCnsAddProperty
{
    public string Cns { get; set; } = "";
    public List&lt;string&gt; Ips { get; set; } = [];

    public ApiResponse Validate()
    {
        var validationResult = ValidateBasic.ValidateAll([
            ValDomain.IsValidDomainFormat(Cns, "Child Name Server"),
            ValIP.IsValidIpFormatAll(Ips, "IP Addresses"),
        ]);

        return new ApiResponse {
            Error = validationResult.Error,
            Message = validationResult.Message,
            ReferenceName = GetReferenceName(validationResult.ErrorIndex)
        };
    }

    private string GetReferenceName(List&lt;string&gt; names, int? errorIndex)
        =&gt; errorIndex.HasValue ? names[errorIndex.Value] : "Validation";
}
</code></pre>
<h2><strong>Best Practices</strong></h2>
<ol>
<li><p><strong>Version Management</strong></p>
<ul>
<li><p>Increment versions systematically (SemVer recommended)</p>
</li>
<li><p>Use wildcards for development versions: <code>1.0.*</code></p>
</li>
</ul>
</li>
<li><p><strong>Dependency Isolation</strong></p>
<pre><code class="language-xml">&lt;PackageReference Include="Bikiran.Validation" Version="1.0.7"&gt;
  &lt;PrivateAssets&gt;all&lt;/PrivateAssets&gt;
&lt;/PackageReference&gt;
</code></pre>
</li>
<li><p><strong>CI/CD Integration</strong></p>
<p>Consider adding a local package directory in your build pipeline:</p>
<pre><code class="language-xml">&lt;RestoreAdditionalProjectSources&gt;
  $(RestoreAdditionalProjectSources);
  $(Build.SourcesDirectory)\artifacts
&lt;/RestoreAdditionalProjectSources&gt;
</code></pre>
</li>
</ol>
<h2><strong>Troubleshooting Common Issues</strong></h2>
<ol>
<li><p><strong>Package Not Found</strong></p>
<ul>
<li><p>Verify the <code>.nupkg</code> file exists at the specified path</p>
</li>
<li><p>Check package version consistency</p>
</li>
<li><p>Clear NuGet caches: <code>dotnet nuget locals all --clear</code></p>
</li>
</ul>
</li>
<li><p><strong>Version Conflicts</strong></p>
<p>Use exact versions during development:</p>
<pre><code class="language-xml">&lt;PackageReference Include="Bikiran.Validation" Version="[1.0.7]" /&gt;
</code></pre>
</li>
<li><p><strong>IntelliSense Issues</strong></p>
<ul>
<li><p>Restart IDE after package updates</p>
</li>
<li><p>Run <code>dotnet restore</code> manually</p>
</li>
</ul>
</li>
</ol>
<h3><strong>CONTACT:</strong></h3>
<p>I’m Kumar Bishojit Paul, the Founder and CEO of <a href="https://www.bikiran.com/">BIKIRAN</a>. If you need further assistance, please leave a comment. I’m interested in helping you.</p>
<hr />
<h2>🏢 About Bikiran</h2>
<p><strong><a href="https://bikiran.com/">Bikiran</a></strong> is a software development and cloud infrastructure company founded in 2012, headquartered in Khulna, Bangladesh. With 15,000+ clients and over a decade of experience, Bikiran builds and operates a suite of products spanning domain services, cloud hosting, app deployment, workflow automation, and developer tools.</p>
<table>
<thead>
<tr>
<th>SL</th>
<th>Topic</th>
<th>Product</th>
<th>Description</th>
</tr>
</thead>
<tbody><tr>
<td>1</td>
<td>Website</td>
<td><a href="https://bikiran.com/">Bikiran</a></td>
<td>Main platform — Domain, hosting &amp; cloud services</td>
</tr>
<tr>
<td>2</td>
<td>Website</td>
<td><a href="https://www.edusoft.com.bd/">Edusoft</a></td>
<td>Education management software for institutions</td>
</tr>
<tr>
<td>3</td>
<td>Website</td>
<td><a href="https://n8nclouds.com/">n8n Clouds</a></td>
<td>Managed n8n workflow automation hosting</td>
</tr>
<tr>
<td>4</td>
<td>Website</td>
<td><a href="https://www.timestamp.zone/">Timestamp Zone</a></td>
<td>Unix timestamp converter &amp; timezone tool</td>
</tr>
<tr>
<td>5</td>
<td>Website</td>
<td><a href="https://pdfpi.bikiran.com/">PDFpi</a></td>
<td>Online PDF processing &amp; manipulation tool</td>
</tr>
<tr>
<td>6</td>
<td>Website</td>
<td><a href="https://blog.bikiran.com/">Blog</a></td>
<td>Technical articles, guides &amp; tutorials</td>
</tr>
<tr>
<td>7</td>
<td>Website</td>
<td><a href="https://support.bikiran.com/">Support</a></td>
<td>24/7 customer support portal</td>
</tr>
<tr>
<td>8</td>
<td>Website</td>
<td><a href="https://probackup.bikiran.com/">Probackup</a></td>
<td>Automated database backup for SQL, PostgreSQL &amp; MongoDB</td>
</tr>
<tr>
<td>9</td>
<td>Service</td>
<td><a href="https://www.bikiran.com/domain">Domain</a></td>
<td>Domain registration, transfer &amp; DNS management</td>
</tr>
<tr>
<td>10</td>
<td>Service</td>
<td><a href="https://www.bikiran.com/services/hosting/web">Hosting</a></td>
<td>Web, app &amp; email hosting on NVMe SSD</td>
</tr>
<tr>
<td>11</td>
<td>Service</td>
<td>Email &amp; SMS</td>
<td>Bulk email &amp; SMS notification service</td>
</tr>
<tr>
<td>12</td>
<td>npm</td>
<td><a href="https://www.npmjs.com/package/@bikiran/chronopick">Chronopick</a></td>
<td>Date &amp; time picker React component</td>
</tr>
<tr>
<td>13</td>
<td>npm</td>
<td><a href="https://www.npmjs.com/package/@bikiran/editor">Rich Editor</a></td>
<td>WYSIWYG rich text editor for React</td>
</tr>
<tr>
<td>14</td>
<td>npm</td>
<td><a href="https://www.npmjs.com/package/@bikiran/button">Button</a></td>
<td>Reusable React button component library</td>
</tr>
<tr>
<td>15</td>
<td>npm</td>
<td><a href="https://www.npmjs.com/package/create-edx-app">Electron Boilerplate</a></td>
<td>CLI to scaffold Electron.js project templates</td>
</tr>
<tr>
<td>16</td>
<td>NuGet</td>
<td><a href="https://www.nuget.org/packages/Bikiran.Payment.Bkash">Bkash</a></td>
<td>bKash payment gateway integration for .NET</td>
</tr>
<tr>
<td>17</td>
<td>NuGet</td>
<td><a href="https://www.nuget.org/packages/Bikiran.Engine">Bikiran Engine</a></td>
<td>Core .NET engine library for Bikiran services</td>
</tr>
<tr>
<td>18</td>
<td>Open Source</td>
<td><a href="https://github.com/bikirandev/pdfpi">PDFpi</a></td>
<td>PDF processing tool — open source</td>
</tr>
<tr>
<td>19</td>
<td>Open Source</td>
<td><a href="https://github.com/bikirandev/Bikiran.Engine">Bikiran Engine</a></td>
<td>Core .NET engine — open source</td>
</tr>
<tr>
<td>20</td>
<td>Open Source</td>
<td><a href="https://github.com/bikirandev/DriveCLI">Drive CLI</a></td>
<td>CLI tool to manage Google Drive from terminal</td>
</tr>
<tr>
<td>21</td>
<td>Docker</td>
<td><a href="https://github.com/bikirandev/docker-pgsql">Pgsql</a></td>
<td>Docker setup for PostgreSQL</td>
</tr>
<tr>
<td>22</td>
<td>Docker</td>
<td><a href="https://github.com/bikirandev/docker-n8n">n8n</a></td>
<td>Docker setup for n8n automation</td>
</tr>
<tr>
<td>23</td>
<td>Docker</td>
<td><a href="https://github.com/bikirandev/docker-pgadmin">Pgadmin</a></td>
<td>Docker setup for pgAdmin</td>
</tr>
<tr>
<td>24</td>
<td>Social Media</td>
<td><a href="https://www.linkedin.com/company/bikiran12">LinkedIn</a></td>
<td>Bikiran on LinkedIn</td>
</tr>
<tr>
<td>25</td>
<td>Social Media</td>
<td><a href="https://www.facebook.com/bikiran12">Facebook</a></td>
<td>Bikiran on Facebook</td>
</tr>
<tr>
<td>26</td>
<td>Social Media</td>
<td><a href="https://www.youtube.com/@bikiranofficial">YouTube</a></td>
<td>Bikiran on YouTube</td>
</tr>
<tr>
<td>27</td>
<td>Social Media</td>
<td><a href="https://www.facebook.com/n8nclouds">FB n8nClouds</a></td>
<td>n8n Clouds on Facebook</td>
</tr>
</tbody></table>
]]></content:encoded></item><item><title><![CDATA[Including Static Files in a NuGet Package: A Developer's Guide]]></title><description><![CDATA[Why Static Files in NuGet Packages?
When developing utility libraries, you'll often need to bundle static files like JSON configurations, text templates, or images. This guide demonstrates two profess]]></description><link>https://blog.bikiran.com/including-static-files-in-a-nuget-package-a-developers-guide</link><guid isPermaLink="true">https://blog.bikiran.com/including-static-files-in-a-nuget-package-a-developers-guide</guid><category><![CDATA[NuGetPackageDevelopment]]></category><category><![CDATA[StaticFilesInNuGet]]></category><category><![CDATA[EmbeddedResources]]></category><category><![CDATA[ContentFiles]]></category><category><![CDATA[AdvancedNuGetFeatures]]></category><category><![CDATA[PackageConfiguration]]></category><category><![CDATA[AssemblyResources]]></category><category><![CDATA[dotnet]]></category><category><![CDATA[Tutorial]]></category><dc:creator><![CDATA[KUMAR BISHOJIT]]></dc:creator><pubDate>Wed, 21 May 2025 11:27:16 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1747827530719/4258130c-0a41-4dd5-b142-be637db628bf.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h3>Why Static Files in NuGet Packages?</h3>
<p>When developing utility libraries, you'll often need to bundle static files like JSON configurations, text templates, or images. This guide demonstrates two professional approaches to include these files in your NuGet package:</p>
<ol>
<li><p><strong>Embedded Resources</strong> (Files compiled into the assembly)</p>
</li>
<li><p><strong>Content Files</strong> (Files added to consumer projects)</p>
</li>
</ol>
<h2>Step 1: Project Setup (YourProject.csproj)</h2>
<p>Base Configuration</p>
<pre><code class="language-xml">&lt;Project Sdk="Microsoft.NET.Sdk"&gt;
  &lt;PropertyGroup&gt;
    &lt;TargetFramework&gt;net9.0&lt;/TargetFramework&gt;
    &lt;PackageId&gt;YourProject&lt;/PackageId&gt;
    &lt;Version&gt;1.0.5&lt;/Version&gt;
    &lt;!-- Other metadata --&gt;
  &lt;/PropertyGroup&gt;
&lt;/Project&gt;
</code></pre>
<p>Key Additions for Static Files</p>
<pre><code class="language-xml">&lt;ItemGroup&gt;
  &lt;!-- As Embedded Resource --&gt;
  &lt;EmbeddedResource Include="Phone/countries.json" /&gt;

  &lt;!-- As Content File --&gt;
  &lt;None Include="Phone/countries.json" 
        Pack="True" 
        PackagePath="contentFiles/any/any/Phone/" /&gt;
&lt;/ItemGroup&gt;
</code></pre>
<p><strong>What These Do?</strong></p>
<ul>
<li><p><code>EmbeddedResource</code>: Bakes the file into your DLL</p>
</li>
<li><p><code>None</code> with <code>Pack</code>: Includes file in NuGet's <code>contentFiles</code> directory</p>
</li>
</ul>
<h2>Step 2: Accessing Embedded Resources</h2>
<pre><code class="language-csharp">using System.Reflection;
using Newtonsoft.Json;

public class PhoneNumberOperation
{
    public List&lt;CountryCode&gt; CountryCodes { get; } = new();

    public PhoneNumberOperation()
    {
        var assembly = Assembly.GetExecutingAssembly();
        var resourceName = "YourProject.Phone.countries.json";

        using var stream = assembly.GetManifestResourceStream(resourceName) 
            ?? throw new FileNotFoundException($"Missing resource: {resourceName}");
        
        using var reader = new StreamReader(stream);
        CountryCodes = JsonConvert.DeserializeObject&lt;List&lt;CountryCode&gt;&gt;(reader.ReadToEnd())
            ?? new List&lt;CountryCode&gt;();
    }
}
</code></pre>
<p><strong>Key Notes:</strong></p>
<ul>
<li><p>Resource naming follows <code>Namespace.Folder.Filename.extension</code></p>
</li>
<li><p>Always validate null streams</p>
</li>
<li><p>Consider using <code>System.Text.Json</code> for modern .NET projects</p>
</li>
</ul>
<h2><strong>Step 3: Understanding Content Files</strong></h2>
<p>When consumers install your package, files in <code>contentFiles</code> will appear in their project under:</p>
<pre><code class="language-plaintext">Project/
└── Phone/
    └── countries.json
</code></pre>
<p><strong>Consumer Control:</strong></p>
<ul>
<li><p>Files can be marked as Copy Always/Never</p>
</li>
<li><p>Build action can be modified</p>
</li>
</ul>
<h2><strong>Step 4: Package Verification</strong></h2>
<ol>
<li><p>Build your package:</p>
<pre><code class="language-bash">dotnet pack --configuration Release
</code></pre>
</li>
<li><p>Inspect using:</p>
<ul>
<li><p><strong>NuGet Package Explorer</strong> (GUI tool)</p>
</li>
<li><p>Manual inspection by renaming <code>.nupkg</code> → <code>.zip</code></p>
</li>
</ul>
</li>
</ol>
<p><strong>Expected Structure:</strong></p>
<pre><code class="language-plaintext">├── lib
│   └── net9.0
│       └── YourProject.dll
└── contentFiles
    └── any
        └── any
            └── Phone
                └── countries.json
</code></pre>
<h2><strong>Pro Tips &amp; Troubleshooting</strong></h2>
<ol>
<li><p><strong>Double-Check Resource Names</strong></p>
<pre><code class="language-csharp">var resources = assembly.GetManifestResourceNames();
Console.WriteLine(string.Join("\n", resources));
</code></pre>
</li>
<li><p><strong>ContentFiles Not Appearing?</strong></p>
<ul>
<li><p>Ensure the consumer's project SDK is <code>Microsoft.NET.Sdk</code></p>
</li>
<li><p>Verify <code>&lt;IncludeContentInPack&gt;true&lt;/IncludeContentInPack&gt;</code></p>
</li>
</ul>
</li>
<li><p><strong>When to Use Which Method</strong></p>
<table>
<thead>
<tr>
<th><strong>Embedded Resources</strong></th>
<th><strong>Content Files</strong></th>
</tr>
</thead>
<tbody><tr>
<td>Internal configs</td>
<td>User-editable files</td>
</tr>
<tr>
<td>Critical data</td>
<td>Example templates</td>
</tr>
<tr>
<td>Small files</td>
<td>Larger assets</td>
</tr>
</tbody></table>
</li>
</ol>
<h2><strong>Complete Project File Reference</strong></h2>
<pre><code class="language-xml">&lt;Project Sdk="Microsoft.NET.Sdk"&gt;
  &lt;PropertyGroup&gt;
    &lt;TargetFramework&gt;net9.0&lt;/TargetFramework&gt;
    &lt;!-- Package Metadata --&gt;
    &lt;PackageId&gt;YourProject&lt;/PackageId&gt;
    &lt;PackageReadmeFile&gt;README.md&lt;/PackageReadmeFile&gt;
  &lt;/PropertyGroup&gt;

  &lt;ItemGroup&gt;
    &lt;!-- Dependencies --&gt;
    &lt;PackageReference Include="Newtonsoft.Json" Version="13.0.3" /&gt;
  &lt;/ItemGroup&gt;

  &lt;ItemGroup&gt;
    &lt;!-- Static Files --&gt;
    &lt;EmbeddedResource Include="Phone/countries.json" /&gt;
    &lt;None Include="Phone/countries.json" 
          Pack="True" 
          PackagePath="contentFiles/any/any/Phone/" /&gt;
    &lt;None Include="README.md" Pack="True" PackagePath="/" /&gt;
  &lt;/ItemGroup&gt;
&lt;/Project&gt;
</code></pre>
<h2><strong>Conclusion:</strong></h2>
<p>Including static files like JSON or text resources in NuGet packages elevates your library’s utility and flexibility. By leveraging <strong>embedded resources</strong>, you ensure critical files remain secure and directly accessible within your assembly. Meanwhile, <strong>content files</strong> empower consumers to customize configurations or reference external assets in their projects.</p>
<p>Always verify your package structure post-build and test consumption scenarios thoroughly. Whether you’re distributing localization files, templates, or configuration data, these techniques ensure your NuGet package delivers a polished, professional experience.</p>
<p><em>Empower your libraries—static files are no longer static limitations, but dynamic tools!</em></p>
<h3><strong>CONTACT:</strong></h3>
<p>I’m Kumar Bishojit Paul, the Founder and CEO of <a href="https://www.bikiran.com/"><strong>BIKIRAN</strong></a>. If you need further assistance, please leave a comment. I’m interested in helping you.</p>
<p><strong>Got questions?</strong> Drop a comment below or reach out at <a href="mailto:contact@bikiran.com">contact@bikiran.com</a>. Happy packaging!</p>
<hr />
<h2>🏢 About Bikiran</h2>
<p><strong><a href="https://bikiran.com/">Bikiran</a></strong> is a software development and cloud infrastructure company founded in 2012, headquartered in Khulna, Bangladesh. With 15,000+ clients and over a decade of experience, Bikiran builds and operates a suite of products spanning domain services, cloud hosting, app deployment, workflow automation, and developer tools.</p>
<table>
<thead>
<tr>
<th>SL</th>
<th>Topic</th>
<th>Product</th>
<th>Description</th>
</tr>
</thead>
<tbody><tr>
<td>1</td>
<td>Website</td>
<td><a href="https://bikiran.com/">Bikiran</a></td>
<td>Main platform — Domain, hosting &amp; cloud services</td>
</tr>
<tr>
<td>2</td>
<td>Website</td>
<td><a href="https://www.edusoft.com.bd/">Edusoft</a></td>
<td>Education management software for institutions</td>
</tr>
<tr>
<td>3</td>
<td>Website</td>
<td><a href="https://n8nclouds.com/">n8n Clouds</a></td>
<td>Managed n8n workflow automation hosting</td>
</tr>
<tr>
<td>4</td>
<td>Website</td>
<td><a href="https://www.timestamp.zone/">Timestamp Zone</a></td>
<td>Unix timestamp converter &amp; timezone tool</td>
</tr>
<tr>
<td>5</td>
<td>Website</td>
<td><a href="https://pdfpi.bikiran.com/">PDFpi</a></td>
<td>Online PDF processing &amp; manipulation tool</td>
</tr>
<tr>
<td>6</td>
<td>Website</td>
<td><a href="https://blog.bikiran.com/">Blog</a></td>
<td>Technical articles, guides &amp; tutorials</td>
</tr>
<tr>
<td>7</td>
<td>Website</td>
<td><a href="https://support.bikiran.com/">Support</a></td>
<td>24/7 customer support portal</td>
</tr>
<tr>
<td>8</td>
<td>Website</td>
<td><a href="https://probackup.bikiran.com/">Probackup</a></td>
<td>Automated database backup for SQL, PostgreSQL &amp; MongoDB</td>
</tr>
<tr>
<td>9</td>
<td>Service</td>
<td><a href="https://www.bikiran.com/domain">Domain</a></td>
<td>Domain registration, transfer &amp; DNS management</td>
</tr>
<tr>
<td>10</td>
<td>Service</td>
<td><a href="https://www.bikiran.com/services/hosting/web">Hosting</a></td>
<td>Web, app &amp; email hosting on NVMe SSD</td>
</tr>
<tr>
<td>11</td>
<td>Service</td>
<td>Email &amp; SMS</td>
<td>Bulk email &amp; SMS notification service</td>
</tr>
<tr>
<td>12</td>
<td>npm</td>
<td><a href="https://www.npmjs.com/package/@bikiran/chronopick">Chronopick</a></td>
<td>Date &amp; time picker React component</td>
</tr>
<tr>
<td>13</td>
<td>npm</td>
<td><a href="https://www.npmjs.com/package/@bikiran/editor">Rich Editor</a></td>
<td>WYSIWYG rich text editor for React</td>
</tr>
<tr>
<td>14</td>
<td>npm</td>
<td><a href="https://www.npmjs.com/package/@bikiran/button">Button</a></td>
<td>Reusable React button component library</td>
</tr>
<tr>
<td>15</td>
<td>npm</td>
<td><a href="https://www.npmjs.com/package/create-edx-app">Electron Boilerplate</a></td>
<td>CLI to scaffold Electron.js project templates</td>
</tr>
<tr>
<td>16</td>
<td>NuGet</td>
<td><a href="https://www.nuget.org/packages/Bikiran.Payment.Bkash">Bkash</a></td>
<td>bKash payment gateway integration for .NET</td>
</tr>
<tr>
<td>17</td>
<td>NuGet</td>
<td><a href="https://www.nuget.org/packages/Bikiran.Engine">Bikiran Engine</a></td>
<td>Core .NET engine library for Bikiran services</td>
</tr>
<tr>
<td>18</td>
<td>Open Source</td>
<td><a href="https://github.com/bikirandev/pdfpi">PDFpi</a></td>
<td>PDF processing tool — open source</td>
</tr>
<tr>
<td>19</td>
<td>Open Source</td>
<td><a href="https://github.com/bikirandev/Bikiran.Engine">Bikiran Engine</a></td>
<td>Core .NET engine — open source</td>
</tr>
<tr>
<td>20</td>
<td>Open Source</td>
<td><a href="https://github.com/bikirandev/DriveCLI">Drive CLI</a></td>
<td>CLI tool to manage Google Drive from terminal</td>
</tr>
<tr>
<td>21</td>
<td>Docker</td>
<td><a href="https://github.com/bikirandev/docker-pgsql">Pgsql</a></td>
<td>Docker setup for PostgreSQL</td>
</tr>
<tr>
<td>22</td>
<td>Docker</td>
<td><a href="https://github.com/bikirandev/docker-n8n">n8n</a></td>
<td>Docker setup for n8n automation</td>
</tr>
<tr>
<td>23</td>
<td>Docker</td>
<td><a href="https://github.com/bikirandev/docker-pgadmin">Pgadmin</a></td>
<td>Docker setup for pgAdmin</td>
</tr>
<tr>
<td>24</td>
<td>Social Media</td>
<td><a href="https://www.linkedin.com/company/bikiran12">LinkedIn</a></td>
<td>Bikiran on LinkedIn</td>
</tr>
<tr>
<td>25</td>
<td>Social Media</td>
<td><a href="https://www.facebook.com/bikiran12">Facebook</a></td>
<td>Bikiran on Facebook</td>
</tr>
<tr>
<td>26</td>
<td>Social Media</td>
<td><a href="https://www.youtube.com/@bikiranofficial">YouTube</a></td>
<td>Bikiran on YouTube</td>
</tr>
<tr>
<td>27</td>
<td>Social Media</td>
<td><a href="https://www.facebook.com/n8nclouds">FB n8nClouds</a></td>
<td>n8n Clouds on Facebook</td>
</tr>
</tbody></table>
]]></content:encoded></item><item><title><![CDATA[Typography Tips: Pick the Perfect Font for Your Brand]]></title><description><![CDATA[Typography is not just about aesthetics – it’s a powerful tool for communication. The right fonts set your brand’s tone, draw attention, and leave a lasting impression. In any visual context – whether]]></description><link>https://blog.bikiran.com/typography-tips-pick-the-perfect-font-for-your-brand</link><guid isPermaLink="true">https://blog.bikiran.com/typography-tips-pick-the-perfect-font-for-your-brand</guid><category><![CDATA[Brand Fonts]]></category><category><![CDATA[typography]]></category><category><![CDATA[Typography in Branding]]></category><category><![CDATA[font-pairing]]></category><category><![CDATA[branding design]]></category><dc:creator><![CDATA[H Moni]]></dc:creator><pubDate>Tue, 20 May 2025 08:33:29 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1747727347287/0fcb0583-dc40-48b4-8928-752f1a6a837c.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Typography is not just about aesthetics – it’s a powerful tool for communication. The right fonts set your brand’s tone, draw attention, and leave a lasting impression. In any visual context – whether a logo, website, or marketing material – typography shapes how people perceive your brand.</p>
<h2><strong>What Is Typography in Design?</strong></h2>
<p>Typography means arranging text to be attractive and easy to read. This involves choosing fonts, adjusting spacing, and organizing text in a clear hierarchy. Good typography guides the viewer’s eye, reinforces your message, and creates the right mood for your content.</p>
<h2><strong>The Evolution of Typography</strong></h2>
<p>Typography has a long history, evolving from early writing systems to today’s digital fonts. Ancient civilizations developed writing (like Egyptian hieroglyphs and Chinese calligraphy), and in the 15th century, Gutenberg’s printing press introduced movable type. Over the centuries, designers created new typefaces and printing techniques. In modern times, digital technology lets us design and use fonts easily on computers and screens. This means designers can fine-tune fonts instantly and maintain consistency across all media.</p>
<h2><strong>Incorporating Typography into Your Design</strong></h2>
<p>To use typography effectively, keep these principles in mind:</p>
<ul>
<li><p><strong>Font vs. Typeface:</strong> A <em>typeface</em> is a family of related fonts (e.g., Arial), while a <em>font</em> is a specific style within that family (e.g., Arial Bold).</p>
</li>
<li><p><strong>Choose the Right Typeface:</strong> Pick a typeface that matches your brand’s personality. Serif fonts (with small decorative strokes) feel traditional or formal, while sans-serif fonts (clean, plain strokes) look modern and minimal. Script or decorative fonts add flair but should be used sparingly.</p>
</li>
<li><p><strong>Hierarchy and Readability:</strong> Use size and weight to guide attention. Headlines should be larger and bolder, while body text remains simple for easy reading. This creates a clear visual hierarchy and makes content more engaging.</p>
</li>
<li><p><strong>Spacing:</strong> Pay attention to kerning (space between letters) and leading (space between lines). Proper spacing prevents text from feeling cramped or too loose, improving readability and balance.</p>
</li>
</ul>
<h2><strong>Key Elements of Typography</strong></h2>
<p>Successful typography combines several key elements:</p>
<ul>
<li><p><strong>Typefaces and Fonts:</strong> The design of characters is the typeface, and fonts are specific variations (weight, size) of that typeface. Choose one or two complementary typefaces and use them consistently to keep the design cohesive.</p>
</li>
<li><p><strong>Color:</strong> Text color affects readability and mood. Ensure high contrast between text and background (for example, dark text on a light background) so content is easy to read. Colors also carry emotion: blue can feel trustworthy, red can feel urgent. Pick colors that support your brand’s message.</p>
</li>
<li><p><strong>Consistency:</strong> Use the same fonts, colors, and styles throughout your design. Consistent typography (across your website, marketing materials, etc.) creates a unified, professional look and strengthens brand identity.</p>
</li>
<li><p><strong>Contrast:</strong> Vary font size, weight, or color to create visual contrast and hierarchy. For example, a bold heading next to normal body text makes the heading pop. Good contrast helps important information stand out and guides the reader’s eye.</p>
</li>
<li><p><strong>Alignment:</strong> Text alignment (left, center, right, or justified) affects how easily people read. Left-aligned text is standard for paragraphs; center-aligned text works for short headings or calls to action. Choose alignment that suits your layout and maintains readability.</p>
</li>
<li><p><strong>Hierarchy:</strong> Establish which text is most important. Make titles and headings larger or bolder than the rest of the text. This way, readers can quickly find key sections and the overall flow of information is clear.</p>
</li>
<li><p><strong>Kerning (Letter Spacing):</strong> Kerning adjusts the space between individual letters. Proper kerning prevents letters from clashing or feeling too far apart, making text smooth and polished.</p>
</li>
<li><p><strong>Tracking (Overall Letter Spacing):</strong> Tracking applies spacing uniformly to a block of text. Increasing tracking can make titles and headlines more airy; decreasing it can fit more text in a line. Good tracking ensures words and lines feel balanced.</p>
</li>
<li><p><strong>Line Height (Leading):</strong> Line height is the vertical space between text lines. A comfortable line height (around 1.4 to 1.6 times the font size) prevents text from feeling cramped or too spread out, making paragraphs easier to read.</p>
</li>
<li><p><strong>Line Length:</strong> For body text, aim for about 50–75 characters per line (including spaces). Lines that are too long tire the reader’s eyes, while very short lines can feel choppy. An optimal line length makes reading flow naturally.</p>
</li>
<li><p><strong>White Space:</strong> Also known as negative space, white space is the empty area around text. Proper white space prevents clutter and highlights important elements. It gives your design room to breathe and makes content easier to scan.</p>
</li>
</ul>
<h2><strong>Popular Fonts in 2025</strong></h2>
<p>Certain typefaces are trending in modern design. Here are some popular choices by category:</p>
<ul>
<li><p><strong>Best for Logos:</strong></p>
<ul>
<li><p><em>Helvetica Now</em> – A modern update of Helvetica that feels minimal and professional.</p>
</li>
<li><p><em>Gotham</em> – A bold, geometric font known for a contemporary, trustworthy feel (famously used in Obama’s campaign posters).</p>
</li>
<li><p><em>Montserrat</em> – A sleek, urban-inspired font that adds elegance to branding.</p>
</li>
</ul>
</li>
<li><p><strong>Best for Landing Pages:</strong></p>
<ul>
<li><p><em>Raleway</em> – An elegant, thin-stroke font that gives a refined look and makes headlines stand out.</p>
</li>
<li><p><em>PT Sans</em> – A highly readable, friendly sans-serif with good spacing, ideal for clear content.</p>
</li>
<li><p><em>Avenir</em> – A blend of classic and modern design; its smooth, geometric lines look polished on any page.</p>
</li>
</ul>
</li>
<li><p><strong>Best for Mobile Apps:</strong></p>
<ul>
<li><p><em>Roboto</em> – Designed for digital screens, offering excellent clarity and smooth readability on small devices.</p>
</li>
<li><p><em>Lato</em> – A warm and professional sans-serif; its balanced spacing improves readability on mobile.</p>
</li>
<li><p><em>Inter</em> – A modern font optimized for digital interfaces, maintaining clarity even at very small sizes.</p>
</li>
</ul>
</li>
<li><p><strong>Best for Website Design:</strong></p>
<ul>
<li><p><em>Avenir</em> – Modern and clean, it has smooth curves that enhance readability for both headlines and body text.</p>
</li>
<li><p><em>FF Kava</em> – A stylish and unique font; its distinct shapes add personality while remaining highly legible.</p>
</li>
<li><p><em>Helvetica</em> – A timeless classic known for its clarity and versatility, it works well in any context.</p>
</li>
</ul>
</li>
<li><p><strong>Best for Social Media:</strong></p>
<ul>
<li><p><em>Bebas Neue</em> – A bold, uppercase font that adds strong visual impact to social headlines.</p>
</li>
<li><p><em>Oswald</em> – A modern, tall font that stands out in posts and banners.</p>
</li>
<li><p><em>Poppins</em> – A clean, geometric sans-serif that looks fresh and contemporary on digital graphics. <a href="https://bikiran.com/">BIKIRAN</a> Choose to use Poppins.</p>
</li>
</ul>
</li>
</ul>
<h2><strong>Why Typography Matters</strong></h2>
<p>Effective typography benefits your design and brand in many ways:</p>
<ul>
<li><p><strong>Brand Identity:</strong> Typography gives your brand a voice. Consistent font choices convey personality and build recognition and trust.</p>
</li>
<li><p><strong>Readability:</strong> Good typography ensures text is easy to read. Appropriate fonts, sizes, and spacing make content accessible to all users.</p>
</li>
<li><p><strong>Visual Hierarchy:</strong> Typography organizes information by importance. By varying size and weight (for example, larger headings), you guide readers through your content logically.</p>
</li>
<li><p><strong>User Experience (UX):</strong> On websites and apps, clean, legible fonts make interfaces more intuitive. Sans-serif fonts are often used on screens for their clarity; this leads to a smoother user experience.</p>
</li>
<li><p><strong>Emotion and Tone:</strong> Fonts evoke feelings. A playful script feels fun, a bold uppercase feels urgent or powerful. The right style sets the tone and helps your message resonate emotionally.</p>
</li>
<li><p><strong>Accessibility:</strong> Thoughtful typography is inclusive. High-contrast text and clear fonts help users with visual impairments. Accessible typography ensures everyone can comfortably read your content.</p>
</li>
</ul>
<h2><strong>How to Choose the Best Typeface for Your Website</strong></h2>
<p>When picking a font for your site, consider these tips:</p>
<ul>
<li><p><strong>Align with Your Purpose:</strong> Think about your website’s goal and audience. Is it a formal business site, a creative blog, or an online store? Choose a typeface that fits the tone. For example, clean serifs or sans-serifs suit corporate sites, while more expressive fonts might fit creative brands.</p>
</li>
<li><p><strong>Focus on Readability:</strong> Prioritize clear, screen-friendly fonts. Sans-serifs like Roboto, Open Sans, or Poppins work well online. Avoid overly decorative or script fonts for body text. Always test your font on different devices to ensure it looks good and scales well.</p>
</li>
<li><p><strong>Size and Spacing:</strong> Use a comfortable base size (around 16px) for body text and larger sizes for headings. Maintain sufficient line spacing (about 1.5× the font size) so lines don’t feel cramped. Adjust kerning and tracking if needed to keep letters from running together or drifting apart.</p>
</li>
<li><p><strong>Limit Your Fonts:</strong> Stick to 2–3 fonts in your design. For example, use one for headings and another for body text (plus an optional third for accents). Too many fonts can make a site look disjointed. Make sure your chosen fonts harmonize and support your brand’s style.</p>
</li>
<li><p><strong>Test and Refine:</strong> After selecting a typeface, preview it with real content. Get feedback and check readability on desktop and mobile. Adjust styles or try alternatives if something feels off. Prioritize user comfort and clarity above all.</p>
</li>
</ul>
<h2><strong>FAQs</strong></h2>
<h3><strong>What is the difference between a font and a typeface?</strong></h3>
<p>A <em>typeface</em> is the overall design of a set of characters (like Arial or Times New Roman). A <em>font</em> is a specific style within that typeface (such as Arial Bold or Times New Roman Italic). In short, the typeface is the family of designs, and the font is the individual style from that family.</p>
<h3>How does typography influence user experience (UX)?</h3>
<p>Typography shapes how easily users can read and navigate your content. Clear, legible fonts make information easy to absorb and can make your site feel intuitive. Conversely, poor typography (tiny fonts, low contrast, or overly decorative styles) can frustrate users. Good typography helps guide the user smoothly through the interface.</p>
<h3>What are web-safe fonts?</h3>
<p>Web-safe fonts are fonts that are commonly available across most devices and operating systems. Examples include Arial, Times New Roman, and Courier New. Using web-safe fonts (or setting fallback options) ensures that text appears consistently for all users, even if a custom font fails to load.</p>
<h3>Should I use multiple fonts in my design?</h3>
<p>It’s usually best to keep the number of fonts to two or three. Use one font for headings and another for body text, plus an optional third for accents or branding elements. This keeps the design clean and consistent. Using too many different fonts can make a layout feel cluttered and uncoordinated.</p>
<h3>How do I ensure my typography is accessible?</h3>
<p>Choose simple, easy-to-read fonts and use sufficient contrast with the background (for example, dark text on a light background). Provide enough letter and line spacing, and use clear sizes. Avoid very thin, tightly-spaced, or ornate fonts for large blocks of text. These practices help all readers, including those with visual impairments, comfortably read your content.</p>
<h2><strong>Conclusion</strong></h2>
<p>Typography is an essential part of building a strong brand identity. The right fonts do more than just look good – they set the tone, improve readability, and create a cohesive visual experience. By choosing fonts that match your brand’s personality and optimizing size, spacing, and contrast, you can create designs that engage viewers and communicate your message effectively.</p>
<h2>CONTACT:</h2>
<p>I’m H Moni, the UI/UX Designer of <a href="https://www.bikiran.com/"><strong>BIKIRAN</strong></a>. If you need further assistance, please leave a comment. I’m interested in helping you.</p>
<hr />
<h2>🏢 About Bikiran</h2>
<p><strong><a href="https://bikiran.com/">Bikiran</a></strong> is a software development and cloud infrastructure company founded in 2012, headquartered in Khulna, Bangladesh. With 15,000+ clients and over a decade of experience, Bikiran builds and operates a suite of products spanning domain services, cloud hosting, app deployment, workflow automation, and developer tools.</p>
<table>
<thead>
<tr>
<th>SL</th>
<th>Topic</th>
<th>Product</th>
<th>Description</th>
</tr>
</thead>
<tbody><tr>
<td>1</td>
<td>Website</td>
<td><a href="https://bikiran.com/">Bikiran</a></td>
<td>Main platform — Domain, hosting &amp; cloud services</td>
</tr>
<tr>
<td>2</td>
<td>Website</td>
<td><a href="https://www.edusoft.com.bd/">Edusoft</a></td>
<td>Education management software for institutions</td>
</tr>
<tr>
<td>3</td>
<td>Website</td>
<td><a href="https://n8nclouds.com/">n8n Clouds</a></td>
<td>Managed n8n workflow automation hosting</td>
</tr>
<tr>
<td>4</td>
<td>Website</td>
<td><a href="https://www.timestamp.zone/">Timestamp Zone</a></td>
<td>Unix timestamp converter &amp; timezone tool</td>
</tr>
<tr>
<td>5</td>
<td>Website</td>
<td><a href="https://pdfpi.bikiran.com/">PDFpi</a></td>
<td>Online PDF processing &amp; manipulation tool</td>
</tr>
<tr>
<td>6</td>
<td>Website</td>
<td><a href="https://blog.bikiran.com/">Blog</a></td>
<td>Technical articles, guides &amp; tutorials</td>
</tr>
<tr>
<td>7</td>
<td>Website</td>
<td><a href="https://support.bikiran.com/">Support</a></td>
<td>24/7 customer support portal</td>
</tr>
<tr>
<td>8</td>
<td>Website</td>
<td><a href="https://probackup.bikiran.com/">Probackup</a></td>
<td>Automated database backup for SQL, PostgreSQL &amp; MongoDB</td>
</tr>
<tr>
<td>9</td>
<td>Service</td>
<td><a href="https://www.bikiran.com/domain">Domain</a></td>
<td>Domain registration, transfer &amp; DNS management</td>
</tr>
<tr>
<td>10</td>
<td>Service</td>
<td><a href="https://www.bikiran.com/services/hosting/web">Hosting</a></td>
<td>Web, app &amp; email hosting on NVMe SSD</td>
</tr>
<tr>
<td>11</td>
<td>Service</td>
<td>Email &amp; SMS</td>
<td>Bulk email &amp; SMS notification service</td>
</tr>
<tr>
<td>12</td>
<td>npm</td>
<td><a href="https://www.npmjs.com/package/@bikiran/chronopick">Chronopick</a></td>
<td>Date &amp; time picker React component</td>
</tr>
<tr>
<td>13</td>
<td>npm</td>
<td><a href="https://www.npmjs.com/package/@bikiran/editor">Rich Editor</a></td>
<td>WYSIWYG rich text editor for React</td>
</tr>
<tr>
<td>14</td>
<td>npm</td>
<td><a href="https://www.npmjs.com/package/@bikiran/button">Button</a></td>
<td>Reusable React button component library</td>
</tr>
<tr>
<td>15</td>
<td>npm</td>
<td><a href="https://www.npmjs.com/package/create-edx-app">Electron Boilerplate</a></td>
<td>CLI to scaffold Electron.js project templates</td>
</tr>
<tr>
<td>16</td>
<td>NuGet</td>
<td><a href="https://www.nuget.org/packages/Bikiran.Payment.Bkash">Bkash</a></td>
<td>bKash payment gateway integration for .NET</td>
</tr>
<tr>
<td>17</td>
<td>NuGet</td>
<td><a href="https://www.nuget.org/packages/Bikiran.Engine">Bikiran Engine</a></td>
<td>Core .NET engine library for Bikiran services</td>
</tr>
<tr>
<td>18</td>
<td>Open Source</td>
<td><a href="https://github.com/bikirandev/pdfpi">PDFpi</a></td>
<td>PDF processing tool — open source</td>
</tr>
<tr>
<td>19</td>
<td>Open Source</td>
<td><a href="https://github.com/bikirandev/Bikiran.Engine">Bikiran Engine</a></td>
<td>Core .NET engine — open source</td>
</tr>
<tr>
<td>20</td>
<td>Open Source</td>
<td><a href="https://github.com/bikirandev/DriveCLI">Drive CLI</a></td>
<td>CLI tool to manage Google Drive from terminal</td>
</tr>
<tr>
<td>21</td>
<td>Docker</td>
<td><a href="https://github.com/bikirandev/docker-pgsql">Pgsql</a></td>
<td>Docker setup for PostgreSQL</td>
</tr>
<tr>
<td>22</td>
<td>Docker</td>
<td><a href="https://github.com/bikirandev/docker-n8n">n8n</a></td>
<td>Docker setup for n8n automation</td>
</tr>
<tr>
<td>23</td>
<td>Docker</td>
<td><a href="https://github.com/bikirandev/docker-pgadmin">Pgadmin</a></td>
<td>Docker setup for pgAdmin</td>
</tr>
<tr>
<td>24</td>
<td>Social Media</td>
<td><a href="https://www.linkedin.com/company/bikiran12">LinkedIn</a></td>
<td>Bikiran on LinkedIn</td>
</tr>
<tr>
<td>25</td>
<td>Social Media</td>
<td><a href="https://www.facebook.com/bikiran12">Facebook</a></td>
<td>Bikiran on Facebook</td>
</tr>
<tr>
<td>26</td>
<td>Social Media</td>
<td><a href="https://www.youtube.com/@bikiranofficial">YouTube</a></td>
<td>Bikiran on YouTube</td>
</tr>
<tr>
<td>27</td>
<td>Social Media</td>
<td><a href="https://www.facebook.com/n8nclouds">FB n8nClouds</a></td>
<td>n8n Clouds on Facebook</td>
</tr>
</tbody></table>
]]></content:encoded></item><item><title><![CDATA[How to Install .NET 9 on Ubuntu (Including Preview Releases)]]></title><description><![CDATA[Introduction
.NET 9 is the latest iteration of Microsoft’s open-source development platform, packed with performance improvements, new C# features, and enhanced tools for cloud-native development. Whi]]></description><link>https://blog.bikiran.com/how-to-install-net-9-on-ubuntu-including-preview-releases</link><guid isPermaLink="true">https://blog.bikiran.com/how-to-install-net-9-on-ubuntu-including-preview-releases</guid><category><![CDATA[dotnet]]></category><category><![CDATA[Ubuntu]]></category><category><![CDATA[Installation]]></category><dc:creator><![CDATA[KUMAR BISHOJIT]]></dc:creator><pubDate>Mon, 19 May 2025 09:21:03 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1747727016334/b0e5ca6a-aa4f-4caa-ad3f-e722c876c582.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h3><strong>Introduction</strong></h3>
<p>.NET 9 is the latest iteration of Microsoft’s open-source development platform, packed with performance improvements, new C# features, and enhanced tools for cloud-native development. While it’s currently in preview, developers eager to experiment with its capabilities can install it on Ubuntu today. In this guide, we’ll walk through two straightforward methods to get .NET 9 up and running on your Ubuntu machine.</p>
<h3><strong>Why .NET 9?</strong></h3>
<p>Before diving into installation, here’s why you might want to explore .NET 9:</p>
<ul>
<li><p><strong>Performance boosts</strong>: Optimized runtime and reduced memory usage.</p>
</li>
<li><p><strong>Cloud-native enhancements</strong>: Better integration with Kubernetes and containerized apps.</p>
</li>
<li><p><strong>C# 13 features</strong>: New language improvements for cleaner, more expressive code.</p>
</li>
</ul>
<p><em>Note</em>: .NET 9 is a <strong>preview release</strong>, so avoid using it in production environments.</p>
<h3><strong>Prerequisites</strong></h3>
<ol>
<li><p><strong>Ubuntu 20.04, 22.04, or later</strong> (check with <code>lsb_release -a</code>).</p>
</li>
<li><p><strong>Terminal access</strong> and <code>sudo</code> privileges.</p>
</li>
<li><p><strong>Basic familiarity</strong> with Linux package management.</p>
</li>
</ol>
<h2>Method 1: Install .NET 9 via APT Repository</h2>
<h3>STEP-1: Add Microsoft’s Package Feed</h3>
<p>First, register Microsoft’s repository to access .NET packages:</p>
<pre><code class="language-bash">wget https://packages.microsoft.com/config/ubuntu/$(lsb_release -rs)/packages-microsoft-prod.deb -O packages-microsoft-prod.deb  
sudo dpkg -i packages-microsoft-prod.deb  
rm packages-microsoft-prod.deb  
</code></pre>
<p>If you encounter issues, replace $(lsb_release—rs) with your Ubuntu version (e.g., 22.04).</p>
<h3>STEP-2: Update Package Lists</h3>
<p>Refresh your system’s package cache:</p>
<pre><code class="language-bash">sudo apt-get update
</code></pre>
<h3>STEP-3: Install the .NET 9 SDK</h3>
<p>Install the SDK with <code>apt</code> (preview packages may have a specific naming convention):</p>
<pre><code class="language-bash">sudo apt-get install dotnet-sdk-9.0
</code></pre>
<h3>Verify the Installation</h3>
<p>Confirm .NET 9 is installed correctly:</p>
<pre><code class="language-bash">dotnet --info

# OR
# Version Check
dotnet --version
</code></pre>
<h3><strong>Troubleshooting Common Issues</strong></h3>
<ol>
<li><p><strong>“Package not found” error</strong>:</p>
<ul>
<li><p>Ensure you’ve added the correct Microsoft repository.</p>
</li>
<li><p>Check for typos in the package name (e.g., <code>dotnet-sdk-9.0-preview</code>).</p>
</li>
</ul>
</li>
<li><p><strong>PATH issues</strong>:</p>
<ul>
<li>Restart your terminal or run <code>source ~/.bashrc</code> after updating the PATH.</li>
</ul>
</li>
<li><p><strong>Preview instability</strong>:</p>
<ul>
<li>Report bugs to the <a href="https://github.com/dotnet/core/issues">.NET GitHub repo</a>.</li>
</ul>
</li>
</ol>
<h3>Conclusion</h3>
<p>You’re now ready to explore .NET 9 on Ubuntu! Whether you’re building microservices, web APIs, or experimenting with C# 13, the preview SDK gives you early access to cutting-edge features. Remember to check the <a href="https://learn.microsoft.com/en-us/dotnet/core/whats-new/dotnet-9">official .NET 9 documentation</a> for updates as the release progresses.</p>
<p><strong>Happy coding!</strong> 🚀</p>
<h3><strong>CONTACT:</strong></h3>
<p>I’m Kumar Bishojit Paul, the Founder and CEO of <a href="https://www.bikiran.com/"><strong>BIKIRAN</strong></a>. <a href="https://www.bikiran.com/">If you</a> need further assistance, please leave a comment. I’m interested in helping you.</p>
<hr />
<h2>🏢 About Bikiran</h2>
<p><strong><a href="https://bikiran.com/">Bikiran</a></strong> is a software development and cloud infrastructure company founded in 2012, headquartered in Khulna, Bangladesh. With 15,000+ clients and over a decade of experience, Bikiran builds and operates a suite of products spanning domain services, cloud hosting, app deployment, workflow automation, and developer tools.</p>
<table>
<thead>
<tr>
<th>SL</th>
<th>Topic</th>
<th>Product</th>
<th>Description</th>
</tr>
</thead>
<tbody><tr>
<td>1</td>
<td>Website</td>
<td><a href="https://bikiran.com/">Bikiran</a></td>
<td>Main platform — Domain, hosting &amp; cloud services</td>
</tr>
<tr>
<td>2</td>
<td>Website</td>
<td><a href="https://www.edusoft.com.bd/">Edusoft</a></td>
<td>Education management software for institutions</td>
</tr>
<tr>
<td>3</td>
<td>Website</td>
<td><a href="https://n8nclouds.com/">n8n Clouds</a></td>
<td>Managed n8n workflow automation hosting</td>
</tr>
<tr>
<td>4</td>
<td>Website</td>
<td><a href="https://www.timestamp.zone/">Timestamp Zone</a></td>
<td>Unix timestamp converter &amp; timezone tool</td>
</tr>
<tr>
<td>5</td>
<td>Website</td>
<td><a href="https://pdfpi.bikiran.com/">PDFpi</a></td>
<td>Online PDF processing &amp; manipulation tool</td>
</tr>
<tr>
<td>6</td>
<td>Website</td>
<td><a href="https://blog.bikiran.com/">Blog</a></td>
<td>Technical articles, guides &amp; tutorials</td>
</tr>
<tr>
<td>7</td>
<td>Website</td>
<td><a href="https://support.bikiran.com/">Support</a></td>
<td>24/7 customer support portal</td>
</tr>
<tr>
<td>8</td>
<td>Website</td>
<td><a href="https://probackup.bikiran.com/">Probackup</a></td>
<td>Automated database backup for SQL, PostgreSQL &amp; MongoDB</td>
</tr>
<tr>
<td>9</td>
<td>Service</td>
<td><a href="https://www.bikiran.com/domain">Domain</a></td>
<td>Domain registration, transfer &amp; DNS management</td>
</tr>
<tr>
<td>10</td>
<td>Service</td>
<td><a href="https://www.bikiran.com/services/hosting/web">Hosting</a></td>
<td>Web, app &amp; email hosting on NVMe SSD</td>
</tr>
<tr>
<td>11</td>
<td>Service</td>
<td>Email &amp; SMS</td>
<td>Bulk email &amp; SMS notification service</td>
</tr>
<tr>
<td>12</td>
<td>npm</td>
<td><a href="https://www.npmjs.com/package/@bikiran/chronopick">Chronopick</a></td>
<td>Date &amp; time picker React component</td>
</tr>
<tr>
<td>13</td>
<td>npm</td>
<td><a href="https://www.npmjs.com/package/@bikiran/editor">Rich Editor</a></td>
<td>WYSIWYG rich text editor for React</td>
</tr>
<tr>
<td>14</td>
<td>npm</td>
<td><a href="https://www.npmjs.com/package/@bikiran/button">Button</a></td>
<td>Reusable React button component library</td>
</tr>
<tr>
<td>15</td>
<td>npm</td>
<td><a href="https://www.npmjs.com/package/create-edx-app">Electron Boilerplate</a></td>
<td>CLI to scaffold Electron.js project templates</td>
</tr>
<tr>
<td>16</td>
<td>NuGet</td>
<td><a href="https://www.nuget.org/packages/Bikiran.Payment.Bkash">Bkash</a></td>
<td>bKash payment gateway integration for .NET</td>
</tr>
<tr>
<td>17</td>
<td>NuGet</td>
<td><a href="https://www.nuget.org/packages/Bikiran.Engine">Bikiran Engine</a></td>
<td>Core .NET engine library for Bikiran services</td>
</tr>
<tr>
<td>18</td>
<td>Open Source</td>
<td><a href="https://github.com/bikirandev/pdfpi">PDFpi</a></td>
<td>PDF processing tool — open source</td>
</tr>
<tr>
<td>19</td>
<td>Open Source</td>
<td><a href="https://github.com/bikirandev/Bikiran.Engine">Bikiran Engine</a></td>
<td>Core .NET engine — open source</td>
</tr>
<tr>
<td>20</td>
<td>Open Source</td>
<td><a href="https://github.com/bikirandev/DriveCLI">Drive CLI</a></td>
<td>CLI tool to manage Google Drive from terminal</td>
</tr>
<tr>
<td>21</td>
<td>Docker</td>
<td><a href="https://github.com/bikirandev/docker-pgsql">Pgsql</a></td>
<td>Docker setup for PostgreSQL</td>
</tr>
<tr>
<td>22</td>
<td>Docker</td>
<td><a href="https://github.com/bikirandev/docker-n8n">n8n</a></td>
<td>Docker setup for n8n automation</td>
</tr>
<tr>
<td>23</td>
<td>Docker</td>
<td><a href="https://github.com/bikirandev/docker-pgadmin">Pgadmin</a></td>
<td>Docker setup for pgAdmin</td>
</tr>
<tr>
<td>24</td>
<td>Social Media</td>
<td><a href="https://www.linkedin.com/company/bikiran12">LinkedIn</a></td>
<td>Bikiran on LinkedIn</td>
</tr>
<tr>
<td>25</td>
<td>Social Media</td>
<td><a href="https://www.facebook.com/bikiran12">Facebook</a></td>
<td>Bikiran on Facebook</td>
</tr>
<tr>
<td>26</td>
<td>Social Media</td>
<td><a href="https://www.youtube.com/@bikiranofficial">YouTube</a></td>
<td>Bikiran on YouTube</td>
</tr>
<tr>
<td>27</td>
<td>Social Media</td>
<td><a href="https://www.facebook.com/n8nclouds">FB n8nClouds</a></td>
<td>n8n Clouds on Facebook</td>
</tr>
</tbody></table>
]]></content:encoded></item><item><title><![CDATA[Creating and Publishing .NET NuGet Packages]]></title><description><![CDATA[SETP-1: Prerequisites

Install .NET SDK (8.0 or newer recommended)

Create a free NuGet.org account


Verify installation: After a successful installation, you could verify by the cmd/bash.
dotnet --v]]></description><link>https://blog.bikiran.com/creating-and-publishing-net-nuget-packages</link><guid isPermaLink="true">https://blog.bikiran.com/creating-and-publishing-net-nuget-packages</guid><category><![CDATA[dotnet]]></category><category><![CDATA[package]]></category><category><![CDATA[Nuget]]></category><category><![CDATA[publishing]]></category><dc:creator><![CDATA[KUMAR BISHOJIT]]></dc:creator><pubDate>Sat, 17 May 2025 14:40:47 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1747547284070/1ccf8225-712b-4577-a211-c1f9d5d81fc7.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h3>SETP-1: Prerequisites</h3>
<ul>
<li><p>Install <a href="https://dotnet.microsoft.com/download">.NET SDK</a> (8.0 or newer recommended)</p>
</li>
<li><p>Create a free <a href="https://www.nuget.org/">NuGet.org account</a></p>
</li>
</ul>
<p><strong>Verify installation:</strong> After a successful installation, you could verify by the cmd/bash.</p>
<pre><code class="language-bash">dotnet --version
</code></pre>
<h3>SETP-2: Create a class library project</h3>
<p>Using this command, a project named <code>MyAwesomePackage</code> will be created.</p>
<pre><code class="language-bash">dotnet new classlib -n MyAwesomePackage
cd MyAwesomePackage
</code></pre>
<h3>SETP-3: Open an Editor and Add your code</h3>
<p>XML comments are necessary for proper documentation.</p>
<pre><code class="language-csharp">namespace MyAwesomePackage;

/// &lt;summary&gt;
/// Provides basic arithmetic operations
/// &lt;/summary&gt;
public class Calculator
{
    /// &lt;summary&gt;
    /// Adds two integers
    /// &lt;/summary&gt;
    /// &lt;param name="a"&gt;First number&lt;/param&gt;
    /// &lt;param name="b"&gt;Second number&lt;/param&gt;
    /// &lt;returns&gt;Sum of a and b&lt;/returns&gt;
    public int Add(int a, int b) =&gt; a + b;
    
    // Add similar documentation for Multiply
}
</code></pre>
<h3>SETP-4: Configure Package Metadata</h3>
<p>Here is a basic project setup file, <code>MyAwesomePackage.csproj</code></p>
<pre><code class="language-xml">&lt;Project Sdk="Microsoft.NET.Sdk"&gt;
	&lt;PropertyGroup&gt;
		&lt;TargetFramework&gt;net9.0&lt;/TargetFramework&gt;
		
		&lt;!-- Core Package Metadata --&gt;
		&lt;PackageId&gt;MyAwesomePackage&lt;/PackageId&gt;
		&lt;Version&gt;1.0.1&lt;/Version&gt;
		&lt;Authors&gt;bishojit&lt;/Authors&gt;
		&lt;Company&gt;BIKIRAN&lt;/Company&gt;
		&lt;Description&gt;Utility functions for common operations&lt;/Description&gt;
		&lt;PackageTags&gt;utilities helper tools&lt;/PackageTags&gt;

		&lt;!-- Recommended Additions --&gt;
		&lt;PackageProjectUrl&gt;https://github.com/bikirandev/bikiran.utils&lt;/PackageProjectUrl&gt;
		&lt;RepositoryUrl&gt;https://github.com/bikirandev/bikiran.utils.git&lt;/RepositoryUrl&gt;
		&lt;PackageLicenseExpression&gt;MIT&lt;/PackageLicenseExpression&gt;
		&lt;IncludeSymbols&gt;true&lt;/IncludeSymbols&gt;
		&lt;SymbolPackageFormat&gt;snupkg&lt;/SymbolPackageFormat&gt;
		
		&lt;!-- Add below existing PackageTags --&gt;
		&lt;PackageReadmeFile&gt;README.md&lt;/PackageReadmeFile&gt;
	&lt;/PropertyGroup&gt;

	&lt;ItemGroup&gt;
		&lt;!-- Add NuGet.Protocol package reference --&gt;
		&lt;PackageReference Include="NuGet.Protocol" Version="6.13.2" /&gt;
	&lt;/ItemGroup&gt;

	&lt;ItemGroup&gt;
		&lt;None Include="README.md" Pack="true" PackagePath="\" /&gt;
	&lt;/ItemGroup&gt;
&lt;/Project&gt;
</code></pre>
<h3>STEP-5: Build the Package</h3>
<p>After developing all the operations, you need to build the package before publishing it.</p>
<pre><code class="language-bash">dotnet build
</code></pre>
<h3>STEP-6: Create NuGet Package</h3>
<p>Make sure to fix all errors and warnings before publishing.</p>
<pre><code class="language-bash">dotnet pack --configuration Release
</code></pre>
<h3>STEP-7: Requirements before publishing</h3>
<ol>
<li><p>Add a LICENSE File (Required)</p>
</li>
<li><p>Add <a href="http://README.md">README.md</a> (Required)</p>
</li>
<li><p>I repeat, must add XML comment documentation on each class.</p>
</li>
<li><p>Add Package Icon (Optional)</p>
</li>
</ol>
<h3>STEP-8: Publish to <a href="http://NuGet.org">NuGet.org</a></h3>
<ul>
<li><p>Log in &gt; Click Upload (On Top Navigation Bar)</p>
</li>
<li><p>Locate your file and upload it.</p>
</li>
<li><p>After a successful upload, complete the form.</p>
</li>
<li><p>After a few minutes, the Package will be approved.</p>
</li>
</ul>
<h3><strong>Important Notes:</strong></h3>
<ol>
<li><p>Versioning: Increment <code>&lt;Version&gt;</code> before each new release</p>
</li>
<li><p>The package ID must be unique across NuGet.org</p>
</li>
<li><p>Recommended: Use <a href="https://semver.org/">Semantic Versioning</a></p>
</li>
<li><p>For private feeds: Change <code>--source</code> to your feed URL</p>
</li>
</ol>
<h3><strong>Next Steps:</strong></h3>
<ol>
<li><p>Add documentation in <a href="http://README.md">README.md</a></p>
</li>
<li><p>Consider adding:</p>
<ul>
<li><p>XML documentation comments</p>
</li>
<li><p>License file</p>
</li>
<li><p>Icon</p>
</li>
<li><p>Release notes</p>
</li>
</ul>
</li>
</ol>
<h3><strong>CONTACT:</strong></h3>
<p>I’m Kumar Bishojit Paul, the Founder and CEO of <a href="https://www.bikiran.com/"><strong>BIKIRAN</strong></a>. If you need further assistance, please leave a comment. I’m interested in helping you.</p>
<hr />
<h2>🏢 About Bikiran</h2>
<p><strong><a href="https://bikiran.com/">Bikiran</a></strong> is a software development and cloud infrastructure company founded in 2012, headquartered in Khulna, Bangladesh. With 15,000+ clients and over a decade of experience, Bikiran builds and operates a suite of products spanning domain services, cloud hosting, app deployment, workflow automation, and developer tools.</p>
<table>
<thead>
<tr>
<th>SL</th>
<th>Topic</th>
<th>Product</th>
<th>Description</th>
</tr>
</thead>
<tbody><tr>
<td>1</td>
<td>Website</td>
<td><a href="https://bikiran.com/">Bikiran</a></td>
<td>Main platform — Domain, hosting &amp; cloud services</td>
</tr>
<tr>
<td>2</td>
<td>Website</td>
<td><a href="https://www.edusoft.com.bd/">Edusoft</a></td>
<td>Education management software for institutions</td>
</tr>
<tr>
<td>3</td>
<td>Website</td>
<td><a href="https://n8nclouds.com/">n8n Clouds</a></td>
<td>Managed n8n workflow automation hosting</td>
</tr>
<tr>
<td>4</td>
<td>Website</td>
<td><a href="https://www.timestamp.zone/">Timestamp Zone</a></td>
<td>Unix timestamp converter &amp; timezone tool</td>
</tr>
<tr>
<td>5</td>
<td>Website</td>
<td><a href="https://pdfpi.bikiran.com/">PDFpi</a></td>
<td>Online PDF processing &amp; manipulation tool</td>
</tr>
<tr>
<td>6</td>
<td>Website</td>
<td><a href="https://blog.bikiran.com/">Blog</a></td>
<td>Technical articles, guides &amp; tutorials</td>
</tr>
<tr>
<td>7</td>
<td>Website</td>
<td><a href="https://support.bikiran.com/">Support</a></td>
<td>24/7 customer support portal</td>
</tr>
<tr>
<td>8</td>
<td>Website</td>
<td><a href="https://probackup.bikiran.com/">Probackup</a></td>
<td>Automated database backup for SQL, PostgreSQL &amp; MongoDB</td>
</tr>
<tr>
<td>9</td>
<td>Service</td>
<td><a href="https://www.bikiran.com/domain">Domain</a></td>
<td>Domain registration, transfer &amp; DNS management</td>
</tr>
<tr>
<td>10</td>
<td>Service</td>
<td><a href="https://www.bikiran.com/services/hosting/web">Hosting</a></td>
<td>Web, app &amp; email hosting on NVMe SSD</td>
</tr>
<tr>
<td>11</td>
<td>Service</td>
<td>Email &amp; SMS</td>
<td>Bulk email &amp; SMS notification service</td>
</tr>
<tr>
<td>12</td>
<td>npm</td>
<td><a href="https://www.npmjs.com/package/@bikiran/chronopick">Chronopick</a></td>
<td>Date &amp; time picker React component</td>
</tr>
<tr>
<td>13</td>
<td>npm</td>
<td><a href="https://www.npmjs.com/package/@bikiran/editor">Rich Editor</a></td>
<td>WYSIWYG rich text editor for React</td>
</tr>
<tr>
<td>14</td>
<td>npm</td>
<td><a href="https://www.npmjs.com/package/@bikiran/button">Button</a></td>
<td>Reusable React button component library</td>
</tr>
<tr>
<td>15</td>
<td>npm</td>
<td><a href="https://www.npmjs.com/package/create-edx-app">Electron Boilerplate</a></td>
<td>CLI to scaffold Electron.js project templates</td>
</tr>
<tr>
<td>16</td>
<td>NuGet</td>
<td><a href="https://www.nuget.org/packages/Bikiran.Payment.Bkash">Bkash</a></td>
<td>bKash payment gateway integration for .NET</td>
</tr>
<tr>
<td>17</td>
<td>NuGet</td>
<td><a href="https://www.nuget.org/packages/Bikiran.Engine">Bikiran Engine</a></td>
<td>Core .NET engine library for Bikiran services</td>
</tr>
<tr>
<td>18</td>
<td>Open Source</td>
<td><a href="https://github.com/bikirandev/pdfpi">PDFpi</a></td>
<td>PDF processing tool — open source</td>
</tr>
<tr>
<td>19</td>
<td>Open Source</td>
<td><a href="https://github.com/bikirandev/Bikiran.Engine">Bikiran Engine</a></td>
<td>Core .NET engine — open source</td>
</tr>
<tr>
<td>20</td>
<td>Open Source</td>
<td><a href="https://github.com/bikirandev/DriveCLI">Drive CLI</a></td>
<td>CLI tool to manage Google Drive from terminal</td>
</tr>
<tr>
<td>21</td>
<td>Docker</td>
<td><a href="https://github.com/bikirandev/docker-pgsql">Pgsql</a></td>
<td>Docker setup for PostgreSQL</td>
</tr>
<tr>
<td>22</td>
<td>Docker</td>
<td><a href="https://github.com/bikirandev/docker-n8n">n8n</a></td>
<td>Docker setup for n8n automation</td>
</tr>
<tr>
<td>23</td>
<td>Docker</td>
<td><a href="https://github.com/bikirandev/docker-pgadmin">Pgadmin</a></td>
<td>Docker setup for pgAdmin</td>
</tr>
<tr>
<td>24</td>
<td>Social Media</td>
<td><a href="https://www.linkedin.com/company/bikiran12">LinkedIn</a></td>
<td>Bikiran on LinkedIn</td>
</tr>
<tr>
<td>25</td>
<td>Social Media</td>
<td><a href="https://www.facebook.com/bikiran12">Facebook</a></td>
<td>Bikiran on Facebook</td>
</tr>
<tr>
<td>26</td>
<td>Social Media</td>
<td><a href="https://www.youtube.com/@bikiranofficial">YouTube</a></td>
<td>Bikiran on YouTube</td>
</tr>
<tr>
<td>27</td>
<td>Social Media</td>
<td><a href="https://www.facebook.com/n8nclouds">FB n8nClouds</a></td>
<td>n8n Clouds on Facebook</td>
</tr>
</tbody></table>
]]></content:encoded></item><item><title><![CDATA[Development of Docker Server Agent with .NET]]></title><description><![CDATA[OVERVIEW & PURPOSE
The majority of developers find it challenging to utilize Docker on Linux server systems due to a lack of expertise. Deploying applications built with technologies like .NET, Next.j]]></description><link>https://blog.bikiran.com/development-of-docker-server-agent-with-dotnet</link><guid isPermaLink="true">https://blog.bikiran.com/development-of-docker-server-agent-with-dotnet</guid><dc:creator><![CDATA[KUMAR BISHOJIT]]></dc:creator><pubDate>Tue, 13 May 2025 08:39:00 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1747128464015/a3145853-8d52-4ec1-91a4-4f434c71341e.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h3>OVERVIEW &amp; PURPOSE</h3>
<p>The majority of developers find it challenging to utilize Docker on Linux server systems due to a lack of expertise. Deploying applications built with technologies like .NET, Next.js, Python, and Java can be particularly complex. This server agent provides a comprehensive API solution, simplifying the deployment process for developers.</p>
<h3>REQUIREMENTS</h3>
<ol>
<li><p>Software Development Knowledge (.NET).</p>
</li>
<li><p>Docker Basic Knowledge</p>
</li>
<li><p>Linux Server Knowledge</p>
</li>
</ol>
<h3>STEP-01: Create a new <a href="http://ASP.NET">ASP.NET</a> Core Web API Project</h3>
<p>Open up your terminal and run the following code <strong>to create your project</strong>. Feel free to personalize the project name instead of using “<strong>DockerInfoApi”</strong>.</p>
<pre><code class="language-bash">dotnet new webapi -n DockerInfoApi
cd DockerInfoApi
</code></pre>
<h3>STEP-02: Add Docker .NET NuGet Package</h3>
<ul>
<li><p>To communicate between the Docker environment and this project, the <strong>Docker.DotNet</strong> NuGet Package is required.</p>
</li>
<li><p>The <strong>Swashbuckle.AspNetCore</strong> NuGet Package is necessary for API management and provides an interactive API testing UI.</p>
</li>
</ul>
<pre><code class="language-bash">dotnet add package Docker.DotNet
dotnet add package Swashbuckle.AspNetCore
dotnet add package NuGet.Protocol
</code></pre>
<h3>STEP-03: Project Setup</h3>
<p>Here is a basic Project.csproj file that you can modify to meet your business requirements. The build and publish configurations are also included.</p>
<pre><code class="language-xml">&lt;Project Sdk="Microsoft.NET.Sdk.Web"&gt;

  &lt;PropertyGroup&gt;
    &lt;TargetFramework&gt;net9.0&lt;/TargetFramework&gt;
    &lt;Nullable&gt;enable&lt;/Nullable&gt;
    &lt;ImplicitUsings&gt;enable&lt;/ImplicitUsings&gt;

    &lt;!-- Add these configurations --&gt;
    &lt;OutputType&gt;Exe&lt;/OutputType&gt;
    &lt;RuntimeIdentifier&gt;linux-x64&lt;/RuntimeIdentifier&gt;
    &lt;SelfContained&gt;true&lt;/SelfContained&gt;
    &lt;PublishSingleFile&gt;true&lt;/PublishSingleFile&gt;
    &lt;PublishTrimmed&gt;false&lt;/PublishTrimmed&gt;
    &lt;IncludeNativeLibrariesForSelfExtract&gt;true&lt;/IncludeNativeLibrariesForSelfExtract&gt;
  &lt;/PropertyGroup&gt;

  &lt;ItemGroup&gt;
    &lt;PackageReference Include="Docker.DotNet" Version="3.125.15" /&gt;
    &lt;!-- Microsoft.AspNetCore.OpenApi is included in .NET 9.0 SDK - you can remove this explicit reference --&gt;
    &lt;PackageReference Include="NuGet.Protocol" Version="6.13.2" /&gt;
    &lt;PackageReference Include="Swashbuckle.AspNetCore" Version="8.1.1" /&gt;
  &lt;/ItemGroup&gt;

&lt;/Project&gt;
</code></pre>
<h3>STEP-04: Update Program.cs &amp; Configure for Docker</h3>
<p>Here is a sample file named <strong>Program.cs</strong>. You can add custom code to meet your business needs.</p>
<pre><code class="language-csharp">using Docker.DotNet;

var builder = WebApplication.CreateBuilder(args);

// Configure Docker client
var dockerUri = Environment.OSVersion.Platform == PlatformID.Unix 
    ? "unix:///var/run/docker.sock" 
    : "npipe://./pipe/docker_engine";
builder.Services.AddSingleton&lt;IDockerClient&gt;(new DockerClientConfiguration(new Uri(dockerUri)).CreateClient());

builder.Services.AddControllers();
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();

var app = builder.Build();

if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}

app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers();
app.Run();
</code></pre>
<h3>STEP-05: Create ContainersController.cs (With APIs)</h3>
<p>Here is the first API for accessing the Docker environment. The controller provides four APIs listed below:</p>
<ol>
<li><p><strong>GET</strong>: <code>/containers</code> - Retrieve a list of all containers.</p>
</li>
<li><p><strong>POST</strong>: <code>/containers</code> - Create a new container.</p>
</li>
<li><p><strong>POST</strong>: <code>/containers/:id/start</code> - Start the specified container.</p>
</li>
<li><p><strong>POST</strong>: <code>/containers/:id/stop</code> - Stop the specified container.</p>
</li>
<li><p><strong>DELETE</strong>: <code>/containers/:id</code> - Remove the specified container.</p>
</li>
</ol>
<pre><code class="language-csharp">using Docker.DotNet;
using Docker.DotNet.Models;
using Microsoft.AspNetCore.Mvc;

namespace DockerInfoApi.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class ContainersController : ControllerBase
    {
        private readonly IDockerClient _dockerClient;

        public ContainersController(IDockerClient dockerClient)
        {
            _dockerClient = dockerClient;
        }

        // List all containers
        [HttpGet]
        public async Task&lt;IActionResult&gt; GetContainers()
        {
            try
            {
                // List all containers
                var contListParams = new ContainersListParameters
                {
                    All = true
                };

                // Get the list of containers
                var containers = await _dockerClient.Containers.ListContainersAsync(contListParams);

                return Ok(containers);
            }
            catch (DockerApiException ex)
            {
                // Handle Docker API exceptions
                var message = $"Error retrieving containers: {ex.Message}";
                return StatusCode((int)ex.StatusCode, message);
            }
            catch (Exception ex)
            {
                // Handle other exceptions
                var message = $"Error retrieving containers: {ex.Message}";
                return BadRequest(message);
            }
        }

        // Create a new container
        //[HttpPost]
        // Coming Soon...

        // Start a container
        [HttpPost("{id}/start")]
        public async Task&lt;IActionResult&gt; StartContainer(string id)
        {
            try
            {
                // Start the container
                var contStartParams = new ContainerStartParameters { };
                var success = await _dockerClient.Containers.StartContainerAsync(id, contStartParams);

                return Ok($"Container {id} started successfully.");
            }
            catch (DockerContainerNotFoundException ex)
            {
                // Handle container not found exception
                var message = $"Container not found: {ex.Message}";
                return NotFound(message);
            }
            catch (Exception ex)
            {
                // Handle other exceptions
                var message = $"Error starting container: {ex.Message}";
                return BadRequest(message);
            }
        }

        // Stop a container
        [HttpPost("{id}/stop")]
        public async Task&lt;IActionResult&gt; StopContainer(string id)
        {
            try
            {
                // Stop the container
                var stopParams = new ContainerStopParameters
                {
                    WaitBeforeKillSeconds = 10
                };
                await _dockerClient.Containers.StopContainerAsync(id, stopParams);

                return Ok($"Container {id} stopped successfully.");
            }
            catch (DockerContainerNotFoundException ex)
            {
                // Handle container not found exception
                var message = $"Container not found: {ex.Message}";
                return NotFound(message);
            }
            catch (Exception ex)
            {
                // Handle other exceptions
                var message = $"Error stopping container: {ex.Message}";
                return BadRequest(message);
            }
        }

        // Remove a container
        [HttpDelete("{id}")]
        public async Task&lt;IActionResult&gt; RemoveContainer(string id)
        {
            try
            {
                // Remove the container
                var removeParams = new ContainerRemoveParameters
                {
                    Force = true,
                    RemoveVolumes = true
                };
                await _dockerClient.Containers.RemoveContainerAsync(id, removeParams);

                return Ok($"Container {id} removed successfully.");
            }
            catch (DockerContainerNotFoundException ex)
            {
                // Handle container not found exception
                var message = $"Container not found: {ex.Message}";
                return NotFound(message);
            }
            catch (Exception ex)
            {
                // Handle other exceptions
                var message = $"Error removing container: {ex.Message}";
                return BadRequest(message);
            }
        }
    }
}
</code></pre>
<h3>STEP-06: Build and Publish the Project</h3>
<p>Run the Project</p>
<pre><code class="language-bash">dotnet run .

# A http://loclhost:5000 link will be generated after successful installation
# Browse URL: http://loclhost:5000/containers
</code></pre>
<p>After a successful run of the project, publish the project</p>
<pre><code class="language-bash">dotnet publish -c Release
</code></pre>
<h3>STEP-07: Prepare your Docker Environment to Test the APIs</h3>
<p>Please check if your Docker is running on the OS.</p>
<pre><code class="language-bash"># This command works on Windows, Linux, and macOS.
docker info &gt; /dev/null 2&gt;&amp;1 &amp;&amp; echo "Docker is running" || echo "Docker is not running"
</code></pre>
<p><strong>Note:</strong> If Docker is not running, then install and run it. <a href="https://docs.docker.com/engine/install/">Docker Install</a></p>
<p>Creating a test container:</p>
<pre><code class="language-csharp">docker pull ubuntu
docker run -it ubuntu /bin/bash

# Test
# It returns the list of containers
docker ps
</code></pre>
<h3>CONCLUSION:</h3>
<p>The development of a Docker Server Agent with .NET simplifies the deployment process for developers who may find using Docker on Linux servers challenging. By following the outlined steps, developers can create a robust API to manage Docker containers efficiently. This guide provides a comprehensive approach, from setting up an <strong>ASP.NET</strong> Core Web API project to integrating necessary NuGet packages and configuring the Docker environment. By implementing these steps, developers can enhance their deployment capabilities, streamline container management, and leverage the full potential of Docker in their development workflows.</p>
<h3>CONTACT:</h3>
<p>I’m Kumar Bishojit Paul, the Founder and CEO of <a href="https://www.bikiran.com/">BIKIRAN</a>. If you need further assistance, please leave a comment. I’m interested in helping you.</p>
<hr />
<h2>🏢 About Bikiran</h2>
<p><strong><a href="https://bikiran.com/">Bikiran</a></strong> is a software development and cloud infrastructure company founded in 2012, headquartered in Khulna, Bangladesh. With 15,000+ clients and over a decade of experience, Bikiran builds and operates a suite of products spanning domain services, cloud hosting, app deployment, workflow automation, and developer tools.</p>
<table>
<thead>
<tr>
<th>SL</th>
<th>Topic</th>
<th>Product</th>
<th>Description</th>
</tr>
</thead>
<tbody><tr>
<td>1</td>
<td>Website</td>
<td><a href="https://bikiran.com/">Bikiran</a></td>
<td>Main platform — Domain, hosting &amp; cloud services</td>
</tr>
<tr>
<td>2</td>
<td>Website</td>
<td><a href="https://www.edusoft.com.bd/">Edusoft</a></td>
<td>Education management software for institutions</td>
</tr>
<tr>
<td>3</td>
<td>Website</td>
<td><a href="https://n8nclouds.com/">n8n Clouds</a></td>
<td>Managed n8n workflow automation hosting</td>
</tr>
<tr>
<td>4</td>
<td>Website</td>
<td><a href="https://www.timestamp.zone/">Timestamp Zone</a></td>
<td>Unix timestamp converter &amp; timezone tool</td>
</tr>
<tr>
<td>5</td>
<td>Website</td>
<td><a href="https://pdfpi.bikiran.com/">PDFpi</a></td>
<td>Online PDF processing &amp; manipulation tool</td>
</tr>
<tr>
<td>6</td>
<td>Website</td>
<td><a href="https://blog.bikiran.com/">Blog</a></td>
<td>Technical articles, guides &amp; tutorials</td>
</tr>
<tr>
<td>7</td>
<td>Website</td>
<td><a href="https://support.bikiran.com/">Support</a></td>
<td>24/7 customer support portal</td>
</tr>
<tr>
<td>8</td>
<td>Website</td>
<td><a href="https://probackup.bikiran.com/">Probackup</a></td>
<td>Automated database backup for SQL, PostgreSQL &amp; MongoDB</td>
</tr>
<tr>
<td>9</td>
<td>Service</td>
<td><a href="https://www.bikiran.com/domain">Domain</a></td>
<td>Domain registration, transfer &amp; DNS management</td>
</tr>
<tr>
<td>10</td>
<td>Service</td>
<td><a href="https://www.bikiran.com/services/hosting/web">Hosting</a></td>
<td>Web, app &amp; email hosting on NVMe SSD</td>
</tr>
<tr>
<td>11</td>
<td>Service</td>
<td>Email &amp; SMS</td>
<td>Bulk email &amp; SMS notification service</td>
</tr>
<tr>
<td>12</td>
<td>npm</td>
<td><a href="https://www.npmjs.com/package/@bikiran/chronopick">Chronopick</a></td>
<td>Date &amp; time picker React component</td>
</tr>
<tr>
<td>13</td>
<td>npm</td>
<td><a href="https://www.npmjs.com/package/@bikiran/editor">Rich Editor</a></td>
<td>WYSIWYG rich text editor for React</td>
</tr>
<tr>
<td>14</td>
<td>npm</td>
<td><a href="https://www.npmjs.com/package/@bikiran/button">Button</a></td>
<td>Reusable React button component library</td>
</tr>
<tr>
<td>15</td>
<td>npm</td>
<td><a href="https://www.npmjs.com/package/create-edx-app">Electron Boilerplate</a></td>
<td>CLI to scaffold Electron.js project templates</td>
</tr>
<tr>
<td>16</td>
<td>NuGet</td>
<td><a href="https://www.nuget.org/packages/Bikiran.Payment.Bkash">Bkash</a></td>
<td>bKash payment gateway integration for .NET</td>
</tr>
<tr>
<td>17</td>
<td>NuGet</td>
<td><a href="https://www.nuget.org/packages/Bikiran.Engine">Bikiran Engine</a></td>
<td>Core .NET engine library for Bikiran services</td>
</tr>
<tr>
<td>18</td>
<td>Open Source</td>
<td><a href="https://github.com/bikirandev/pdfpi">PDFpi</a></td>
<td>PDF processing tool — open source</td>
</tr>
<tr>
<td>19</td>
<td>Open Source</td>
<td><a href="https://github.com/bikirandev/Bikiran.Engine">Bikiran Engine</a></td>
<td>Core .NET engine — open source</td>
</tr>
<tr>
<td>20</td>
<td>Open Source</td>
<td><a href="https://github.com/bikirandev/DriveCLI">Drive CLI</a></td>
<td>CLI tool to manage Google Drive from terminal</td>
</tr>
<tr>
<td>21</td>
<td>Docker</td>
<td><a href="https://github.com/bikirandev/docker-pgsql">Pgsql</a></td>
<td>Docker setup for PostgreSQL</td>
</tr>
<tr>
<td>22</td>
<td>Docker</td>
<td><a href="https://github.com/bikirandev/docker-n8n">n8n</a></td>
<td>Docker setup for n8n automation</td>
</tr>
<tr>
<td>23</td>
<td>Docker</td>
<td><a href="https://github.com/bikirandev/docker-pgadmin">Pgadmin</a></td>
<td>Docker setup for pgAdmin</td>
</tr>
<tr>
<td>24</td>
<td>Social Media</td>
<td><a href="https://www.linkedin.com/company/bikiran12">LinkedIn</a></td>
<td>Bikiran on LinkedIn</td>
</tr>
<tr>
<td>25</td>
<td>Social Media</td>
<td><a href="https://www.facebook.com/bikiran12">Facebook</a></td>
<td>Bikiran on Facebook</td>
</tr>
<tr>
<td>26</td>
<td>Social Media</td>
<td><a href="https://www.youtube.com/@bikiranofficial">YouTube</a></td>
<td>Bikiran on YouTube</td>
</tr>
<tr>
<td>27</td>
<td>Social Media</td>
<td><a href="https://www.facebook.com/n8nclouds">FB n8nClouds</a></td>
<td>n8n Clouds on Facebook</td>
</tr>
</tbody></table>
]]></content:encoded></item></channel></rss>