version: "3.8" services: postgres: image: "${POSTGRES_IMAGE}" container_name: ciyuan-postgres environment: POSTGRES_USER: "${POSTGRES_USER}" POSTGRES_PASSWORD: "${POSTGRES_PASSWORD}" POSTGRES_DB: "${POSTGRES_DB}" PGDATA: "${POSTGRES_PGDATA}" expose: - "5432" volumes: - pgdata:/var/lib/postgresql/data - ./pg_backup:/backups - ./docker/postgres/init:/docker-entrypoint-initdb.d:ro healthcheck: test: ["CMD-SHELL", "pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB}"] interval: 10s timeout: 5s retries: 10 restart: unless-stopped networks: - ciyuan-net redis: image: "${REDIS_IMAGE}" container_name: ciyuan-redis expose: - "6379" volumes: - redisdata:/data healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 10s timeout: 5s retries: 10 restart: unless-stopped networks: - ciyuan-net minio: image: "${MINIO_IMAGE}" container_name: ciyuan-minio command: server /data --console-address ":9001" environment: MINIO_ROOT_USER: "${MINIO_ROOT_USER}" MINIO_ROOT_PASSWORD: "${MINIO_ROOT_PASSWORD}" expose: - "9000" - "9001" volumes: - miniodata:/data restart: unless-stopped networks: - ciyuan-net server: build: context: ./server args: SERVER_BASE_IMAGE: "${SERVER_BASE_IMAGE}" PIP_INDEX_URL: "${PIP_INDEX_URL}" PIP_TRUSTED_HOST: "${PIP_TRUSTED_HOST}" PIP_DEFAULT_TIMEOUT: "${PIP_DEFAULT_TIMEOUT}" SERVER_INTERNAL_PORT: "${SERVER_INTERNAL_PORT}" container_name: ciyuan-server environment: SERVER_INTERNAL_PORT: "${SERVER_INTERNAL_PORT}" DATABASE_URL: "${DATABASE_URL}" DATABASE_URL_SYNC: "${DATABASE_URL_SYNC}" REDIS_URL: "${REDIS_URL}" SECRET_KEY: "${SECRET_KEY}" ACCESS_TOKEN_EXPIRE_MINUTES: "${ACCESS_TOKEN_EXPIRE_MINUTES}" REFRESH_TOKEN_EXPIRE_DAYS: "${REFRESH_TOKEN_EXPIRE_DAYS}" STORAGE_BACKEND: "${STORAGE_BACKEND}" LOCAL_STORAGE_PATH: "${LOCAL_STORAGE_PATH}" S3_ENDPOINT: "${S3_ENDPOINT}" S3_ACCESS_KEY: "${S3_ACCESS_KEY}" S3_SECRET_KEY: "${S3_SECRET_KEY}" S3_BUCKET: "${S3_BUCKET}" S3_REGION: "${S3_REGION}" S3_PUBLIC_URL: "${S3_PUBLIC_URL}" TENCENT_MAP_KEY: "${TENCENT_MAP_KEY}" SENTRY_DSN: "${SENTRY_DSN}" LOG_LEVEL: "${LOG_LEVEL}" LOG_JSON: "${LOG_JSON}" DEFAULT_ADMIN_ENABLED: "${DEFAULT_ADMIN_ENABLED}" DEFAULT_ADMIN_PHONE: "${DEFAULT_ADMIN_PHONE}" DEFAULT_ADMIN_EMAIL: "${DEFAULT_ADMIN_EMAIL}" DEFAULT_ADMIN_PASSWORD: "${DEFAULT_ADMIN_PASSWORD}" DEFAULT_ADMIN_NICKNAME: "${DEFAULT_ADMIN_NICKNAME}" DEFAULT_ADMIN_SYNC_PASSWORD: "${DEFAULT_ADMIN_SYNC_PASSWORD}" expose: - "${SERVER_INTERNAL_PORT}" volumes: - server_uploads:/app/uploads depends_on: postgres: condition: service_healthy redis: condition: service_healthy minio: condition: service_started healthcheck: test: [ "CMD", "python", "-c", "import urllib.request; urllib.request.urlopen('http://127.0.0.1:${SERVER_INTERNAL_PORT}/', timeout=5)", ] interval: 15s timeout: 10s retries: 10 start_period: 30s restart: unless-stopped networks: - ciyuan-net admin-web: build: context: ./admin-web args: ADMIN_WEB_NODE_IMAGE: "${ADMIN_WEB_NODE_IMAGE}" ADMIN_WEB_NGINX_IMAGE: "${ADMIN_WEB_NGINX_IMAGE}" VITE_API_BASE: "${VITE_API_BASE}" container_name: ciyuan-admin-web environment: ADMIN_WEB_INTERNAL_PORT: "${ADMIN_WEB_INTERNAL_PORT}" SERVER_INTERNAL_PORT: "${SERVER_INTERNAL_PORT}" expose: - "${ADMIN_WEB_INTERNAL_PORT}" depends_on: server: condition: service_healthy restart: unless-stopped networks: - ciyuan-net clients: build: context: ./clients args: CLIENTS_NODE_IMAGE: "${CLIENTS_NODE_IMAGE}" CLIENTS_NGINX_IMAGE: "${CLIENTS_NGINX_IMAGE}" VITE_CLIENT_H5_API_BASE: "${VITE_CLIENT_H5_API_BASE}" VITE_CLIENT_H5_SERVER_ORIGIN: "${VITE_CLIENT_H5_SERVER_ORIGIN}" VITE_CLIENT_NATIVE_API_BASE: "${VITE_CLIENT_NATIVE_API_BASE}" VITE_CLIENT_NATIVE_SERVER_ORIGIN: "${VITE_CLIENT_NATIVE_SERVER_ORIGIN}" container_name: ciyuan-clients environment: CLIENTS_INTERNAL_PORT: "${CLIENTS_INTERNAL_PORT}" SERVER_INTERNAL_PORT: "${SERVER_INTERNAL_PORT}" expose: - "${CLIENTS_INTERNAL_PORT}" depends_on: server: condition: service_healthy restart: unless-stopped networks: - ciyuan-net nginx: image: "${NGINX_IMAGE}" container_name: ciyuan-nginx environment: NGINX_CLIENT_INTERNAL_PORT: "${NGINX_CLIENT_INTERNAL_PORT}" NGINX_ADMIN_INTERNAL_PORT: "${NGINX_ADMIN_INTERNAL_PORT}" CLIENTS_INTERNAL_PORT: "${CLIENTS_INTERNAL_PORT}" ADMIN_WEB_INTERNAL_PORT: "${ADMIN_WEB_INTERNAL_PORT}" ports: - "${CLIENT_WEB_PORT}:${NGINX_CLIENT_INTERNAL_PORT}" - "${ADMIN_WEB_PORT}:${NGINX_ADMIN_INTERNAL_PORT}" volumes: - ./docker/nginx/default.conf:/etc/nginx/templates/default.conf.template:ro depends_on: server: condition: service_healthy admin-web: condition: service_started clients: condition: service_started restart: unless-stopped networks: - ciyuan-net volumes: pgdata: redisdata: miniodata: server_uploads: networks: ciyuan-net: driver: bridge