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-rsjakoPOSTFIXADMIN_RS__DATABASE__PASSWORD=....[password] scheme– musi odpowiadać temu, co obsługuje Dovecot (default_pass_scheme). Dla nowych instalacji:ARGON2IDlubSHA512-CRYPT.[defaults] vacation_domain– domena transportu autorespondera zmaster.cf.[security]– za nginx ustawtrusted_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
- Kopia zapasowa bazy oraz konfiguracji Postfix/Dovecot/PostfixAdmin.
- Przenieś ustawienia z
config.local.phpdoconfig.toml($CONF['encrypt']→password.scheme,$CONF['vacation_domain'],default_aliases, limity,quota_multiplier…). Przykład odwzorowania: config.from-user.toml. postfixadmin-rs --init-schema --dry-run, a potem bez--dry-run(dodaje tylko brakujące kolumny nowszych wersji PostfixAdmin).- Uruchom panel równolegle (inny vhost), sprawdź logowanie, listy i jedną domenę testową.
- 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.