opn
2026-10-07 09:43:58 +02:00
2026-10-10 00:16:01 +02:00
2026-10-08 22:22:11 +02:00
2026-10-08 22:22:11 +02:00
2026-10-08 22:22:11 +02:00
2026-10-06 23:03:38 +02:00
2026-10-07 11:05:35 +02:00
2026-10-06 23:03:38 +02:00
opn
2026-10-07 09:23:17 +02:00
2026-10-08 22:22:11 +02:00
2026-10-08 22:22:11 +02:00
opn
2026-10-07 09:23:17 +02:00

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-<version>_<revision>.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

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

Minimalnie ustaw:

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:

APT/RPM:  18765 -> nginx :8080
OPNsense: 18766 -> nginx :8081

Przykładowo reverse proxy może kierować:

packages.example.net             -> http://builder:18765
opn-rustproxy.linuxiarz.pl       -> http://builder:18766

Pipeline

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

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

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:

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:

/opt/freebsd-sysroot
clang / lld / llvm
Rust target x86_64-unknown-freebsd

Poprawki tylko dla builda OPNsense są w:

opnsense/patches/<wersja-RustProxy>/*.patch

Są nakładane na izolowaną kopię źródła. Build Linux nie jest modyfikowany.

Kod pluginu OPNsense znajduje się w:

opnsense/plugin/

Rotacja logów RustProxy

  • DEB/RPM: builder zawsze umieszcza packaging/rustproxy.logrotate w /etc/logrotate.d/rustproxy (nFPM: config|noreplace). Logrotate jest zależnością obu pakietów. Reguła obejmuje /var/log/rustproxy/*.jsonl, *.log i vhosts/*.jsonl, z rotacją codzienną lub po przekroczeniu 100 MiB, 14 archiwami, gzip z opóźnioną kompresją, copytruncate oraz su rustproxy rustproxy.
  • OPNsense/FreeBSD PKG: pakiet dostarcza /usr/local/etc/newsyslog.conf.d/rustproxy.conf dla tych samych ścieżek; newsyslog wykonuje rotację codziennie lub przy rozmiarze 100 MiB, przechowuje 14 archiwów, pomija puste pliki i używa gzip z niekompresowanym najnowszym archiwum. Plik *.log jest ponownie otwierany przez daemon(8) po SIGHUP (opcja -H w skrypcie rc.d). OPNsense uruchamia usługę jako root, dlatego newsyslog używa root:wheel.

Uwaga FreeBSD: newsyslog działa przez zmianę nazwy pliku, nie ma copytruncate. Pliki JSONL i inne logi otwarte bezpośrednio przez aplikację muszą być przez nią ponownie otwierane po rotacji. W przeciwnym razie proces może pisać do poprzedniego (przeniesionego) pliku; zachowanie nie jest identyczne z Linux. Reguły są instalowane, ale na działającym OPNsense należy zweryfikować sposób otwierania plików przez RustProxy.

Zmiana konfiguracji pakietów ustawia PACKAGING_REVISION=2. check-and-build.sh porównuje rewizję z metadanymi aktualnych repozytoriów; po podmianie buildera ./start.sh przebudowuje obie gałęzie nawet przy tym samym SHA źródła. Automatyczny release DEB/RPM oraz rewizja PKG są zwiększane, aby menedżer pakietów mógł zainstalować nową wersję. Konfiguracja w /etc/logrotate.d/rustproxy jest oznaczona jako noreplace, więc lokalna wersja zmodyfikowana przez administratora może zostać zachowana (zależnie od menedżera pakietów).

Kontrola po zainstalowaniu:

# DEB / RPM (nie wykonuje rotacji)
logrotate -d /etc/logrotate.d/rustproxy

# OPNsense (nie wykonuje rotacji)
newsyslog -n -v -f /usr/local/etc/newsyslog.conf.d/rustproxy.conf

Pakietowe testy integracyjne (lokalnie, bez budowy aplikacji):

./tests/log-rotation.sh

Dane

data/
├── aptly/
├── cargo/
├── packages/
│   ├── deb/
│   └── rpm/x86_64/
├── repository/
│   ├── current -> releases/<build>
│   ├── 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:

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

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

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.

S
Description
No description provided
Readme
596 KiB
0 Stars 1 Watchers 0 Forks
Languages
Shell 52.9%
CSS 12.9%
Python 11.4%
JavaScript 10.2%
HTML 6.3%
Other 6.3%