# 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, ale wszystkie artefakty są publikowane jednym atomowym przełączeniem `repository/current`. ## 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 | +-> cargo test +-> Linux cargo build | +-> DEB | +-> RPM | +-> izolowana kopia źródła +-> poprawki FreeBSD/OPNsense +-> x86_64-unknown-freebsd +-> os-rustproxy.pkg | +-> APT metadata +-> RPM metadata +-> OPNsense pkg metadata +-> walidacja +-> atomic switch repository/current ``` Jeżeli którykolwiek etap się nie powiedzie, publiczne repozytoria nie są przełączane. ## 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 ``` `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/ ``` Jeden release zawiera jednocześnie `apt/`, `rpm/` i `opnsense/`. Dzięki temu oba publiczne adresy przechodzą na nową wersję jednocześnie. ## 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.