Skip to content

Feature Storage vi

SkimMail docs edited this page Sep 15, 2026 · 1 revision

English · Tiếng Việt · 中文

Cài đặt Storage

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.

Vấn đề nó giải quyết

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.

Nằm ở đâu

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.

Vì sao nó bị ẩn suốt mười một bản phát hành

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, mysqls3 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.

Blob engine: filesystem hay S3

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ì.

Hai nút khác nhau, hai mức cẩn trọng khác nhau

Đâ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.

Phần database chỉ là một runbook, không phải một nút bấm

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.

Giới hạn

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

Nó không làm gì

  • 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.

Xem thêm

  • Vận hành — sao lưu filesystem, và blobs/ nằm ở đâu dưới DATA_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-only DB_DRIVER/DATABASE_URL/BLOB_STORE/S3_*

SkimMail · skimmail@base101.app · 2026-09-15 · commit dffbb18

Clone this wiki locally