Repository navigation
Expand file tree
/
Copy pathdocker-compose.yml
More file actions
133 lines (128 loc) · 5.09 KB
/
Copy pathdocker-compose.yml
File metadata and controls
133 lines (128 loc) · 5.09 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
# Fish AI Code 一键部署
# 使用:cp .env.example .env && 编辑 .env 填密钥,然后:
# docker compose up -d --build
# 访问:http://<服务器IP>
#
# 说明:
# - frontend(Nginx) 托管前端并反代 /api 到 backend
# - backend 通过挂载 docker.sock 调用宿主 Docker 运行 Vue 隔离构建
# - mysql 首次启动自动执行 sql/create.sql 初始化
services:
mysql:
image: mysql:8.0
container_name: fish-ai-mysql
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: ${DB_PASSWORD:-123456}
MYSQL_DATABASE: ${DB_NAME:-fish_ai_code}
TZ: Asia/Shanghai
command:
- --character-set-server=utf8mb4
- --collation-server=utf8mb4_unicode_ci
volumes:
- mysql-data:/var/lib/mysql
# 首次启动自动建库建表
- ./sql/create.sql:/docker-entrypoint-initdb.d/01-create.sql:ro
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-p${DB_PASSWORD:-123456}"]
interval: 10s
timeout: 5s
retries: 10
start_period: 30s
redis:
image: redis:7-alpine
container_name: fish-ai-redis
restart: unless-stopped
environment:
REDIS_PASSWORD: ${REDIS_PASSWORD:-}
command:
- /bin/sh
- -c
- |
if [ -n "$$REDIS_PASSWORD" ]; then
exec redis-server --requirepass "$$REDIS_PASSWORD"
fi
exec redis-server
volumes:
- redis-data:/data
healthcheck:
test: ["CMD-SHELL", "if [ -n \"$$REDIS_PASSWORD\" ]; then redis-cli -a \"$$REDIS_PASSWORD\" ping; else redis-cli ping; fi"]
interval: 10s
timeout: 5s
retries: 5
backend:
build:
context: .
dockerfile: docker/backend/Dockerfile
container_name: fish-ai-backend
restart: unless-stopped
depends_on:
mysql:
condition: service_healthy
redis:
condition: service_healthy
environment:
# 数据库 / Redis(服务名即主机名)
DB_HOST: mysql
DB_PORT: "3306"
DB_NAME: ${DB_NAME:-fish_ai_code}
DB_USERNAME: root
DB_PASSWORD: ${DB_PASSWORD:-123456}
REDIS_HOST: redis
REDIS_PORT: "6379"
REDIS_PASSWORD: ${REDIS_PASSWORD:-}
SESSION_COOKIE_SECURE: ${SESSION_COOKIE_SECURE:-false}
# AI 模型(必填:DEEPSEEK_API_KEY)
DEEPSEEK_API_KEY: ${DEEPSEEK_API_KEY:?请设置 DEEPSEEK_API_KEY}
AI_BASE_URL: ${AI_BASE_URL:-https://api.deepseek.com}
AI_CHAT_MODEL: ${AI_CHAT_MODEL:-deepseek-chat}
AI_REASONING_MODEL: ${AI_REASONING_MODEL:-deepseek-reasoner}
AI_STREAM_REQUEST_TIMEOUT: ${AI_STREAM_REQUEST_TIMEOUT:-120s}
# 可选:图片搜索
PEXELS_API_KEY: ${PEXELS_API_KEY:-}
UNDRAW_TOKEN: ${UNDRAW_TOKEN:-}
# Vue 构建镜像名(后端容器内 docker run 使用;对应 vue-build.docker-image)
VUE_BUILD_DOCKER_IMAGE: ${VUE_BUILDER_IMAGE:-fish-ai-code-vue-builder:20}
# Vue 隔离构建的宿主机代码输出根目录(对应 vue-build.host-code-output-dir):
# 后端容器内的 docker CLI 经 docker.sock 把 --mount 交给宿主机 daemon,bind 源
# 按宿主机文件系统解析,src 必须是宿主机绝对路径 → 默认传 ./data/code_output 的
# 宿主路径(可用 .env 的 CODE_OUTPUT_HOST_DIR 覆盖)。
CODE_OUTPUT_HOST_DIR: ${CODE_OUTPUT_HOST_DIR:-${PWD}/data/code_output}
# 部署访问域名与产物路径前缀(frontend 的 nginx 与后端共用同一配置)
APP_DEPLOY_HOST: ${APP_DEPLOY_HOST:-http://localhost}
APP_DEPLOY_PATH: ${APP_DEPLOY_PATH:-/deploy}
# 预览静态资源签名 token 密钥(必填:生产用强随机值,如 openssl rand -base64 32)
PREVIEW_TOKEN_SECRET: ${PREVIEW_TOKEN_SECRET:?请设置 PREVIEW_TOKEN_SECRET}
PREVIEW_ORIGIN: ${PREVIEW_ORIGIN:-}
APP_ORIGIN: ${APP_ORIGIN:-}
CORS_ALLOWED_ORIGINS: ${CORS_ALLOWED_ORIGINS:-}
PREVIEW_CONNECT_SRC: ${PREVIEW_CONNECT_SRC:-'self'}
volumes:
# 挂载宿主 Docker,供后端调用 docker run 做 Vue 隔离构建
- /var/run/docker.sock:/var/run/docker.sock
# 代码生成/部署目录:宿主机 ./data/code_* ↔ 容器 /app/tmp/code_*(后端 user.dir=/app)。
# Vue 构建的 bind 源路径由 CODE_OUTPUT_HOST_DIR 显式传给后端(见 environment),
# 因为 docker.sock 模式下 --mount src 由宿主机 daemon 解析,容器内路径在宿主机不存在。
- ./data/code_output:/app/tmp/code_output
- ./data/code_deploy:/app/tmp/code_deploy
ports:
- "${BACKEND_PORT:-8911}:8911"
frontend:
build:
context: .
dockerfile: docker/frontend/Dockerfile
container_name: fish-ai-frontend
restart: unless-stopped
depends_on:
- backend
environment:
# 部署产物路径前缀,必须与后端 app.deploy.path 一致(默认 /deploy)
APP_DEPLOY_PATH: ${APP_DEPLOY_PATH:-/deploy}
volumes:
# 部署产物目录:后端写入 data/code_deploy,nginx 通过部署路径服务
- ./data/code_deploy:/usr/share/nginx/deploy:ro
ports:
- "${FRONTEND_PORT:-80}:80"
volumes:
mysql-data:
redis-data: