-
Notifications
You must be signed in to change notification settings - Fork 0
Feature Storage vi
Settings ▸ Storage, bị ẩn sau flag storage từ 0.1.0 cho tới khi được
bật ở 1.14.0. Trang này nói về những gì màn hình đó thực sự làm hôm nay —
nội dung thư đã cache nằm ở đâu và cách chuyển nó, và vì sao phần database
bên cạnh chỉ là một runbook chứ không phải một nút bấm.
Hai quyết định không liên quan nằm chung một màn hình vì cả hai đều nói về việc SkimMail giữ byte của mình ở đâu: blob engine nào giữ nội dung thư đã cache (đĩa cục bộ, hay một bucket tương thích S3), và database engine nào giữ mọi thứ còn lại (SQLite mặc định, hoặc Postgres/MySQL). Trang này nói đầy đủ về blob engine — nó có các hành động switch/test/migrate thật, hoạt động được — và nói thẳng về phần database, thứ hôm nay chỉ là một bản sao lệnh, không phải migration tự động.
Settings ▸ Storage, chỉ owner. Màn hình mang một huy hiệu "Advanced" ngay trên tiêu đề của chính nó — không phải chuyện hình thức, mà là một cảnh báo thật: đổi engine đang dùng nghĩa là đổi nơi dữ liệu của bạn vật lý nằm ở đâu.
Flag storage tắt từ 0.1.0 tới hết 1.13.0 vì đúng một lý do, đáng biết nếu
bạn từng thấy một screenshot cũ hay một release note cũ: phần database từng
có nút "Migrate database…" mở ra một wizard bảo operator phải build lại
SkimMail với -tags postgres trước. Điều đó chưa bao giờ đúng với bất kỳ ai
chạy bản build chính thức — mọi tarball, .deb và image container đã phát
hành đều gấp sẵn postgres, mysql và s3 từ 1.4.3 — nên chỉ dẫn đó
không chỉ thừa, nó mô tả một bước mà một người self-host không có Go
toolchain hoàn toàn không thể thực hiện. 1.14.0 không thêm tính năng còn
thiếu; nó chỉ dừng việc một màn hình thật tự nhận là một thứ khác, rồi bật
flag lên khi lời lẽ của chính màn hình đã đúng.
Hai engine, chọn bằng một công tắc: Filesystem (mặc định — nội dung
cache nằm dưới DATA_DIR/blobs, và sao lưu nó chính xác là "copy
DATA_DIR", xem Vận hành) hoặc tương thích S3 (bất kỳ
endpoint nào nói API S3 — MinIO, Cloudflare R2, Backblaze B2, Wasabi, hoặc
chính AWS S3), cấu hình bằng endpoint, bucket, region, access key và secret
key, cộng thêm một công tắc path-style tuỳ chọn cho các endpoint cần nó.
Object luôn được stream qua SkimMail, không bao giờ phục vụ trực tiếp từ một URL bucket công khai — kể cả trên S3, nội dung thư vẫn giữ nguyên việc sanitize, chặn tracker và kiểm quyền theo từng request như filesystem, và những blob hay đọc vẫn được cache cục bộ để nhanh hơn bất kể engine nào đang dùng. Chọn S3 không biến bucket của bạn thành thứ mà một mail client hay trình duyệt nói chuyện thẳng vào.
Test connection dựng cấu hình ứng viên và thăm dò nó bằng một lệnh
Stat rẻ tiền vào một key làm mốc — phản hồi "not found" tính là thành
công, vì nó chứng minh bucket và credential có thể truy cập được mà không
đòi hỏi gì phải tồn tại sẵn ở đó. Chạy cái này trước khi lưu; một cấu hình S3
sai sẽ bị chính lượt thăm dò đó từ chối lúc lưu/switch (xem bên dưới), nhưng
thấy lỗi sớm thì chẳng tốn gì.
Đây là điểm khác biệt đáng đọc hai lần trước khi bấm bất kỳ nút nào:
- Save lưu engine mới và chuyển ngay blob cache đang chạy sang nó. Nếu vị trí mới thực sự khác vị trí cũ (một bucket S3 khác, hoặc chuyển từ filesystem sang S3 hay ngược lại — chỉ xoay vòng access key S3 thì không tính là một lần chuyển), nội dung cache của engine cũ bị bỏ lại, không còn ai tham chiếu tới, và index từng trỏ vào chúng bị xoá. Không gì bị xoá khỏi kho cũ — SkimMail sẽ không tự ý chạm vào một bucket S3 có thể đồng thời là đích sao lưu của bạn rồi bắt đầu xoá object — nhưng cũng không có gì từng được cache được copy tiếp sang. Điều này an toàn chính vì body cache là một cache: bất cứ gì bị bỏ lại theo cách này đơn giản sẽ được lấy lại từ server IMAP của từng tài khoản vào lần mở kế tiếp.
- Switch & migrate làm y hệt việc chuyển đó, rồi duyệt qua từng key trong kho cũ và copy nó sang kho mới ở nền, bỏ qua key đã có sẵn (chạy lại an toàn) và đếm số đã copy/bỏ qua/lỗi khi nó chạy. Đây là lựa chọn nếu bạn muốn nội dung đã cache hôm qua vẫn là một cú hit cục bộ trên engine mới thay vì một lượt lấy IMAP mới toanh.
Dù chọn cách nào, object đã lưu ở engine cũ không bao giờ bị màn hình này xoá. Một lần chuyển an toàn để đổi ý: trỏ cấu hình về chỗ cũ, và byte cũ của bạn, nếu bạn chưa ghi đè bucket đó bằng thứ khác, vẫn còn nguyên.
Chuyển từ SQLite sang Postgres hay MySQL được trình bày như một wizard in
ra các lệnh để bạn tự chạy, không phải một hành động SkimMail tự làm thay
bạn: chọn engine đích, dán một connection string (chỉ kiểm hình dạng — một
regex, không phải một lượt kết nối thật), rồi nhận lại một đoạn script ngắn
dùng skimmail config set (hoặc biến môi trường tương
đương, thứ luôn thắng giá trị config-set) để trỏ server vào database mới,
cộng thêm lời nhắc đăng nhập lại sau đó.
Không dòng nào được copy. Kho thư của SkimMail là một cache được dựng
lại từ server IMAP của từng tài khoản, nên "migrate" database nghĩa là dựng
một instance Postgres hay MySQL trống, trỏ SkimMail vào đó, rồi thêm lại tài
khoản của bạn — lượt sync theo sau sẽ nạp lại mọi thứ. File SQLite hiện có
của bạn dưới DATA_DIR được giữ nguyên hoàn toàn, đó chính là điều khiến
toàn bộ việc này đảo ngược được: trỏ cấu hình về DB_DRIVER=sqlite là bạn
quay đúng về điểm xuất phát.
| Có từ | 1.14.0 (flag được bật); bản thân cơ chế blob engine là 1.11.0 |
| Vai | owner |
| Blob engine | filesystem, tương thích S3 |
| "Migration" database | một runbook (lệnh để copy), không phải hành động tự động |
| Đồng thời | một lượt backfill blob tại một thời điểm; bắt đầu lượt thứ hai khi một lượt đang chạy là vô tác dụng |
| S3 có sẵn | gấp sẵn trong mọi bản build chính thức từ 1.4.3 |
- Không tự migrate database cho bạn. Wizard trên màn hình này chỉ kiểm hình dạng một connection string rồi đưa bạn các lệnh; nó không gọi mạng và không copy dòng nào. Xem phần trên.
- Chuyển blob engine chỉ bằng Save không mang blob cũ theo. Chỉ Switch & migrate làm điều đó; Save một mình bỏ lại chúng ở kho cũ (không bao giờ xoá) và quên index.
- Không bao giờ xoá object ở kho bạn đang rời đi. Bucket hay thư mục đó có thể đồng thời là đích sao lưu (xem Backup và restore); màn hình này sẽ không tự đoán là an toàn để dọn nó.
- Xoay vòng S3 secret key không được xem là đổi vị trí. Chỉ endpoint/bucket/region/path-style mới xác định "cùng một chỗ" — chỉ cập nhật credential không kích hoạt việc bỏ lại cũng không kích hoạt migrate.
-
Vận hành — sao lưu filesystem, và
blobs/nằm ở đâu dướiDATA_DIR - Cache nội dung thư — thứ gì thực sự được lưu trong một blob, giới hạn kích cỡ/tuổi, và mã hoá at-rest
-
Cấu hình — mô hình ba mặt phẳng,
skimmail config, và các biến boot-onlyDB_DRIVER/DATABASE_URL/BLOB_STORE/S3_*
SkimMail · skimmail@base101.app · 2026-09-15 · commit dffbb18