server-up/docs/netwerken.md
Ramon 8b29553a71
Some checks failed
Deploy server-up (dev) / deploy (push) Failing after 3s
v0.5.00-beta - containerbeheer, eigen IP-adressen, veiliger installeren
- Beheer per container: de stackkaart klapt uit naar de losse containers, met
  start/stop/herstart, logs en live CPU-/geheugengebruik per container. De
  containernaam wordt getoetst aan compose_ps van díé stack, zodat de route
  geen willekeurige container op de host kan raken.
- Stacks met een eigen IP-adres (macvlan/ipvlan): netwerkbeheer onder
  Instellingen → Netwerken, netwerkkeuze in de installatiemodal met voorstel
  voor het eerstvolgende vrije adres, en automatische omzetting van het
  gerenderde compose-bestand (poortmappings eruit, ipv4_address erin). De
  templates in apps/ blijven ongewijzigd.
- Toegekende IP's worden vastgehouden in .serverup.json en getoond op de
  stackkaart, zodat een volgende installatie ze niet opnieuw uitdeelt.
- Vrije poort voorstellen bij installeren: next_free_port() bestond al maar
  werd nergens gebruikt. Bezette poorten worden in de UI gemeld.
- Genereerknop voor velden die op een geheim wijzen (token/password/secret),
  lokaal gegenereerd via crypto.getRandomValues.
- Compose valideren met `docker compose config` vóór het wegschrijven, zowel
  bij de editor als na het renderen bij installatie. Ontbreekt de compose-CLI,
  dan blokkeert dat een installatie niet.
- Uitloggen in de zijbalk; gebruikersbeheer en wachtwoord wijzigen onder
  Instellingen → Beveiliging.
- docs/netwerken.md (incl. de shim-interface die de host nodig heeft om zijn
  eigen macvlan-containers te bereiken) en docs/beveiliging.md toegevoegd.
- CHANGELOG bijgewerkt; testsuite uitgebreid naar 112 tests.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01C7oLCRYzY5ixJ5Sv8Y8EFb
2026-07-26 14:51:32 +02:00

134 lines
5 KiB
Markdown

# Stacks een eigen IP-adres geven (macvlan / ipvlan)
Standaard publiceert een stack poorten op de host: Vaultwarden op `8222`, Mealie
op `9925`, enzovoort. Dat werkt, maar levert op den duur een lange lijst
poortnummers op die je moet onthouden, en twee apps die allebei poort 8080 willen
gaan niet samen.
Met een **macvlan**- of **ipvlan**-netwerk krijgt een stack een eigen IP-adres in
je LAN. De app draait dan gewoon op zijn eigen standaardpoort:
| Zonder | Met eigen IP |
|--------|--------------|
| `http://192.168.1.10:8222` | `http://192.168.1.240` |
| `http://192.168.1.10:9925` | `http://192.168.1.241` |
Je kunt er ook per app op firewallen, en een DNS-naam aan koppelen.
---
## ⚠️ Lees dit eerst: de host bereikt zijn eigen containers niet
Dit is de bekendste valkuil van macvlan. De Docker-host kan **niet** bij een
container die op een macvlan-netwerk draait, en andersom ook niet. Alle andere
apparaten in je netwerk kunnen dat wél.
Draait Server Up op dezelfde machine als de containers, dan zie je dus:
- vanaf je laptop: `http://192.168.1.240` werkt
- vanaf de server zelf: `curl http://192.168.1.240` loopt vast
Heb je dat nodig (bijvoorbeeld voor een healthcheck of een reverse proxy die op
de host draait), maak dan een shim-interface aan op de host:
```bash
# Eenmalig; vervang eth0 en de adressen door die van jouw netwerk.
ip link add shim link eth0 type macvlan mode bridge
ip addr add 192.168.1.239/32 dev shim
ip link set shim up
ip route add 192.168.1.240/28 dev shim
```
Zet dat in een systemd-unit of in `/etc/network/interfaces`, anders is het na een
herstart weg.
**ipvlan (l2)** heeft dit probleem niet op dezelfde manier, maar vereist wel dat
je switch en router er goed mee omgaan. Werkt macvlan niet, probeer dan ipvlan.
---
## Stap 1 — Bepaal je netwerkgegevens
Je hebt vier dingen nodig:
| Wat | Voorbeeld | Hoe kom je eraan |
|-----|-----------|------------------|
| Host-interface | `eth0` | `ip -br link` op de server |
| Subnet | `192.168.1.0/24` | Je router; hetzelfde subnet als de server |
| Gateway | `192.168.1.1` | `ip route \| grep default` |
| IP-range | `192.168.1.240/28` | Een blok dat je **buiten je DHCP-bereik** houdt |
De IP-range is optioneel maar sterk aanbevolen. Zonder range mag Docker het hele
subnet gebruiken en kan het een adres uitdelen dat je DHCP-server ook aan een
telefoon geeft. `192.168.1.240/28` reserveert `.240` t/m `.255` — zestien
adressen. Zet dat bereik in je router buiten de DHCP-pool.
## Stap 2 — Netwerk aanmaken in Server Up
Ga naar **Instellingen → Netwerken → Netwerk** en vul de gegevens in. Server Up
maakt het Docker-netwerk aan en onthoudt de definitie.
Hetzelfde met de hand zou zijn:
```bash
docker network create -d macvlan \
--subnet 192.168.1.0/24 \
--gateway 192.168.1.1 \
--ip-range 192.168.1.240/28 \
-o parent=eth0 \
lan
```
## Stap 3 — Een stack installeren op een eigen IP
Kies in de installatiemodal bij **Netwerk** je netwerk in plaats van "Poorten op
de host". Server Up stelt het eerstvolgende vrije adres voor; je kunt het
overschrijven.
Bij het installeren gebeurt er dit met het compose-bestand:
```yaml
# vóór # ná
services: services:
vaultwarden: vaultwarden:
image: vaultwarden/server image: vaultwarden/server
ports: networks:
- "8222:80" lan:
ipv4_address: 192.168.1.240
networks:
lan:
external: true
```
De poortmapping verdwijnt — die heeft geen functie meer. Vaultwarden luistert op
poort 80 en is bereikbaar op `http://192.168.1.240`.
Bestaat een stack uit meerdere containers, dan krijgt de container die poorten
publiceerde het vaste adres; de rest komt zonder vast adres in hetzelfde netwerk,
zodat ze elkaar op servicenaam blijven vinden.
---
## Adresbeheer
Server Up bewaart het toegekende adres in `.serverup.json` in de stackmap. Zo
blijft het gereserveerd, ook als de stack gestopt is, en krijgt een volgende
installatie het volgende vrije adres voorgesteld.
Wil je het adres van een bestaande stack wijzigen, pas dan het compose-bestand
aan via **compose bewerken** en werk `ipv4_address` bij.
## Verwijderen
Een netwerk kan pas weg als er geen containers meer op draaien. Stop eerst de
betreffende stacks; Server Up weigert het anders met een melding.
## Problemen oplossen
| Symptoom | Oorzaak |
|----------|---------|
| `network ... not found` bij het starten | Netwerk verwijderd terwijl de stack er nog naar verwijst — maak het opnieuw aan |
| Container krijgt geen verbinding | Verkeerde `parent`-interface, of de interface zit in een bond/bridge |
| Adres al in gebruik | Het adres valt binnen je DHCP-bereik; verklein de DHCP-pool of kies een andere range |
| Vanaf de server niet bereikbaar, vanaf laptop wel | Verwacht gedrag — zie de shim-interface bovenaan |
| Werkt niet op WiFi | Klopt: macvlan werkt niet over een draadloze interface |