<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Munir Ahmad</title>
    <description>The latest articles on DEV Community by Munir Ahmad (@munirahmad6224).</description>
    <link>https://dev.to/munirahmad6224</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2482133%2F185824bd-394d-4a0b-b1e6-e6deaedf8b44.jpg</url>
      <title>DEV Community: Munir Ahmad</title>
      <link>https://dev.to/munirahmad6224</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/munirahmad6224"/>
    <language>en</language>
    <item>
      <title>Use Multiple GitHub Accounts on One Machine (SSH)</title>
      <dc:creator>Munir Ahmad</dc:creator>
      <pubDate>Sun, 14 Dec 2025 15:01:47 +0000</pubDate>
      <link>https://dev.to/munirahmad6224/how-to-manage-multiple-github-accounts-on-one-machine-using-ssh-keys-1kio</link>
      <guid>https://dev.to/munirahmad6224/how-to-manage-multiple-github-accounts-on-one-machine-using-ssh-keys-1kio</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F460upyqtorhqq7y9ansb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F460upyqtorhqq7y9ansb.png" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;A step-by-step guide to seamlessly manage multiple GitHub accounts with SSH keys.&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Managing Multiple GitHub Accounts on One Machine Using SSH
&lt;/h3&gt;

&lt;p&gt;If you use both personal and work GitHub accounts on the same machine, authentication issues are almost inevitable. Commits go to the wrong account, pushes fail, or Git keeps asking for credentials.&lt;/p&gt;

&lt;p&gt;The clean solution is simple: &lt;strong&gt;one SSH key per account, configured once, and reused forever&lt;/strong&gt;. This guide shows how to do exactly that.&lt;/p&gt;
&lt;h3&gt;
  
  
  What You’ll Learn
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Create separate SSH keys for each GitHub account&lt;/li&gt;
&lt;li&gt;Configure SSH to automatically select the correct identity&lt;/li&gt;
&lt;li&gt;Clone, push, and commit without account conflicts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Applies to:&lt;/strong&gt; macOS and Linux (Windows users via WSL or Git Bash can follow the same steps)&lt;/p&gt;
&lt;h3&gt;
  
  
  Prerequisites
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Git installed&lt;/li&gt;
&lt;li&gt;Basic terminal knowledge&lt;/li&gt;
&lt;li&gt;Access to multiple GitHub accounts&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Step 1: Generate a Dedicated SSH Key
&lt;/h3&gt;

&lt;p&gt;Create a new key for your work account:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ssh-keygen -t ed25519 -C "work@email.com" -f ~/.ssh/id_ed25519_work
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This avoids overwriting existing keys and clearly separates identities.&lt;br&gt;&lt;br&gt;
When prompted, adding a passphrase is recommended for security.&lt;/p&gt;

&lt;p&gt;Generated files:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;id_ed25519_work — private key (keep secret)&lt;/li&gt;
&lt;li&gt;id_ed25519_work.pub — public key (add to GitHub)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Step 2: Add the Key to the SSH Agent
&lt;/h3&gt;

&lt;p&gt;Start the agent and load your key:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_ed25519_work
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This allows Git to authenticate without repeatedly asking for a passphrase.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: Add the Public Key to GitHub
&lt;/h3&gt;

&lt;p&gt;Copy your public key:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cat ~/.ssh/id_ed25519_work.pub
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Copy the entire output (starts with ssh-ed25519).&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Navigate to: &lt;a href="https://github.com/settings/keys" rel="noopener noreferrer"&gt;&lt;strong&gt;https://github.com/settings/keys&lt;/strong&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;New SSH key&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Add a title (e.g., “Work Laptop — 2024”)&lt;/li&gt;
&lt;li&gt;Paste your public key&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Add SSH key&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9g6r8mn6npzs3p23jowm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9g6r8mn6npzs3p23jowm.png" alt=" " width="800" height="292"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Highlighting where to add your SSH key in GitHub settings.&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Step 4: Configure SSH Host Aliases
&lt;/h3&gt;

&lt;p&gt;Edit your SSH config:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;nano ~/.ssh/config
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Here you can add multiple identities personal, work etc.
# Personal account
Host github.com
  HostName github.com
  User git
  IdentityFile ~/.ssh/id_ed25519
  IdentitiesOnly yes

# Work account
Host github-work
  HostName github.com
  User git
  IdentityFile ~/.ssh/id_ed25519_work
  IdentitiesOnly yes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This tells SSH exactly which key to use for each account.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 5: Test the Setup
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ssh -T github-work
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If successful, GitHub will confirm authentication. Expected output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Hi username! You've successfully authenticated, but GitHub does not provide shell access.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Using the Correct Account
&lt;/h3&gt;

&lt;h3&gt;
  
  
  Clone Repositories
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Work account
git clone git@github-work:company/repo.git

