205 lines
6.1 KiB
YAML
205 lines
6.1 KiB
YAML
# ============================================================
|
||
# 可乐平台 异步化架构 · 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
|