server-up/README.md
Ramon 8e53b90615
All checks were successful
Deploy server-up (dev) / deploy (push) Successful in 1m14s
Deploy server-up (prod) / deploy (push) Successful in 1m44s
Release / release (push) Successful in 5s
v0.7.40-beta - beheerdersaccount en bind meteen klaarzetten
Het installatiescript kan nu allebei zelf regelen, zodat je na afloop niet
meer naar de webinterface hoeft om een account te claimen en niet meer in
.env hoeft te duiken om erbij te kunnen.

Beheerdersaccount:
- Op een terminal wordt gevraagd of je er meteen een wil, met naam en
  wachtwoord (twee keer, echo uit).
- Automatisch via --admin NAAM plus --admin-password-file of
  SU_ADMIN_PASSWORD; zonder bron en zonder terminal maakt het script er
  zelf een van 24 tekens en toont die.
- --admin-password weigert bewust: argumenten zijn zichtbaar in 'ps'. Het
  wachtwoord gaat via stdin naar curl, niet als argument.
- Nieuw --create-admin voor een installatie die al draait.

Bereikbaarheid:
- Keuzemenu voor BIND (deze server / hele netwerk / eigen adres), met het
  gedetecteerde serveradres erbij.
- Bij opnieuw installeren is de bestaande instelling het uitgangspunt, zodat
  enter je server niet ongemerkt terugzet op loopback.

Opgeloste fouten:
- Een bestaande .env bleef altijd ongemoeid, ook met --bind: de installatie
  leek te lukken terwijl de server op het oude adres bleef luisteren.
- --update rekende met de standaardpoort in plaats van met wat er in .env
  staat, waardoor de wachtlus en het slotadres niet klopten.
- --dry-run riep 'sudo docker' aan en vroeg dus om een wachtwoord terwijl
  het net beloofd had niets te doen; zonder terminal liep het daarop vast.
- Ongeldig bind-adres en poort buiten 1-65535 worden nu meteen geweigerd.

Getest met een pseudo-terminal voor de vragen en tegen een echt draaiende
server voor het aanmaken van het account, inclusief een wachtwoord vol
aanhalingstekens en backslashes, een geweigerd tweede account en een server
die niet reageert. De e2e-tests slaan zichzelf over waar curl ontbreekt,
zoals in het CI-image. 992 tests groen.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01C7oLCRYzY5ixJ5Sv8Y8EFb
2026-07-27 21:13:06 +02:00

155 lines
6.3 KiB
Markdown

