# heather — tuwunel-admin (web admin UI for tuwunel Matrix homeserver). # # 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 (первый зарегистрированный = 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" ]; wants = [ "network-online.target" ]; wantedBy = [ "multi-user.target" ]; serviceConfig = { Type = "simple"; # Бинарь из 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, читает config.toml). User = "root"; Environment = [ "HOME=/var/lib/tuwunel-admin" ]; }; }; }