feat(edit): AI套图生成、图片切七牛
This commit is contained in:
@@ -2,7 +2,7 @@
|
||||
|
||||
> 文档日期:2026-09-30。操作示例:腾讯云 Linux 服务器、Ubuntu 24.04、DNSPod 中国站、七牛 Kodo 私有空间与 CDN 加速域名、Let's Encrypt、acme.sh 3.1.6。
|
||||
>
|
||||
> 状态:操作手册;文档中的服务器安装、DNS 修改、证书申请和七牛部署尚未在你的账号执行。操作系统、DNS 托管商和实际域名需要按现场情况替换。本次仅更新操作文档,不变更应用代码、存储配置或已有素材。
|
||||
> 状态:2026-10-03 已完成 Let's Encrypt staging 与正式证书签发,正式证书的颁发者、有效期和 SAN 已由维护者提供的 OpenSSL 输出确认;七牛 hook 对两个图片域名返回部署成功,两个图片域名的网络检查均返回本次正式证书的颁发者、有效期,且指纹一致。服务器使用 1Panel/OpenResty,Atlas 生产、开发应用尚未部署。定时自动续期仍待验收;网站 HTTPS 接入留待应用部署时完成。现场进度见第 6.2 节、第 7 节、第 8.2 节、第 9.2 节和第 10.2 节。操作系统、DNS 托管商和实际域名需要按现场情况核对。
|
||||
|
||||
## 1. 要完成的事情
|
||||
|
||||
@@ -338,6 +338,14 @@ install -d -m 700 /var/lib/atlas-cert/acme-staging
|
||||
|
||||
RSA 2048 用作兼容性示例,避免后续文件目录和 `--ecc` 参数混用。acme.sh 会创建临时 TXT、等待 DNS 验证并清理;首次可能需几分钟。成功后在 DNSPod 检查本次 TXT 已清理,且两个图片 CNAME 保持正确。
|
||||
|
||||
### 2026-10-03 现场执行记录
|
||||
|
||||
- 服务器上的 `atlas-cert` 账号运行上述 staging `--issue` 命令,于北京时间 2026-10-03 11:02:09 收到证书文件路径及续期窗口输出;这确认测试环境签发已完成,不能视为正式证书或七牛部署验收。
|
||||
- 测试证书位于 `/var/lib/atlas-cert/acme-staging/atlas.joeyone.cn/`:叶证书 `atlas.joeyone.cn.cer`、私钥 `atlas.joeyone.cn.key`、中间证书 `ca.cer`、完整证书链 `fullchain.cer`。这里只记录路径,不记录证书或私钥内容。
|
||||
- 本次 staging 输出的 ARI 建议窗口为 `2026-12-01T04:47:36Z`~`2026-12-02T23:58:26Z`,所选下次续期时间为 `2026-12-01T20:38:56Z`;这些是**测试证书**的输出,不能用作正式证书续期日程。
|
||||
- DNSPod 自动验证已使签发完成;临时 TXT 是否清理、两个图片域名 CNAME 是否保持正确仍需在 DNSPod 复核。随后按第 7 节申请正式证书,并用 `openssl` 检查正式证书的 SAN 和有效期。
|
||||
- 正式签发和部署前,确认此前截图中暴露的腾讯云及七牛凭据均已停用、更换,并核对 `secrets.env` 与 acme.sh 缓存中的凭据。不要在项目文档或排错日志中保存真实密钥。
|
||||
|
||||
如果有 CAA 记录,确保它允许 Let's Encrypt 的 `letsencrypt.org` 签发;不要为排错直接删除业务已有 CAA。DNS-01 验证原理参见[Let's Encrypt 官方说明](https://letsencrypt.org/docs/challenge-types/)。
|
||||
|
||||
## 7. 申请正式证书
|
||||
@@ -369,6 +377,21 @@ openssl x509 \
|
||||
|
||||
证书私钥仅用于证书部署,不是七牛 SK,也不是 Ozon 店铺 API Key。
|
||||
|
||||
### 2026-10-03 正式签发记录
|
||||
|
||||
维护者在北京时间 2026-10-03 11:08:13 收到正式证书签发成功输出,证书目录为 `/var/lib/atlas-cert/.acme.sh/atlas.joeyone.cn/`。随后运行本节的 OpenSSL 检查,结果如下;尚未据此确认七牛或网站已使用新证书。
|
||||
|
||||
| 项目 | 本次结果 |
|
||||
|---|---|
|
||||
| 颁发者 | `C = US, O = Let's Encrypt, CN = YR2` |
|
||||
| SAN | `*.atlas.joeyone.cn`、`atlas.joeyone.cn` |
|
||||
| 生效时间 | UTC `2026-10-03 02:09:40`;北京时间 `2026-10-03 10:09:40` |
|
||||
| 到期时间 | UTC `2027-01-01 02:09:39`;北京时间 `2027-01-01 10:09:39` |
|
||||
| ARI 建议窗口 | UTC `2026-12-01 04:53:44`~`2026-12-03 00:04:34` |
|
||||
| acme.sh 所选下次续期时间 | UTC `2026-12-01 20:51:08`;北京时间 `2026-12-02 04:51:08` |
|
||||
|
||||
ARI 时间是客户端本次选择的续期时间,实际自动执行仍依赖第 9 节的定时任务。下一步为第 8.1 节首次上传和启用七牛 HTTPS。
|
||||
|
||||
## 8. 首次开启七牛 HTTPS 并配置自动部署
|
||||
|
||||
### 8.1 首次开启 HTTPS
|
||||
@@ -381,6 +404,13 @@ openssl x509 \
|
||||
4. 如需 HTTP 强制跳转 HTTPS,保持与 `QINIU_FORCE_HTTPS='true'` 一致。
|
||||
5. 等待控制台显示部署完成,检查两个域名的证书;临时下载到本机的私钥按秘密文件管理,传递结束后清理临时副本。
|
||||
|
||||
取回文件时可复用已有管理员 SSH 连接的 SFTP 文件面板。本次服务器使用已有的 `root` 管理连接访问证书目录;终端内的 `sudo -iu atlas-cert` 不会改变文件面板的登录身份。不要为下载文件给维护账号新增 SSH 密码或放宽证书目录权限。
|
||||
|
||||
1. 打开客户端的服务器文件面板,将远端路径设为 `/var/lib/atlas-cert/.acme.sh/atlas.joeyone.cn/`。`.acme.sh` 是隐藏目录,优先直接输入完整路径,或启用“显示隐藏文件”。
|
||||
2. 只下载 `fullchain.cer` 和 `atlas.joeyone.cn.key` 到本机专用临时目录,保留服务器上的原文件。不要下载整个 `.acme.sh`,其中包含账户与 DNS/API 凭据。
|
||||
3. 在七牛上传这两个文件;若页面要求填写 PEM 文本,在本机文本编辑器打开对应文件,完整复制各自的 BEGIN/END 区块。私钥不发送到聊天、项目仓库或公共日志。
|
||||
4. 两个域名证书验收完成后,清理本机临时副本;服务器原文件继续供后续自动续期与部署使用。
|
||||
|
||||
如果两个域名原本就已开启 HTTPS,先上传并切换到新证书即可。不要先删除旧证书。
|
||||
|
||||
### 8.2 执行一次自动部署
|
||||
@@ -398,6 +428,8 @@ set +a
|
||||
|
||||
该步骤会上传证书,并逐一更新 `QINIU_CDN_DOMAIN` 中的两个域名,同时保存部署 hook 供续期时调用。确认输出包含两个域名的部署成功记录,并在七牛控制台复核。首次手工上传和 hook 上传可能留下两条证书记录,这是正常的;验收后按引用情况清理旧条目。
|
||||
|
||||
2026-10-03 现场记录:维护者以 `atlas-cert` 执行上述部署命令,于北京时间 11:26:12 收到 `img.atlas.joeyone.cn` 和 `img-dev.atlas.joeyone.cn` 各自的 `certificate has been deployed successfully`,最终输出 `Success`。随后两个图片域名的网络证书检查结果已记录于第 10.2 节;自动续期执行仍需完成第 9 节的 systemd timer。日志中的 `updating domain atlas.joeyone.cn` 使用证书主域名标识本次证书,不能据此判断网站 Nginx 已更新。
|
||||
|
||||
参考:[acme.sh 七牛部署实现](https://github.com/acmesh-official/acme.sh/blob/3.1.6/deploy/qiniu.sh)、[七牛证书管理与部署 FAQ](https://developer.qiniu.com/fusion/3905/ssl-certificate-faq)。
|
||||
|
||||
收紧本地文件权限:
|
||||
@@ -425,6 +457,13 @@ chmod 600 /var/lib/atlas-cert/nginx-export/privkey.pem \
|
||||
|
||||
`--install-cert` 会保存导出路径,续期时自动更新这两个文件。Nginx 不直接引用 acme.sh 内部文件;本流程由第 9.2 节的 root 管理脚本复制到 `/etc/nginx/tls/atlas/current/`、执行 `nginx -t` 并重载,因此这里没有设置 `--reloadcmd`。必须完成第 9 节,只有导出证书不能让 Nginx 使用新证书。[acme.sh 证书安装说明](https://github.com/acmesh-official/acme.sh#3-install-the-cert-to-apachenginx-etc)
|
||||
|
||||
2026-10-03 现场记录:北京时间 11:27:26,维护者收到两项 `Installing` 输出,证书已导出到以下路径;Nginx 接入仍需完成第 9.2 节。
|
||||
|
||||
| 文件用途 | 实际导出路径 |
|
||||
|---|---|
|
||||
| 证书私钥 | `/var/lib/atlas-cert/nginx-export/privkey.pem` |
|
||||
| 完整证书链 | `/var/lib/atlas-cert/nginx-export/fullchain.pem` |
|
||||
|
||||
维护账号不获得通用 sudo 权限。证书申请和七牛 API 调用以 `atlas-cert` 执行;复制到系统证书目录与 Nginx 重载由 systemd 的 root 步骤完成。root 脚本不加载 `secrets.env`,只读取固定路径的证书文件。
|
||||
|
||||
## 9. 配置 systemd 定时续期
|
||||
@@ -463,7 +502,43 @@ exit
|
||||
|
||||
### 9.2 创建 Nginx 部署脚本并完成首次接入
|
||||
|
||||
本节默认服务器已经安装并运行 Nginx。如果使用 Docker、宝塔、其他 Web 服务或开发网站位于另一台机器,应按实际部署方式替换证书分发与重载步骤;不要直接运行这份面向本机 systemd Nginx 的脚本。
|
||||
本节按网站服务选择接入方式:当前现场使用 **9.2.1 的 1Panel 分支**;9.2.2 仅适用于已经安装并运行宿主机 systemd Nginx 的服务器。
|
||||
|
||||
> 2026-10-03 现场环境确认:服务器为 1Panel `v2.0.11 stable`,网站服务容器为 `1Panel-openresty-C1B1`,镜像为 `1panel/openresty:1.27.1.2-2-3-focal`。维护者执行本节原脚本时,证书检查与宿主机 `nginx -t` 通过,但 `systemctl reload nginx` 报 `nginx.service is not active, cannot reload`;本节接入未完成。应用部署后应使用 1Panel 配置网站 HTTPS,证书续期后的同步与容器重载需按实际网站配置适配。当前可先启用第 9.3 节不含网站部署步骤的基础定时任务,待适配验收后补上 `ExecStartPost`。
|
||||
>
|
||||
> 1Panel v2.0.11 从服务器路径导入证书时会读取并保存内容,不能把导入操作视为持续引用源文件;acme.sh 更新 `nginx-export` 后仍需主动同步到 1Panel 网站使用的证书。依据:[v2.0.11 证书导入实现](https://github.com/1Panel-dev/1Panel/blob/v2.0.11/agent/app/service/website_ssl.go)。
|
||||
|
||||
#### 9.2.1 当前现场:1Panel/OpenResty,应用尚未部署
|
||||
|
||||
2026-10-03,维护者通过 `docker inspect` 与容器内 `nginx -T` 确认以下挂载关系:
|
||||
|
||||
| 宿主机路径 | OpenResty 容器路径 | 用途 |
|
||||
|---|---|---|
|
||||
| `/opt/1panel/www` | `/www` | 网站目录及各网站证书文件 |
|
||||
| `/opt/1panel/www/conf.d` | `/usr/local/openresty/nginx/conf/conf.d` | 网站配置 |
|
||||
| `/opt/1panel/apps/openresty/openresty/conf/ssl` | `/usr/local/openresty/nginx/conf/ssl` | 默认站点证书 |
|
||||
|
||||
现有网站包括 `git.joeyone.cn`、`pipi-assets.joeyone.cn`、`test.joeyone.cn`、`wmd.joeyone.cn`,分别使用 `/www/sites/<网站域名>/ssl/fullchain.pem` 和 `privkey.pem`。输出中没有 `atlas.joeyone.cn` 或 `dev.atlas.joeyone.cn` 的网站配置;维护者确认两套 Atlas 应用尚未部署。
|
||||
|
||||
**当前可先完成图片域名验收及第 9.3 节的七牛续期任务。** 网站应用未部署前,无需创建占位反向代理,也不把项目本地开发端口当作云端应用地址。现有网站及默认站点证书继续由各自配置维护。
|
||||
|
||||
应用部署时按以下顺序接入:
|
||||
|
||||
1. 部署生产、开发应用,确认各自实际访问地址、监听端口及 OpenResty 容器可达性。
|
||||
2. 在 1Panel 的“网站 → 证书”上传正式证书,使用“本地导入/服务器路径”时填写以下**宿主机路径**;若界面要求文件内容,则在受控终端读取后粘贴,不将私钥发送到聊天或提交到仓库。
|
||||
|
||||
- 证书:`/var/lib/atlas-cert/nginx-export/fullchain.pem`
|
||||
- 私钥:`/var/lib/atlas-cert/nginx-export/privkey.pem`
|
||||
|
||||
3. 在 1Panel 新建 `atlas.joeyone.cn` 和 `dev.atlas.joeyone.cn` 网站,配置各自真实应用的反向代理,并在 HTTPS 设置中选择导入的同一张 Atlas 证书。
|
||||
4. 再次检查网站配置中的实际证书路径,并从网络验证两个网站证书和环境路由。文件目录可能由网站创建方式决定,不预先假设一定为 `/www/sites/atlas.joeyone.cn`。
|
||||
5. 接入续期后同步:优先通过与 1Panel 版本匹配的证书更新接口更新已导入证书,使面板记录与关联网站一起更新;验收后再接入第 9.3 节的 `ExecStartPost`。当前未确认面板接口配置、证书 ID 和新网站实际路径,自动同步尚未完成。
|
||||
|
||||
仅手工导入证书不会完成网站自动续期部署。以后只替换网站目录里的 PEM 文件也可能造成面板保存的证书内容与实际文件不一致,后续面板操作可能重新写入旧内容,应完成上述同步适配。
|
||||
|
||||
#### 9.2.2 宿主机 systemd Nginx 分支
|
||||
|
||||
以下示例仅用于宿主机 Nginx。当前 1Panel 现场跳过本小节;不要为使旧脚本成功而启动另一个宿主机 Nginx。
|
||||
|
||||
以下由管理账号执行。脚本及系统证书目录由 root 管理,维护账号不能修改部署脚本。每次部署使用独立版本目录,只有配置检查和重载成功后才记录成功指纹;失败则恢复原目录链接,供下次重试:
|
||||
|
||||
@@ -566,7 +641,9 @@ sudo systemctl reload nginx
|
||||
|
||||
### 9.3 配置定时任务
|
||||
|
||||
以下由管理账号执行,创建 systemd 单元:
|
||||
当前 1Panel 现场尚未部署 Atlas 网站,先创建**证书续期、七牛部署及 PEM 导出**的定时任务。以下基础服务不调用第 9.2.2 节的宿主机 Nginx 脚本,因此不会因 `nginx.service` 未运行而报错;网站自动同步仍须在应用部署后单独接入。
|
||||
|
||||
以下由管理账号执行,创建 systemd 单元。如果先前已创建含 `ExecStartPost=/usr/local/sbin/atlas-cert-install-nginx` 的服务,使用此基础单元覆盖后重新加载:
|
||||
|
||||
```bash
|
||||
sudo tee /etc/systemd/system/atlas-qiniu-cert-renew.service > /dev/null <<'UNIT'
|
||||
@@ -580,7 +657,6 @@ Type=oneshot
|
||||
WorkingDirectory=/var/lib/atlas-cert
|
||||
UMask=0077
|
||||
ExecStart=/usr/sbin/runuser -u atlas-cert -- /var/lib/atlas-cert/renew-qiniu.sh
|
||||
ExecStartPost=/usr/local/sbin/atlas-cert-install-nginx
|
||||
TimeoutStartSec=30min
|
||||
NoNewPrivileges=true
|
||||
PrivateTmp=true
|
||||
@@ -613,9 +689,11 @@ sudo systemctl show atlas-qiniu-cert-renew.service \
|
||||
sudo journalctl -u atlas-qiniu-cert-renew.service -n 50 --no-pager
|
||||
```
|
||||
|
||||
该服务由 root 启动,`ExecStart` 通过 `runuser` 降权执行 acme.sh;只有申请/续期及七牛部署返回成功,才执行 root 的 `ExecStartPost` 部署 Nginx。维护账号仍没有 sudo 权限。Nginx 部署失败会使整个 service 失败;acme.sh 的邮件通知只覆盖其自身的申请及七牛步骤,因此还须监控 service 失败和四个域名实际证书。
|
||||
该基础服务由 root 启动,`ExecStart` 通过 `runuser` 降权执行 acme.sh,维护账号仍没有 sudo 权限。基础服务成功只证明当前续期检查流程完成,不证明网站证书已同步;还须监控 service 失败和两个图片域名实际证书。
|
||||
|
||||
每天北京时间 03:20 后随机延迟最多 30 分钟执行。每天检查不等于每天重新申请;acme.sh 按证书续期窗口决定是否申请,并更新保存的证书导出路径、调用七牛部署 hook。随后 Nginx 脚本核验证书,指纹变化才重载;若七牛失败则本轮不执行 Nginx 部署,排错后重新运行 service。服务器关机时不会运行,`Persistent=true` 会在恢复后补跑错过的定时检查。
|
||||
每天北京时间 03:20 后随机延迟最多 30 分钟执行。每天检查不等于每天重新申请;acme.sh 按证书续期窗口决定是否申请,并更新保存的证书导出路径、调用七牛部署 hook。服务器关机时不会运行,`Persistent=true` 会在恢复后补跑错过的定时检查。
|
||||
|
||||
**已有宿主机 Nginx 网站的服务器**:先完成第 9.2.2 节验收,再在服务 `[Service]` 中添加 `ExecStartPost=/usr/local/sbin/atlas-cert-install-nginx`,重新执行单元校验、`daemon-reload` 和手工触发 service。**1Panel 现场**:完成第 9.2.1 节的网站及证书同步适配后,才添加对应的部署脚本;不能使用宿主机 Nginx 脚本替代。带 `ExecStartPost` 时,只有前置续期流程成功才执行网站部署,网站部署失败会使整个 service 失败;应同时监控网站证书和任务状态。
|
||||
|
||||
刚申请的证书显示跳过续期是正常的。`Type=oneshot` 完成后显示 inactive/dead 也是正常的,检查 timer 为 active、任务 `Result=success`、`ExecMainStatus=0`。日志只在受控终端查看,不导出带凭据的调试日志。
|
||||
|
||||
@@ -651,35 +729,51 @@ exit
|
||||
|
||||
### 10.2 从网络检查四个域名实际证书
|
||||
|
||||
本地证书更新成功不等于所有 CDN 节点完成更新。使用 OpenSSL 从网络检查四个域名实际提供的证书:
|
||||
本地证书更新成功不等于所有 CDN 节点完成更新。当前两个网站尚未部署,先使用 OpenSSL 检查两个图片域名。应用上线且网站 HTTPS 配置完成后,将循环域名扩展为 `atlas.joeyone.cn dev.atlas.joeyone.cn img.atlas.joeyone.cn img-dev.atlas.joeyone.cn`,再验收四个域名。
|
||||
|
||||
仅复制代码块内的命令,不复制 Markdown 的三个反引号。若终端显示连续的 `>` 续行提示,先按 `Ctrl+C` 返回正常提示符,再重新粘贴命令。
|
||||
|
||||
```bash
|
||||
set -o pipefail
|
||||
for cert_domain in atlas.joeyone.cn dev.atlas.joeyone.cn img.atlas.joeyone.cn img-dev.atlas.joeyone.cn; do
|
||||
for cert_domain in img.atlas.joeyone.cn img-dev.atlas.joeyone.cn; do
|
||||
printf '%s\n' "$cert_domain"
|
||||
timeout 20 openssl s_client \
|
||||
-connect "$cert_domain:443" -servername "$cert_domain" \
|
||||
-verify_hostname "$cert_domain" -verify_return_error </dev/null 2>/dev/null |
|
||||
-verify_hostname "$cert_domain" -verify_return_error </dev/null |
|
||||
openssl x509 -noout -issuer -dates -fingerprint -sha256
|
||||
done
|
||||
```
|
||||
|
||||
四个域名的网络证书指纹应在部署传播完成后与正式 `fullchain.cer` 的叶证书指纹一致。私有图片返回 401/403 不能据此判断 TLS 失败;TLS 握手验证可以独立于图片授权完成。
|
||||
|
||||
2026-10-03 现场网络检查记录(维护者从服务器执行,检查的具体时刻未提供):
|
||||
|
||||
| 项目 | 两个图片域名的结果 |
|
||||
|---|---|
|
||||
| 域名 | `img.atlas.joeyone.cn`、`img-dev.atlas.joeyone.cn` |
|
||||
| 颁发者 | `C = US, O = Let's Encrypt, CN = YR2` |
|
||||
| 有效期开始 | `2026-10-03 02:09:40 GMT`(北京时间 10:09:40) |
|
||||
| 有效期结束 | `2027-01-01 02:09:39 GMT`(北京时间 10:09:39) |
|
||||
| SHA-256 指纹 | `E0:EB:B3:0B:A7:3A:B0:12:10:5F:EC:8D:F0:1E:99:F5:0D:09:9C:CA:29:27:BF:8A:B0:4C:74:48:04:44:D0:00` |
|
||||
|
||||
两域名返回的指纹相同,颁发者和有效期与第 7 节本次正式签发结果一致,确认本次探测到的 CDN 节点已提供正式证书;这不代表所有地区节点都已完成传播,也不代表定时续期任务已验收。
|
||||
|
||||
同次检查中,`atlas.joeyone.cn` 与 `dev.atlas.joeyone.cn` 返回 `Could not read certificate from <stdin>` / `Unable to load certificate`,表示管道没有获得可解析的证书。由于当时隐藏了 `s_client` 的错误输出,无法仅凭这一结果区分 DNS、连接或 TLS 失败;结合应用尚未部署的现场状态,两个网站暂列待部署后验收,无需重新签发证书。
|
||||
|
||||
### 10.3 给四个域名分别加独立监控
|
||||
|
||||
在现有外部监控系统或支持证书检查的云监控产品中,把四个完整域名分别纳入 TLS 到期监控。同一张证书也可能在某个部署目标更新失败:
|
||||
在现有外部监控系统或支持证书检查的云监控产品中,当前先把两个图片域名纳入 TLS 到期监控;网站上线后补齐两个网站域名。同一张证书也可能在某个部署目标更新失败:
|
||||
|
||||
- 证书剩余不足 21 天告警,不足 7 天升级处理。
|
||||
- TLS 握手、证书链或域名匹配失败立即告警。
|
||||
- 日常任务长期没有运行,单独按任务执行时间监控。
|
||||
- 私有资源 HTTP 探测需使用受控授权;普通无签名 403 不是资源故障。
|
||||
|
||||
首次手工检查到期阈值可使用以下命令;它只检查当前网络节点,不能代替多地区监控:
|
||||
首次手工检查到期阈值可使用以下命令;它只检查当前网络节点,不能代替多地区监控。当前仅检查图片域名,网站上线后再扩展域名列表:
|
||||
|
||||
```bash
|
||||
set -o pipefail
|
||||
for cert_domain in atlas.joeyone.cn dev.atlas.joeyone.cn img.atlas.joeyone.cn img-dev.atlas.joeyone.cn; do
|
||||
for cert_domain in img.atlas.joeyone.cn img-dev.atlas.joeyone.cn; do
|
||||
if timeout 20 openssl s_client \
|
||||
-connect "$cert_domain:443" -servername "$cert_domain" \
|
||||
-verify_hostname "$cert_domain" -verify_return_error </dev/null 2>/dev/null |
|
||||
@@ -765,6 +859,7 @@ PY
|
||||
```dotenv
|
||||
OBJECT_STORAGE_PROVIDER=qiniu_kodo
|
||||
OBJECT_STORAGE_ENDPOINT=https://s3.cn-east-1.qiniucs.com
|
||||
OBJECT_STORAGE_REGION=cn-east-1
|
||||
OBJECT_STORAGE_BUCKET=atlas-prod-assets
|
||||
OBJECT_STORAGE_FORCE_PATH_STYLE=true
|
||||
OBJECT_STORAGE_ACCESS_KEY=填写生产对象存储凭据
|
||||
@@ -777,16 +872,16 @@ QINIU_SECRET_KEY=填写生产私有下载签名凭据
|
||||
OZON_PUBLISH_ENABLED=auto
|
||||
```
|
||||
|
||||
开发联调配置替换为开发空间、开发凭据和 `https://img-dev.atlas.joeyone.cn`。数据库素材身份继续记录 `storage_provider + bucket + object_key`,不保存签名 URL 作为素材主数据。
|
||||
开发联调配置替换为开发空间、开发凭据和 `https://img-dev.atlas.joeyone.cn`。`OZON_IMAGE_DOWNLOAD_ORIGIN` 同时用于 API 的图片预览、附件下载和 Worker 向 Ozon 交付图片;七牛私有空间的链接由服务端按用途签发短期下载凭证。上传仍使用 `OBJECT_STORAGE_ENDPOINT`。数据库素材身份继续记录 `storage_provider + bucket + object_key`,不保存签名 URL 作为素材主数据。
|
||||
|
||||
`OBJECT_STORAGE_BUCKET` 当前用于 S3 操作,因此应填七牛显示的 **S3 空间名**;如它与普通空间名不同,不可混用。自定义 CDN 域名绑定相应的实际空间。[七牛 S3 服务域名说明](https://developer.qiniu.com/kodo/4088/s3-access-domainname)
|
||||
|
||||
### 12.2 当前代码接入前置事项
|
||||
### 12.2 接入校验事项
|
||||
|
||||
证书配置完成不代表项目已完成七牛接入。本文编写时:
|
||||
证书配置完成后,还需确认应用与存储空间的联通性:
|
||||
|
||||
1. `apps/api/src/media/media.service.ts` 和 `apps/worker/src/main.ts` 的 S3 region 为硬编码 `us-east-1`。需要后续代码任务添加配置,并与七牛 S3 区域匹配;目前没有已生效的 `OBJECT_STORAGE_REGION` 配置项,不能只在 `.env` 填一个新变量就认为完成。
|
||||
2. 需验证现有 S3 上传、HEAD/GET、预签名预览和浏览器直传的七牛兼容性;上传 endpoint 的 CORS 要允许实际 Atlas 开发/生产网站 Origin、PUT/GET/HEAD 及预检请求中实际使用的头,不能拿 CDN 配置代替上传 CORS。
|
||||
1. API 和 Worker 的 S3 客户端读取 `OBJECT_STORAGE_REGION`;它必须与七牛空间的区域及 endpoint 匹配。API 的七牛预览与附件下载使用绑定的 HTTPS 图片域名签发私有下载链接。
|
||||
2. 需验证现有 S3 上传、HEAD/GET、图片域名私有下载和浏览器直传的七牛兼容性;上传 endpoint 的 CORS 要允许实际 Atlas 开发/生产网站 Origin、PUT/GET/HEAD 及预检请求中实际使用的头,不能拿 CDN 配置代替上传 CORS。
|
||||
3. 发布代码拒绝 `local_minio` 或与当前 bucket 不一致的素材。原 MinIO 图片需要复制、校验并更新素材定位,或重新导入,不能仅切换配置。
|
||||
4. 原有架构文件仍以普通本地开发使用 MinIO 为基线。本手册描述待实施的七牛联调操作,不自行宣布该基线已被替换;正式切换时应同步更新上游架构和交接文档。
|
||||
5. 生产 `OZON_PUBLISH_ENABLED=auto` 默认不启用发布。完成七牛延迟抓图及真实店铺其他前置验收后,另行显式启用,不在证书维护步骤中顺便开启生产上架。
|
||||
@@ -873,7 +968,7 @@ sudo systemctl start atlas-qiniu-cert-renew.timer
|
||||
| systemd 执行后 inactive | oneshot 已正常结束 | 看 timer、Result 和退出码 |
|
||||
| 没收到邮件 | SMTP 授权码、From、端口出站、收件箱 | 重做通知配置测试,检查邮箱服务商要求 |
|
||||
| 图片签名链接 404 | 对象是否在正确空间、key 编码、是否被提前清理 | 检查对象身份和保留策略 |
|
||||
| 应用 S3 访问失败 | region、endpoint、S3 空间名、对象权限 | 按第 12 节处理应用配置与代码前置事项 |
|
||||
| 应用 S3 访问失败 | region、endpoint、S3 空间名、对象权限 | 按第 12 节核对应用配置和存储空间权限 |
|
||||
|
||||
排错时只提供脱敏后的错误码、域名、时间和请求 ID;不提供 SK、证书私钥、完整授权 URL 或完整账号配置文件。
|
||||
|
||||
@@ -907,15 +1002,18 @@ sudo systemctl start atlas-qiniu-cert-renew.timer
|
||||
- [ ] 两个空间都是私有,生产与开发数据/应用凭据隔离。
|
||||
- [ ] 两个下载域名是七牛 CDN 域名,分别指向正确空间,CNAME 已生效。
|
||||
- [ ] 两个域名均启用私有空间回源鉴权,未添加与现有签名协议冲突的限制。
|
||||
- [ ] DNS-01 staging 验证成功,临时 TXT 清理正常。
|
||||
- [ ] 正式 SAN 含 `atlas.joeyone.cn` 与 `*.atlas.joeyone.cn`,覆盖四个域名;未误用更深一层域名。
|
||||
- [x] DNS-01 staging 验证及测试证书签发成功(2026-10-03)。
|
||||
- [ ] 临时 TXT 已清理,两个图片域名 CNAME 保持正确。
|
||||
- [x] 正式 SAN 含 `atlas.joeyone.cn` 与 `*.atlas.joeyone.cn`,覆盖四个域名;颁发者及有效期已检查(2026-10-03)。
|
||||
- [ ] 两个网站 A 记录正确,Nginx 分别路由到对应环境,证书导出、配置检查和重载成功。
|
||||
- [ ] 七牛 hook 首次部署成功,两域名实际证书均已更新。
|
||||
- [x] 七牛 hook 首次部署对两个图片域名均返回成功(2026-10-03 11:26:12,北京时间)。
|
||||
- [x] 两个图片域名的实际网络证书已核验更新(2026-10-03,当前探测节点的颁发者及有效期与本次正式证书一致,两个域名指纹相同)。
|
||||
- [ ] systemd timer 启用,手工触发 service 成功,七牛及 Nginx 均完成部署;没有另一个 cron/服务器并发维护。
|
||||
- [ ] 当前 1Panel 阶段:先启用仅续期、七牛部署及 PEM 导出的基础 timer,手工触发成功;应用上线后补齐网站同步,再验收上一项完整链路。
|
||||
- [ ] 故障/实际续期通知已收到测试消息,四个域名已纳入独立到期监控。
|
||||
- [ ] 两空间测试图片均通过有效签名、无签名、缓存后无签名、过期签名测试。
|
||||
- [ ] 权限受控的加密备份和旧有效证书回滚方式已准备。
|
||||
- [ ] 应用 S3 region 等前置问题另行解决,未把证书部署成功当作 Ozon 上架验收成功。
|
||||
- [ ] 应用 S3 region、上传与图片域名的私有下载均已验证,未把证书部署成功当作 Ozon 上架验收成功。
|
||||
|
||||
## 17. 项目与官方参考
|
||||
|
||||
|
||||
Reference in New Issue
Block a user