219 lines
5.9 KiB
Markdown
219 lines
5.9 KiB
Markdown
# 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`.
|
|
|