Initial commit: Hugo-Host LXC Setup Script
This commit is contained in:
@@ -0,0 +1,124 @@
|
||||
# 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.
|
||||
Reference in New Issue
Block a user