1
0
forked from erp-dev/erp
Files
erpnew/docs/DEPLOY_DOCKER_COMPOSE.md

149 lines
4.3 KiB
Markdown
Raw 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
本项目已拆分为两套 Compose 文件:
- **开发环境**`docker-compose.dev.yml`(源码挂载到容器,适合本地开发调试)
- **正式发布**`docker-compose.prod.yml`(运行预构建镜像,不挂载源码,适合可分发部署)
> 旧的 `docker-compose.yml` 可视为历史文件;建议后续统一使用 dev/prod 两份文件。
---
## 开发环境如何启动dev
### 1启动
在项目根目录执行:
```bash
docker compose -f docker-compose.dev.yml up -d --build
```
开发环境默认暴露端口:
- Web`http://localhost:8100`
- Postgres`localhost:5432`
- PgAdmin`http://localhost:5050`
- RabbitMQ 管理台:`http://localhost:15672`
### 2初始化数据库首次
```bash
docker compose -f docker-compose.dev.yml exec web uv run python manage.py migrate
docker compose -f docker-compose.dev.yml exec web uv run python manage.py createsuperuser
```
### 3查看日志 / 重启
```bash
docker compose -f docker-compose.dev.yml logs -f web
docker compose -f docker-compose.dev.yml logs -f celery_worker
docker compose -f docker-compose.dev.yml logs -f celery_beat
docker compose -f docker-compose.dev.yml restart web
```
### 4停止 / 清理
```bash
docker compose -f docker-compose.dev.yml down
# 连同数据卷一起删除(会清空数据库等)
docker compose -f docker-compose.dev.yml down -v
```
---
## 正式发布如何部署prod镜像分发
### 1构建发布镜像构建机
Dockerfile 已新增 `runtime` stage 且作为默认最终产物,因此直接构建即可:
```bash
docker build -t flower-app:20251220 .
```
> `docker-compose.prod.yml` 会通过 `FLOWER_IMAGE` 使用这个镜像标签。
### 2导出镜像用于分发
```bash
docker save -o flower-app_20251220.tar flower-app:20251220
```
(可选)压缩:
```bash
gzip -9 flower-app_20251220.tar
```
### 3服务器导入镜像
```bash
docker load -i flower-app_20251220.tar
# 或者 gzip 版本gunzip -c xxx.tar.gz | docker load
```
### 4准备备份目录推荐
生产环境的数据库备份目录建议使用宿主机可见路径,例如:
```bash
mkdir -p /srv/flower/data-bak
```
### 5启动生产环境不使用 .env 文件)
`docker-compose.prod.yml` **不再使用 `env_file: .env`**。你可以用系统环境变量(或 systemd 注入)提供关键配置。
最小示例(请替换为真实值):
```bash
export FLOWER_IMAGE=flower-app:20251220
export SECRET_KEY='请换成强随机值'
export ALLOWED_HOSTS='yuwenerp.yuwen.cloud'
export CSRF_TRUSTED_ORIGINS='https://yuwenerp.yuwen.cloud'
export DEBUG=0
# 备份目录(不设则默认 ./data-bak相对 compose 文件所在目录)
export BACKUP_DIR=/srv/flower/data-bak
docker compose -f docker-compose.prod.yml up -d
```
说明:
- `web`/`celery_worker`/`celery_beat` **共用同一个镜像**,通过不同 `command` 启动(只需打包/分发一次)。
- 生产环境默认 `uvicorn` **workers=1**(与当前 SSE 实现兼容;若未来 SSE 改为 Redis/Channels 再考虑增大)。
- 数据库在生产 compose 中默认只绑定到 `127.0.0.1:5432`,避免对公网暴露。
### 6验证运行
```bash
docker compose -f docker-compose.prod.yml ps
docker compose -f docker-compose.prod.yml logs -f web
```
---
## data-bak备份目录当前是如何处理的
- **开发环境dev**:因为 `.:/app` 源码挂载,容器内 `/app/data-bak` 会直接对应宿主机项目目录的 `./data-bak`,你在宿主机上能直接看到备份文件。
- **生产环境prod**`celery_worker``/app/data-bak` bind mount 到宿主机路径:
- 默认:`./data-bak`(相对 `docker-compose.prod.yml` 所在目录)
- 或者通过 `BACKUP_DIR=/srv/flower/data-bak` 指定绝对路径
---
## Dockerfile 现在该如何理解?
当前 `Dockerfile` 主要有三个阶段:
- `base`:安装依赖并 `COPY . /app`(开发 compose 使用 `target: base`
- `celery`保留作示例目前不强依赖prod compose 直接用同一镜像 + command 覆盖)
- `runtime`:作为默认最终产物,默认 `CMD``uvicorn ...`prod 直接用该镜像)
并且已经添加 `.dockerignore`,确保 `.env``data-bak/` 等不会被打进发布镜像。