Sk1-exam/docker-compose.yml
Gigi Saji 260b60622f Initial commit: Expense Tracker on Oracle Cloud (sk1 exam)
Public-cloud deployment of a single-user expense tracker:
- 4-container stack: Caddy (HTTPS via Let's Encrypt), nginx (React/Vite SPA), Express API, Postgres 16
- Repeatable deployment via prepare-app.sh using only OCI CLI (no web console)
- Persistent Postgres volume, auto-restart policies, healthchecks, backup + restore scripts
- DuckDNS dynamic DNS for the public hostname; secrets isolated to gitignored .env

Author: Gigi Saji
Live URL: https://savesave.duckdns.org
2026-05-14 12:53:45 +05:30

90 lines
1.9 KiB
YAML

name: sk1
services:
db:
image: postgres:16-alpine
container_name: sk1-db
restart: unless-stopped
environment:
POSTGRES_USER: ${POSTGRES_USER}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
POSTGRES_DB: ${POSTGRES_DB}
volumes:
- postgres_data:/var/lib/postgresql/data
- ./backend/db/init.sql:/docker-entrypoint-initdb.d/init.sql:ro
networks:
- appnet
healthcheck:
test: ["CMD-SHELL", "pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB}"]
interval: 10s
timeout: 5s
retries: 10
backend:
build:
context: ./backend
dockerfile: Dockerfile
image: sk1-backend:latest
container_name: sk1-backend
restart: unless-stopped
environment:
PORT: "3000"
POSTGRES_HOST: db
POSTGRES_PORT: "5432"
POSTGRES_USER: ${POSTGRES_USER}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
POSTGRES_DB: ${POSTGRES_DB}
depends_on:
db:
condition: service_healthy
networks:
- appnet
healthcheck:
test: ["CMD-SHELL", "wget -qO- http://localhost:3000/health || exit 1"]
interval: 15s
timeout: 5s
retries: 5
start_period: 10s
frontend:
build:
context: ./frontend
dockerfile: Dockerfile
image: sk1-frontend:latest
container_name: sk1-frontend
restart: unless-stopped
networks:
- appnet
depends_on:
- backend
caddy:
image: caddy:2-alpine
container_name: sk1-caddy
restart: unless-stopped
ports:
- "80:80"
- "443:443"
environment:
DUCKDNS_DOMAIN: ${DUCKDNS_DOMAIN}
LE_EMAIL: ${LE_EMAIL}
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile:ro
- caddy_data:/data
- caddy_config:/config
- ./logs/caddy:/var/log/caddy
networks:
- appnet
depends_on:
- frontend
- backend
networks:
appnet:
driver: bridge
volumes:
postgres_data:
caddy_data:
caddy_config: