diff --git a/.spec/specs/2026-10-24_add-blog-infra/tasks.md b/.spec/specs/2026-10-24_add-blog-infra/tasks.md index 33456bf..b0ddda9 100644 --- a/.spec/specs/2026-10-24_add-blog-infra/tasks.md +++ b/.spec/specs/2026-10-24_add-blog-infra/tasks.md @@ -24,7 +24,7 @@ - boundary: 新建 `~/docker_apps/gitea/`(compose+数据卷);容器仅绑 127.0.0.1:13020;初始化管理员与 blog 空仓;nginx conf 草稿与 app.ini 上传限制调整(MAX_FILES=20)写进 `infra/gitea/`(仓库内);不安装任何 nginx 配置、不 reload、不碰 DNS - verify: `curl -sf http://127.0.0.1:13020/api/v1/version && docker inspect -f {{.State.Status}} gitea | grep -q running` -- [ ] T4 Artalk 部署(容器 13030,nginx conf 草稿不安装) +- [x] T4 Artalk 部署(容器 13030,nginx conf 草稿不安装) - claim: op-artalk 2026-10-24 - boundary: 新建 `~/docker_apps/artalk/`(compose+sqlite 卷);容器仅绑 127.0.0.1:13030;站点配置含 wait4x.online;nginx conf 草稿(主域 /artalk location)写进 `infra/artalk/`(仓库内);不安装任何 nginx 配置、不 reload、不碰 DNS - verify: `curl -sf http://127.0.0.1:13030/api && docker inspect -f {{.State.Status}} artalk | grep -q running` diff --git a/infra/artalk/README.md b/infra/artalk/README.md new file mode 100644 index 0000000..552ad47 --- /dev/null +++ b/infra/artalk/README.md @@ -0,0 +1,36 @@ +# Artalk 评论系统 + +部署实例:`~/docker_apps/artalk/`(compose + 数据),本目录为入库交付件(配置模板,`app_key` 以占位符入库,真身在实例目录)。 + +## 管理入口 + +- 控制中心(Dashboard):评论框右下角齿轮,或直访 `https://wait4x.online/artalk/sidebar/`(需 nginx 片段合并生效后可用) +- 管理员:`wait4xx` / `admin@wait4x.online` +- **初始密码**:见实例目录 `~/docker_apps/artalk/data/INITIAL-CREDENTIALS.txt`(0600,不入库——本仓库将公开,凭据不进 git 历史);首次登录后立即修改并删除该文件 + +## 命令速查(在 `~/docker_apps/artalk/` 下执行) + +```bash +docker compose up -d # 启动 +docker compose logs -f artalk # 跟日志 +docker compose pull && docker compose up -d # 升级(改 compose 中 image tag 后) +docker compose exec artalk artalk admin # 创建/修改管理员(非交互:--name --email --password) +curl -sf http://127.0.0.1:13030/api/v2/conf # 健康自查,返回 JSON 即存活 +``` + +## 数据与备份 + +- sqlite 库:`~/docker_apps/artalk/data/artalk.db`(容器以 root 写入,宿主备份需 sudo 或 `docker cp artalk:/data/artalk.db ./`) +- 日志:`~/docker_apps/artalk/data/artalk.log`(JSON 行格式) +- 备份只需拷贝整个 `data/` 目录,停容器后拷贝保证一致性 + +## 接入 + +- nginx 片段:`nginx-artalk.conf`(合并进 wait4x.online vhost,见文件头注释;容器仅绑 127.0.0.1:13030) +- 博客前端:`Artalk.init({ el: '#Comments', server: 'https://wait4x.online/artalk', site: 'wait4x.online', pageKey: <文章相对路径> })` + +## 已知事项 + +- 启动日志有 `Email Sender initialize failed` ERROR:邮件通知未配置(`email` 段默认关闭)所致,不影响评论功能;将来需要邮件通知时补 `email` 配置段即可消除 +- 镜像名 `artalk/artalk-go` 带历史后缀 `-go`,是官方现用镜像名(官方文档与 Dockerfile 均为此名),勿"纠正"成 `artalk/artalk` +- 固定 tag `2.10.0`(2026-07-24 构建,当前最新稳定版),升级前先看上游 CHANGELOG 是否有 sqlite schema 迁移,并先备份 `data/` diff --git a/infra/artalk/artalk.yml b/infra/artalk/artalk.yml new file mode 100644 index 0000000..af79a59 --- /dev/null +++ b/infra/artalk/artalk.yml @@ -0,0 +1,34 @@ +# Artalk 配置模板(与官方镜像 -w / -c /data/artalk.yml 启动方式配套,数据路径须为 /data 绝对路径) +# 部署实例真身:~/docker_apps/artalk/data/artalk.yml(app_key 已生成,勿将真实密钥提交入库) + +host: "0.0.0.0" +port: 23366 + +# 会话与内容加密密钥,部署时用 `openssl rand -hex 24` 生成;泄漏须更换 +app_key: "" + +debug: false +locale: zh-CN +timezone: Asia/Shanghai + +# 站点名与站点地址同填域名,前端 Artalk.init({ site: 'wait4x.online' }) +site_default: wait4x.online +site_url: https://wait4x.online + +db: + type: sqlite + file: /data/artalk.db + +http: + # 经 nginx 反代后从 X-Forwarded-For 取访客真实 IP + proxy_header: X-Forwarded-For + +log: + enabled: true + filename: /data/artalk.log + +# 前端页面域名(CORS 白名单;site_url 会自动加入) +trusted_domains: + - https://wait4x.online + +admin_users: [] diff --git a/infra/artalk/docker-compose.yml b/infra/artalk/docker-compose.yml new file mode 100644 index 0000000..e952089 --- /dev/null +++ b/infra/artalk/docker-compose.yml @@ -0,0 +1,14 @@ +services: + artalk: + image: artalk/artalk-go:2.10.0 + container_name: artalk + restart: unless-stopped + # 仅回环暴露,公网访问必须经 nginx 反代(见 nginx-artalk.conf) + ports: + - "127.0.0.1:13030:23366" + volumes: + # 配置与 sqlite 同卷:官方 entrypoint 自动检测 /data/artalk.yml 并以 -c 启动 + - ./data:/data + - /etc/localtime:/etc/localtime:ro + environment: + - TZ=Asia/Shanghai diff --git a/infra/artalk/nginx-artalk.conf b/infra/artalk/nginx-artalk.conf new file mode 100644 index 0000000..c727f5a --- /dev/null +++ b/infra/artalk/nginx-artalk.conf @@ -0,0 +1,18 @@ +# Artalk 反代 location 片段 —— 由 orchestrator 合并进 wait4x.online vhost 的 server{} 内,勿直接启用 +# 后端仅绑回环 127.0.0.1:13030(docker-compose.yml 端口映射) +# Artalk 官方无子路径(base path)模式:靠 proxy_pass 尾斜杠剥掉 /artalk 前缀; +# 前端 Artalk.init({ server: 'https://wait4x.online/artalk' }),API 与内嵌资源(/dist /sidebar)随之可达 +# 合并后需实测侧边栏控制中心内页跳转,若存在绝对路径引用会 404,届时改用子域名方案 + +location = /artalk { return 301 /artalk/; } + +location /artalk/ { + proxy_pass http://127.0.0.1:13030/; + proxy_redirect off; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + # 覆盖 vhost 默认 body 上限,覆盖评论图片上传场景 + client_max_body_size 20m; +}