No description
  • Rust 49.9%
  • Nix 19%
  • CSS 17.6%
  • HTML 9.5%
  • JavaScript 4%
Find a file
steffen 29521147c0
Some checks failed
CI / flake-check (push) Successful in 2m59s
CI / lint (push) Failing after 13s
CI / deploy (push) Has been skipped
ci/cds
2026-10-08 16:59:06 +02:00
.forgejo ci/cds 2026-10-08 16:59:06 +02:00
hosts/hochzeit ci/cds 2026-10-08 16:59:06 +02:00
nix ci/cds 2026-10-08 16:59:06 +02:00
src changed pw; added video supp 2026-08-30 18:29:56 +02:00
static changed pw; added video supp 2026-08-30 18:29:56 +02:00
templates changed pw; added video supp 2026-08-30 18:29:56 +02:00
users/steffen initial commit 2026-08-27 17:55:34 +02:00
.gitignore initial commit 2026-08-27 17:55:34 +02:00
.sops.yaml better 1st install 2026-08-27 18:50:52 +02:00
Cargo.lock changed pw; added video supp 2026-08-30 18:29:56 +02:00
Cargo.toml changed pw; added video supp 2026-08-30 18:29:56 +02:00
flake.lock ci/cds 2026-10-08 16:59:06 +02:00
flake.nix ci/cds 2026-10-08 16:59:06 +02:00
README.md ci/cds 2026-10-08 16:59:06 +02:00

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 main und Pull Requests: nix flake check (App-Build, pre-commit-check mit nixfmt/statix/rustfmt/ shellcheck/yamllint/actionlint, deploy-rs-Checks inkl. Systembuild) sowie cargo fmt --check und cargo clippy -D warnings.
  • Nur Push auf main: danach Deploy per deploy-rs mit Magic Rollback (deploy.nodes.hochzeit in flake.nix). Der Runner nutzt den Deploy-Key aus dem Repo-Secret HOCHZEIT_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:8629 hinter nginx (TLS/Let's Encrypt), dufs auf 127.0.0.1:5001 für WebDAV hinter nginx-Basic-Auth, Secrets via sops-nix.