Files
rustbox-package-builder/README.md
T
2026-10-30 12:59:58 +01:00

5.9 KiB

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:

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

cp .env.example .env
nano .env
./start.sh

Minimalnie ustaw:

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ć:

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

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:

/usr/local/bin/rustbox
/usr/lib/systemd/system/rustbox.service
/etc/rustbox/rustbox.toml
/etc/logrotate.d/rustbox

oraz tworzy:

/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:

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:

/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

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:

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

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

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

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.