# RustProxy unified package builder Jeden kontener buildera buduje z jednego commita RustProxy: - Linux x86_64: DEB + podpisane repo APT, - Linux x86_64: RPM + podpisane repo DNF/YUM, - FreeBSD x86_64: cross-build bez VM FreeBSD, - OPNsense: `os-rustproxy-_.pkg` + statyczne repo `pkg`. Nie ma Docker-in-Docker, SCP ani osobnego watchera repo OPNsense. FreeBSD sysroot, clang/lld i Rust target są częścią głównego obrazu buildera. OPNsense dostaje osobny publiczny adres. Gałąź Linux i gałąź OPNsense są budowane oraz publikowane niezależnie, więc błąd testów Linux nie blokuje pakietu FreeBSD. ## Szybki start ```bash cp .env.example .env nano .env ./start.sh ``` Minimalnie ustaw: ```env SOURCE_REPO=https://git.linuxiarz.pl/gru/RustProxy.git REPOSITORY_URL=http://192.168.1.100 OPNSENSE_REPOSITORY_URL=https://opn-rustproxy.linuxiarz.pl ``` Dla `http://` bez portu `start.sh` dopisze domyślny port. Dla `https://` zakładany jest zewnętrzny reverse proxy/TLS. Domyślne lokalne porty: ```text APT/RPM: 18765 -> nginx :8080 OPNsense: 18766 -> nginx :8081 ``` Przykładowo reverse proxy może kierować: ```text packages.example.net -> http://builder:18765 opn-rustproxy.linuxiarz.pl -> http://builder:18766 ``` ## Pipeline ```text Git RustProxy | wspólny checkout / \ / \ Linux branch OPNsense branch cargo test izolowana kopia źródła cargo build poprawki FreeBSD DEB + RPM cross-build FreeBSD APT + DNF os-rustproxy.pkg | | v v publikacja Linux publikacja OPNsense ``` `cargo test` należy tylko do gałęzi Linux. Jeśli testy nie przejdą, DEB/RPM nie są publikowane, ale builder nadal uruchamia cross-build FreeBSD i może opublikować repo OPNsense. Stan jest śledzony osobno w `last_linux_commit` i `last_opnsense_commit`, więc kolejny cykl ponawia tylko brakującą gałąź. ## OPNsense repo Publiczny root `OPNSENSE_REPOSITORY_URL` zawiera m.in.: ```text / ├── meta.conf ├── packagesite.pkg ├── data.pkg ├── RustProxy.conf ├── BUILD-INFO.txt ├── SHA256 ├── os-rustproxy-latest.pkg └── 26.7/ └── amd64/ ├── os-rustproxy-0.20.0_123.pkg └── ... ``` `RustProxy.conf` jest generowany automatycznie i wskazuje na `OPNSENSE_REPOSITORY_URL`. Repo OPNsense jest obecnie niesygnowane, zgodnie z wcześniejszym builderem/repo (`signature_type: "none"`). Repo APT/RPM pozostaje podpisane GPG. Ręczna konfiguracja na OPNsense: ```sh mkdir -p /usr/local/etc/pkg/repos fetch -o /usr/local/etc/pkg/repos/RustProxy.conf \ https://opn-rustproxy.linuxiarz.pl/RustProxy.conf pkg update -f pkg install os-rustproxy ``` ## Konfiguracja Najważniejsze zmienne: ```env SOURCE_REPO=https://git.linuxiarz.pl/gru/RustProxy.git SOURCE_BRANCH=master REPOSITORY_URL=http://192.168.1.100 HTTP_PORT=18765 OPNSENSE_REPOSITORY_URL=https://opn-rustproxy.linuxiarz.pl OPNSENSE_HTTP_PORT=18766 POLL_INTERVAL=300 PACKAGE_RELEASE=auto MAX_GLIBC_VERSION=2.34 RUN_LINUX_TESTS=1 OPNSENSE_ABI=26.7 OPNSENSE_RETENTION=10 FREEBSD_RELEASE=15.1-RELEASE FREEBSD_ABI=FreeBSD:15:amd64 FREEBSD_ARCH=freebsd:15:x86:64 FREEBSD_RUST_TOOLCHAIN=1.88.0 APPLY_FREEBSD_PATCHES=1 ``` `RUN_LINUX_TESTS=1` jest domyślne. Testy są bramką tylko dla DEB/RPM i nie wpływają na gałąź OPNsense. Ustaw `0`, jeśli chcesz całkowicie pominąć testy Linux. `OPNSENSE_RETENTION=10` zachowuje ostatnie 10 wersji pakietu dla danej serii/architektury OPNsense. `0` wyłącza usuwanie starych wersji. ## FreeBSD cross-build Obraz buildera pobiera i weryfikuje `base.txz` dla `FREEBSD_RELEASE`, a następnie używa: ```text /opt/freebsd-sysroot clang / lld / llvm Rust target x86_64-unknown-freebsd ``` Poprawki tylko dla builda OPNsense są w: ```text opnsense/patches//*.patch ``` Są nakładane na izolowaną kopię źródła. Build Linux nie jest modyfikowany. Kod pluginu OPNsense znajduje się w: ```text opnsense/plugin/ ``` ## Dane ```text data/ ├── aptly/ ├── cargo/ ├── packages/ │ ├── deb/ │ └── rpm/x86_64/ ├── repository/ │ ├── current -> releases/ │ ├── apt -> current/apt │ ├── rpm -> current/rpm │ ├── opnsense -> current/opnsense │ └── releases/ ├── state/ └── work/ ``` Każda publikacja tworzy nowy snapshot `repository/releases/...` i atomowo przełącza `current`. Przy publikacji Linux poprzedni katalog OPNsense jest zachowywany, a przy publikacji OPNsense zachowywane są aktualne APT/RPM. Dzięki temu obie gałęzie są niezależne, ale nginx nadal serwuje jeden spójny snapshot katalogu. ## HTTP i logi Jeden kontener nginx obsługuje oba repozytoria na dwóch lokalnych portach: ```bash docker compose logs -f rust-package-builder docker compose logs -f repository-http curl -f http://127.0.0.1:18765/healthz curl -f http://127.0.0.1:18766/healthz ``` ## Testy statyczne ```bash ./tests/static.sh ./tests/check-rustproxy-source.sh /sciezka/do/RustProxy ``` ## Klucz GPG `./start.sh` generuje trwały klucz GPG przy pierwszym uruchomieniu. Katalogu `gpg/` nie należy usuwać po publikacji APT/RPM. ## Migracja ze starszego buildera Linux-only Builder używa osobnych stanów: ```text data/state/last_linux_commit data/state/last_opnsense_commit ``` Jeżeli istnieje starsze `last_commit` oraz poprawne APT/RPM dla tego SHA, zostanie ono potraktowane jako stan gałęzi Linux. Brak repo OPNsense uruchomi wyłącznie gałąź OPNsense. Po udanym OPNsense kolejny cykl nie będzie ponownie kompilował FreeBSD, nawet jeśli testy Linux nadal nie przechodzą. ## FreeBSD patch version detection The OPNsense branch reuses the Cargo package `VERSION` already detected by the main build pipeline. If `apply-freebsd-patches.sh` is run manually, it falls back to `RUST_PROXY_PYTHON` (`/usr/bin/python3.11`) so Rocky Linux 9's default Python 3.9 does not cause a missing `tomllib` error.