diff --git a/compose.yaml b/compose.yaml index ff06bf3..18925b6 100644 --- a/compose.yaml +++ b/compose.yaml @@ -1,26 +1,49 @@ services: app: - image: worthpath:${WORTHPATH_IMAGE_TAG:-local} - build: - context: . - dockerfile: Dockerfile + image: worthpath:local + + # 服务器生产环境配置,包含数据库连接、域名和安全开关 env_file: - - .env.production + - /opt/worthpath/.env.production + environment: ICON_STORAGE_DIR: /app/data/icons + + # 图标持久化目录,宿主机目录需允许 UID/GID 1000 读写 volumes: - type: bind source: /opt/worthpath/data/icons target: /app/data/icons bind: create_host_path: false + + # 容器通过此名称连接宿主机 MySQL + extra_hosts: + - "host.docker.internal:host-gateway" + + # 只供宿主机 Nginx 访问,不向公网直接开放应用端口 ports: - - '127.0.0.1:3100:3100' + - "127.0.0.1:3100:3100" + + networks: + - worthpath + restart: unless-stopped init: true stop_grace_period: 30s + + # 禁止容器进程通过执行程序获得额外权限 + security_opt: + - no-new-privileges:true + logging: driver: json-file options: - max-size: '10m' - max-file: '3' + max-size: "10m" + max-file: "3" + +networks: + worthpath: + # 使用已经创建的网络,Compose 不负责创建或删除它 + external: true + name: worthpath \ No newline at end of file diff --git a/docker.md b/docker.md index 3f15a43..e02fe47 100644 --- a/docker.md +++ b/docker.md @@ -1,5 +1,58 @@ # WorthPath Docker 部署 +``` +# 打包 +docker build -t worthpath:local . +docker save -o E:\worthpath-local.tar worthpath:local +``` + +```shell +# 添加固定网桥 +docker network create \ + --driver bridge \ + --subnet 172.30.50.0/24 \ + --gateway 172.30.50.1 \ + --opt com.docker.network.bridge.name=br-worthpath \ + worthpath + +# MySQL 允许172.30.50.0/255.255.255.0 连接 + +# 更新防火墙 +ip -4 addr show br-worthpath + + +sudo ufw allow in on br-worthpath \ + from 172.30.50.0/24 \ + to 172.17.0.1 port 3306 proto tcp \ + comment 'WorthPath MySQL' + +# 创建图标持久化目录,容器内 node 用户的 UID/GID 为 1000 +sudo install -d -m 750 -o 1000 -g 1000 /opt/worthpath/data/icons + +# 执行数据库迁移 +docker compose run --rm app node scripts/database.cjs deploy + +# 初始化内置图标 +docker compose run --rm app node scripts/seed-icons.cjs + +# 启动应用 +docker compose up -d --no-build app +docker compose ps +docker compose logs --tail=100 app + +# 更新 +# 保留旧镜像,方便回退 +docker tag worthpath:local worthpath:rollback + +# 加载新镜像并重新创建应用容器 +docker load -i worthpath-local.tar +docker compose up -d --no-build --force-recreate app + +# 查看运行状态和日志 +docker compose ps +docker compose logs --since=2m --tail=100 app +``` + ## 更新已部署的项目(尚未上传图片) 图标持久化新增配置不需要数据库结构迁移,也不需要搬运上传图片。保留服务器已有 `.env.production`、MySQL 与反向代理配置;更新镜像和 Compose 的图标挂载即可。历史空库迁移修复也包含在此次更新中,已完成迁移的数据库不用重复初始化或运行图标 seed。 @@ -123,6 +176,14 @@ docker compose version ## 2. 配置生产环境 +针对本次正式部署:网站为 `https://worthpath.chyuovo.top`,MySQL 和 Nginx 均在宿主机,应用在容器内。根目录 `.env.production` 已按此拓扑填写并添加中文注释,数据库和初始管理员密码仍为占位符,必须自行替换。 + +应用容器通过 `host.docker.internal:3306` 访问数据库,Compose 已加入 `host-gateway` 映射。映射不能绕过 MySQL 的监听限制:若 MySQL 只绑定宿主机 `127.0.0.1`,需另外允许 Docker 可达的宿主机私有接口,限制数据库账号来源和防火墙,不开放公网 3306。MySQL 8.0.13+ 支持配置多个具体监听地址;填写前需确认服务器版本和实际接口地址。 + +宿主机 Nginx 上游使用 `http://127.0.0.1:3100`,并保留外部 Host。当前 Compose 的端口只绑定宿主机回环地址,无需共享 Docker 网络,不应改成公网发布 3100。 + +上述数据库监听与 Nginx HTTPS 代理配置尚未在服务器执行或验证;仅写环境文件不会使这些服务器前置条件自动完成。 + 首次部署复制模板;已有配置时不要再次覆盖: ```bash