168 lines
5.7 KiB
YAML
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
|