diff --git a/hosts/heather/tuwunel-admin.nix b/hosts/heather/tuwunel-admin.nix index 3bec457..8a6b5f6 100644 --- a/hosts/heather/tuwunel-admin.nix +++ b/hosts/heather/tuwunel-admin.nix @@ -1,20 +1,53 @@ # heather — tuwunel-admin (web admin UI for tuwunel Matrix homeserver). # -# https://github.com/matrix-construct/tuwunel-admin (приватный репо/сборка). -# Публичного docker-образа НЕТ — это статический x86_64 бинарник, собранный -# вручную (v0.0.0). Бинарник лежит вне nix-store: /var/lib/tuwunel-admin/tuwunel-admin -# (скопирован с iscg-dev-jul11 2026-07-13). При пересоздании heather с нуля — -# перескопировать с jul11 (или заново собрать из исходников). -# +# https://github.com/knadh/tuwunel-admin (Rust, axum, self-contained static binary). # Логинится matrix-пользователем на homeserver https://iscg.dev (см. [matrix] # в config.toml). Чтобы UI мог выполнять admin-команды, залогиненный юзер -# должен быть server admin tuwunel (`users make-admin` через --execute). +# должен быть server admin tuwunel (первый зарегистрированный = admin room member). # # Слушает 127.0.0.1:8009 → Caddy admin.iscg.dev терминирует TLS (см. caddy.nix). # Конфиг: /var/lib/tuwunel-admin/config.toml (вне git, root:root 0644). +# +# Бинарь: публичного docker-образа НЕТ, но есть prebuilt static musl бинарник +# в GitHub releases (v0.1.0, x86_64-unknown-linux-musl). Тащим через fetchurl + +# оборачиваем в nix-деривацию — воспроизводимо, переживает пересоздание VM. +# heather = x86_64-linux, поэтому берём x86_64-musl asset. При появлении aarch64 +# хоста — добавить второй fetchurl или собирать из исходников (Cargo.toml + lock). { config, pkgs, lib, ... }: -{ + +let + tuwunel-admin = pkgs.stdenv.mkDerivation rec { + pname = "tuwunel-admin"; + version = "0.1.0"; + + # Prebuilt static musl binary (x86_64 only). sha256 из checksums.txt релиза. + src = pkgs.fetchurl { + url = "https://github.com/knadh/tuwunel-admin/releases/download/v${version}/tuwunel-admin_${version}_x86_64-unknown-linux-musl.tar.gz"; + sha256 = "a22c345f414f9af34d28f7b9166922b736e8774737f67038252d5422f47a2201"; + }; + + # tar.gz с tuwunel-admin (бинарь) + LICENSE + README. Просто копируем бинарь. + dontBuild = true; + dontConfigure = true; + + installPhase = '' + runHook preInstall + install -Dm555 tuwunel-admin $out/bin/tuwunel-admin + install -Dm444 LICENSE $out/share/licenses/tuwunel-admin/LICENSE + install -Dm444 README.md $out/share/doc/tuwunel-admin/README.md + runHook postInstall + ''; + + meta = with lib; { + description = "Web admin UI for tuwunel Matrix homeserver"; + homepage = "https://github.com/knadh/tuwunel-admin"; + license = licenses.asl20; + mainProgram = "tuwunel-admin"; + platforms = [ "x86_64-linux" ]; + }; + }; +in { systemd.services.tuwunel-admin = { description = "tuwunel-admin (Matrix admin web UI)"; after = [ "network-online.target" ]; @@ -22,11 +55,12 @@ wantedBy = [ "multi-user.target" ]; serviceConfig = { Type = "simple"; - ExecStart = "/var/lib/tuwunel-admin/tuwunel-admin --config /var/lib/tuwunel-admin/config.toml"; + # Бинарь из nix-store (деривация выше), конфиг вне git на хосте. + ExecStart = "${tuwunel-admin}/bin/tuwunel-admin --config /var/lib/tuwunel-admin/config.toml"; WorkingDirectory = "/var/lib/tuwunel-admin"; Restart = "on-failure"; RestartSec = 5; - # Бинарник статический, рут-запуск ок (биндит 127.0.0.1:8009). + # Статический бинарь, рут-запуск (биндит 127.0.0.1:8009, читает config.toml). User = "root"; Environment = [ "HOME=/var/lib/tuwunel-admin" ]; };