Files
vscode-workbench/docker-compose.yml

205 lines
6.1 KiB
YAML
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# ============================================================
# 可乐平台 异步化架构 · Docker Compose 编排
# ------------------------------------------------------------
# 架构总览(生产形态):
# [浏览器] --8080--> [Nginx 前端容器]
# ├─ / → React SPA 静态资源 (build 产物,动静分离)
# ├─ /api 等前缀 → 反向代理 → Granian(Django+ADRF) :8000
# └─ /ws/ → 反向代理 → Granian(Channels WS) :8000
# 数据层: PostgreSQL 16 (psycopg3 全链路异步 ORM) + Redis 7 (缓存/Session/Celery)
# 开发形态: Vite HMR 开发服务器 :5173,API 走 vite proxy → :8000
# ============================================================
x-backend-env: &backend-env
DJANGO_SECRET_KEY: ${DJANGO_SECRET_KEY:?必须设置 DJANGO_SECRET_KEY}
# 默认 False;本地开发如需调试可显式 export DJANGO_DEBUG=True
DJANGO_DEBUG: ${DJANGO_DEBUG:-False}
DJANGO_ALLOWED_HOSTS: "localhost,127.0.0.1,backend,nginx,host.docker.internal,192.168.5.7"
CORS_ALLOWED_ORIGINS: "http://localhost:8080,http://127.0.0.1:8080,http://localhost:5173,http://127.0.0.1:5173,http://192.168.5.7:18080"
# --- PostgreSQL(异步 ORM 必备)---
DB_ENGINE: "django.db.backends.postgresql"
DB_NAME: "chunyu"
DB_USER: "chunyu"
DB_PASSWORD: "${POSTGRES_PASSWORD:?必须设置 POSTGRES_PASSWORD}"
DB_HOST: "postgres"
DB_PORT: "5432"
# --- Redis ---
REDIS_HOST: "redis"
REDIS_PORT: "6379"
REDIS_PASSWORD: "${REDIS_PASSWORD:?必须设置 REDIS_PASSWORD}"
services:
# ============================================
# PostgreSQL 16 —— 全链路异步 ORM 的数据层
# ============================================
postgres:
image: postgres:16-alpine
container_name: chunyu-postgres
environment:
POSTGRES_DB: chunyu
POSTGRES_USER: chunyu
POSTGRES_PASSWORD: "${POSTGRES_PASSWORD:?必须设置 POSTGRES_PASSWORD}"
TZ: Asia/Shanghai
ports:
- "127.0.0.1:5432:5432"
volumes:
- postgres_data:/var/lib/postgresql/data
networks:
- chunyu-net
restart: unless-stopped
healthcheck:
test: ["CMD-SHELL", "pg_isready -U chunyu -d chunyu"]
interval: 5s
timeout: 5s
retries: 10
# ============================================
# Redis 7 —— 缓存 / Session / Celery broker / Channels layer
# ============================================
redis:
image: redis:7-alpine
container_name: chunyu-redis
command: >
redis-server
--requirepass ${REDIS_PASSWORD:?必须设置 REDIS_PASSWORD}
--maxmemory 256mb
--maxmemory-policy allkeys-lru
--appendonly yes
ports:
- "127.0.0.1:6379:6379"
volumes:
- redis_data:/data
networks:
- chunyu-net
restart: unless-stopped
healthcheck:
test: ["CMD-SHELL", "redis-cli -a $$REDIS_PASSWORD ping | grep PONG"]
interval: 5s
timeout: 5s
retries: 10
environment:
REDIS_PASSWORD: ${REDIS_PASSWORD:?必须设置 REDIS_PASSWORD}
# ============================================
# Django Backend —— Granian(Rust) + ADRF 异步视图 + 异步 ORM
# ============================================
backend:
build:
context: ./chunyu_project
dockerfile: Dockerfile
container_name: chunyu-backend
environment:
<<: *backend-env
ports:
- "8000:8000"
volumes:
- backend_media:/app/media
depends_on:
postgres:
condition: service_healthy
redis:
condition: service_healthy
networks:
- chunyu-net
restart: unless-stopped
healthcheck:
test: ["CMD", "python", "-c", "import urllib.request; urllib.request.urlopen('http://localhost:8000/', timeout=5)"]
interval: 15s
timeout: 10s
retries: 8
start_period: 120s
# ============================================
# React Frontend —— Nginx 托管 SPA 静态产物 + API 反代
# ============================================
frontend:
build:
context: ./chunyu_project_react
dockerfile: Dockerfile
container_name: chunyu-frontend
ports:
- "8080:80"
volumes:
- ./nginx-docker.conf:/etc/nginx/conf.d/default.conf:ro
depends_on:
backend:
condition: service_healthy
networks:
chunyu-net:
aliases:
- nginx
restart: unless-stopped
# ============================================
# Android Emulator (Redroid) —— 仅本地开发需要,profiles: android
# ============================================
android:
image: redroid/redroid:14.0.0-latest
container_name: chunyu-android
privileged: true
profiles:
- android
ports:
- "5555:5555"
- "5556:5556"
volumes:
- android_data:/data
devices:
- /dev/kvm
shm_size: '4gb'
networks:
- chunyu-net
restart: unless-stopped
healthcheck:
test: ["CMD", "sh", "-c", "echo 'test'"]
interval: 30s
timeout: 10s
retries: 3
# ============================================
# Android Tools (ADB + APK installer) —— 仅本地开发需要,profiles: android
# ============================================
android-tools:
build:
context: ./android
dockerfile: Dockerfile.tools
container_name: chunyu-android-tools
profiles:
- android
depends_on:
- android
volumes:
- ./android/apks:/app/apks:ro
- ./android/scripts:/app/scripts:ro
environment:
- ANDROID_HOST=android
- ANDROID_PORT=5555
- APK_PATH=/app/apks/app-debug.apk
- LAUNCH_ACTIVITY=com.chunyu.app/.MainActivity
networks:
- chunyu-net
restart: "no"
# ============================================
# Volumes
# ============================================
volumes:
postgres_data:
driver: local
redis_data:
driver: local
backend_media:
driver: local
android_data:
driver: local
# ============================================
# Networks
# ============================================
networks:
chunyu-net:
driver: bridge
ipam:
config:
- subnet: 172.28.0.0/16