Files
2026-11-04 08:55:53 +01:00

7.7 KiB
Raw Permalink Blame History

PostfixAdmin-RS

Panel administracyjny serwera poczty Postfix/Dovecot napisany w Rust — zamiennik PHP-owego PostfixAdmin, działający na tej samej bazie danych (MySQL/MariaDB, PostgreSQL, SQLite). Postfix, Dovecot, vacation.pl i fetchmail.pl korzystają z tabel dokładnie tak jak przy PHP-owym PostfixAdminie, więc panel można podmienić bez migracji danych.

Wersja: 0.1.0 · referencja logiki: PostfixAdmin 4.0.5 + gałąź master (schemat bazy 1857).

Jeden statyczny plik binarny z wbudowanym interfejsem (EN/PL, jasny/ciemny motyw, działa na telefonie), bez PHP, bez serwera aplikacji, bez zależności w runtime.

Funkcje

Obszar Zachowanie
Domeny limity aliasów/skrzynek (-1 = wyłączone, 0 = bez limitu), quota domeny i maks. quota skrzynki, transport, backup MX, wygasanie haseł, status DNS, domyślne aliasy przy tworzeniu, kasowanie domeny z wszystkimi danymi
Lista wirtualna widok domeny jak list-virtual.php: domeny aliasowe, aliasy, skrzynki, wyszukiwanie, stronicowanie, filtr aktywne/nieaktywne, przełączanie aktywności jednym kliknięciem, „usuń nieaktywne”, statusy (niedostarczalny, zewnętrzny, autoresponder, wyłączona, hasło wygasło, POP/IMAP)
Skrzynki reguły quota identyczne z MailboxHandler::check_quota()/allowed_quota() (podpowiedź „maks. N MB” w formularzu), generowanie hasła, potwierdzenie hasła, SMTP on/off, e-mail do odzyskiwania, wiadomość powitalna (w tle), maildir zgodny z domain_path/domain_in_mailbox, hooki po utworzeniu/edycji/usunięciu/zmianie hasła
Przekierowania alias skrzynki („przekaż i zachowaj”), z uprawnieniami alias_control / alias_control_admin / edit_alias jak w PostfixAdminie
Aliasy catch-all (* → @domena), przekierowanie całej domeny, konto lokalne (root), blokada aliasu wskazującego na siebie, emailcheck_localaliasonly, chronione aliasy domyślne (special_alias_control), zapamiętany domyślny cel
Domeny aliasowe z ochroną przed łańcuchami i pętlami
Administratorzy globalni i domenowi, przypisanie domen, aktywacja, reset hasła
Autoresponder tabela vacation + alias transportu user#domena@vacation_domain, data i godzina od/do, vacation_choice_of_reply, czyszczenie vacation_notification
Panel użytkownika podgląd skrzynki i quota, przekierowania, autoresponder, zmiana hasła, zmiana nazwy (edit_mailbox_name), 2FA, hasła aplikacji, filtry Sieve
Bezpieczeństwo TOTP + wyjątki IP, hasła aplikacji, odzyskiwanie hasła e-mailem, limit prób logowania per IP/konto, CSRF, ciasteczka HttpOnly/SameSite=Strict/Secure, nagłówki CSP/HSTS, wylogowanie innych sesji po zmianie hasła, rewalidacja sesji (wyłączone konto lub odebrane uprawnienia działają natychmiast)
Inne fetchmail (hasło base64 jak w PostfixAdmin), dziennik zmian z filtrem domen i stronicowaniem, wysyłanie poczty / wiadomość do wszystkich, kopia zapasowa bazy, DKIM (tabele PostfixAdmin/OpenDKIM oraz Rspamd), ManageSieve
Hasła wszystkie formaty PostfixAdmin (ARGON2ID/I, BLF-CRYPT, SHA512-CRYPT, MD5-CRYPT, php_crypt:*, md5crypt, SSHA, Courier, Authlib, dovecot:* …) — format zapisany w rekordzie ma pierwszeństwo, więc stare i nowe hashe mogą współistnieć

Szczegółowe porównanie z PHP: PORT-PARITY.md.

Instalacja produkcyjna

1. Budowanie

cargo build --release --locked          # wynik: target/release/postfixadmin-rs
# albo pakiet Debiana (w Dockerze):
./scripts/build-deb.sh                  # wynik: packages/postfixadmin-rs_*.deb

2. Konfiguracja

install -d -m 0750 -g postfixadmin /etc/postfixadmin-rs
install -m 0640 -g postfixadmin config.example.toml /etc/postfixadmin-rs/config.toml
$EDITOR /etc/postfixadmin-rs/config.toml

