All checks were successful
Deploy server-up (dev) / deploy (push) Successful in 1m27s
Aanleiding: Homepage weigerde met "Host validation failed" omdat de standaardwaarde van allowed_hosts poort 3001 noemde terwijl het poortveld op 3002 stond. Alle 96 sjablonen zijn daarop nagelopen. Systemisch: - De dobbelsteenknop, waar zeventien apps in hun uitleg naar verwijzen, verscheen nooit: hij hing af van een veld 'secret' dat fields() niet meestuurde. Wachtwoorden stonden daardoor leesbaar in het formulier. - 27 velden die je toch nooit zelf typt (databasewachtwoorden, JWT- en versleutelingssleutels) worden nu voorgevuld met een willekeurige waarde. Inlogwachtwoorden krijgen alleen een knop, want die moet je noteren. - De knop hangt nu aan 'generate' in plaats van aan 'secret': voor een WireGuard-privésleutel of een token uit een andere app is een verzonnen waarde juist fout. - required werd nergens gecontroleerd. Je kon installeren met een leeg databasewachtwoord of een lege sleutel. Nu geweigerd bij installeren en bij herconfigureren, met vermelding van de lege velden. Velden achter een uitgeschakelde groepsschakelaar tellen niet mee. - Wachtwoorden werden uitgeschreven in het installatielog; nu gemaskeerd. Losse fouten: - homepage: allowed_hosts stond op localhost:3001, nu * met uitleg. - baserow, hedgedoc, ntfy: URL in de standaardwaarde wees naar een poort waar niets luistert. - Vast wachtwoord in acht sjablonen weggehaald: ghost, immich, miniflux, paperless-ngx, unifi-network en vikunja kregen allemaal dezelfde database-wachtwoorden; grafana en gotify stonden op 'admin'. - data_dir bij keycloak, metube, miniflux en teslamate stond in het formulier maar kwam nergens terecht (die apps gebruiken een Docker-volume). - puid/pgid bij freshrss: het image kent ze niet. - prometheus gaf de gevraagde tijdzone niet door. Nieuw tests/test_app_templates.py: rendert elke app met zijn standaardwaarden en controleert ongedefinieerde variabelen, velden zonder werking, niet-gedeclareerde volumes, depends_on, dubbele containernamen, poortconflicten, poortnummers in standaardwaarden en vaste wachtwoorden. 2236 tests groen. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01C7oLCRYzY5ixJ5Sv8Y8EFb
125 lines
3.3 KiB
JSON
125 lines
3.3 KiB
JSON
{
|
|
"kind": "compose",
|
|
"metadata": {
|
|
"name": "Unifi Network Application",
|
|
"description": "Unifi netwerkconfiguratie en -beheer. Beheert access points, switches en gateways van Ubiquiti.",
|
|
"tags": [
|
|
"netwerk",
|
|
"unifi",
|
|
"ubiquiti",
|
|
"wifi"
|
|
],
|
|
"icon": {
|
|
"provider": "selfhst",
|
|
"id": "unifi"
|
|
},
|
|
"version": {
|
|
"name": "latest"
|
|
},
|
|
"categories": [
|
|
"netwerk",
|
|
"beheer"
|
|
]
|
|
},
|
|
"variables": [
|
|
{
|
|
"title": "Algemeen",
|
|
"items": [
|
|
{
|
|
"name": "service_name",
|
|
"type": "str",
|
|
"title": "Servicenaam",
|
|
"default": "unifi",
|
|
"required": true
|
|
},
|
|
{
|
|
"name": "port_ui",
|
|
"type": "int",
|
|
"title": "Web UI poort (HTTPS)",
|
|
"default": 8443,
|
|
"required": true,
|
|
"description": "Poort voor de Unifi-webinterface"
|
|
},
|
|
{
|
|
"name": "port_inform",
|
|
"type": "int",
|
|
"title": "Inform poort",
|
|
"default": 8080,
|
|
"required": true,
|
|
"description": "Poort waarop Unifi-apparaten inchecken. Moet bereikbaar zijn voor alle access points en switches."
|
|
},
|
|
{
|
|
"name": "port_stun",
|
|
"type": "int",
|
|
"title": "STUN poort (UDP)",
|
|
"default": 3478,
|
|
"required": true,
|
|
"description": "Gebruikt voor NAT traversal. Vereist voor correct functioneren van Unifi-apparaten."
|
|
},
|
|
{
|
|
"name": "port_discovery",
|
|
"type": "int",
|
|
"title": "Discovery poort (UDP)",
|
|
"default": 10001,
|
|
"required": true,
|
|
"description": "Gebruikt om Unifi-apparaten op het lokale netwerk automatisch te ontdekken."
|
|
},
|
|
{
|
|
"name": "data_dir",
|
|
"type": "str",
|
|
"title": "Data directory",
|
|
"default": "/opt/serverup/appdata",
|
|
"required": true,
|
|
"description": "Basismap voor configuratie en database"
|
|
},
|
|
{
|
|
"name": "timezone",
|
|
"type": "str",
|
|
"title": "Tijdzone",
|
|
"default": "Europe/Amsterdam",
|
|
"required": true
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"title": "Gebruiker",
|
|
"items": [
|
|
{
|
|
"name": "puid",
|
|
"type": "int",
|
|
"title": "PUID",
|
|
"default": 1000,
|
|
"required": true,
|
|
"description": "User ID van de systeemgebruiker die de container beheert (whoami → id -u)"
|
|
},
|
|
{
|
|
"name": "pgid",
|
|
"type": "int",
|
|
"title": "PGID",
|
|
"default": 1000,
|
|
"required": true,
|
|
"description": "Group ID van de systeemgebruiker (id -g)"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"title": "Database",
|
|
"items": [
|
|
{
|
|
"name": "mongo_password",
|
|
"type": "str",
|
|
"title": "MongoDB wachtwoord",
|
|
"default": "",
|
|
"required": true,
|
|
"description": "Wachtwoord voor de interne MongoDB database",
|
|
"config": {
|
|
"placeholder": "sterk-wachtwoord"
|
|
},
|
|
"secret": true,
|
|
"generate": "auto",
|
|
"help": "Wordt automatisch ingevuld met een willekeurige waarde. Alleen de containers onderling gebruiken hem, dus je hoeft hem niet te onthouden."
|
|
}
|
|
]
|
|
}
|
|
]
|
|
}
|