Problem
Hey guys! I have a problem with connecting to my PostgreSQL database from my backend service in a Docker Swarm setup. I have Traefik set up as a reverse proxy, and I'm using Docker Swarm for orchestration. The backend service is unable to connect to the PostgreSQL database, and I'm not sure why.
INFRA config
version: "3"
services:
traefik:
image: traefik:v3.1
hostname: "{{.Node.Hostname}}"
ports:
# listen on host ports without ingress network
- target: 80
published: 80
protocol: tcp
mode: host
- target: 443
published: 443
protocol: tcp
mode: host
networks:
- proxy
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- letsencrypt:/letsencrypt
command:
- --api.dashboard=true
- --log.level=INFO
- --accesslog=true
- --providers.swarm.exposedByDefault=false
- --providers.swarm.network=proxy
- --entrypoints.web.address=:80
- --entrypoints.web.http.redirections.entrypoint.to=websecure
- --entryPoints.web.http.redirections.entrypoint.scheme=https
- --entrypoints.websecure.address=:443
- --entrypoints.websecure.asDefault=true
- --entrypoints.websecure.http.tls.certresolver=myresolver
- --entrypoints.postgres.address=:5432
- "--certificatesresolvers.myresolver.acme.dnschallenge=true"
- "--certificatesresolvers.myresolver.acme.dnschallenge.provider=cloudflare"
- "--certificatesresolvers.myresolver.acme.email=xxxxxx@gmail.com"
- "--certificatesresolvers.myresolver.acme.storage=/letsencrypt/acme.json"
deploy:
mode: global
placement:
constraints:
- node.role==manager
labels:
- traefik.enable=true
- traefik.http.routers.mydashboard.rule=Host(`traefik.xxxxxx.dev`)
- traefik.http.routers.mydashboard.service=api@internal
- traefik.http.routers.mydashboard.middlewares=myauth
- traefik.http.services.mydashboard.loadbalancer.server.port=1337
whoami:
image: traefik/whoami:v1.10
hostname: "{{.Node.Hostname}}"
networks:
- proxy
deploy:
mode: global
labels:
- traefik.enable=true
- traefik.http.routers.whoami.rule=Host(`whoami.xxxxxx.dev`)
- traefik.http.services.whoami.loadbalancer.server.port=80
- traefik.http.routers.whoami.tls.certresolver=myresolver
networks:
proxy:
name: proxy
driver: overlay
attachable: true
volumes:
letsencrypt:
name: letsencrypt
Backend config
version: "3.8"
services:
skippy:
image: xxxxxx/skippy:backend-latest
hostname: "{{.Node.Hostname}}"
networks:
- proxy
environment:
- POSTGRES_HOST=db
- POSTGRES_PORT=5432
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=password
- POSTGRES_DB=skippy
- POSTGRES_SSLMODE=disable
- JWT_SECRET=development-secret
- OPENAI_API_KEY=sk-dummy-key-for-development-only-replace-in-production
depends_on:
- db
deploy:
replicas: 1
labels:
- traefik.enable=true
- traefik.http.routers.skippy.rule=Host(`skippy.xxxxxx.dev`)
- traefik.http.routers.skippy.entrypoints=websecure
- traefik.http.routers.skippy.tls.certresolver=myresolver
- traefik.http.services.skippy.loadbalancer.server.port=3000
# restart_policy:
# condition: on-failure
# update_config:
# order: start-first
db:
image: postgres:latest
networks:
- proxy
environment:
- POSTGRES_DB=skippy
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=password
volumes:
- postgres-data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres -d skippy"]
interval: 10s
timeout: 5s
retries: 5
deploy:
replicas: 1
labels:
- traefik.enable=true
- traefik.tcp.routers.db.rule=HostSNI(`*`)
- traefik.tcp.routers.db.tls=true
- traefik.tcp.routers.db.entryPoints=postgres
- traefik.tcp.routers.db.service=postgres
- traefik.tcp.services.db.loadbalancer.server.port=5432
volumes:
postgres-data:
networks:
proxy:
external: true