You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

111 lines
2.8 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

version: '3.8'
services:
# MySQL 8.0 数据库
mysql:
image: mysql:8.0
container_name: aguzhitou-mysql-dev
environment:
MYSQL_ROOT_PASSWORD: 1qazse42W3
MYSQL_DATABASE: aguzhitou
MYSQL_CHARSET: utf8mb4
MYSQL_COLLATION: utf8mb4_unicode_ci
TZ: Asia/Shanghai
volumes:
- mysql_dev_data:/var/lib/mysql
# 注:移除 init-scripts使用 Prisma db push 创建表结构
ports:
- "3306:3306"
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-p1qazse42W3"]
interval: 10s
timeout: 5s
retries: 5
start_period: 30s
restart: always
networks:
- aguzhitou-dev-network
command: >
--default-authentication-plugin=mysql_native_password
--character-set-server=utf8mb4
--collation-server=utf8mb4_unicode_ci
--innodb_buffer_pool_size=256M
# Redis 7 缓存
redis:
image: redis:7-alpine
container_name: aguzhitou-redis-dev
volumes:
- redis_dev_data:/data
ports:
- "6379:6379"
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 10s
timeout: 5s
retries: 5
restart: always
networks:
- aguzhitou-dev-network
# 后端应用 - 开发模式(热重载)
app:
image: node:20-alpine
container_name: aguzhitou-app-dev
working_dir: /app
environment:
NODE_ENV: development
PORT: 3000
DATABASE_URL: mysql://root:1qazse42W3@mysql:3306/aguzhitou
REDIS_URL: redis://redis:6379
JWT_SECRET: aguzhitou-dev-secret-key-2024-development-only
JWT_EXPIRES_IN: 7d
LOG_LEVEL: debug
ports:
- "3000:3000"
volumes:
# 挂载源代码(关键:实现代码同步)
- ./src:/app/src:ro
- ./prisma:/app/prisma:ro
- ./package.json:/app/package.json:ro
- ./tsconfig.json:/app/tsconfig.json:ro
- ./logs:/app/logs
# 不覆盖 node_modules
- app_dev_node_modules:/app/node_modules
- app_dev_dist:/app/dist
depends_on:
mysql:
condition: service_healthy
redis:
condition: service_healthy
restart: unless-stopped
networks:
- aguzhitou-dev-network
command: >
sh -c "
echo '[Dev] Installing system dependencies...' &&
apk add --no-cache openssl &&
echo '[Dev] Installing dependencies...' &&
npm install &&
npx prisma generate &&
echo '[Dev] Creating database tables...' &&
npx prisma db push --accept-data-loss &&
echo '[Dev] Starting with hot reload...' &&
npx tsx watch src/app.ts
"
# 使用 tsx watch 实现热重载
volumes:
mysql_dev_data:
driver: local
redis_dev_data:
driver: local
app_dev_node_modules:
driver: local
app_dev_dist:
driver: local
networks:
aguzhitou-dev-network:
driver: bridge