Files
LXC-HUGO-HOST/README.md
T

125 lines
3.3 KiB
Markdown

# lxc-hugo-host
Setup-Script für minimalistische Hugo-Hosting-Container unter Proxmox.
Richtet einen frischen Debian-12-LXC-Container in einem Schritt ein:
- Nginx mit Security Headers (HTTP only, TLS via vorgelagertem Reverse-Proxy)
- SSH-Daemon als reiner SFTP-Server (kein Shell-Login von außen)
- SFTP-User mit Chroot auf `/var/www`
- UFW, fail2ban, unattended-upgrades, sysctl-Hardening
- Public Key direkt im Script hinterlegt
## Konfiguration
Vor dem ersten Lauf einmalig den eigenen Public Key oben im Script eintragen:
```bash
SSH_PUBKEYS="ssh-ed25519 AAAA... user@host"
```
Mehrere Keys: eine Zeile pro Key innerhalb der Variable.
## Pro neuem Server
### 1. Container in Proxmox erstellen
- Template: `debian-12-standard`
- Unprivileged: ja
- 512 MB RAM, 1 Core reicht
### 2. In den Container
Auf dem Proxmox-Host:
```bash
pct enter <ctid>
```
### 3. Script ausführen
```bash
curl -fsSL https://git.kgva.ch/karim/lxc-hugo-host/raw/branch/main/setup-hugo-host.sh \
| bash -s -- meine-domain.ch
```
Das Script:
- installiert und konfiguriert alles (inkl. `apt update` + `upgrade`)
- legt den SFTP-User `webedit-meine-domain-ch` an
- gibt am Ende die fertige Deploy-Zeile aus
### 4. Reverse-Proxy für TLS
Im Nginx Proxy Manager (oder Caddy) ein Proxy-Host anlegen:
- **Domain:** `meine-domain.ch`
- **Forward zu:** `http://<container-ip>:80`
- **SSL:** Let's Encrypt
### 5. Deployen
Vom Arbeitsrechner:
```bash
hugo --minify
lftp -u webedit-meine-domain-ch, sftp://<container-ip> \
-e "mirror -R --delete public/ /meine-domain.ch/; quit"
```
Wegen Chroot ist der Zielpfad `/meine-domain.ch/`, nicht
`/var/www/meine-domain.ch/`.
Installation von `lftp` falls noch nicht da:
```bash
brew install lftp # macOS
apt install lftp # Debian/Ubuntu
```
## Mehrere Sites pro Container
Script einfach nochmal laufen lassen — neue nginx-Site + neuer SFTP-User
werden zusätzlich angelegt, das bestehende Setup bleibt unangetastet.
```bash
./setup-hugo-host.sh weitere-domain.ch
```
## SSH-/SFTP-Config auf dem Client (optional)
Damit du dir die langen User-/Hostnamen nicht merken musst, in
`~/.ssh/config` ergänzen:
```
Host meine-domain
HostName 192.168.1.46
User webedit-meine-domain-ch
IdentityFile ~/.ssh/id_ed25519
```
Dann reicht:
```bash
lftp -e "mirror -R --delete public/ /meine-domain.ch/; quit" sftp://meine-domain
```
## Sicherheits-Modell
| Angriffsfläche | Status |
|----------------------|------------------------------------------------|
| Port 22 (SSH-Shell) | Geschlossen — kein Shell-Login möglich |
| Port 22 (SFTP) | Nur Key-Auth, User chrooted auf `/var/www` |
| Port 80 (nginx) | Statische Files, Security Headers |
| Port 443 | Nicht im Container — Reverse-Proxy davor |
| Administration | Nur via Proxmox-Host (`pct enter`) |
| Auto-Updates | Security-Patches täglich, Reboot 03:00 |
| Key-Management | Public Key im Script (Git-versioniert) |
## Key rotieren / neue Maschine hinzufügen
1. Neuen Public Key oben im Script in `SSH_PUBKEYS` ergänzen, committen
2. Auf jedem bestehenden Server Script erneut laufen lassen
(überschreibt `/etc/ssh/sftp-keys/<user>/authorized_keys`)
Alternativ einzeln per Hand die `authorized_keys` updaten.