ssb-datatek.dk: selvhostet webserver
Den side du læser nu. En hardened Ubuntu-server derhjemme med NGINX, Let's Encrypt og UFW, bygget for at vise hvad jeg kan i stedet for bare at skrive det.
- Status
- Løbende
- Periode
- 2026 - nu
- Kontekst
- Privat projekt
- Ubuntu Server 24.04
- NGINX
- Let's Encrypt
- UFW
- Netplan
- Hugo
Indhold
Formål
I stedet for at sende et klassisk CV ville jeg vise, at jeg kan sætte en rigtig server op fra bunden, sikre den og holde den kørende. Hele siden kører på en Lenovo-PC (Intel i5, 7. gen.) derhjemme.
Opsætning
| Område | Løsning |
|---|---|
| OS | Ubuntu Server 24.04 LTS (headless) |
| Webserver | NGINX med server blocks til to domæner |
| Adgang | SSH med ED25519-nøgler |
| Hardening | Password-login og root-login slået fra |
| Netværk | Statisk IP via Netplan og port forwarding |
| Firewall | UFW: kun 80 og 443 åbne udefra, SSH kun fra LAN |
| Kryptering | TLS via Let’s Encrypt (Certbot) med automatisk fornyelse |
| DNS | A-records hos Simply.com |
SSH-hardening
Serveren accepterer kun nøgle-login:
# /etc/ssh/sshd_config
PasswordAuthentication no
PermitRootLogin no
Firewall
sudo ufw default deny incoming
sudo ufw allow from 192.168.1.0/24 to any port 22 proto tcp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable
Udfordringer og løsninger
CGNAT hos internetudbyderen
Siden kunne ikke nås udefra, selvom port forwarding var sat korrekt op. Fejlfindingen viste, at routeren ikke havde en rigtig offentlig IP, men sad bag Carrier-Grade NAT (CGNAT). Løsningen var at få en offentlig IP-adresse fra Waoo.
Offentlig IP skiftede
Efter en periode var siden pludselig nede igen. DNS pegede stadig på den gamle IP, men serveren havde fået en ny:
curl -4 ifconfig.me
Jeg opdaterede A-records hos Simply.com, og siden var oppe igen. Næste skridt er DDNS, så serveren selv opdaterer DNS, når IP’en skifter.
Fra én HTML-side til portfolio
Den første version var én håndskrevet HTML-side. Nu er siden bygget med Hugo, så hvert projekt er en mappe med en Markdown-fil og tilhørende dokumenter og billeder. Hugo bygger det til statiske filer, som NGINX serverer. Der er ingen database og intet admin-login, der kan angribes.
Hvad jeg lærte
- At fejlfinde netværk hele vejen fra server til router til internetudbyder.
- At sikre en server, der står direkte på internettet.
- At dokumentere undervejs, så jeg kan genskabe opsætningen.