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

6.4 KiB
Raw Permalink Blame History

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)

# 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

# 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

cd /opt/kennzeichen-website

# domain in docker-compose.yml setzen
nano docker-compose.yml

In der docker-compose.yml die zwei Umgebungsvariablen anpassen:

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:

# In docker-compose.yml temporär unter pocketbase: hinzufügen:
#   ports:
#     - "8090:8090"

Dann starten:

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

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

# 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):

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)

# Cron-Job: täglich Daten aus plates-Repo neu importieren
crontab -e
# 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

# 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