Commit 741c9c0e authored by wenwen.tang's avatar wenwen.tang 😕

docs: 记录服务器 Git 同步部署、线上数据对齐与三处环境坑

parent 22c17fe0
Pipeline #837 canceled with stages
......@@ -58,3 +58,78 @@
### 附带发现
`git ls-files` 暴露了 `.租金通知系统-需求确认清单.ref/` 其实是个**目录**(内含 `build.py`),非单文件。
---
## 服务器同步部署(192.168.68.121)
### 结论:改用 Git 拉取式部署
服务器**可直连** Git 站点(`git.thiztech.com` 解析到公网 IPv4,HTTPS 302 / 0.199s;
服务器侧 IPv6 不通,走 IPv4)。服务器 git 很老(**1.8.3.1**,CentOS 7 自带)但 clone/pull 正常。
- **仓库位置** `/opt/rentos/repo`(git 工作副本),与 `data/`、`output/`、`logs/`、`uploads/`、
`wecom-config/` **同级但独立** → `git reset --hard` 不会碰线上数据
- **凭据**:写在服务器 `~/.git-credentials`(600)+ `credential.helper=store`,
由 `deploy_git.py setup` 经 **SFTP 直写**(不经命令行,避免密码进进程列表 / shell 历史)
- **一键同步**:`RENTOS_SSH_PASSWORD=... python tools/deploy_git.py sync`
(pull → build → 重启 → 验证);另有 `setup` / `pull` / `build` / `run` / `status` / `logs`
- 镜像 `rentos:latest`:153MB → **201MB**(新增 reportlab / pillow / 中文字体)
### Dockerfile 改为「仓库根」构建上下文
原来以 `app/` 为上下文(SFTP 上传形态),现在上下文 = 仓库根,
构建命令 `docker build -f deploy/Dockerfile -t rentos:latest .`:
- `COPY deploy/wheels/`、`COPY rentos/ web/ assets/ templates/ build_notices.py`
- **新增 `COPY tools/`** —— 服务器无 Python 3(yum 仅 3.6.8,项目需 3.7+),
台账迁移只能在容器内执行
- 企微 CLI 改为从仓库内 `deploy/wecom/cli-linux-x64.tgz` 解压,
不再依赖未入库的 `deploy/wecom/x/`
- 新增 `.dockerignore`(上下文变成仓库根后必须裁剪 `.git` / `data` / `output` / `samples` 等)
### 两个构建坑(都已修)
1. Dockerfile 在 `deploy/` 下,必须 `-f` 指定,否则报
`failed to read dockerfile: open Dockerfile: no such file or directory`
2. **`docker build … | tail` 的退出码来自 tail**,会把构建失败**吞掉** —— 症状是
"构建明明报错,脚本却继续用旧镜像重启容器"。改为重定向日志 → 取真实 rc → 回显尾部
### 数据迁移(线上)
- AJ「下一账单日」:**64 行**(`migrate_next_bill.py --apply`),21 行因账单起始日为空留空
- 车位备注 AA:**31 条**(本机导出映射 → SFTP 上传 → `tables.update_cells` 写入)
- 线上台账 85 行 × **36 列**(`load_table` 以代码列定义为准,35 列的旧文件会自动补齐 AJ 定义)
### ⚠️ 重要:线上账期领先本机
线上在本机之外**真实出单过**(`20261009-175756` 30 行、`20261012-150747` 4 行、
`20261012-170741` 10 行,共 44 行),线上 AC 已推进到 2027-01/02/03,
本机还停在 2026-11/12 —— **11 行 AC 有差异**。
- 结论:**线上台账才是权威**。若用本机覆盖线上会**回退账期、导致重复出单**
- 处理:以线上为基准补迁移;随后**用线上数据覆盖本机**,两侧现逐格零差异
- 本机备份 `data/_snap/20261013-1110-before-online-sync/`
- **推论:本机不应再出单**(账期已落后),只作预览 / 开发;云端是唯一生产方
### 线上验证(实测)
- **PDF 出单链**:生成 302/303/305 室三份中文 PDF,`%PDF-` 头、约 32KB,
**302 室 22734.00 与本机测试完全一致**;命名 `{单元}-房租&物业费-收费通知书.pdf`
- **新增接口**:批次详情含 `receipt`(doc_count=10 / unpaid_amount=243868.6);
批次导出返回 9103 字节合法 xlsx(`PK` 头)
- **排期**:43 行可出单(另 21 行 `rent`/`fee` 为空 → `billable=False`),
下一账单日均为 2027-01-01 及以后 → 最近推送日 **2026-12-27**,今日不到点(0 行)
### 本机 git 网络坑:必须绕过沙箱代理
本机 `https_proxy=http://127.0.0.1:12934`(WorkBuddy 沙箱代理),git 走它返回
`CONNECT tunnel failed, response 502`;沙箱内直连被拦(curl 返回 000)。
**解决**:绕过沙箱 + 取消代理变量:
```bash
env -u http_proxy -u https_proxy -u HTTP_PROXY -u HTTPS_PROXY git push origin main
```
绕过沙箱后直连正常(302 / 3.1s)。以后本机 push 报 502 就是这个原因。
......@@ -168,19 +168,32 @@
- **镜像源已修**:`daemon.json` 的 `registry-mirrors` 换成 `docker.m.daocloud.io` → `docker.1ms.run`
→ `docker.xuanyuan.me`(原阿里云个人版已停服 403)。`docker pull` 已实测可用。
## 云端部署(2026-10-12 完成 · Docker)
## 云端部署(2026-10-13 改为 Git 同步 · Docker)
- **地址 `http://192.168.68.121:8899/`**(admin / 1989@rent05),容器名 `rentos`,`--restart unless-stopped`。
- 一键:`RENTOS_SSH_PASSWORD=... python tools/deploy_docker.py deploy`(或 `run`/`build`/`status`/`logs`)。
- 部署物:`deploy/Dockerfile`(底座用服务器**本地已有**的 `python:3.11.3-slim`)+
`deploy/wheels/`(openpyxl 离线 wheel)。构建期**零联网**。
- 服务器布局 `/opt/rentos/`:`app/`(代码)· `data/` `output/` `logs/` `uploads/`(**bind volume**,
改这些目录即可改线上数据;重跑 `push` 会用本机 `data/` 覆盖云端)。
- **打包必须含根目录 `build_notices.py`**(`elec_render` / `rent_render` 会 import 它,漏了就出单崩)。
- **主用(Git 同步)**:`RENTOS_SSH_PASSWORD=... python tools/deploy_git.py sync`
(另有 setup / pull / build / run / status / logs)。服务器**可直连** git 站点(走 IPv4,0.2s;
服务器侧 IPv6 不通),代码落在 `/opt/rentos/repo`,与 `data/` 等同级独立 →
`git reset --hard` 不会碰线上数据。凭据由 setup 经 **SFTP 直写** `~/.git-credentials`(600)。
- **降级(服务器访问不到 Git 时)**:`python tools/deploy_docker.py deploy`(本机打包 SFTP 上传,
解包进同一个 `repo/`)。两条通道共用一份 `deploy/Dockerfile`,可互相接管。
- 构建 `docker build -f deploy/Dockerfile -t rentos:latest .`,**上下文 = 仓库根**;
`deploy/wheels/`(openpyxl / reportlab / pillow / charset-normalizer)+ `deploy/wecom/*.tgz`
+ `assets/fonts/simhei.ttf` 全随仓库走,构建期**零联网**(底座 python:3.11.3-slim 服务器本地已有)。
- **Dockerfile 必须用 `-f` 指定**(它在 deploy/ 下);**切勿写 `docker build … | tail`** ——
管道退出码来自 tail,会吞掉构建失败并让你用旧镜像重启容器。
- 服务器布局 `/opt/rentos/`:`repo/`(代码)· `data/` `output/` `logs/` `uploads/` `wecom-config/`(**bind volume**)。
- 镜像内含 `tools/`:**服务器无 Python 3**(yum 仅 3.6.8),台账迁移只能
`docker exec rentos python /app/tools/xxx.py`。
- **`docker -v` 的 SELinux 选项是冒号 `:z` 不是逗号 `,z`**。写成逗号 docker 会把 `,z` 并入容器路径
(挂到 `/app/data,z`),症状是「容器正常、页面 200、但台账 0 行」。
排查:`docker inspect rentos --format '{{range .Mounts}}{{.Source}} -> {{.Destination}}{{"\n"}}{{end}}'`
- 云端**已能直发企业微信**(见下条);**本机与云端不要同时开定时器**,会重复发送。
- **云端与本机 `data/` 是两份独立副本**,不自动同步。
- 云端**已能直发企业微信**;**本机与云端不要同时开定时器**,会重复发送。
- ⚠️ **线上账期领先本机**(线上 2026-10-09、10-12 三次出单共 44 行,AC 已到 2027-01/02/03)→
**本机不应再出单**,只作预览/开发,云端为唯一生产方。台账以线上为准
(2026-10-13 已双向对齐,两侧逐格一致)。
- **本机 git 网络坑**:沙箱 `https_proxy=http://127.0.0.1:12934` 会让 push 报
`CONNECT tunnel failed, response 502` → 需绕过沙箱并
`env -u http_proxy -u https_proxy -u HTTP_PROXY -u HTTPS_PROXY git push`。
## 企业微信发送(2026-10-12 · 打通云端直发)
- `rentos/wecom.py` 调的 `@wecom/cli` 是**壳**,真身是平台原生二进制;官方有
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment