# VPS-Infrastruktur — bujour.de

> IONOS EU-VPS · Docker Compose + Caddy · Stand: Juni 2026

---

## Übersicht

Der VPS läuft mit Docker Compose als Orchestrierung. Caddy übernimmt als Reverse Proxy automatisch TLS (Let's Encrypt) für alle Dienste — kein certbot, kein manuelles Zertifikatsmanagement.

Alle Dienste hängen im externen Docker-Netzwerk `proxy`. Caddy erreicht sie über den Container-Namen.

---

## Verzeichnisstruktur

```
~/stacks/
├── caddy/
│   ├── compose.yaml
│   └── Caddyfile
├── forgejo/
│   └── compose.yaml
└── checkpoint/
    ├── compose.yaml
    └── .env          ← Secrets, nicht im Git
~/apps/
└── checkpoint/       ← geklontes Repo, Build-Quelle
```

---

## Docker-Netzwerk

```bash
docker network create proxy
```

Externes Netzwerk `proxy` — einmalig angelegt, von allen Stacks referenziert.

---

## Caddy (Reverse Proxy + TLS)

**Stack:** `~/stacks/caddy/`

```yaml
# compose.yaml
services:
  caddy:
    image: caddy:2
    container_name: caddy
    restart: unless-stopped
    ports:
      - "80:80"
      - "443:443"
      - "443:443/udp"
    volumes:
      - ./Caddyfile:/etc/caddy/Caddyfile:ro
      - caddy_data:/data
      - caddy_config:/config
    networks:
      - proxy
```

```
# Caddyfile
git.bujour.de {
    reverse_proxy forgejo:3000
}

cpe.bujour.info {
    reverse_proxy checkpoint:8000
}
```

**Caddy neu laden** (nach Caddyfile-Änderung):
```bash
cd ~/stacks/caddy
docker compose exec caddy caddy reload --config /etc/caddy/Caddyfile
```

---

## Forgejo (Git)

**Stack:** `~/stacks/forgejo/`
**URL:** https://git.bujour.de
**SSH:** Port 2222

```yaml
services:
  forgejo:
    image: codeberg.org/forgejo/forgejo:10
    container_name: forgejo
    restart: unless-stopped
    environment:
      - USER_UID=1000
      - USER_GID=1000
    volumes:
      - forgejo_data:/data
    networks:
      - proxy
    expose:
      - "3000"
    ports:
      - "2222:22"
```

---

## Neuen Dienst hinzufügen

1. `mkdir ~/stacks/<dienst>/`
2. `compose.yaml` erstellen — `expose` statt `ports`, Netzwerk `proxy` (external)
3. Eintrag in `~/stacks/caddy/Caddyfile` ergänzen
4. Caddy neu laden
5. `docker compose up -d` im neuen Stack-Verzeichnis

---

## Nützliche Befehle

```bash
# Status aller Container
docker ps

# Logs eines Dienstes
docker logs <container_name> -f

# Container neu starten
docker compose restart

# Image neu bauen und Container ersetzen
docker compose build
docker compose up -d
```

---

## SSH-Schlüssel VPS → Forgejo

Schlüsselpaar auf dem VPS für unbeaufsichtigtes `git pull`:

```bash
ssh-keygen -t ed25519 -C "vps-checkpoint" -f ~/.ssh/id_ed25519_forgejo
```

`~/.ssh/config`:
```
Host git.bujour.de
    HostName git.bujour.de
    User git
    Port 2222
    IdentityFile ~/.ssh/id_ed25519_forgejo
```

Öffentlichen Schlüssel in Forgejo unter Einstellungen → SSH-Schlüssel eintragen.
