<?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>Forem: Nguezet Jordan Junior</title>
    <description>The latest articles on Forem by Nguezet Jordan Junior (@wintercodenkjj).</description>
    <link>https://forem.com/wintercodenkjj</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%2F3783959%2Fd8834771-f3dd-4b23-afa5-b146d3d98b31.jpeg</url>
      <title>Forem: Nguezet Jordan Junior</title>
      <link>https://forem.com/wintercodenkjj</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/wintercodenkjj"/>
    <language>en</language>
    <item>
      <title>Dokploy - Deploy a Postgres DB + Express API + Next.js app from GitHub</title>
      <dc:creator>Nguezet Jordan Junior</dc:creator>
      <pubDate>Mon, 23 Feb 2026 10:44:31 +0000</pubDate>
      <link>https://forem.com/wintercodenkjj/dokploy-deploy-a-postgres-db-express-api-nextjs-app-from-github-hcj</link>
      <guid>https://forem.com/wintercodenkjj/dokploy-deploy-a-postgres-db-express-api-nextjs-app-from-github-hcj</guid>
      <description>&lt;h2&gt;
  
  
  1. What is Dokploy
&lt;/h2&gt;

&lt;p&gt;Dokploy is an open-source, self-hostable PaaS that uses Docker + Traefik to let you run apps and managed databases on your VPS with a web UI, Git integration, auto-deploy and TLS support. It’s designed to be an alternative to platforms like Heroku, Vercel or Netlify while keeping everything under your control. (&lt;a href="https://dokploy.com/?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;dokploy.com&lt;/a&gt;)&lt;/p&gt;




&lt;h2&gt;
  
  
  2. How to install Dokploy
&lt;/h2&gt;

&lt;p&gt;Quick install (recommended for most): run Dokploy’s installer on a fresh VPS (Ubuntu/Debian recommended). The docs show the one-line installer approach; you can also follow the manual install if you prefer to inspect scripts first. Example (as in Dokploy docs):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# example installer (copy from official docs before running)&lt;/span&gt;
curl &lt;span class="nt"&gt;-sSL&lt;/span&gt; https://dokploy.com/install.sh | sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Security note:&lt;/strong&gt; as always, audit remote install scripts before piping to &lt;code&gt;sh&lt;/code&gt; — the docs include a manual install path if you want to download + inspect the script. (&lt;a href="https://docs.dokploy.com/docs/core/installation?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;docs.dokploy.com&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;Suggested VPS sizing: 1–2 vCPU, 2–4 GB RAM minimum for a small dev instance; increase for production. Many community tutorials add firewall and swap steps before installing. (&lt;a href="https://www.massivegrid.com/blog/how-to-install-dokploy-on-vps/?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;MassiveGRID&lt;/a&gt;)&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Launching Dokploy
&lt;/h2&gt;

&lt;p&gt;After installation the Dokploy service runs as Docker containers on your server. You’ll access the panel at &lt;code&gt;http(s)://&amp;lt;your-server-ip-or-domain&amp;gt;:PORT&lt;/code&gt; (by default the installer binds ports and configures Traefik). After initial login you’ll see the dashboard where you can create projects and services. (&lt;a href="https://docs.dokploy.com/docs/core/installation?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;docs.dokploy.com&lt;/a&gt;)&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%2Fmi7h1x8av9lqh02hq31b.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%2Fmi7h1x8av9lqh02hq31b.png" alt="Dokploy dashboard screenshot" width="800" height="430"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Creating a project
&lt;/h2&gt;

&lt;p&gt;In Dokploy a &lt;em&gt;Project&lt;/em&gt; groups related services (e.g., &lt;code&gt;my-app&lt;/code&gt;). From the dashboard: click &lt;strong&gt;Create Project&lt;/strong&gt; → give it a name and optional description. Projects scope deployments, environment variables, and service access.&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%2F2rb2cxzvop4poatl7a5m.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%2F2rb2cxzvop4poatl7a5m.png" alt="Create a project in dockploy" width="800" height="430"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  5. Types of services available in Dokploy
&lt;/h2&gt;

&lt;p&gt;Dokploy supports multiple service types (examples):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Application&lt;/strong&gt; (build from Git repo: Dockerfile / Node, etc.)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Docker Compose&lt;/strong&gt; stacks (deploy entire &lt;code&gt;docker-compose.yml&lt;/code&gt;) — great for multi-container apps.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Database services&lt;/strong&gt; (managed Postgres, MySQL, Redis) that Dokploy can provision and back up.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Static sites / templates&lt;/strong&gt; and third-party image-based services (Docker Hub images). (&lt;a href="https://dokploy.com/?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;dokploy.com&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  6. Creating a service in a project
&lt;/h2&gt;

&lt;p&gt;You can add a service by either:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pointing Dokploy to a GitHub repository (select branch + build options), or&lt;/li&gt;
&lt;li&gt;Deploying a Docker Compose stack directly, or&lt;/li&gt;
&lt;li&gt;Creating a managed database service via the UI.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Steps (GitHub example):&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;In your project, click &lt;strong&gt;Create Service&lt;/strong&gt; → choose &lt;strong&gt;Application&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;Git&lt;/strong&gt; as source → choose &lt;strong&gt;GitHub&lt;/strong&gt; (you’ll connect Dokploy to GitHub once per account). (&lt;a href="https://docs.dokploy.com/docs/core/github?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;docs.dokploy.com&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Enter repo path, branch, and build command (if needed). Dokploy can auto-deploy on pushes (auto-deploy option). (&lt;a href="https://docs.dokploy.com/docs/core/auto-deploy?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;docs.dokploy.com&lt;/a&gt;)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Placeholder for screenshot:&lt;/strong&gt;&lt;br&gt;
[Insert "Create Service" / GitHub connect screenshot]&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%2Fw4t7qxhocjxzoduvoa7z.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%2Fw4t7qxhocjxzoduvoa7z.png" alt="Create Service" width="800" height="430"&gt;&lt;/a&gt;&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%2Fhyk37uqeyf7krfpjtmik.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%2Fhyk37uqeyf7krfpjtmik.png" alt="Service creation form" width="800" height="430"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  7. Service provider
&lt;/h2&gt;

&lt;p&gt;When creating a service you typically choose:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Repository provider:&lt;/strong&gt; GitHub (common), GitLab, or a direct Docker image.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Build method:&lt;/strong&gt; Dockerfile (recommended for Node/Next), buildpack, or remote image.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deployment mode:&lt;/strong&gt; single container app vs compose stack.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Dokploy’s docs explain the GitHub connection flow — you’ll grant access with a token and can restrict repositories. (&lt;a href="https://docs.dokploy.com/docs/core/github?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;docs.dokploy.com&lt;/a&gt;)&lt;/p&gt;


&lt;h2&gt;
  
  
  8. Service configuration
&lt;/h2&gt;

&lt;p&gt;Each service exposes a configuration panel with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Build settings&lt;/strong&gt; (Dockerfile path, build args)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Start command / entrypoint&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ports&lt;/strong&gt; to expose (internal → routed via Traefik)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Resource limits&lt;/strong&gt; (CPU, memory)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Environment variables&lt;/strong&gt; (next section)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Volumes / persistent storage&lt;/strong&gt; (for databases or file uploads)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Set the build context and port your app listens on (e.g., Express &lt;code&gt;PORT=3000&lt;/code&gt;, Next &lt;code&gt;PORT=3000&lt;/code&gt; or use Next.js recommended &lt;code&gt;next start&lt;/code&gt; settings for production builds).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt; For a Next.js production app you build (&lt;code&gt;npm run build&lt;/code&gt;) and then run &lt;code&gt;npm run start&lt;/code&gt; on port 3000 configure Dokploy to expose that internal port.&lt;/p&gt;


&lt;h2&gt;
  
  
  9. Environment
&lt;/h2&gt;

&lt;p&gt;Use Dokploy’s environment variables UI to provide secrets (DB credentials, JWT secrets, API keys). Best practices:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Store credentials (e.g., &lt;code&gt;DATABASE_URL&lt;/code&gt;, &lt;code&gt;JWT_SECRET&lt;/code&gt;) in the service’s env panel, not in the repo.&lt;/li&gt;
&lt;li&gt;For multi-service stacks, define shared envs at the project level when possible (Dokploy supports scoping).&lt;/li&gt;
&lt;li&gt;Use different env sets for &lt;code&gt;production&lt;/code&gt; vs &lt;code&gt;staging&lt;/code&gt; branches.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Example env for Express API (set in Dokploy):&lt;/strong&gt;&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%2Fu0gz4cgllvqcsvruujhg.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%2Fu0gz4cgllvqcsvruujhg.png" alt="Service configuration" width="800" height="430"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PORT=4000
DATABASE_HOST=postgres-db     # service name (see internal comms)
DATABASE_PORT=5432
DATABASE_USER=app_user
DATABASE_PASSWORD=strong_password
DATABASE_NAME=app_db
JWT_SECRET=change_this_secret
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  10. Internal communication to other services using service names and connection URLs (Postgres case)
&lt;/h2&gt;

&lt;p&gt;When Dokploy runs multiple services in the same project, they share an internal Docker network. That means you can reference other services by the &lt;strong&gt;service name&lt;/strong&gt; as the hostname.&lt;/p&gt;

&lt;p&gt;Example architecture:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Service name: &lt;code&gt;postgres-db&lt;/code&gt; (managed DB service or a container from docker-compose)&lt;/li&gt;
&lt;li&gt;Express API uses host: &lt;code&gt;postgres-db&lt;/code&gt;, port &lt;code&gt;5432&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Connection string (Express / node-pg):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Pool&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;pg&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;pool&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Pool&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;host&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;DATABASE_HOST&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;postgres-db&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Number&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;DATABASE_PORT&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="mi"&gt;5432&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="na"&gt;user&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;DATABASE_USER&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;password&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;DATABASE_PASSWORD&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;database&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;DATABASE_NAME&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If Dokploy provisions a &lt;em&gt;managed&lt;/em&gt; Postgres service, it will expose host/port/credentials in the service UI — copy those into your Express service envs. Internal DNS using service names only works when the DB is deployed &lt;em&gt;inside the same Dokploy project/network&lt;/em&gt; (compose or container); hosted/managed DBs may have external hostnames which you should use instead. (&lt;a href="https://dokploy.com/?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;dokploy.com&lt;/a&gt;)&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%2F9ljmp5v8upxdo5t7lsxe.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%2F9ljmp5v8upxdo5t7lsxe.png" alt="Postgres service details screenshot showing host/port/credentials" width="800" height="430"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  11. Deployment
&lt;/h2&gt;

&lt;p&gt;Two main flows:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A. Manual / UI deploy:&lt;/strong&gt; push config in Dokploy and click &lt;strong&gt;Deploy&lt;/strong&gt; on the service.&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%2F62rfk4iqtytdc9itdggn.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%2F62rfk4iqtytdc9itdggn.png" alt="Manual / UI deploy" width="800" height="324"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;B. Auto-deploy via GitHub:&lt;/strong&gt; connect GitHub and enable auto-deploy so every push to the chosen branch triggers a build and deployment (Dokploy supports webhooks + native GitHub integration). For CI you can also use the GitHub Action for Dokploy to trigger deployments as part of your workflow. (&lt;a href="https://docs.dokploy.com/docs/core/auto-deploy?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;docs.dokploy.com&lt;/a&gt;)&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%2F7ex27ka2epnb58uqegwf.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%2F7ex27ka2epnb58uqegwf.png" alt="Auto-deploy via GitHub" width="800" height="430"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Typical deploy steps for our stack:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create a Project in Dokploy.&lt;/li&gt;
&lt;li&gt;Add Postgres service (managed or as compose).&lt;/li&gt;
&lt;li&gt;Add Express service (point to repo &lt;code&gt;./api&lt;/code&gt; with Dockerfile; set envs).&lt;/li&gt;
&lt;li&gt;Add Next.js service (point to repo &lt;code&gt;./frontend&lt;/code&gt; with Dockerfile; set envs).&lt;/li&gt;
&lt;li&gt;Ensure services expose correct ports and healthchecks.&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Deploy&lt;/strong&gt; (or push to the branch if auto-deploy enabled).&lt;/li&gt;
&lt;li&gt;Inspect logs in Dokploy UI for build and runtime logs.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Troubleshooting tips:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If build fails, check build logs in the UI—missing build dependencies are common (node version mismatch, missing build args).&lt;/li&gt;
&lt;li&gt;For DB connection errors check that the Express service envs match the database service credentials and that the DB is ready (use &lt;code&gt;depends_on&lt;/code&gt; or retry logic).&lt;/li&gt;
&lt;li&gt;Use health checks and readiness probes in your Dockerfile/start scripts.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  12. Connecting the service to a domain name
&lt;/h2&gt;

&lt;p&gt;Dokploy uses Traefik for routing and TLS management. Steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;In your DNS provider, create an &lt;strong&gt;A&lt;/strong&gt; record for &lt;code&gt;app.yourdomain.com&lt;/code&gt; pointing to your server IP.&lt;/li&gt;
&lt;li&gt;In Dokploy, open the service’s domain/route settings and set the hostname (&lt;code&gt;app.yourdomain.com&lt;/code&gt;). Dokploy will map that hostname to the internal service and (usually) request a TLS certificate automatically via Let’s Encrypt (if configured). (&lt;a href="https://dokploy.com/?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;dokploy.com&lt;/a&gt;)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you run your own Traefik config (Dokploy allows editing Traefik file editor), you can customize certificate providers or add advanced routing rules.&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%2F1kxttfgrbq547psh6xl9.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%2F1kxttfgrbq547psh6xl9.png" alt="Insert domain mapping / Traefik rules screenshot" width="800" height="430"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  13. Accessing the service online
&lt;/h2&gt;

&lt;p&gt;After DNS propagation and successful deployment:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Visit &lt;code&gt;https://app.yourdomain.com&lt;/code&gt; — Traefik will route to the Next.js service.&lt;/li&gt;
&lt;li&gt;API endpoints will be under the path you configured (e.g., &lt;code&gt;https://app.yourdomain.com/api/*&lt;/code&gt;) or on a subdomain like &lt;code&gt;api.yourdomain.com&lt;/code&gt; if you prefer.&lt;/li&gt;
&lt;li&gt;Use Dokploy logs and monitoring to verify runtime errors, request traces, and resource use.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you used internal service names for backend-to-DB communication, those hostnames are only resolvable &lt;em&gt;inside&lt;/em&gt; Dokploy’s network — external requests must go through the public domain / proxy.&lt;/p&gt;




&lt;h1&gt;
  
  
  Example: Minimal Dockerfiles
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;Express (&lt;code&gt;./api/Dockerfile&lt;/code&gt;):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; node:20-alpine&lt;/span&gt;
&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /app&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; package*.json ./&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;npm ci &lt;span class="nt"&gt;--production&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; . .&lt;/span&gt;
&lt;span class="k"&gt;EXPOSE&lt;/span&gt;&lt;span class="s"&gt; 4000&lt;/span&gt;
&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="s"&gt; ["node", "dist/index.js"]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Next.js (&lt;code&gt;./frontend/Dockerfile&lt;/code&gt;) — production build + start:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;node:20-alpine&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;builder&lt;/span&gt;
&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /app&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; package*.json ./&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;npm ci
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; . .&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;npm run build

&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;node:20-alpine&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;runner&lt;/span&gt;
&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /app&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; --from=builder /app/.next ./.next&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; --from=builder /app/node_modules ./node_modules&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; --from=builder /app/package.json ./package.json&lt;/span&gt;
&lt;span class="k"&gt;EXPOSE&lt;/span&gt;&lt;span class="s"&gt; 3000&lt;/span&gt;
&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="s"&gt; ["npm", "run", "start"]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  Final checklist before first production deploy
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;VPS firewall opened for HTTP/HTTPS, SSH locked down.&lt;/li&gt;
&lt;li&gt;Dokploy installed and reachable. (&lt;a href="https://docs.dokploy.com/docs/core/installation?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;docs.dokploy.com&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;GitHub connected and auto-deploy configured if desired. (&lt;a href="https://docs.dokploy.com/docs/core/github?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;docs.dokploy.com&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Postgres credentials set securely in Dokploy env UI (or use managed DB service).&lt;/li&gt;
&lt;li&gt;Health checks and resource limits applied.&lt;/li&gt;
&lt;li&gt;DNS A records created, TLS validated by Dokploy/Traefik. (&lt;a href="https://dokploy.com/?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;dokploy.com&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  Troubleshooting common errors
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Build fails:&lt;/strong&gt; inspect build logs; confirm Node version and build scripts.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DB connection refused:&lt;/strong&gt; confirm service name/port and that DB init finished; add retry/backoff in your app.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Domain shows default page or 404:&lt;/strong&gt; check hostname mapping in Dokploy and verify DNS A record.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Auto-deploy not triggering:&lt;/strong&gt; recheck GitHub webhook permissions and branch settings. (&lt;a href="https://docs.dokploy.com/docs/core/auto-deploy?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;docs.dokploy.com&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  Where to learn more / references
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;Dokploy installation &amp;amp; manual: official docs. (&lt;a href="https://docs.dokploy.com/docs/core/installation?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;docs.dokploy.com&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;GitHub integration &amp;amp; auto-deploy: official docs. (&lt;a href="https://docs.dokploy.com/docs/core/github?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;docs.dokploy.com&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Dokploy overview &amp;amp; Traefik/Docker Compose support: homepage/docs. (&lt;a href="https://dokploy.com/?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;dokploy.com&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>automation</category>
      <category>devops</category>
      <category>docker</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
