services: db_prod: image: postgres:16-alpine container_name: canino_db_prod restart: always environment: POSTGRES_USER: ${POSTGRES_USER:-canino_prod} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} POSTGRES_DB: ${POSTGRES_DB:-caninodb_prod} volumes: - canina_prod_db:/var/lib/postgresql/data networks: - traefik_public redis_prod: image: redis:7-alpine container_name: canino_redis_prod command: > sh -c 'if [ -n "$$REDIS_PASSWORD" ]; then exec redis-server --requirepass "$$REDIS_PASSWORD"; else exec redis-server; fi' environment: - REDIS_PASSWORD=${REDIS_PASSWORD:-} restart: always networks: - traefik_public backend_prod: build: context: ./backend dockerfile: Dockerfile container_name: canino_backend_prod restart: always dns: - 217.218.127.127 - 217.218.155.155 environment: - DATABASE_URL=postgresql://${POSTGRES_USER:-canino_prod}:${POSTGRES_PASSWORD}@db_prod:5432/${POSTGRES_DB:-caninodb_prod}?schema=public - REDIS_HOST=redis_prod - REDIS_PORT=6379 - REDIS_PASSWORD=${REDIS_PASSWORD:-} - JWT_ACCESS_SECRET=${JWT_ACCESS_SECRET} - JWT_REFRESH_SECRET=${JWT_REFRESH_SECRET} - ADMIN_EMAIL=${ADMIN_EMAIL:-admin@canina.ir} - ADMIN_PASSWORD=${ADMIN_PASSWORD} - PORT=3000 volumes: - canina_prod_uploads:/app/uploads labels: - "traefik.enable=true" - "traefik.http.routers.canina-api-prod.rule=Host(`api.canina.ir`) || Host(`apicanina.parsaaghayi.ir`)" - "traefik.http.routers.canina-api-prod.entrypoints=websecure" - "traefik.http.routers.canina-api-prod.tls=true" - "traefik.http.services.canina-api-prod.loadbalancer.server.port=3000" depends_on: - db_prod - redis_prod networks: - traefik_public frontend_prod: build: context: . dockerfile: Dockerfile container_name: canino_frontend_prod restart: always dns: - 217.218.127.127 - 217.218.155.155 environment: - NEXT_PUBLIC_API_URL=http://backend_prod:3000 labels: - "traefik.enable=true" - "traefik.http.routers.canina-prod.rule=Host(`canina.ir`) || Host(`www.canina.ir`) || Host(`admin.canina.ir`)" - "traefik.http.routers.canina-prod.entrypoints=websecure" - "traefik.http.routers.canina-prod.tls=true" - "traefik.http.services.canina-prod.loadbalancer.server.port=8080" depends_on: - backend_prod networks: - traefik_public networks: traefik_public: external: true volumes: canina_prod_db: canina_prod_uploads: