Files
psp_api/docker-compose.yml
2026-05-19 09:14:30 +03:30

168 lines
5.7 KiB
YAML

version: "3.9"
services:
database:
image: mysql:8.0
platform: ${DOCKER_PLATFORM:-linux/amd64}
container_name: psp_consumer_api_db
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}
MYSQL_DATABASE: ${DATABASE_NAME}
MYSQL_USER: ${DATABASE_USER}
MYSQL_PASSWORD: ${DATABASE_PASSWORD}
ports:
- "${DATABASE_PORT}:3306"
volumes:
- db_data:/var/lib/mysql
healthcheck:
test: "mysqladmin ping -h 127.0.0.1 -u ${DATABASE_USER} -p'${DB_ROOT_PASSWORD}'"
interval: 15s # Shortened interval, as MySQL is starting fast now
timeout: 5s # Shorter timeout
retries: 5 # Keep retries
start_period: 30s # Reduced start_period since MySQL is fast
networks:
- psp_consumer_network
redis:
image: redis:7-alpine
platform: ${DOCKER_PLATFORM:-linux/amd64}
container_name: psp_consumer_api_redis
restart: unless-stopped
command: redis-server --appendonly yes
ports:
- "${REDIS_PORT:-6379}:6379"
volumes:
- redis_data:/data
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 15s
timeout: 5s
retries: 5
networks:
- psp_consumer_network
api:
platform: ${DOCKER_PLATFORM:-linux/amd64}
build:
context: .
dockerfile: Dockerfile
args:
# Pass individual components that prisma generate needs during build
NODE_ENV: ${NODE_ENV:-production}
PORT: ${PORT}
DATABASE_NAME: ${DATABASE_NAME} # From .env
DATABASE_USER: ${DATABASE_USER} # From .env
DATABASE_PASSWORD: ${DATABASE_PASSWORD} # From .env
DATABASE_PORT: ${DATABASE_PORT} # From .env
DATABASE_HOST: ${DATABASE_HOST} # From .env
# Construct the DATABASE_URL and SHADOW_DATABASE_URL for the build context
# Use 'database' as the host, as per docker-compose networking
DATABASE_URL: mysql://${DATABASE_USER}:${DATABASE_PASSWORD}@${DATABASE_HOST}:${DATABASE_PORT}/${DATABASE_NAME}
SHADOW_DATABASE_URL: mysql://${DATABASE_USER}:${DATABASE_PASSWORD}@${DATABASE_HOST}:${DATABASE_PORT}/${DATABASE_NAME}_shadow
JWT_SECRET: ${JWT_SECRET} # From .env
JWT_EXPIRES_IN: ${JWT_EXPIRES_IN} # From .env (ensure consistency with Dockerfile ARG)
OTP_STATIC_CODE: ${OTP_STATIC_CODE} # From .env
container_name: psp_consumer_api
restart: unless-stopped
depends_on:
database:
condition: service_healthy
redis:
condition: service_healthy
environment:
NODE_ENV: ${NODE_ENV:-production}
PORT: ${PORT}
DATABASE_NAME: ${DATABASE_NAME} # From .env
DATABASE_USER: ${DATABASE_USER} # From .env
DATABASE_PASSWORD: ${DATABASE_PASSWORD} # From .env
DATABASE_PORT: ${DATABASE_PORT} # From .env
DATABASE_HOST: ${DATABASE_HOST} # From .env
DATABASE_URL: mysql://${DATABASE_USER}:${DATABASE_PASSWORD}@${DATABASE_HOST}:${DATABASE_PORT}/${DATABASE_NAME}
SHADOW_DATABASE_URL: mysql://${DATABASE_USER}:${DATABASE_PASSWORD}@${DATABASE_HOST}:${DATABASE_PORT}/${DATABASE_NAME}_shadow
JWT_SECRET: ${JWT_SECRET}
JWT_EXPIRES_IN: ${JWT_EXPIRES_IN}
CORS_ORIGINS: ${CORS_ORIGINS:-http://localhost:5000,http://127.0.0.1:5000}
OTP_STATIC_CODE: ${OTP_STATIC_CODE} # From .env
REDIS_HOST: ${REDIS_HOST:-redis}
REDIS_PORT: ${REDIS_PORT:-6379}
REDIS_DB: ${REDIS_DB:-0}
REDIS_PASSWORD: ${REDIS_PASSWORD:-}
ports:
- "${PORT:-5002}:5002"
read_only: true
tmpfs:
- /tmp
security_opt:
- no-new-privileges:true
cap_drop:
- ALL
networks:
- psp_consumer_network
# healthcheck:
# test:
# [
# "CMD",
# "wget",
# "--quiet",
# "--tries=1",
# "--spider",
# "http://localhost:5002/api/v1/health",
# ]
# interval: 30s
# timeout: 10s
# retries: 3
# start_period: 10s
# seed:
# platform: ${DOCKER_PLATFORM:-linux/amd64}
# build:
# context: .
# dockerfile: Dockerfile
# target: build
# args:
# NODE_ENV: ${NODE_ENV:-production}
# PORT: ${PORT}
# DATABASE_NAME: ${DATABASE_NAME}
# DATABASE_USER: ${DATABASE_USER}
# DATABASE_PASSWORD: ${DATABASE_PASSWORD}
# DATABASE_PORT: ${DATABASE_PORT}
# DATABASE_HOST: ${DATABASE_HOST}
# DATABASE_URL: mysql://${DATABASE_USER}:${DATABASE_PASSWORD}@${DATABASE_HOST}:${DATABASE_PORT}/${DATABASE_NAME}
# SHADOW_DATABASE_URL: mysql://${DATABASE_USER}:${DATABASE_PASSWORD}@${DATABASE_HOST}:${DATABASE_PORT}/${DATABASE_NAME}_shadow
# JWT_SECRET: ${JWT_SECRET}
# JWT_EXPIRES_IN: ${JWT_EXPIRES_IN}
# OTP_STATIC_CODE: ${OTP_STATIC_CODE}
# depends_on:
# database:
# condition: service_healthy
# environment:
# NODE_ENV: ${NODE_ENV:-production}
# PORT: ${PORT}
# DATABASE_NAME: ${DATABASE_NAME}
# DATABASE_USER: ${DATABASE_USER}
# DATABASE_PASSWORD: ${DATABASE_PASSWORD}
# DATABASE_PORT: ${DATABASE_PORT}
# DATABASE_HOST: ${DATABASE_HOST}
# DATABASE_URL: mysql://${DATABASE_USER}:${DATABASE_PASSWORD}@${DATABASE_HOST}:${DATABASE_PORT}/${DATABASE_NAME}
# SHADOW_DATABASE_URL: mysql://${DATABASE_USER}:${DATABASE_PASSWORD}@${DATABASE_HOST}:${DATABASE_PORT}/${DATABASE_NAME}_shadow
# JWT_SECRET: ${JWT_SECRET}
# JWT_EXPIRES_IN: ${JWT_EXPIRES_IN}
# OTP_STATIC_CODE: ${OTP_STATIC_CODE}
# networks:
# - psp_consumer_network
# profiles:
# - tools
# command: ["pnpm", "seed:sku"]
volumes:
db_data:
driver: local
redis_data:
driver: local
networks:
psp_consumer_network:
driver: bridge