07
Infrastructure
5 servers. Hetzner, AWS. Docker, Nginx, PM2, SSL, domains. Email infrastructure. How I deploy and keep things running.
DockerNginxServersDevOps
This is the big one. The part that surprises people the most. I run 5 production servers. Real servers, with real applications, serving real users. Someone with no IT background managing production infrastructure. Let me walk you through every piece of it.
Server 1 is at 37.27.5.172 on Hetzner. It runs the SMTPCloud backend (the Express API that powers the dashboard), RT Helper (a real-time automation tool), and n8n — which is an open-source workflow automation platform. This server handles the core business logic for SMTPCloud.
Server 2 is at 46.62.208.26, also on Hetzner. This one runs LeadTool (the Python/FastAPI app), learn.smtpcloud.io (a learning platform), the Postal tracking pixel service, and several other smaller apps. It is my general-purpose application server.
Server 3 is at 52.202.26.53 on AWS EC2. It runs Quality Monitoring inside Docker Compose (postgres + backend + frontend containers), CampaignPulse, and the Nurturing Report System. I chose AWS for this one because the team using Quality Monitoring is global and AWS gives good latency worldwide.
Then there are the relay servers — like 45.148.28.22 — running Postfix and OpenDKIM for email delivery through mail-warm.com. These are specialized: their only job is to send emails with proper authentication (DKIM signatures, SPF records, DMARC policies). Email delivery infrastructure is its own world, and getting it right matters when your business depends on emails actually reaching inboxes.
Docker is something I use where it makes sense. Quality Monitoring runs in Docker Compose — one command and you get a PostgreSQL database, the backend API, and the frontend all running together in isolated containers. Docker is great when you need to reproduce the exact same setup on different machines. I asked Claude to write the Dockerfiles and docker-compose.yml, and it explained each line so I understood what was happening.
Nginx sits on every single server as a reverse proxy. What does that mean? My apps run on ports like 3000, 3001, 8080 internally. Nginx takes incoming requests on port 80 (HTTP) and 443 (HTTPS) and routes them to the right app based on the domain name. So smtpcloud-api.example.com goes to port 3000, leadtool.example.com goes to port 8000, and so on. All with SSL certificates from Let's Encrypt, set up through certbot with automatic renewal. Claude wrote every Nginx config file for me.
PM2 is my process manager for Node.js applications. It keeps apps running — if one crashes, PM2 automatically restarts it. It manages logs, lets you monitor memory and CPU usage, and handles running multiple apps on the same server. On my Hetzner servers, PM2 manages several Node.js processes each. A simple 'pm2 restart app-name' after deployment and you are live.
DNS goes through Cloudflare for all my domains. Cloudflare handles DNS records, provides CDN caching, and adds a layer of DDoS protection. Frontend deployments for smtpcloud-dashboard and smtpcloud-website go to Vercel — it connects to your GitHub repo and deploys automatically when you push code. Vercel is genuinely the easiest deployment I have ever used.
My deployment workflow depends on the project. For Vercel frontends: git push and it deploys automatically. For server apps: I build locally or on the server, use rsync to copy files if needed, then either 'docker compose up -d' for Docker projects or 'pm2 restart' for Node.js apps. It is not fancy. It does not need to be. The whole point is reliability, not elegance.
The email infrastructure deserves its own mention. I run a Postal mail server (an open-source mail server), Postfix relay servers with OpenDKIM for signing emails, and I manage SPF, DKIM, and DMARC records for proper email authentication. If you do not know what those are — they are DNS records that prove your emails are legitimate and not spam. Getting email infrastructure right is genuinely hard, and it took many iterations with Claude to get everything configured properly.
SSL certificates are handled by Let's Encrypt with certbot. Every domain on every server has HTTPS. Certbot handles automatic renewal so certificates do not expire. Setting this up the first time was confusing, but Claude walked me through the commands and now it runs on its own.
Here is what I want you to understand: none of this infrastructure knowledge came from a course or a certification. Every single piece — Docker, Nginx, PM2, SSL, DNS, email authentication — I learned because a project needed it. I would tell Claude 'I need to deploy this app on my server' and Claude would walk me through the steps. After doing it 20 times, you just know how it works. The servers are stable. The apps stay running. That is what matters.