پیکربندی پایگاه داده

Madmail حساب‌ها، تنظیمات، سهمیه، توکن‌ها و وضعیت فدراسیون را در یک پایگاه SQL برنامه نگه می‌دارد: SQLite (پیش‌فرض) یا PostgreSQL. متن نامه‌ها روی دیسک می‌ماند (Maildir). صفحات اشتراک مخاطب فایل SQLite جداگانه‌ای دارند (sharing.db).

MySQL پشتیبانی نمی‌شود. عوض کردن driver به‌تنهایی فایل SQLite موجود را کپی نمی‌کند. بعد از ویرایش driver / dsn باید فرآیند را ری‌استارت کنید — madmail reload پایگاه را دوباره باز نمی‌کند.

SQLite (پیش‌فرض)

madmail install همیشه driver sqlite3 می‌نویسد. مسیر فایل از state_dir شما پیروی می‌کند.

auth.pass_table local_authdb {
    table sql_table {
        driver sqlite3
        dsn /var/lib/madmail/credentials.db
        table_name passwords
    }
}

PostgreSQL (پایگاه خالی)

یک پایگاه خالی و نقشی با مجوز ساخت جدول بسازید. هر دو بلوک auth.pass_table و storage.imapsql را روی همان driver postgres و همان DSN بگذارید (v2 همان DSN احراز هویت را باز می‌کند؛ یکی نبودن آن‌ها پیکربندی را گمراه‌کننده می‌کند).

CREATE USER madmail WITH PASSWORD 'choose-a-secret';
CREATE DATABASE madmail OWNER madmail;

نمونه در madmail.conf:

auth.pass_table local_authdb {
    auto_create yes
    jit_domain $(primary_domain)
    table sql_table {
        driver postgres
        dsn host=127.0.0.1 port=5432 user=madmail password=choose-a-secret dbname=madmail sslmode=disable
        table_name passwords
    }
}

storage.imapsql local_mailboxes {
    auto_create yes
    driver postgres
    dsn host=127.0.0.1 port=5432 user=madmail password=choose-a-secret dbname=madmail sslmode=disable
    retention 24h
    default_quota 1G
    appendlimit 100M
}

فرم URL هم پذیرفته می‌شود: postgres://madmail:choose-a-secret@127.0.0.1:5432/madmail?sslmode=disable.

سپس Madmail را ری‌استارت کنید. اولین اجرا روی Postgres خالی مهاجرت‌های sqlx را اعمال می‌کند. GORM در کار نیست و لازم نیست جداول quotas / contacts را دستی بسازید.

کپی SQLite به PostgreSQL

اول سرویس را متوقف کنید تا SQLite بیکار باشد، بعد:

madmail db sqlite-to-postgres --dsn 'host=127.0.0.1 user=madmail dbname=madmail sslmode=disable' --dry-run
madmail db sqlite-to-postgres --dsn 'host=127.0.0.1 user=madmail dbname=madmail sslmode=disable' -y

پس از کپی، driver postgres را مثل بالا تنظیم کنید و سرویس را روشن کنید. فقط جداول برنامه کپی می‌شوند. Maildir، صف ارسال مجدد، admin_token و sharing.db جابه‌جا نمی‌شوند و madmail.conf بازنویسی نمی‌شود. اگر Postgres از قبل ردیف رمز عبور داشته باشد، --force لازم است.

کش حافظه در برابر دیتابیس روی دیسک

برای سرعت، سرور در حال اجرا ممکن است ردیف‌های اعتبارنامه (auth.pass_table) و مجموع سهمیه هر کاربر (storage.imapsql) را در RAM نگه دارد. منبع حقیقی همچنان پایگاه داده است.

اگر با CLI (مثلاً madmail creds، madmail accounts یا madmail imap-acct) در حالی که سرویس روشن است دیتابیس را عوض کردید، یک بار Admin API را با POST /admin/cache/reload صدا بزنید تا فرآیند دوباره جداول را بخواند؛ یا سرویس را ری‌استارت کنید.