Najważniejsze ustawienia:

  • [database] – dane bazy używanej przez Postfix/Dovecot. Hasło można podać w /etc/default/postfixadmin-rs jako POSTFIXADMIN_RS__DATABASE__PASSWORD=....
  • [password] scheme – musi odpowiadać temu, co obsługuje Dovecot (default_pass_scheme). Dla nowych instalacji: ARGON2ID lub SHA512-CRYPT.
  • [defaults] vacation_domain – domena transportu autorespondera z master.cf.
  • [security] – za nginx ustaw trusted_proxies = ["127.0.0.1", "::1"], cookie_secure = true, hsts = true.

3. Baza danych

export POSTFIXADMIN_RS_CONFIG=/etc/postfixadmin-rs/config.toml
postfixadmin-rs --init-schema --dry-run     # co zostałoby zmienione
postfixadmin-rs --init-schema               # tworzy brakujące tabele/kolumny/indeksy
postfixadmin-rs --create-superadmin admin@example.com   # hasło ze stdin lub POSTFIXADMIN_RS_ADMIN_PASSWORD
postfixadmin-rs --check-config

--init-schema zastępuje setup.php/upgrade.php: na pustej bazie tworzy pełny schemat PostfixAdmin (wersja 1857), na istniejącej tylko dodaje brakujące elementy — nigdy niczego nie usuwa. Jest idempotentne.

4. Usługa i reverse proxy

install -m 0644 packaging/postfixadmin-rs.service /etc/systemd/system/
systemctl daemon-reload && systemctl enable --now postfixadmin-rs

Przykład nginx z TLS, HSTS i limitem logowań: packaging/nginx.conf.example. Aplikacja nasłuchuje tylko na 127.0.0.1:8080; publicznie wystawiony jest wyłącznie nginx.

5. Zadania okresowe (opcjonalnie)

# odświeżanie statusu DNS domen (odpowiednik scripts/domain-dns-check.php)
17 3 * * *  postfixadmin  POSTFIXADMIN_RS_CONFIG=/etc/postfixadmin-rs/config.toml /usr/bin/postfixadmin-rs --refresh-dns

Migracja z PHP PostfixAdmin

  1. Kopia zapasowa bazy oraz konfiguracji Postfix/Dovecot/PostfixAdmin.
  2. Przenieś ustawienia z config.local.php do config.toml ($CONF['encrypt'] → password.scheme, $CONF['vacation_domain'], default_aliases, limity, quota_multiplier …). Przykład odwzorowania: config.from-user.toml.
  3. postfixadmin-rs --init-schema --dry-run, a potem bez --dry-run (dodaje tylko brakujące kolumny nowszych wersji PostfixAdmin).
  4. Uruchom panel równolegle (inny vhost), sprawdź logowanie, listy i jedną domenę testową.
  5. Przełącz reverse proxy, a PHP/FPM wyłącz na końcu.

Konta administratorów i skrzynek oraz ich hasła działają bez zmian.

Polecenia

postfixadmin-rs                     uruchamia serwer
postfixadmin-rs --check-config      sprawdza konfigurację, połączenie i schemat
postfixadmin-rs --init-schema       tworzy/aktualizuje schemat (--dry-run: tylko raport)
postfixadmin-rs --integrity-check   osierocone rekordy (tylko odczyt)
postfixadmin-rs --create-superadmin EMAIL
postfixadmin-rs --refresh-dns       odświeża status DNS wszystkich domen
postfixadmin-rs --version | --help

Rozwój

bash dev.sh                          # izolowana baza SQLite z danymi testowymi
POSTFIXADMIN_RS_DEV_RESET=1 bash dev.sh

Konta testowe: admin@example.test / admin123 (globalny), domain-admin@example.test / domain123 (admin example.test), user@example.test / user123 (skrzynka). Tryb SSH do prawdziwej bazy (domyślnie tylko do odczytu) opisuje .env.example.

Testy:

cargo fmt --check && cargo clippy --all-targets -- -D warnings && cargo test
python3 scripts/api-smoke.py http://127.0.0.1:8080 admin@example.test admin123   # test API na działającej instancji
python3 scripts/i18n/build.py        # przebudowa katalogu PL + kontrola brakujących tłumaczeń

Interfejs jest w src/web (zwykły JS/CSS, wbudowywany przez build.rs); teksty źródłowe są po angielsku, tłumaczenia polskie w scripts/i18n/pl_messages.py.

Licencja

GPL-2.0-or-later, jak PostfixAdmin. Zob. LICENSE i NOTICE.md.