# 上線 Checklist — 編輯器上傳臨時檔回收（files.status pending + 偽 cron GC）

> 對象：先 jyg（範本站），驗過再隨 runbook 推其他站。
> 設計：`article-draft-binding.md`｜SQL：`article-draft-migrate.sql`｜commit：micro `4ccb60b6`→`2aaa9601`、cdn `e54395b`
> 重點：**不建表**（jyg 已有 `files`/`file_usages`）；主要是部署程式，SQL 只有「確認 signed + 選用的舊標記校正」。

---

## 0. 前置檢查：`files.status` 必須是 signed（負值存得進去）⚠ 必做
```sql
SHOW COLUMNS FROM `files` LIKE 'status';
```
- 顯示 `tinyint(1)`（無 `unsigned`）→ ✅ 可存 -1/-2，跳到第 1 步。
- 顯示 `unsigned` → ❌ 負值會壞（報錯或被截成 0）。先改 signed：
  ```sql
  ALTER TABLE `files` MODIFY `status` TINYINT NOT NULL DEFAULT 1;
  ```

## 1. 校正舊 GC 標記（選用，只在有 status=2 時）
```sql
SELECT `status`, COUNT(*) FROM `files` GROUP BY `status`;
```
- 有 `status=2`（以前跑過 gc/mark）→ 跑：
  ```sql
  UPDATE `files` SET `status` = -1 WHERE `status` = 2;
  UPDATE `files` SET `status` = -2 WHERE `status` = 3;   -- 通常無，保險
  ```
- 沒有 → 略過（no-op）。

## 2. 部署程式（FTP）
- [ ] `PHP71/pubs/apps/Models/Files/`：`Status.php`(新)、`Files.php`、`DB/Files.php`、`DB/Scan.php`、`Scan.php`、`Usages.php`、`Cron.php`(新)
- [ ] `PHP71/pubs/apps/Models/Uploader/Files.php`
- [ ] `PHP71/pubs/apps/Models/Articles/Indexs.php`（偽 cron tick 掛點）
- [ ] `admin71/apps/conf/routes/conf.route.main.php`（`gc/run`、`gc/pending`）
- [ ] **清 opcache**（重啟 PHP 或更新 mtime；FTP 常留舊 mtime → 不清會跑舊碼）

## 3. 部署 cf-cdn（cdn-microweb-cc）
- [ ] `git push`（adapter 加 `pending=1`、`editor.js` import `?v=4`）
- [ ] Cloudflare **Purge Cache**（4h 快取，不清會載到舊 adapter）
- [ ] micro 端 `editor.js?...&v=4` 已隨 admin71 部署（同步破快取）

## 4. 驗證鏈（jyg 後台）
1. [ ] 新建文章 → 編輯器插一張圖 → 查 `SELECT id,status FROM files ORDER BY id DESC LIMIT 1` = **-2（PENDING）**。
2. [ ] 該文章**存檔** → 再查同一 id = **1（ACTIVE）**，且 `file_usages` 有對應列。
3. [ ] 另上傳一張**不存檔**就離開 → 立即手動跑 `GET /<base>/files/maintenance/gc/pending?pending_grace=0`（grace=0 立即判定）→ 回 `purged≥1`，該 -2 列被刪、本機/R2 檔也清。
   - 正常營運是偽 cron（文章列表 load、距上次≥1天）自動跑 `gc/run`，這裡用 grace=0 + 手動只為即時驗證。
4. [ ] 開文章列表頁幾次，確認頁面正常（偽 cron tick 不影響列表、`.gc_last_*` 有寫進 `media->root`）。
5. [ ] 既有文章編輯器上傳圖也照走（status=-2 → 存檔轉 1），不破既有圖。

## 5. 回退（出事時）
- 程式：FTP 還原上述檔（或 git 對應 commit 前一版）+ 清 opcache。
- 資料：`UPDATE files SET status=2 WHERE status=-1;`（把校正過的標記還原）。臨時 -2 列無既有資料、可直接刪或留待 GC。

---

## 推到其他站
同 `station-migration-runbook.md`（B 節已補本功能註記）：每站部署同一份共用 PHP71/admin71 + 各站確認 `files.status` signed + 選用的 2→-1 校正 + cf-cdn 已是共用（push 一次全站共享）。
