- Rust 49.9%
- Nix 19%
- CSS 17.6%
- HTML 9.5%
- JavaScript 4%
| .forgejo | ||
| hosts/hochzeit | ||
| nix | ||
| src | ||
| static | ||
| templates | ||
| users/steffen | ||
| .gitignore | ||
| .sops.yaml | ||
| Cargo.lock | ||
| Cargo.toml | ||
| flake.lock | ||
| flake.nix | ||
| README.md | ||
hochzeit-web
Passwortgeschützte Foto-Galerie für unsere Hochzeit (Rust/axum) auf lshermann.de.
Ein Passwort für alle Gäste, Events als Reiter (kirchliche Hochzeit später = Ordner kirchlich/ anlegen),
Ordner-Galerien mit gecachten Thumbnails, Einzeldownload + ZIP-Stream, Upload per scp oder WebDAV.
Lokale Entwicklung
nix develop
echo geheim > /tmp/hw-pw
HW_DATA_DIR=./sample-data HW_CACHE_DIR=/tmp/hw-cache \
HW_PASSWORD_FILE=/tmp/hw-pw HW_LISTEN=127.0.0.1:8629 cargo run
Datenlayout: sample-data/standesamt/<name>/*.jpg
Fotos hochladen
Konvention: /data/hochzeit/<event>/<ordner>/ — Ordnername = Anzeigename, neue Fotos erscheinen sofort.
Vorschau-Banner nach dem Login: automatisch das erste Bild des ersten Ordners. Eigenes Bild wählen: z. B. vorschau1.jpg direkt nach /data/hochzeit/standesamt/ legen (außerhalb der Ordner) — es taucht nicht in den Galerien auf.
scp -P 2299 -r ./beccy steffen@lshermann.de:/data/hochzeit/standesamt/
Ohne Terminal: https://dav.lshermann.de als Netzlaufwerk einbinden (Login nur Steffen & Beccy) —
Windows: Explorer → Dieser PC → „Netzlaufwerk verbinden"; macOS: Finder → Cmd+K.
Windows-Limit ~47 MB pro Datei (Registry FileSizeLimitInBytes) — Fotos ok, Videos per scp.
Troubleshooting: HEIC vorher konvertieren (magick mogrify -format jpg *.heic),
chmod -R a+rX /data/hochzeit falls Bilder fehlen, erster Ordner-Aufruf baut die Thumbnails.
Deploy
Hetzner VPS (UEFI-Boot, wie edge), DNS A für lshermann.de, www, dav.
Erstinstallation (NixOS-Minimal-ISO booten, Partitionieren nach synix-Template — GPT: 1G EF00 BOOT,
4G swap SWAP, Rest ext4 ROOT, gemountet nach /mnt):
ssh-keygen -t ed25519 -f /tmp/hostkey -N "" # Host-Key vorab, damit sops ab Boot 1 läuft
ssh-to-age < /tmp/hostkey.pub # → als host_hochzeit in .sops.yaml, dann:
sops updatekeys hosts/hochzeit/secrets/secrets.yaml
scp /tmp/hostkey root@<ip>:/mnt/etc/ssh/ssh_host_ed25519_key
nix build .#nixosConfigurations.hochzeit.config.system.build.toplevel
nix copy -s --no-check-sigs --to "ssh://root@<ip>?remote-store=local?root=/mnt" ./result
ssh root@<ip> nixos-install --system <storepath> --no-root-passwd
# ISO auswerfen, reboot — danach läuft alles auf Port 2299
Passwörter ändern: sops hosts/hochzeit/secrets/secrets.yaml (Keys: hochzeit-web-password,
webdav-htpasswd — Zeile via nix shell nixpkgs#apacheHttpd --command htpasswd -nB beccy).
Updates laufen automatisch über Forgejo Actions (.forgejo/workflows/ci.yml, Runner portuus-nix):
- Push auf
mainund Pull Requests:nix flake check(App-Build, pre-commit-check mit nixfmt/statix/rustfmt/ shellcheck/yamllint/actionlint, deploy-rs-Checks inkl. Systembuild) sowiecargo fmt --checkundcargo clippy -D warnings. - Nur Push auf
main: danach Deploy per deploy-rs mit Magic Rollback (deploy.nodes.hochzeitinflake.nix). Der Runner nutzt den Deploy-Key aus dem Repo-SecretHOCHZEIT_DEPLOY_KEY(öffentlicher Teil:hosts/hochzeit/deploy_key.pub) und prüft den Host-Key gegen.forgejo/known_hosts.
Manuell (z. B. Notfall), mit eigenem SSH-Key:
nix run github:serokell/deploy-rs -- .#hochzeit
Zusätzlich scannt .forgejo/workflows/security.yml wöchentlich (montags) bzw. auf Knopfdruck das System mit vulnix
und vergleicht per nvd mit dem letzten Scan; rot nur bei neuen CVEs mit CVSS >= 9.0.
Der App-Build bezieht nur Cargo.*, src/, templates/ und static/ ein – Änderungen an Doku oder Nix-Config
bauen die App also nicht neu.
Betrieb
- Thumbnail-Cache
/var/cache/hochzeit-web— kann jederzeit gelöscht werden. - Logs:
journalctl -u hochzeit-web/-u dufs-webdav/-u nginx. - Passwort ändern loggt alle Gäste aus (Feature — Cookie-Key wird aus dem Passwort abgeleitet).
- Aufbau: axum auf
127.0.0.1:8629hinter nginx (TLS/Let's Encrypt), dufs auf127.0.0.1:5001für WebDAV hinter nginx-Basic-Auth, Secrets via sops-nix.