# Personal account
git clone git@github.com:username/repo.git
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Fix an Existing Repository
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git remote set-url origin git@github-work:company/repo.git
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Set Commit Identity (Per Repository)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git config user.name "Your Name"
git config user.email "work@company.com"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This ensures commits are attributed correctly.&lt;/p&gt;

&lt;h3&gt;
  
  
  Final Thoughts
&lt;/h3&gt;

&lt;p&gt;Managing multiple GitHub accounts doesn’t require hacks or workarounds.&lt;br&gt;&lt;br&gt;
With &lt;strong&gt;one SSH key per account and a clear SSH configuration&lt;/strong&gt; , Git becomes invisible — and that’s exactly how tooling should behave.&lt;/p&gt;

&lt;p&gt;Configure it once. Forget about it forever.&lt;/p&gt;

</description>
      <category>gitconfiguration</category>
      <category>github</category>
      <category>sshkeys</category>
      <category>multipleaccounts</category>
    </item>
    <item>
      <title>Secure Swagger &amp; ReDoc in Django REST Framework with DRF Spectacular: Best Practices for API…</title>
      <dc:creator>Munir Ahmad</dc:creator>
      <pubDate>Sun, 07 Dec 2025 17:56:18 +0000</pubDate>
      <link>https://dev.to/munirahmad6224/secure-swagger-redoc-in-django-rest-framework-with-drf-spectacular-best-practices-for-api-332a</link>
      <guid>https://dev.to/munirahmad6224/secure-swagger-redoc-in-django-rest-framework-with-drf-spectacular-best-practices-for-api-332a</guid>
      <description>&lt;h3&gt;
  
  
  Secure Swagger &amp;amp; ReDoc in Django REST Framework with DRF Spectacular: Best Practices for API Security
&lt;/h3&gt;

&lt;p&gt;API documentation tools like &lt;strong&gt;Swagger UI&lt;/strong&gt; and &lt;strong&gt;ReDoc&lt;/strong&gt; make development easier, but they also expose &lt;strong&gt;every endpoint, schema, and request structure&lt;/strong&gt; to anyone who can access the URL.&lt;/p&gt;

&lt;p&gt;If you deploy your Django REST Framework project without protecting /api/docs/ or /api/schema/, you're unintentionally giving outsiders:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A complete map of all your APIs&lt;/li&gt;
&lt;li&gt;All request/response structures&lt;/li&gt;
&lt;li&gt;Authentication patterns&lt;/li&gt;
&lt;li&gt;Internal admin/debug endpoints&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This makes exploitation easier and increases your attack surface.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;That’s why Swagger must never be public in production.&lt;/strong&gt; In this guide, we’ll show a clean, secure way to protect your API documentation using &lt;strong&gt;DRF Spectacular&lt;/strong&gt; in a Django REST Framework project.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu7mty7b8cfjz281n48e2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu7mty7b8cfjz281n48e2.png" alt=" " width="720" height="480"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;A secure architecture for safeguarding Swagger and ReDoc in DRF using DRF Spectacular.&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Directory structure
core/
    docs/
        swagger_view.py
    urls.py
    settings.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;core/docs/swagger_view.py&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;from django.shortcuts import redirect
from drf_spectacular.views import (
    SpectacularAPIView,
    SpectacularSwaggerView,
    SpectacularRedocView,
)

class AdminOnlyMixin:
    """
    Restrict access to authenticated superusers.
    """

    def dispatch(self, request, *args, **kwargs):
        if not request.user.is_authenticated:
            return redirect(f"/admin/login/?next={request.path}")
        if not request.user.is_superuser:
            return redirect("/403/") # Make sure a 403 page exists
        return super().dispatch(request, *args, **kwargs)

class SuperuserSchemaView(AdminOnlyMixin, SpectacularAPIView):
    pass

class SuperuserSwaggerView(AdminOnlyMixin, SpectacularSwaggerView):
    pass

class SuperuserRedocView(AdminOnlyMixin, SpectacularRedocView):
    pass
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;core/urls.y&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;from django.urls import path
from core.docs import (
    SuperuserRedocView,
    SuperuserSchemaView,
    SuperuserSwaggerView,
)

urlpatterns = [
    # API documentation (protected)
    path("api/schema/", SuperuserSchemaView.as_view(), name="schema"),
    path("api/docs/", SuperuserSwaggerView.as_view(url_name="schema"), name="swagger-ui"),
    path("api/redoc/", SuperuserRedocView.as_view(url_name="schema"), name="redoc"),
]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;core/settings.py&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;REST_FRAMEWORK = {
    "DEFAULT_AUTHENTICATION_CLASSES": (
        # JWT for external API clients
        "rest_framework_simplejwt.authentication.JWTAuthentication",

        # Session auth so Swagger works automatically after admin login
        "rest_framework.authentication.SessionAuthentication",
    ),
    "DEFAULT_PERMISSION_CLASSES": (
        "rest_framework.permissions.IsAuthenticated",
    ),
    "DEFAULT_SCHEMA_CLASS": "drf_spectacular.openapi.AutoSchema",
}

