# rustbox-package-builder Linux-only builder i repozytorium pakietów dla RustBox. Projekt jest uproszczoną wersją pipeline'u używanego dla RustProxy: nie zawiera FreeBSD, OPNsense ani dodatkowego agenta. ## Co buduje Z jednego commita RustBox dla `amd64/x86_64`: - podpisany DEB i repo APT, - podpisany RPM i repo DNF/YUM, - opcjonalny osobny RPM dla SUSE/openSUSE i repo Zypper, - panel WWW repozytorium w stylistyce RustBox, - publiczny JSON `GET /api/v1/packages`. Builder obserwuje `SOURCE_BRANCH`. Nowy commit lub zmiana `PACKAGING_REVISION` uruchamia testy, release build i publikację nowego snapshotu. `current` jest przełączany atomowo dopiero po udanym pakowaniu i podpisaniu metadanych. ## Wymaganie po stronie źródeł RustBox Repo RustBox musi obsługiwać natywne logowanie plikowe przez `log_dir`. Pakiet ustawia: ```toml log_dir = "/var/log/rustbox" ``` Builder celowo przerywa build, jeśli w źródłach nie ma obsługi `log_dir`. Dzięki temu logi aplikacji trafiają do `/var/log/rustbox/rustbox.log`, a nie do stdout usługi systemd. ## Szybki start ```bash cp .env.example .env nano .env ./start.sh ``` Minimalnie ustaw: ```env SOURCE_REPO=https://git.example.com/rustbox/RustBox.git SOURCE_BRANCH=master REPOSITORY_URL=https://repo.example.com ``` Dla lokalnego HTTP można użyć: ```env REPOSITORY_URL=http://192.168.1.100 HTTP_PORT=18765 ``` `start.sh` utworzy trwały klucz GPG w `gpg/`, zbuduje obrazy i uruchomi: - `rustbox-package-builder` — watcher + build + publikacja, - `repository-dashboard` — read-only panel/API, - `repository-http` — Nginx udostępniający panel oraz artefakty APT/RPM. Dane buildera są trwałe w `data/`. ## Domyślne ustawienia builda ```env POLL_INTERVAL=300 REPO_DISTRIBUTION=stable REPO_COMPONENT=main PACKAGE_RELEASE=auto RUN_LINUX_TESTS=compile MAX_GLIBC_VERSION=2.34 BUILD_SUSE=1 RELEASE_RETENTION=10 ``` `RUN_LINUX_TESTS=compile` uruchamia `cargo test --release --locked --no-run`. Ustaw `full`, aby uruchamiać wszystkie testy, albo `0`, aby je wyłączyć. ## Instalacja pakietu RustBox Pakiet instaluje: ```text /usr/local/bin/rustbox /usr/lib/systemd/system/rustbox.service /etc/rustbox/rustbox.toml /etc/logrotate.d/rustbox ``` oraz tworzy: ```text /var/lib/rustbox rustbox:rustbox 0700 /var/log/rustbox rustbox:rustbox 0750 /etc/rustbox rustbox:rustbox 0750 ``` `/etc/rustbox/rustbox.toml` ma finalnie `rustbox:rustbox 0640` i jest oznaczony jako `config|noreplace`, więc aktualizacja pakietu nie nadpisuje lokalnej konfiguracji. ### systemd Jednostka używa: ```ini User=rustbox Group=rustbox Environment=RUSTBOX_CONFIG=/etc/rustbox/rustbox.toml WorkingDirectory=/var/lib/rustbox ExecStart=/usr/local/bin/rustbox StateDirectory=rustbox LogsDirectory=rustbox ProtectSystem=strict ProtectHome=true NoNewPrivileges=true ``` Logi tracing RustBox trafiają do `/var/log/rustbox/rustbox.log`. `StandardOutput=null`; `StandardError=journal` zostaje tylko dla błędów startowych, które wystąpią zanim aplikacja uruchomi własny logger. ### logrotate `/etc/logrotate.d/rustbox`: ```text /var/log/rustbox/rustbox.log ``` jest obracany codziennie i przechowywany przez 7 rotacji, z kompresją i właścicielem `rustbox:rustbox`. ## Domyślna konfiguracja pakietu ```toml host = "0.0.0.0" port = 3001 environment = "production" data_dir = "/var/lib/rustbox" log_dir = "/var/log/rustbox" session_timeout_hours = 72 remember_me_enabled = true remember_me_days = 30 imap_host = "localhost" imap_port = 993 smtp_host = "localhost" smtp_port = 587 tls_enabled = true tls_verify = false max_attachment_size_mb = 50 max_message_size_mb = 100 sieve_port = 4190 sieve_tls_mode = "none" sieve_allow_insecure_auth = true sieve_timeout_secs = 10 default_junk_folder = "Spam" default_theme = "system" default_interface_skin = "apple-mail" trusted_proxies = "127.0.0.1,::1" outgoing_headers = [] pgp_wkd_enabled = true pgp_hkp_enabled = false pgp_hkp_url = "https://keys.openpgp.org" pgp_network_timeout_secs = 10 pgp_max_key_bytes = 1048576 pgp_allow_private_export = true ``` ## Repo APT Panel pokazuje gotowe polecenia. Ręcznie: ```bash curl -fsSL https://repo.example.com/repo-key.gpg \ | sudo gpg --dearmor -o /usr/share/keyrings/rustbox.gpg echo "deb [signed-by=/usr/share/keyrings/rustbox.gpg] https://repo.example.com/apt stable main" \ | sudo tee /etc/apt/sources.list.d/rustbox.list sudo apt update sudo apt install rustbox ``` ## Repo DNF/YUM ```bash sudo rpm --import https://repo.example.com/repo-key.gpg sudo tee /etc/yum.repos.d/rustbox.repo >/dev/null <<'REPO' [rustbox] name=RustBox Repository baseurl=https://repo.example.com/rpm/$basearch enabled=1 gpgcheck=1 repo_gpgcheck=1 gpgkey=https://repo.example.com/repo-key.gpg REPO sudo dnf install rustbox ``` ## Repo SUSE/Zypper ```bash sudo rpm --import https://repo.example.com/repo-key.gpg sudo zypper addrepo --refresh --gpgcheck https://repo.example.com/suse/x86_64/ rustbox sudo zypper refresh rustbox sudo zypper install rustbox ``` ## Reverse proxy Nginx buildera nasłuchuje lokalnie na `HTTP_PORT` (domyślnie `18765`). Dla publicznego HTTPS zalecany jest zewnętrzny reverse proxy kierujący na ten port. ## Logi buildera ```bash docker compose --env-file .env logs -f rustbox-package-builder docker compose --env-file .env logs -f repository-http docker compose --env-file .env logs -f repository-dashboard ``` ## Licencja paczki Dostarczone źródła RustBox nie zawierają autorytatywnego pliku `LICENSE`; `NOTICE.md` zaleca weryfikację licencji upstream przed publiczną redystrybucją. Dlatego builder ustawia obecnie metadane pakietu na `UNKNOWN`, zamiast zgadywać licencję. Przed publicznym repozytorium warto ustalić właściwe oznaczenie i wtedy zmienić je w `scripts/prepare-package.sh`. ## Zależności runtime Pakiety deklarują jawnie systemowy OpenSSL i GnuPG używane przez RustBox. Dla APT są to `libssl3`/`libssl3t64` i `gnupg`, dla RHEL/Rocky `openssl-libs` i `gnupg2`, a dla SUSE `libopenssl3` i `gpg2`.