Files
djnizz-website/README.md
T
Nizz05andClaude Opus 5 131b30f9b0 README: Deploy-Key statt HTTPS-Clone auf der VM
Das Repo ist privat, ein HTTPS-Clone auf dem Server wuerde interaktiv nach
Zugangsdaten fragen. Stattdessen ein repo-eigener Deploy-Key mit Nur-Lese-
Rechten und ein eigener Host-Alias, damit der Key nicht bei anderen
GitHub-Repos angeboten wird.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-17 23:28:25 +02:00

198 lines
6.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# djnizz.at
Website von DJ NIZZ. Astro 7 (statisch vorgerendert) hinter einem Node-Server,
Tailwind 4, ausgeliefert per Docker + Caddy mit automatischem HTTPS.
## Inhalte ändern
Fast alles steht in **[`src/data/site.ts`](src/data/site.ts)** Texte, Genres,
Kontaktdaten, Navigation, Social-Links. Für normale Textänderungen musst du
keine Komponente anfassen.
- **Social-Profile**: In `SOCIALS` die `url` eintragen. Einträge ohne URL werden
automatisch ausgeblendet, du kannst also alles stehen lassen, was du noch
nicht hast.
- **Neues Genre**: In `GENRES` ergänzen. Marquee, Genre-Karten, Zähler in der
About-Sektion, Footer-Text und die strukturierten Daten ziehen automatisch nach.
Für die Akzentfarbe muss der Name in `accentVar` in
[`src/components/About.astro`](src/components/About.astro) existieren.
- **Impressum / Datenschutz**: [`src/pages/impressum.astro`](src/pages/impressum.astro)
und [`src/pages/datenschutz.astro`](src/pages/datenschutz.astro).
## Lokal entwickeln
```bash
npm install
npm run dev
```
Läuft auf http://localhost:4321.
```bash
npm run build # nach dist/ bauen
npm run preview # gebaute Seite wie in Produktion starten
```
## Bild-Assets
Die Quellbilder liegen in `src/assets/`. Abgeleitete Dateien (Hero-Hintergrund,
OG-Bild, Favicons) erzeugt:
```bash
npm run assets
```
Der freigestellte Render `src/assets/nizz-cutout.png` entsteht separat aus dem
Ganzkörper-Bild:
```bash
node scripts/cutout.mjs pfad/zum/render.jpg src/assets/nizz-cutout.png 70
```
Das Skript trennt über eine Sobel-Kantenkarte frei und entfernt zusätzlich
eingeschlossene Hintergrundflächen (z. B. zwischen Arm und Oberkörper). Der
letzte Parameter ist die Kantenschwelle höher = aggressiver, damit fallen
weiche Bodenschatten weg.
## Deployment auf Oracle Cloud
Läuft sowohl auf Ampere A1 (ARM) als auch auf x86 die verwendeten Images sind
Multi-Arch.
### 1. Netzwerk freigeben (zwei Stellen!)
Der häufigste Stolperstein bei OCI: Ports müssen **sowohl** in der Cloud-Firewall
**als auch** in der Instanz freigegeben werden.
**a) VCN Security List / NSG** in der OCI-Konsole Ingress-Regeln für
`0.0.0.0/0` auf TCP 80 und TCP 443 (und UDP 443, wenn HTTP/3 genutzt werden soll).
**b) Firewall in der Instanz.** Oracle-Linux-Images bringen firewalld mit:
```bash
sudo firewall-cmd --permanent --add-service=http --add-service=https
sudo firewall-cmd --permanent --add-port=443/udp
sudo firewall-cmd --reload
```
Ubuntu-Images von Oracle haben stattdessen eine restriktive iptables-Regel:
```bash
sudo iptables -I INPUT 6 -m state --state NEW -p tcp --dport 80 -j ACCEPT
sudo iptables -I INPUT 6 -m state --state NEW -p tcp --dport 443 -j ACCEPT
sudo netfilter-persistent save
```
### 2. DNS
A-Record `djnizz.at` → öffentliche IP der Instanz. Wenn `www.djnizz.at` genutzt
werden soll, dafür ebenfalls einen A-Record anlegen sonst den `www`-Block im
[`Caddyfile`](Caddyfile) auskommentieren, weil Caddy sonst dauerhaft erfolglos
ein Zertifikat dafür anfordert.
### 3. Docker installieren
```bash
curl -fsSL https://get.docker.com | sudo sh
sudo usermod -aG docker $USER
```
Danach einmal neu einloggen.
### 4. Deploy-Key einrichten
Das Repo ist privat, ein HTTPS-Clone auf der VM würde also nach Zugangsdaten
fragen. Stattdessen bekommt die VM einen eigenen Deploy-Key mit **Nur-Lese-Rechten**:
```bash
ssh-keygen -t ed25519 -C "djnizz-vm-deploy" -f ~/.ssh/djnizz_deploy -N ""
cat ~/.ssh/djnizz_deploy.pub
```
Den ausgegebenen Public Key in GitHub unter **Repo → Settings → Deploy keys →
Add deploy key** eintragen und *Allow write access* **nicht** anhaken.
Anschließend einen eigenen Host-Alias anlegen bewusst nicht `Host github.com`,
sonst würde dieser Key auch bei allen anderen GitHub-Repos angeboten und dort
scheitern:
```bash
cat >> ~/.ssh/config <<'EOF'
Host github-djnizz
HostName github.com
User git
IdentityFile ~/.ssh/djnizz_deploy
IdentitiesOnly yes
EOF
chmod 600 ~/.ssh/config
ssh -T git@github-djnizz
```
Die letzte Zeile muss mit `Hi nizzgruber/djnizz_website! You've successfully
authenticated` antworten. Dass GitHub danach „does not provide shell access"
meldet, ist normal und kein Fehler.
### 5. Starten
```bash
git clone git@github-djnizz:nizzgruber/djnizz_website.git
cd djnizz_website
docker compose up -d --build
```
Caddy holt sich das Let's-Encrypt-Zertifikat automatisch, sobald die Domain auf
den Server zeigt. Fortschritt prüfen:
```bash
docker compose logs -f caddy
```
### Updates ausrollen
```bash
git pull
docker compose up -d --build
```
### Konfiguration
Domain und ACME-Mailadresse lassen sich per `.env` neben der
`docker-compose.yml` überschreiben:
```env
DOMAIN=djnizz.at
ACME_EMAIL=business.djnizz@gmail.com
```
> Das Volume `caddy_data` enthält die TLS-Zertifikate. Nicht löschen sonst
> werden bei jedem Neustart neue Zertifikate angefordert und irgendwann greift
> das Rate-Limit von Let's Encrypt.
## Datenschutz
Die Seite lädt nichts von externen Servern: Schriften sind selbst gehostet, es
gibt keine Cookies, kein Tracking und keine eingebetteten Player. Caddy kürzt in
den Access-Logs die Client-IP (`ip_mask`) und löscht sie nach 14 Tagen das muss
so bleiben, sonst stimmt die Datenschutzerklärung nicht mehr.
Wenn später ein Booking-Formular, Analytics oder Spotify-/YouTube-Embeds
dazukommen, muss `src/pages/datenschutz.astro` entsprechend erweitert werden.
## Struktur
```
src/
assets/ Bilder (werden beim Build zu WebP/AVIF optimiert)
components/ Header, Hero, About, Footer, SocialIcon
data/site.ts Zentrale Inhalts- und Konfigurationsdatei
layouts/ Base (SEO, JSON-LD), Legal
pages/ index, impressum, datenschutz, 404
styles/ global.css (Tailwind-Theme, Animationen)
scripts/ Einmalige Bildaufbereitung
```
Die Seiten sind alle vorgerendert. Der Node-Adapter ist trotzdem drin, damit
später einzelne Routen (z. B. `/api/booking`) mit `export const prerender = false`
dynamisch werden können, ohne dass sich am Deployment etwas ändert.