SPECTACULAR_SETTINGS = {
    "TITLE": "Your API",
    "DESCRIPTION": "API documentation",
    "VERSION": "1.0.0",

    # Allow our custom view to control permissions manually
    "SERVE_PERMISSIONS": ["rest_framework.permissions.IsAdminUser"],

    # Use DRF’s normal authentication classes (Session + JWT)
    "SERVE_AUTHENTICATION": None,

    # Important: Do NOT expose schema automatically in unrestricted mode
    "SERVE_INCLUDE_SCHEMA": False,
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Notes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;SessionAuthentication allows admin users to access protected docs easily.&lt;/li&gt;
&lt;li&gt;SERVE_INCLUDE_SCHEMA = False ensures your schema isn’t automatically exposed.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And that’s the real value of securing your API documentation: you empower your team without empowering your attackers. When Swagger and ReDoc live behind proper authentication, your developers gain clarity, your system gains integrity, and your attack surface quietly shrinks. Secure the docs, protect the blueprint, and let your API evolve with confidence — exactly the way production-grade engineering should be. Appreciate your time. Until next time 👋.&lt;/p&gt;

</description>
      <category>django</category>
      <category>djangorestframework</category>
      <category>drfspectacular</category>
      <category>restapi</category>
    </item>
    <item>
      <title>Install the Latest PostgreSQL (psql 18) on Ubuntu 24.04 (Noble)</title>
      <dc:creator>Munir Ahmad</dc:creator>
      <pubDate>Mon, 03 Nov 2025 17:40:16 +0000</pubDate>
      <link>https://dev.to/munirahmad6224/install-the-latest-postgresql-psql-18-on-ubuntu-2404-noble-3fdp</link>
      <guid>https://dev.to/munirahmad6224/install-the-latest-postgresql-psql-18-on-ubuntu-2404-noble-3fdp</guid>
      <description>&lt;p&gt;&lt;strong&gt;Why I Wrote This&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;While setting up my development environment on &lt;strong&gt;Ubuntu 24.04 (Noble Numbat)&lt;/strong&gt;, I noticed the default PostgreSQL version in Ubuntu’s repository was outdated.&lt;br&gt;&lt;br&gt;
So I decided to document the clean, official way to install the latest &lt;strong&gt;PostgreSQL (v18) &lt;/strong&gt;— straight from the PostgreSQL Apt repository.&lt;/p&gt;

&lt;p&gt;If you’ve ever run into issues like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;“No cluster suitable as a default target”&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;or old versions like PostgreSQL 14 or 15 being installed instead of the latest then this guide will help you start fresh.&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;Step-by-Step Guide to Installing PostgreSQL 18&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4u6tijhx6istsf2xo48k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4u6tijhx6istsf2xo48k.png" alt=" " width="720" height="480"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Step 1 — Update and Upgrade Your System&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo apt update &amp;amp;&amp;amp; sudo apt upgrade -y
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Step 2 — Check Your Ubuntu &lt;strong&gt;Codename:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;PostgreSQL’s official repo depends on your Ubuntu version codename.&lt;br&gt;&lt;br&gt;
 Run the following to check yours:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;. /etc/os-release
echo $VERSION_CODENAME
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For Ubuntu 24.04, the output should be:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;noble
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Step 3 — Install Required Packages&lt;/p&gt;

&lt;p&gt;We’ll install curl, ca-certificates, and postgresql-common:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo apt install -y curl ca-certificates postgresql-common
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Step 4 — Add the PostgreSQL Apt Repository&lt;/p&gt;

&lt;p&gt;Run the following command to automatically add the official PostgreSQL repository:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo /usr/share/postgresql-common/pgdg/apt.postgresql.org.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Step 5 — Update Package Lists &amp;amp; Install PostgreSQL 18&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo apt update
sudo apt install -y postgresql-18
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When prompted during installation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Type &lt;strong&gt;Y&lt;/strong&gt; to confirm.&lt;/li&gt;
&lt;li&gt;If you see a purple configuration screen like this 👇 choose
&lt;strong&gt;“install the package maintainer’s version”&lt;/strong&gt;
(This ensures a clean, default setup for PostgreSQL 18.)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhkga71btjf6gqnxq0dpt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhkga71btjf6gqnxq0dpt.png" alt=" " width="720" height="337"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Step 7 — Verify Installation&lt;/p&gt;

&lt;p&gt;Check the installed version you should see:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;psql --version
psql (PostgreSQL) 18.x
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;That’s it! You’ve successfully installed and verified PostgreSQL 18 on Ubuntu 24.04 (Noble).&lt;br&gt;&lt;br&gt;
Your system is now running the latest, officially supported PostgreSQL version, ready for use in production or local development.If you encounter any issues, check the PostgreSQL service logs with:&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo journalctl -u postgresql
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Otherwise — you’re all set to start building with PostgreSQL 18.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

</description>
    </item>
  </channel>
</rss>