# Server Up
Zelfgehoste beheerinterface voor Docker: apps installeren uit een catalogus,
stacks starten en stoppen, backups maken en terugzetten, en containers een eigen
IP-adres in je netwerk geven.
> ⚠️ **Toegang tot Server Up staat gelijk aan root op de host.** De applicatie
> beheert de Docker-daemon, en wie containers kan starten kan willekeurige mappen
> van de host mounten. Behandel de interface navenant: maak direct een account
> aan, zet hem niet zonder reverse proxy met TLS op internet, en lees
> [docs/beveiliging.md](docs/beveiliging.md).
---
## Wat het doet
| | |
|---|---|
| **App-catalogus** | 96 kant-en-klare apps, ingedeeld in categorieën met kleur. Zoeken, filteren en installeren met een formulier in plaats van YAML. |
| **Stacks beheren** | Starten, stoppen, bijwerken en herstarten — per stack of per losse container, met logs en live CPU-/geheugengebruik. |
| **Apps koppelen** | Stacks komen op een gedeeld netwerk, zodat ze elkaar op naam bereiken. Een veld dat naar een andere app verwijst toont een keuzelijst met wat je al draait. |
| **Eigen IP per stack** | Met macvlan of ipvlan krijgt een app een eigen adres in je LAN in plaats van poorten op de host. |
| **Backups** | Handmatig, gepland, en automatisch vóór een update of verwijdering. Met terugzetten en een bewaarbeleid. |
| **Updates** | Voor Server Up zelf (stable of beta) en voor de images van je geïnstalleerde stacks. |
| **Toegang** | Lokale accounts met rollen (beheerder, operator, alleen lezen), of SSO via een reverse proxy. |
## Wat je nodig hebt
- Een Linux-server met Docker en de compose-plugin
- Toegang tot `/var/run/docker.sock`
- Ongeveer 300 MB schijfruimte voor de applicatie zelf
## Installeren
```bash
curl -fsSL https://git.ramonbesselink.nl/bes-r/server-up/raw/branch/main/install.sh | sh
```
Dat controleert je systeem, installeert Docker als het ontbreekt, zet Server Up
in `/opt/server-up` en start het. Onderweg vraagt het waarop de interface moet
luisteren en of het meteen een beheerdersaccount voor je aanmaakt — die twee
vragen komen vooraf, zodat je kunt weglopen terwijl het image gebouwd wordt.
Liever eerst lezen wat je uitvoert — verstandig, want het script gebruikt
root-rechten:
```bash
curl -fsSL https://git.ramonbesselink.nl/bes-r/server-up/raw/branch/main/install.sh -o install.sh
less install.sh
sh install.sh --dry-run # toont wat het zou doen, zonder iets te wijzigen
sh install.sh
```
Handmatig kan ook:
```bash
git clone https://git.ramonbesselink.nl/bes-r/server-up.git /opt/server-up
cd /opt/server-up
cp .env.example .env
docker compose up -d --build
```
Alle opties staan in [docs/installeren.md](docs/installeren.md): `--dir`,
`--port`, `--bind`, `--branch`, `--token`, `--admin`, `--create-admin`,
`--update`, `--uninstall`.
### Het beheerdersaccount
Zolang er nog geen account is, kan iedereen die de pagina bereikt het claimen —
de container waarschuwt daar bij het opstarten ook voor. Laat het script het
daarom meteen aanmaken:
```bash
sh install.sh --admin ramon # vraagt om een wachtwoord
SU_ADMIN_PASSWORD='...' sh install.sh --admin ramon --yes # zonder vragen
```
Zonder wachtwoordbron en zonder terminal maakt het script er zelf een en toont
die. Overgeslagen of misgegaan? `sh /opt/server-up/install.sh --create-admin
--admin ramon` doet het achteraf. Een wachtwoord als opdrachtregeloptie wordt
geweigerd: dat is zichtbaar in `ps`.
### Instellingen
Alles staat met uitleg in [`.env.example`](.env.example). De twee die je
waarschijnlijk meteen nodig hebt:
```bash
BIND=127.0.0.1 # 0.0.0.0 om er van buiten de server bij te kunnen
PORT=5000
```
De poort bindt standaard op `127.0.0.1`. Zet hem pas open als er een reverse
proxy met TLS voor staat. Achteraf wijzigen kan met
`sh /opt/server-up/install.sh --update --bind 0.0.0.0`; pas het anders aan in
`.env` en **niet** in `docker-compose.yml`, want dat bestand komt uit de repo en
wordt bij elke update overschreven.
## Documentatie
| Document | Waarover |
|---|---|
| [docs/installeren.md](docs/installeren.md) | Het installatiescript, opties, bijwerken en verwijderen |
| [docs/beveiliging.md](docs/beveiliging.md) | Accounts, rollen, SSO, reverse proxy, wat wel en niet is afgedekt |
| [docs/apps-maken.md](docs/apps-maken.md) | Eigen apps toevoegen: het volledige templateformaat |
| [docs/netwerken.md](docs/netwerken.md) | Stacks een eigen IP geven met macvlan of ipvlan |
| [docs/backups.md](docs/backups.md) | Wat er wél en niet in een backup zit, terugzetten, bewaarbeleid |
| [docs/updates.md](docs/updates.md) | Update-kanalen en de Forgejo-registry inrichten |
| [docs/synchroniseren.md](docs/synchroniseren.md) | Code van je apparaat naar de server via Forgejo |
| [docs/forgejo-actions-setup.md](docs/forgejo-actions-setup.md) | Runners instellen |
## Eigen apps toevoegen
Wijs Server Up naar je eigen git-repo met app-sjablonen (Instellingen → App
Store → Repository), of voeg een map toe onder `apps/`:
```
apps/mijn-app/
├── template.json metadata en de vragen bij het installeren
└── files/
└── compose.yaml het compose-bestand met << variabelen >>
```
Het volledige formaat staat in [docs/apps-maken.md](docs/apps-maken.md).
## Bijwerken en verwijderen
```bash
sh /opt/server-up/install.sh --update # nieuwste versie ophalen en herstarten
sh /opt/server-up/install.sh --uninstall # stoppen; je gegevens blijven staan
```
Draait Server Up vanaf een registry-image, dan kan bijwerken ook met een knop in
de interface — zie [docs/updates.md](docs/updates.md).
## Ontwikkelen
```bash
python3 -m venv venv && venv/bin/pip install -r server-up/requirements.txt pytest
venv/bin/python -m pytest tests -q # de volledige suite
cd server-up && SU_DEV=1 python app.py # lokaal draaien op poort 5000
```
De testsuite draait ook over alle app-sjablonen: elke app moet renderen naar
geldige compose-YAML, met gedeclareerde volumes en zonder onvervangen
variabelen. Voeg je een app toe, dan wordt die automatisch meegenomen.
De deploy-workflows draaien de tests in een container (`python:3.12-slim`), dus
op de runner is verder niets nodig dan Docker.
## Licentie en bijdragen
Zie `CHANGELOG.md` voor de geschiedenis. Werk op de `dev`-branch en bump
`VERSION` bij elke wijziging; een test bewaakt dat er een changelog-sectie bij
hoort.