kennzeichen-seite/SETUP.md
2026-05-20 20:47:07 +02:00

268 lines
6.4 KiB
Markdown
Raw Permalink 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.

# Setup-Anleitung — Debian Server
## Voraussetzungen
- Debian 11 / 12
- Root oder sudo-Zugriff
- Dein Hetzner Reverse Proxy zeigt auf diese Maschine
- Port 8888 im Reverse Proxy weitergeleitet
---
## 1. Docker installieren (falls noch nicht vorhanden)
```bash
# Alte Versionen entfernen
sudo apt remove docker docker-engine docker.io containerd runc 2>/dev/null
# Abhängigkeiten
sudo apt update
sudo apt install -y ca-certificates curl gnupg
# Docker GPG-Key
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/debian/gpg | \
sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
# Repository
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \
https://download.docker.com/linux/debian $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# Docker installieren
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
# Deinen User zur docker-Gruppe hinzufügen (kein sudo nötig)
sudo usermod -aG docker $USER
newgrp docker
# Test
docker --version
docker compose version
```
---
## 2. Projektdateien auf den Server bringen
```bash
# Auf deinem lokalen Rechner — Dateien hochladen
scp -r kennzeichen-website/ user@dein-server:/opt/kennzeichen-website
# Oder: Git-Repo anlegen und pushen/pullen
# Dann auf dem Server:
cd /opt/kennzeichen-website
```
Alternativ direkt auf dem Server mit nano/vim die Dateien anlegen
(der Ordner existiert ja schon).
---
## 3. Konfiguration anpassen
```bash
cd /opt/kennzeichen-website
# domain in docker-compose.yml setzen
nano docker-compose.yml
```
In der `docker-compose.yml` die zwei Umgebungsvariablen anpassen:
```yaml
environment:
- NEXT_PUBLIC_PB_URL=https://deine-echte-domain.de/api # ← anpassen
- PB_INTERNAL_URL=http://pocketbase:8090 # ← so lassen
```
---
## 4. PocketBase Admin-UI einmalig direkt exponieren
Beim allerersten Start muss der Admin-Account angelegt werden.
Dafür kurz PocketBase direkt zugänglich machen:
```bash
# In docker-compose.yml temporär unter pocketbase: hinzufügen:
# ports:
# - "8090:8090"
```
Dann starten:
```bash
docker compose up -d pocketbase
```
Im Browser aufrufen: `http://<server-ip>:8090/_/`
→ Admin-Account anlegen (E-Mail + Passwort merken!)
Danach den `ports:`-Block wieder aus der docker-compose.yml entfernen.
---
## 5. Alles starten
```bash
cd /opt/kennzeichen-website
# Beim ersten Mal: Images bauen (dauert 25 Min)
docker compose build
# Starten
docker compose up -d
# Status prüfen
docker compose ps
# Logs ansehen
docker compose logs -f nextjs
docker compose logs -f pocketbase
```
Die Website ist jetzt unter Port 8888 erreichbar.
---
## 6. Daten importieren
```bash
# Python-Abhängigkeiten
pip3 install requests
# plates-Repo klonen (falls noch nicht vorhanden)
git clone https://git.denode.eu/denode/plates /opt/plates
# data.db auf den Server bringen
scp data.db user@dein-server:/opt/
# Import starten
cd /opt/kennzeichen-website
python3 scripts/import.py \
--pb-url http://localhost:8090 \
--pb-email deine@email.de \
--pb-password deinpasswort \
--repo-path /opt/plates \
--db-path /opt/data.db
```
PocketBase ist beim Import direkt über localhost:8090 erreichbar
(kein Port nach außen nötig, nur von der Servermaschine selbst).
---
## 7. Reverse Proxy konfigurieren
In deinem Hetzner-Reverse-Proxy die Domain auf `<wireguard-ip>:8888` zeigen lassen.
Nginx Beispiel (auf dem Proxy-Server):
```nginx
server {
listen 443 ssl;
server_name deine-domain.de;
# SSL-Zertifikat (z.B. Let's Encrypt)
ssl_certificate /etc/letsencrypt/live/deine-domain.de/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/deine-domain.de/privkey.pem;
# Next.js
location / {
proxy_pass http://<wireguard-ip>:8888;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
# PocketBase API (wird von Next.js intern genutzt,
# aber für den Browser-SDK zugänglich machen)
location /api/ {
proxy_pass http://<wireguard-ip>:8888/api/;
proxy_set_header Host $host;
}
}
```
---
## 8. Auto-Update bei Git-Änderungen (optional)
```bash
# Cron-Job: täglich Daten aus plates-Repo neu importieren
crontab -e
```
```cron
# Jeden Tag um 03:00 Uhr
0 3 * * * cd /opt/plates && git pull && \
python3 /opt/kennzeichen-website/scripts/import.py \
--pb-url http://localhost:8090 \
--pb-email deine@email.de \
--pb-password deinpasswort \
--repo-path /opt/plates \
--db-path /opt/data.db \
--skip-schema \
>> /var/log/kennzeichen-import.log 2>&1
```
---
## Nützliche Befehle
```bash
# Neustart nach Code-Änderungen
docker compose build nextjs && docker compose up -d nextjs
# PocketBase-Daten sichern
docker cp kennzeichen-website_pb_data_1:/pb/pb_data ./backup-$(date +%Y%m%d)
# Logs verfolgen
docker compose logs -f
# Alles stoppen
docker compose down
```
---
## Projektstruktur (Endzustand)
```
/opt/kennzeichen-website/
├── docker-compose.yml
├── README.md
├── SCHEMA.md
├── docker/
│ └── pocketbase/
│ └── Dockerfile
├── frontend/
│ ├── Dockerfile
│ ├── package.json
│ ├── next.config.js
│ ├── tailwind.config.ts
│ ├── tsconfig.json
│ ├── app/
│ │ ├── layout.tsx # Root Layout + Navigation
│ │ ├── page.tsx # Startseite
│ │ ├── globals.css # Design-System
│ │ ├── kennzeichen/
│ │ │ ├── page.tsx # Datenbank mit Suche + Filter
│ │ │ └── KennzeichenFilter.tsx
│ │ ├── diplomatenkennzeichen/
│ │ │ └── page.tsx
│ │ ├── sammlung/
│ │ │ └── page.tsx # Persönlicher Fortschritt
│ │ └── blog/
│ │ ├── page.tsx # Blog-Übersicht
│ │ └── [slug]/
│ │ └── page.tsx # Blog-Post
│ ├── components/
│ │ └── ui/
│ │ └── Nav.tsx
│ └── lib/
│ └── pb.ts # PocketBase Client + Typen
└── scripts/
├── import.py
└── validate.py
```