diff --git a/docker-compose.prod.yml b/docker-compose.prod.yml new file mode 100644 index 0000000..da632e7 --- /dev/null +++ b/docker-compose.prod.yml @@ -0,0 +1,98 @@ +# docker-compose.prod.yml - Production configuration +version: '3.8' + +services: + backend: + image: photo-sharing-backend:latest + build: + context: ./backend + dockerfile: Dockerfile + restart: unless-stopped + environment: + - NODE_ENV=production + - PORT=3000 + - JWT_SECRET=${JWT_SECRET} + - ADMIN_URL=${ADMIN_URL} + - FRONTEND_URL=${FRONTEND_URL} + - SMTP_HOST=${SMTP_HOST} + - SMTP_PORT=${SMTP_PORT} + - SMTP_SECURE=${SMTP_SECURE} + - SMTP_USER=${SMTP_USER} + - SMTP_PASS=${SMTP_PASS} + - EMAIL_FROM=${EMAIL_FROM} + - UMAMI_URL=${UMAMI_URL} + - UMAMI_WEBSITE_ID=${UMAMI_WEBSITE_ID} + volumes: + - ./storage:/app/storage + - ./data:/app/data + - ./logs:/app/logs + networks: + - photo-sharing + + frontend: + image: photo-sharing-frontend:latest + build: + context: ./frontend + dockerfile: Dockerfile + restart: unless-stopped + depends_on: + - backend + networks: + - photo-sharing + + nginx: + image: nginx:alpine + restart: unless-stopped + ports: + - "80:80" + - "443:443" + volumes: + - ./nginx/nginx.conf:/etc/nginx/nginx.conf + - ./nginx/sites-enabled:/etc/nginx/sites-enabled + - ./certbot/conf:/etc/letsencrypt + - ./certbot/www:/var/www/certbot + depends_on: + - frontend + - backend + networks: + - photo-sharing + command: "/bin/sh -c 'while :; do sleep 6h & wait $${!}; nginx -s reload; done & nginx -g \"daemon off;\"'" + + certbot: + image: certbot/certbot + restart: unless-stopped + volumes: + - ./certbot/conf:/etc/letsencrypt + - ./certbot/www:/var/www/certbot + entrypoint: "/bin/sh -c 'trap exit TERM; while :; do certbot renew; sleep 12h & wait $${!}; done;'" + + db: + image: postgres:14-alpine + restart: unless-stopped + environment: + - POSTGRES_USER=${DB_USER:-photoapp} + - POSTGRES_PASSWORD=${DB_PASSWORD} + - POSTGRES_DB=${DB_NAME:-photo_sharing} + volumes: + - postgres_data:/var/lib/postgresql/data + networks: + - photo-sharing + + umami: + image: ghcr.io/umami-software/umami:postgresql-latest + restart: unless-stopped + environment: + DATABASE_URL: postgresql://${DB_USER:-photoapp}:${DB_PASSWORD}@db:5432/umami + DATABASE_TYPE: postgresql + HASH_SALT: ${UMAMI_HASH_SALT} + depends_on: + - db + networks: + - photo-sharing + +networks: + photo-sharing: + driver: bridge + +volumes: + postgres_data: