personal-homepage/docs/docker-deploy.md

201 lines
3.9 KiB
Markdown
Raw Permalink 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 部署说明
当前提供的是最小可用静态部署方案:
- 构建阶段:在 Docker build 中执行 `npm run rebuild`
- 运行阶段:使用 Nginx 提供 `dist/` 静态文件
## 文件
- `Dockerfile`
- `docker-compose.yml`
- `docker/nginx/default.conf`
## 使用方式
### 1. 准备环境变量
确保仓库根目录有可用的 `.env`,或在执行 `docker compose` 前导出这些变量:
- `PUBLIC_SITE_URL`
- `PUBLIC_GITEA_URL`
- `PUBLIC_GITHUB_URL`
- `PUBLIC_BLOG_URL`
- `PUBLIC_GITEA_USERNAME`
- `GITEA_BASE_URL`
- `GITEA_TOKEN`
- `GITEA_USERNAME`
- `SEAFILE_BASE_URL`
- `SEAFILE_TOKEN`
可选:
- `STRICT_SYNC`
- `HOMEPAGE_PORT`
- 其余同步调优参数
`docker-compose.yml` 会把这些值作为 **build args** 传给 Dockerfile用于构建时同步和静态生成。
### 环境变量是怎么注入的
当前链路是:
```text
宿主机环境变量 / 项目根目录 .env
-> docker compose 读取变量
-> docker-compose.yml 的 build.args
-> Dockerfile 的 ARG
-> Dockerfile 的 ENV
-> npm run rebuild
```
也就是说,`docker-compose.yml` 自己并不保存真实值,它只是引用变量,例如:
```yaml
args:
GITEA_BASE_URL: ${GITEA_BASE_URL:-}
```
含义是:
- 如果宿主机环境或 `.env` 里有 `GITEA_BASE_URL`,就把它传进去
- 如果没有,就用空字符串
然后 `Dockerfile` 再接住:
```dockerfile
ARG GITEA_BASE_URL=""
ENV GITEA_BASE_URL="${GITEA_BASE_URL}"
```
这样 `npm run rebuild` 在镜像构建阶段就能读取到这些变量。
### `.env` 和 compose 的关系
当前项目里,同一个 `.env` 同时服务两条路径:
1. **本地直接执行**
```bash
npm run rebuild
```
Node 通过:
```bash
--env-file-if-exists=.env
```
读取 `.env`
2. **Docker Compose 构建**
```bash
docker compose up -d --build
```
Compose 会自动读取项目根目录 `.env`,并将变量传给 `build.args`
所以可以把 `.env` 理解成:
- 本地脚本运行配置
- Docker 构建时同步配置
共用的一份构建环境变量文件。
### 为什么用 build args 而不是运行时环境变量
因为这个项目的 Gitea / Seafile token 只在**构建阶段**需要:
- 构建时同步远端数据
- 构建时生成静态页面
最终运行时容器只是 Nginx 提供 `dist/`,不再访问 Gitea / Seafile也不需要 token。
### 修改环境变量后要怎么生效
因为变量是注入到 **构建阶段** 的,所以修改 `.env` 后需要重新 build
```bash
docker compose up -d --build
```
如果只执行:
```bash
docker compose restart
```
不会重新同步,也不会重新生成静态产物。
### 2. 构建并启动
```bash
docker compose up -d --build
```
默认会把站点暴露到:
```text
http://localhost:8080
```
如需修改端口:
```bash
HOMEPAGE_PORT=80 docker compose up -d --build
```
### 3. 查看日志
```bash
docker compose logs -f homepage
```
### 4. 停止
```bash
docker compose down
```
## 部署方式说明
当前 compose 方案是:
1. 构建镜像时执行 `npm run rebuild`
2. 生成 `dist/`
3.`dist/` 拷贝进 Nginx 容器
4. 运行时只提供静态文件服务
这意味着:
- 运行中的容器不需要 Gitea / Seafile token
- token 只在镜像构建阶段使用
- 每次内容更新后,需要重新 build 镜像
## 与 AstrBot 的配合方式
如果后续由 AstrBot 触发重建,推荐:
1. AstrBot 在服务器上拉最新代码
2. AstrBot 执行 `docker compose up -d --build`
3. AstrBot 根据命令结果发送成功 / 失败通知
如果你想让 AstrBot 先单独判断同步 / 构建错误码,再决定是否部署,也可以先执行:
```bash
npm run rebuild
```
通过后再执行:
```bash
docker compose up -d --build
```
## 当前限制
- compose 里还没有反向代理、HTTPS、域名配置
- 还没有单独拆“构建容器”和“运行容器”的外部流水线
- 还没有持久化部署产物或零停机切换策略