v0.8.00-beta - 55 apps erbij, en drie kapotte images gevonden
All checks were successful
Deploy server-up (dev) / deploy (push) Successful in 2m22s

- Catalogus van 142 naar 197 apps. Het zwaartepunt lag na het ARR-werk op media
  (42 apps) terwijl communicatie er 4 had, AI 4, financien 3 en foto's 2
- Drie nieuwe categorieen: Statistiek, Zakelijk en Spellen
- Homelab-gereedschap: Dockge, Komodo, Glance, Gatus, Scrutiny, Backrest,
  Headscale, Zoraxy, CrowdSec, NetAlertX, Pocket ID, Authentik
- Communicatie van 4 naar 12: Mattermost, Synapse, Element, Listmonk, Mumble,
  Roundcube, Stalwart
- Notities: Outline, Trilium, SilverBullet, Readeck, Docmost, Kiwix
- Verder LibreChat, AnythingLLM, LocalAI, Ghostfolio, Wallos, Maybe, Lychee,
  Piwigo, Homebox, wger, Donetick, Dawarich, Gitea, Adminer, code-server,
  Woodpecker, Semaphore, Opengist, MinIO, Pingvin Share, Umami, Matomo, Odoo,
  FreeScout, EspoCRM, RomM, Minecraft, Leantime, PrivateBin, Emby, ConvertX
- Drie bestaande apps waren niet installeerbaar: Forgejo wees naar een
  latest-tag die dat project niet publiceert, Planka naar een tag 1 die niet
  bestaat, en Baby Buddy naar een ghcr-pad dat er niet is. Gevonden door alle
  213 images in de catalogus langs de registries te halen
- Twee testregels waren te krap: een config.yaml in files/ die geen compose is
  telde niet mee voor "veld wordt gebruikt", en geheimen die de gebruiker zelf
  aanlevert stonden in een handmatige namenlijst. Dat laatste is nu een vlag in
  het sjabloon: "eigen_invoer": true
- Nieuwe controles voor de 36 apps met een eigen database: elke extra container
  draagt de servicenaam als voorvoegsel, geen vaste databasewachtwoorden, en er
  wacht altijd iemand met depends_on op de database

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q9eqpADJSRs49SoGGr4NAy
This commit is contained in:
Ramon 2026-07-31 23:47:41 +02:00
parent 279c1e36e3
commit 7d178a68b0
125 changed files with 5789 additions and 13 deletions

View file

@ -1,3 +1,44 @@
# v0.8.00-beta — 55 apps erbij, en drie kapotte images gevonden
**De catalogus stond scheef.** Na het ARR-werk telde media 42 apps en downloaden
19, terwijl communicatie er 4 had, AI 4, financiën 3 en foto's 2. Wie de store
opende voor iets anders dan media, vond het vaak niet. Er zijn nu 55 apps bij, van
142 naar 197, gekozen op wat er in 2026 daadwerkelijk gedraaid wordt.
**Drie nieuwe categorieën:** Statistiek (Umami, Matomo), Zakelijk (Odoo,
FreeScout, EspoCRM) en Spellen (RomM, Minecraft) — hoeken die er helemaal niet
waren.
**Homelab-gereedschap:** Dockge, Komodo, Glance, Gatus, Scrutiny, Backrest,
Headscale, Zoraxy, CrowdSec, NetAlertX, Pocket ID en Authentik.
**Communicatie** gaat van 4 naar 12 met Mattermost, Synapse, Element, Listmonk,
Mumble, Roundcube en Stalwart. **Notities en documenten:** Outline, Trilium,
SilverBullet, Readeck, Docmost en Kiwix. Verder LibreChat, AnythingLLM, LocalAI,
Ghostfolio, Wallos, Maybe, Lychee, Piwigo, Homebox, wger, Donetick, Dawarich,
Gitea, Adminer, code-server, Woodpecker, Semaphore, Opengist, MinIO, Pingvin
Share, Leantime, PrivateBin, Emby en ConvertX.
**Drie apps in de catalogus waren niet te installeren.** De controle die bij het
ARR-werk Huntarr ontmaskerde, is nu over alle 213 images in de catalogus gehaald.
Daaruit kwamen drie stille fouten: Forgejo wees naar `:latest` terwijl dat project
helemaal geen latest-tag publiceert, Planka naar een tag `1` die niet bestaat, en
Baby Buddy naar `ghcr.io/babybuddy/babybuddy` — een pad dat er niet is, terwijl
het sjabloon met zijn PUID/PGID al voor de linuxserver-variant geschreven was. Alle
drie rechtgezet.
**Twee testregels waren te krap.** Een `config.yaml` in `files/` die geen
compose-bestand is, viel tussen wal en schip: hij werd niet als compose gescand en
overgeslagen omdat hij op `.yaml` eindigt — velden die alleen dáár gebruikt werden,
gingen door voor ongebruikt. En een verplicht geheim dat de gebruiker ergens anders
vandaan haalt, stond in een handmatige lijst met veldnamen. Dat is nu een vlag in
het sjabloon zelf: `"eigen_invoer": true`.
**Nieuwe controles.** Zesendertig apps brengen inmiddels hun eigen database mee.
Daarvoor geldt nu: elke extra container draagt de servicenaam als voorvoegsel
(anders botsen twee installaties van dezelfde app), geen enkel databasewachtwoord
staat vast in een sjabloon, en er wacht altijd iemand met `depends_on` op de
database.
# v0.7.90-beta — De ARR-stack uit elkaar, en netwerkopties per container # v0.7.90-beta — De ARR-stack uit elkaar, en netwerkopties per container
**Elk *arr-onderdeel is nu een losse app.** Wie alleen Sonarr wil, hoefde eerst **Elk *arr-onderdeel is nu een losse app.** Wie alleen Sonarr wil, hoefde eerst

View file

@ -16,7 +16,7 @@ IP-adres in je netwerk geven.
| | | | | |
|---|---| |---|---|
| **App-catalogus** | 96 kant-en-klare apps, ingedeeld in categorieën met kleur. Zoeken, filteren en installeren met een formulier in plaats van YAML. | | **App-catalogus** | 197 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. | | **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. | | **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. | | **Eigen IP per stack** | Met macvlan of ipvlan krijgt een app een eigen adres in je LAN in plaats van poorten op de host. |

View file

@ -1 +1 @@
0.7.90-beta 0.8.00-beta

View file

@ -0,0 +1,9 @@
services:
<< service_name >>:
image: adminer:latest
container_name: << service_name >>
environment:
- TZ=<< timezone >>
ports:
- "<< port >>:8080"
restart: unless-stopped

View file

@ -0,0 +1,51 @@
{
"kind": "compose",
"metadata": {
"name": "Adminer",
"description": "Databasebeheer in één bestand: MySQL, PostgreSQL, SQLite en meer, zonder installatie per database. Let op: Adminer geeft volledige toegang tot elke database die hij kan bereiken. Zet hem niet zomaar op internet.",
"tags": [
"database",
"beheer",
"ontwikkeling"
],
"icon": {
"provider": "selfhst",
"id": "adminer"
},
"version": {
"name": "latest"
},
"categories": [
"ontwikkeling"
]
},
"variables": [
{
"title": "Algemeen",
"items": [
{
"name": "service_name",
"type": "str",
"title": "Servicenaam",
"default": "adminer",
"required": true
},
{
"name": "port",
"type": "int",
"title": "Webinterface",
"default": 8160,
"required": true,
"description": "Standaard 8080; hier verplaatst omdat die poort al bezet is"
},
{
"name": "timezone",
"type": "str",
"title": "Tijdzone",
"default": "Europe/Amsterdam",
"required": true
}
]
}
]
}

View file

@ -0,0 +1,14 @@
services:
<< service_name >>:
image: mintplexlabs/anythingllm:latest
container_name: << service_name >>
environment:
- TZ=<< timezone >>
- STORAGE_DIR=/app/server/storage
volumes:
- << appdata_dir >>/<< service_name >>:/app/server/storage
ports:
- "<< port >>:3001"
cap_add:
- SYS_ADMIN
restart: unless-stopped

View file

@ -0,0 +1,61 @@
{
"kind": "compose",
"metadata": {
"name": "AnythingLLM",
"description": "Praat met je eigen documenten: laadt bestanden in een vectordatabase en gebruikt die als context. Werkt met Ollama.",
"tags": [
"ai",
"llm",
"rag",
"documenten"
],
"icon": {
"provider": "selfhst",
"id": "anythingllm"
},
"version": {
"name": "latest"
},
"categories": [
"ai",
"documenten"
]
},
"variables": [
{
"title": "Algemeen",
"items": [
{
"name": "service_name",
"type": "str",
"title": "Servicenaam",
"default": "anythingllm",
"required": true
},
{
"name": "port",
"type": "int",
"title": "Webinterface",
"default": 8142,
"required": true,
"description": "Standaard 3001; hier verplaatst omdat die poort al bezet is"
},
{
"name": "appdata_dir",
"type": "str",
"title": "Appdata-map",
"default": "/opt/serverup/appdata",
"required": true,
"description": "Basismap voor de gegevens van deze app"
},
{
"name": "timezone",
"type": "str",
"title": "Tijdzone",
"default": "Europe/Amsterdam",
"required": true
}
]
}
]
}

View file

@ -0,0 +1,58 @@
services:
<< service_name >>:
image: ghcr.io/goauthentik/server:latest
container_name: << service_name >>
environment:
- TZ=<< timezone >>
- AUTHENTIK_SECRET_KEY=<< secret_key >>
- AUTHENTIK_POSTGRESQL__HOST=<< service_name >>-db
- AUTHENTIK_POSTGRESQL__USER=authentik
- AUTHENTIK_POSTGRESQL__NAME=authentik
- AUTHENTIK_POSTGRESQL__PASSWORD=<< db_password >>
- AUTHENTIK_REDIS__HOST=<< service_name >>-redis
volumes:
- << appdata_dir >>/<< service_name >>:/media
- << appdata_dir >>/<< service_name >>-templates:/templates
command: server
ports:
- "<< port >>:9000"
depends_on:
- << service_name >>-db
- << service_name >>-redis
restart: unless-stopped
<< service_name >>-worker:
image: ghcr.io/goauthentik/server:latest
container_name: << service_name >>-worker
command: worker
environment:
- AUTHENTIK_SECRET_KEY=<< secret_key >>
- AUTHENTIK_POSTGRESQL__HOST=<< service_name >>-db
- AUTHENTIK_POSTGRESQL__USER=authentik
- AUTHENTIK_POSTGRESQL__NAME=authentik
- AUTHENTIK_POSTGRESQL__PASSWORD=<< db_password >>
- AUTHENTIK_REDIS__HOST=<< service_name >>-redis
volumes:
- << appdata_dir >>/<< service_name >>/media:/media
- << appdata_dir >>/<< service_name >>-templates:/templates
- /var/run/docker.sock:/var/run/docker.sock
depends_on:
- << service_name >>-db
- << service_name >>-redis
restart: unless-stopped
<< service_name >>-db:
image: postgres:16-alpine
container_name: << service_name >>-db
environment:
- POSTGRES_DB=authentik
- POSTGRES_USER=authentik
- POSTGRES_PASSWORD=<< db_password >>
volumes:
- << appdata_dir >>/<< service_name >>-db:/var/lib/postgresql/data
restart: unless-stopped
<< service_name >>-redis:
image: valkey/valkey:8-alpine
container_name: << service_name >>-redis
command: valkey-server --save 60 1
volumes:
- << appdata_dir >>/<< service_name >>-redis:/data
restart: unless-stopped

View file

@ -0,0 +1,86 @@
{
"kind": "compose",
"metadata": {
"name": "Authentik",
"description": "Volledige identiteitsserver: OIDC, SAML, LDAP en passkeys, met een visuele opbouw van je inlogstappen. De zwaardere broer van Authelia.",
"tags": [
"sso",
"oidc",
"saml",
"ldap",
"authenticatie"
],
"icon": {
"provider": "selfhst",
"id": "authentik"
},
"version": {
"name": "latest"
},
"categories": [
"beveiliging"
]
},
"variables": [
{
"title": "Algemeen",
"items": [
{
"name": "service_name",
"type": "str",
"title": "Servicenaam",
"default": "authentik",
"required": true
},
{
"name": "port",
"type": "int",
"title": "Webinterface",
"default": 8133,
"required": true,
"description": "Standaard 9000; hier verplaatst omdat die poort al bezet is"
},
{
"name": "appdata_dir",
"type": "str",
"title": "Appdata-map",
"default": "/opt/serverup/appdata",
"required": true,
"description": "Basismap voor de gegevens van deze app"
},
{
"name": "timezone",
"type": "str",
"title": "Tijdzone",
"default": "Europe/Amsterdam",
"required": true
}
]
},
{
"title": "Toegang",
"items": [
{
"name": "db_password",
"type": "str",
"title": "Databasewachtwoord",
"default": "",
"required": true,
"secret": true,
"generate": "auto",
"description": "Wordt automatisch ingevuld en in .env bewaard"
},
{
"name": "secret_key",
"type": "str",
"title": "Geheime sleutel",
"default": "",
"required": true,
"secret": true,
"generate": "auto",
"description": "Ondertekent de sessies; verlies je hem, dan moet iedereen opnieuw inloggen"
}
]
}
]
}

View file

@ -1,6 +1,6 @@
services: services:
<< service_name >>: << service_name >>:
image: ghcr.io/babybuddy/babybuddy:latest image: lscr.io/linuxserver/babybuddy:latest
container_name: << service_name >> container_name: << service_name >>
ports: ports:
- "<< port >>:8000" - "<< port >>:8000"
@ -12,5 +12,5 @@ services:
- ALLOWED_HOSTS=<< allowed_hosts >> - ALLOWED_HOSTS=<< allowed_hosts >>
- CSRF_TRUSTED_ORIGINS=http://<< allowed_hosts >> - CSRF_TRUSTED_ORIGINS=http://<< allowed_hosts >>
volumes: volumes:
- << appdata_dir >>/<< service_name >>/config:/app/data - << appdata_dir >>/<< service_name >>:/config
restart: unless-stopped restart: unless-stopped

View file

@ -0,0 +1,14 @@
services:
<< service_name >>:
image: garethgeorge/backrest:latest
container_name: << service_name >>
environment:
- TZ=<< timezone >>
volumes:
- << appdata_dir >>/<< service_name >>:/config
- << appdata_dir >>/<< service_name >>-data:/data
- << appdata_dir >>/<< service_name >>-cache:/cache
- << bron_dir >>:/userdata:ro
ports:
- "<< port >>:9898"
restart: unless-stopped

View file

@ -0,0 +1,72 @@
{
"kind": "compose",
"metadata": {
"name": "Backrest",
"description": "Webinterface voor restic: back-upschema's, snapshots doorbladeren en terugzetten, zonder de commandoregel.",
"tags": [
"backup",
"restic",
"opslag"
],
"icon": {
"provider": "selfhst",
"id": "backrest"
},
"version": {
"name": "latest"
},
"categories": [
"opslag"
]
},
"variables": [
{
"title": "Algemeen",
"items": [
{
"name": "service_name",
"type": "str",
"title": "Servicenaam",
"default": "backrest",
"required": true
},
{
"name": "port",
"type": "int",
"title": "Webinterface",
"default": 8127,
"required": true,
"description": "Standaard 9898; hier verplaatst omdat die poort al bezet is"
},
{
"name": "appdata_dir",
"type": "str",
"title": "Appdata-map",
"default": "/opt/serverup/appdata",
"required": true,
"description": "Basismap voor de gegevens van deze app"
},
{
"name": "timezone",
"type": "str",
"title": "Tijdzone",
"default": "Europe/Amsterdam",
"required": true
}
]
},
{
"title": "Instellingen",
"items": [
{
"name": "bron_dir",
"type": "str",
"title": "Map om te back-uppen",
"default": "/opt/serverup",
"required": true,
"description": "Wordt alleen-lezen gekoppeld als /userdata"
}
]
}
]
}

View file

@ -0,0 +1,16 @@
services:
<< service_name >>:
image: lscr.io/linuxserver/code-server:latest
container_name: << service_name >>
environment:
- PUID=<< puid >>
- PGID=<< pgid >>
- TZ=<< timezone >>
- UMASK=002
- PASSWORD=<< wachtwoord >>
- DEFAULT_WORKSPACE=/config/workspace
volumes:
- << appdata_dir >>/<< service_name >>:/config
ports:
- "<< port >>:8443"
restart: unless-stopped

View file

@ -0,0 +1,93 @@
{
"kind": "compose",
"metadata": {
"name": "code-server",
"description": "Visual Studio Code in je browser, draaiend op de server. Handig om vanaf een tablet of een andere machine te werken.",
"tags": [
"editor",
"ontwikkeling",
"code"
],
"icon": {
"provider": "selfhst",
"id": "vscode"
},
"version": {
"name": "latest"
},
"categories": [
"ontwikkeling"
]
},
"variables": [
{
"title": "Algemeen",
"items": [
{
"name": "service_name",
"type": "str",
"title": "Servicenaam",
"default": "codeserver",
"required": true
},
{
"name": "port",
"type": "int",
"title": "Webinterface",
"default": 8161,
"required": true,
"description": "Standaard 8443; hier verplaatst omdat die poort al bezet is"
},
{
"name": "appdata_dir",
"type": "str",
"title": "Appdata-map",
"default": "/opt/serverup/appdata",
"required": true,
"description": "Basismap voor de gegevens van deze app"
},
{
"name": "timezone",
"type": "str",
"title": "Tijdzone",
"default": "Europe/Amsterdam",
"required": true
}
]
},
{
"title": "Gebruiker",
"items": [
{
"name": "puid",
"type": "int",
"title": "Gebruikers-ID (PUID)",
"default": 1000,
"required": true,
"description": "`id -u` op je server; bepaalt de eigenaar van de bestanden"
},
{
"name": "pgid",
"type": "int",
"title": "Groeps-ID (PGID)",
"default": 1000,
"required": true
}
]
},
{
"title": "Toegang",
"items": [
{
"name": "wachtwoord",
"type": "str",
"title": "Wachtwoord voor de editor",
"default": "",
"required": true,
"secret": true,
"eigen_invoer": true
}
]
}
]
}

View file

@ -0,0 +1,13 @@
services:
<< service_name >>:
image: ghcr.io/c4illin/convertx:latest
container_name: << service_name >>
environment:
- TZ=<< timezone >>
- JWT_SECRET=<< jwt_secret >>
- ACCOUNT_REGISTRATION=false
volumes:
- << appdata_dir >>/<< service_name >>:/app/data
ports:
- "<< port >>:3000"
restart: unless-stopped

View file

@ -0,0 +1,73 @@
{
"kind": "compose",
"metadata": {
"name": "ConvertX",
"description": "Zet bestanden om naar een ander formaat in je browser: afbeeldingen, documenten, video en geluid, zonder uploaddienst van derden.",
"tags": [
"conversie",
"bestanden",
"gereedschap"
],
"icon": {
"provider": "selfhst",
"id": "convertx"
},
"version": {
"name": "latest"
},
"categories": [
"productiviteit"
]
},
"variables": [
{
"title": "Algemeen",
"items": [
{
"name": "service_name",
"type": "str",
"title": "Servicenaam",
"default": "convertx",
"required": true
},
{
"name": "port",
"type": "int",
"title": "Webinterface",
"default": 8176,
"required": true,
"description": "Standaard 3000; hier verplaatst omdat die poort al bezet is"
},
{
"name": "appdata_dir",
"type": "str",
"title": "Appdata-map",
"default": "/opt/serverup/appdata",
"required": true,
"description": "Basismap voor de gegevens van deze app"
},
{
"name": "timezone",
"type": "str",
"title": "Tijdzone",
"default": "Europe/Amsterdam",
"required": true
}
]
},
{
"title": "Toegang",
"items": [
{
"name": "jwt_secret",
"type": "str",
"title": "JWT-sleutel",
"default": "",
"required": true,
"secret": true,
"generate": "auto"
}
]
}
]
}

View file

@ -0,0 +1,14 @@
services:
<< service_name >>:
image: crowdsecurity/crowdsec:latest
container_name: << service_name >>
environment:
- TZ=<< timezone >>
- COLLECTIONS=crowdsecurity/linux crowdsecurity/nginx
volumes:
- << appdata_dir >>/<< service_name >>:/etc/crowdsec
- << appdata_dir >>/<< service_name >>-data:/var/lib/crowdsec/data
- << log_dir >>:/var/log/host:ro
ports:
- "<< port >>:8080"
restart: unless-stopped

View file

@ -0,0 +1,72 @@
{
"kind": "compose",
"metadata": {
"name": "CrowdSec",
"description": "Leest je logbestanden mee en blokkeert aanvallers, met een blocklijst die door alle gebruikers samen wordt opgebouwd.",
"tags": [
"beveiliging",
"firewall",
"logs"
],
"icon": {
"provider": "selfhst",
"id": "crowdsec"
},
"version": {
"name": "latest"
},
"categories": [
"beveiliging"
]
},
"variables": [
{
"title": "Algemeen",
"items": [
{
"name": "service_name",
"type": "str",
"title": "Servicenaam",
"default": "crowdsec",
"required": true
},
{
"name": "port",
"type": "int",
"title": "API-poort",
"default": 8130,
"required": true,
"description": "Standaard 8080; hier verplaatst omdat die poort al bezet is"
},
{
"name": "appdata_dir",
"type": "str",
"title": "Appdata-map",
"default": "/opt/serverup/appdata",
"required": true,
"description": "Basismap voor de gegevens van deze app"
},
{
"name": "timezone",
"type": "str",
"title": "Tijdzone",
"default": "Europe/Amsterdam",
"required": true
}
]
},
{
"title": "Instellingen",
"items": [
{
"name": "log_dir",
"type": "str",
"title": "Logmap van de host",
"default": "/var/log",
"required": true,
"description": "Wordt alleen-lezen gekoppeld; hier leest CrowdSec in mee"
}
]
}
]
}

View file

@ -0,0 +1,40 @@
services:
<< service_name >>:
image: freikin/dawarich:latest
container_name: << service_name >>
environment:
- RAILS_ENV=development
- DATABASE_HOST=<< service_name >>-db
- DATABASE_USERNAME=dawarich
- DATABASE_PASSWORD=<< db_password >>
- DATABASE_NAME=dawarich
- REDIS_URL=redis://<< service_name >>-redis:6379
- APPLICATION_HOSTS=<< app_hosts >>
- TIME_ZONE=<< timezone >>
- SECRET_KEY_BASE=<< secret_key_base >>
volumes:
- << appdata_dir >>/<< service_name >>:/var/app/public
command: ["web-entrypoint.sh", "bin/rails", "server", "-p", "3000", "-b", "::"]
ports:
- "<< port >>:3000"
depends_on:
- << service_name >>-db
- << service_name >>-redis
restart: unless-stopped
<< service_name >>-db:
image: postgis/postgis:16-3.4-alpine
container_name: << service_name >>-db
environment:
- POSTGRES_DB=dawarich
- POSTGRES_USER=dawarich
- POSTGRES_PASSWORD=<< db_password >>
volumes:
- << appdata_dir >>/<< service_name >>-db:/var/lib/postgresql/data
restart: unless-stopped
<< service_name >>-redis:
image: valkey/valkey:8-alpine
container_name: << service_name >>-redis
command: valkey-server --save 60 1
volumes:
- << appdata_dir >>/<< service_name >>-redis:/data
restart: unless-stopped

View file

@ -0,0 +1,97 @@
{
"kind": "compose",
"metadata": {
"name": "Dawarich",
"description": "Je eigen locatiegeschiedenis, als vervanging van Google Maps Timeline. Importeert je oude Google-export.",
"tags": [
"locatie",
"kaart",
"privacy"
],
"icon": {
"provider": "selfhst",
"id": "dawarich"
},
"version": {
"name": "latest"
},
"categories": [
"gezin",
"beveiliging"
]
},
"variables": [
{
"title": "Algemeen",
"items": [
{
"name": "service_name",
"type": "str",
"title": "Servicenaam",
"default": "dawarich",
"required": true
},
{
"name": "port",
"type": "int",
"title": "Webinterface",
"default": 8152,
"required": true,
"description": "Standaard 3000; hier verplaatst omdat die poort al bezet is"
},
{
"name": "appdata_dir",
"type": "str",
"title": "Appdata-map",
"default": "/opt/serverup/appdata",
"required": true,
"description": "Basismap voor de gegevens van deze app"
},
{
"name": "timezone",
"type": "str",
"title": "Tijdzone",
"default": "Europe/Amsterdam",
"required": true
}
]
},
{
"title": "Instellingen",
"items": [
{
"name": "app_hosts",
"type": "str",
"title": "Toegestane adressen",
"default": "localhost",
"required": true,
"description": "Komma-gescheiden; Rails weigert verzoeken van andere namen"
}
]
},
{
"title": "Toegang",
"items": [
{
"name": "db_password",
"type": "str",
"title": "Databasewachtwoord",
"default": "",
"required": true,
"secret": true,
"generate": "auto",
"description": "Wordt automatisch ingevuld en in .env bewaard"
},
{
"name": "secret_key_base",
"type": "str",
"title": "Rails-sleutel",
"default": "",
"required": true,
"secret": true,
"generate": "auto"
}
]
}
]
}

View file

@ -0,0 +1,14 @@
services:
<< service_name >>:
image: louislam/dockge:1
container_name: << service_name >>
environment:
- TZ=<< timezone >>
- DOCKGE_STACKS_DIR=/opt/stacks
volumes:
- << appdata_dir >>/<< service_name >>:/app/data
- /var/run/docker.sock:/var/run/docker.sock
- << stacks_dir >>:/opt/stacks
ports:
- "<< port >>:5001"
restart: unless-stopped

73
apps/dockge/template.json Normal file
View file

@ -0,0 +1,73 @@
{
"kind": "compose",
"metadata": {
"name": "Dockge",
"description": "Beheert je compose-stacks met een interface die het compose-bestand laat zien in plaats van te verstoppen. Lichter dan Portainer.",
"tags": [
"docker",
"beheer",
"containers"
],
"icon": {
"provider": "selfhst",
"id": "dockge"
},
"version": {
"name": "latest"
},
"categories": [
"beheer"
]
},
"variables": [
{
"title": "Algemeen",
"items": [
{
"name": "service_name",
"type": "str",
"title": "Servicenaam",
"default": "dockge",
"required": true
},
{
"name": "port",
"type": "int",
"title": "Webinterface",
"default": 8121,
"required": true,
"description": "Standaard 5001; hier verplaatst omdat die poort al bezet is"
},
{
"name": "appdata_dir",
"type": "str",
"title": "Appdata-map",
"default": "/opt/serverup/appdata",
"required": true,
"description": "Basismap voor de gegevens van deze app"
},
{
"name": "timezone",
"type": "str",
"title": "Tijdzone",
"default": "Europe/Amsterdam",
"required": true
}
]
},
{
"title": "Instellingen",
"items": [
{
"name": "stacks_dir",
"type": "str",
"title": "Stacks-map",
"default": "/opt/stacks",
"required": true,
"description": "Waar Dockge de compose-bestanden neerzet",
"help": "Dockge bewaart hier zijn eigen stacks. Wijs dit niet naar de library van Server Up: dan beheren twee programma's dezelfde mappen en overschrijven ze elkaars werk."
}
]
}
]
}

View file

@ -0,0 +1,35 @@
services:
<< service_name >>:
image: docmost/docmost:latest
container_name: << service_name >>
environment:
- TZ=<< timezone >>
- APP_URL=<< app_url >>
- APP_SECRET=<< app_secret >>
- DATABASE_URL=postgresql://docmost:<< db_password >>@<< service_name >>-db:5432/docmost?schema=public
- REDIS_URL=redis://<< service_name >>-redis:6379
volumes:
- << appdata_dir >>/<< service_name >>:/app/data/storage
ports:
- "<< port >>:3000"
depends_on:
- << service_name >>-db
- << service_name >>-redis
restart: unless-stopped
<< service_name >>-db:
image: postgres:16-alpine
container_name: << service_name >>-db
environment:
- POSTGRES_DB=docmost
- POSTGRES_USER=docmost
- POSTGRES_PASSWORD=<< db_password >>
volumes:
- << appdata_dir >>/<< service_name >>-db:/var/lib/postgresql/data
restart: unless-stopped
<< service_name >>-redis:
image: valkey/valkey:8-alpine
container_name: << service_name >>-redis
command: valkey-server --save 60 1
volumes:
- << appdata_dir >>/<< service_name >>-redis:/data
restart: unless-stopped

View file

@ -0,0 +1,96 @@
{
"kind": "compose",
"metadata": {
"name": "Docmost",
"description": "Documenten samen bewerken in realtime, met werkruimtes en rechten. Vergelijkbaar met Confluence of Notion.",
"tags": [
"wiki",
"documenten",
"samenwerken"
],
"icon": {
"provider": "selfhst",
"id": "docmost"
},
"version": {
"name": "latest"
},
"categories": [
"documenten",
"productiviteit"
]
},
"variables": [
{
"title": "Algemeen",
"items": [
{
"name": "service_name",
"type": "str",
"title": "Servicenaam",
"default": "docmost",
"required": true
},
{
"name": "port",
"type": "int",
"title": "Webinterface",
"default": 8157,
"required": true,
"description": "Standaard 3000; hier verplaatst omdat die poort al bezet is"
},
{
"name": "appdata_dir",
"type": "str",
"title": "Appdata-map",
"default": "/opt/serverup/appdata",
"required": true,
"description": "Basismap voor de gegevens van deze app"
},
{
"name": "timezone",
"type": "str",
"title": "Tijdzone",
"default": "Europe/Amsterdam",
"required": true
}
]
},
{
"title": "Instellingen",
"items": [
{
"name": "app_url",
"type": "str",
"title": "Publiek adres",
"default": "http://localhost:8157",
"required": true
}
]
},
{
"title": "Toegang",
"items": [
{
"name": "db_password",
"type": "str",
"title": "Databasewachtwoord",
"default": "",
"required": true,
"secret": true,
"generate": "auto",
"description": "Wordt automatisch ingevuld en in .env bewaard"
},
{
"name": "app_secret",
"type": "str",
"title": "Geheime sleutel",
"default": "",
"required": true,
"secret": true,
"generate": "auto"
}
]
}
]
}

View file

@ -0,0 +1,14 @@
services:
<< service_name >>:
image: donetick/donetick:latest
container_name: << service_name >>
environment:
- TZ=<< timezone >>
- DT_ENV=selfhosted
- DT_SQLITE_PATH=/donetick-data/donetick.db
- DT_JWT_SECRET=<< jwt_secret >>
volumes:
- << appdata_dir >>/<< service_name >>:/donetick-data
ports:
- "<< port >>:2021"
restart: unless-stopped

View file

@ -0,0 +1,74 @@
{
"kind": "compose",
"metadata": {
"name": "Donetick",
"description": "Terugkerende klusjes verdelen in huis, met beurten die doorschuiven en een melding als jij aan de beurt bent.",
"tags": [
"taken",
"huishouden",
"klusjes"
],
"icon": {
"provider": "selfhst",
"id": "donetick"
},
"version": {
"name": "latest"
},
"categories": [
"gezin",
"productiviteit"
]
},
"variables": [
{
"title": "Algemeen",
"items": [
{
"name": "service_name",
"type": "str",
"title": "Servicenaam",
"default": "donetick",
"required": true
},
{
"name": "port",
"type": "int",
"title": "Webinterface",
"default": 8151,
"required": true,
"description": "Standaard 2021; hier verplaatst omdat die poort al bezet is"
},
{
"name": "appdata_dir",
"type": "str",
"title": "Appdata-map",
"default": "/opt/serverup/appdata",
"required": true,
"description": "Basismap voor de gegevens van deze app"
},
{
"name": "timezone",
"type": "str",
"title": "Tijdzone",
"default": "Europe/Amsterdam",
"required": true
}
]
},
{
"title": "Toegang",
"items": [
{
"name": "jwt_secret",
"type": "str",
"title": "JWT-sleutel",
"default": "",
"required": true,
"secret": true,
"generate": "auto"
}
]
}
]
}

View file

@ -0,0 +1,11 @@
services:
<< service_name >>:
image: vectorim/element-web:latest
container_name: << service_name >>
environment:
- TZ=<< timezone >>
volumes:
- ./config.json:/app/config.json:ro
ports:
- "<< port >>:80"
restart: unless-stopped

View file

@ -0,0 +1,10 @@
{
"default_server_config": {
"m.homeserver": {
"base_url": "<< homeserver >>",
"server_name": "<< server_name >>"
}
},
"brand": "Element",
"disable_guests": true
}

View file

@ -0,0 +1,77 @@
{
"kind": "compose",
"metadata": {
"name": "Element",
"description": "Webclient voor Matrix. Wijst standaard naar matrix.org; koppel hem aan je eigen Synapse.",
"tags": [
"matrix",
"chat",
"communicatie"
],
"icon": {
"provider": "selfhst",
"id": "element"
},
"version": {
"name": "latest"
},
"categories": [
"communicatie"
]
},
"variables": [
{
"title": "Algemeen",
"items": [
{
"name": "service_name",
"type": "str",
"title": "Servicenaam",
"default": "element",
"required": true
},
{
"name": "port",
"type": "int",
"title": "Webinterface",
"default": 8136,
"required": true,
"description": "Standaard 80; hier verplaatst omdat die poort al bezet is"
},
{
"name": "timezone",
"type": "str",
"title": "Tijdzone",
"default": "Europe/Amsterdam",
"required": true
}
]
},
{
"title": "Instellingen",
"items": [
{
"name": "homeserver",
"type": "str",
"title": "Adres van je homeserver",
"default": "https://matrix.example.com",
"required": true,
"connect": {
"app": "synapse",
"scheme": "http",
"port": 8008
},
"help": "Het adres van de Matrix-server waar deze client op inlogt. Draai je Synapse zelf, kies die dan hier."
},
{
"name": "server_name",
"type": "str",
"title": "Servernaam",
"default": "matrix.example.com",
"required": true,
"description": "Wordt getoond op het inlogscherm"
}
]
}
]
}

View file

@ -0,0 +1,14 @@
services:
<< service_name >>:
image: emby/embyserver:latest
container_name: << service_name >>
environment:
- TZ=<< timezone >>
- UID=<< puid >>
- GID=<< pgid >>
volumes:
- << appdata_dir >>/<< service_name >>:/config
- << data_root >>/media:/data/media:ro
ports:
- "<< port >>:8096"
restart: unless-stopped

89
apps/emby/template.json Normal file
View file

@ -0,0 +1,89 @@
{
"kind": "compose",
"metadata": {
"name": "Emby",
"description": "Mediaserver voor films, series en muziek, met eigen apps voor tv en telefoon. Alternatief voor Jellyfin en Plex.",
"tags": [
"media",
"streaming",
"films",
"series"
],
"icon": {
"provider": "selfhst",
"id": "emby"
},
"version": {
"name": "latest"
},
"categories": [
"media"
]
},
"variables": [
{
"title": "Algemeen",
"items": [
{
"name": "service_name",
"type": "str",
"title": "Servicenaam",
"default": "emby",
"required": true
},
{
"name": "port",
"type": "int",
"title": "Webinterface",
"default": 8175,
"required": true,
"description": "Standaard 8096; hier verplaatst omdat die poort al bezet is"
},
{
"name": "appdata_dir",
"type": "str",
"title": "Appdata-map",
"default": "/opt/serverup/appdata",
"required": true,
"description": "Basismap voor de gegevens van deze app"
},
{
"name": "data_root",
"type": "str",
"title": "Gedeelde datamap",
"default": "/mnt/data",
"required": true,
"description": "Eén map met je media, gekoppeld als /data",
"help": "Media en downloads horen onder één map te staan, die als /data in elke container komt. Alleen dan kan een voltooide download met een hardlink naar je bibliotheek: geen kopie, geen dubbele opslag, en je torrent blijft seeden. Zet je ze op gescheiden paden, dan kopieert elke download opnieuw. Eronder: media/films, media/series, torrents/ en usenet/."
},
{
"name": "timezone",
"type": "str",
"title": "Tijdzone",
"default": "Europe/Amsterdam",
"required": true
}
]
},
{
"title": "Gebruiker",
"items": [
{
"name": "puid",
"type": "int",
"title": "Gebruikers-ID (PUID)",
"default": 1000,
"required": true,
"description": "`id -u` op je server; bepaalt de eigenaar van de bestanden"
},
{
"name": "pgid",
"type": "int",
"title": "Groeps-ID (PGID)",
"default": 1000,
"required": true
}
]
}
]
}

View file

@ -0,0 +1,31 @@
services:
<< service_name >>:
image: espocrm/espocrm:latest
container_name: << service_name >>
environment:
- TZ=<< timezone >>
- ESPOCRM_DATABASE_HOST=<< service_name >>-db
- ESPOCRM_DATABASE_NAME=espocrm
- ESPOCRM_DATABASE_USER=espocrm
- ESPOCRM_DATABASE_PASSWORD=<< db_password >>
- ESPOCRM_ADMIN_USERNAME=<< admin_user >>
- ESPOCRM_ADMIN_PASSWORD=<< admin_password >>
- ESPOCRM_SITE_URL=<< app_url >>
volumes:
- << appdata_dir >>/<< service_name >>:/var/www/html
ports:
- "<< port >>:80"
depends_on:
- << service_name >>-db
restart: unless-stopped
<< service_name >>-db:
image: mariadb:11
container_name: << service_name >>-db
environment:
- MARIADB_DATABASE=espocrm
- MARIADB_USER=espocrm
- MARIADB_PASSWORD=<< db_password >>
- MARIADB_ROOT_PASSWORD=<< db_password >>
volumes:
- << appdata_dir >>/<< service_name >>-db:/var/lib/mysql
restart: unless-stopped

102
apps/espocrm/template.json Normal file
View file

@ -0,0 +1,102 @@
{
"kind": "compose",
"metadata": {
"name": "EspoCRM",
"description": "Klantrelatiebeheer: contacten, kansen, offertes en e-mail op één plek, met eigen velden en schermen.",
"tags": [
"crm",
"klanten",
"verkoop"
],
"icon": {
"provider": "selfhst",
"id": "espocrm"
},
"version": {
"name": "latest"
},
"categories": [
"zakelijk"
]
},
"variables": [
{
"title": "Algemeen",
"items": [
{
"name": "service_name",
"type": "str",
"title": "Servicenaam",
"default": "espocrm",
"required": true
},
{
"name": "port",
"type": "int",
"title": "Webinterface",
"default": 8171,
"required": true,
"description": "Standaard 80; hier verplaatst omdat die poort al bezet is"
},
{
"name": "appdata_dir",
"type": "str",
"title": "Appdata-map",
"default": "/opt/serverup/appdata",
"required": true,
"description": "Basismap voor de gegevens van deze app"
},
{
"name": "timezone",
"type": "str",
"title": "Tijdzone",
"default": "Europe/Amsterdam",
"required": true
}
]
},
{
"title": "Instellingen",
"items": [
{
"name": "admin_user",
"type": "str",
"title": "Beheerdersnaam",
"default": "admin",
"required": true
},
{
"name": "app_url",
"type": "str",
"title": "Publiek adres",
"default": "http://localhost:8171",
"required": true
}
]
},
{
"title": "Toegang",
"items": [
{
"name": "db_password",
"type": "str",
"title": "Databasewachtwoord",
"default": "",
"required": true,
"secret": true,
"generate": "auto",
"description": "Wordt automatisch ingevuld en in .env bewaard"
},
{
"name": "admin_password",
"type": "str",
"title": "Beheerderswachtwoord",
"default": "",
"required": true,
"secret": true,
"eigen_invoer": true
}
]
}
]
}

View file

@ -1,6 +1,6 @@
services: services:
<< service_name >>: << service_name >>:
image: codeberg.org/forgejo/forgejo:latest image: codeberg.org/forgejo/forgejo:13
container_name: << service_name >> container_name: << service_name >>
ports: ports:
- "<< port_web >>:3000" - "<< port_web >>:3000"

View file

@ -0,0 +1,33 @@
services:
<< service_name >>:
image: tiredofit/freescout:latest
container_name: << service_name >>
environment:
- TZ=<< timezone >>
- SITE_URL=<< app_url >>
- DB_TYPE=mariadb
- DB_HOST=<< service_name >>-db
- DB_NAME=freescout
- DB_USER=freescout
- DB_PASS=<< db_password >>
- ADMIN_EMAIL=<< admin_email >>
- ADMIN_PASS=<< admin_password >>
- DISPLAY_ERRORS=FALSE
volumes:
- << appdata_dir >>/<< service_name >>:/data
ports:
- "<< port >>:80"
depends_on:
- << service_name >>-db
restart: unless-stopped
<< service_name >>-db:
image: mariadb:11
container_name: << service_name >>-db
environment:
- MARIADB_DATABASE=freescout
- MARIADB_USER=freescout
- MARIADB_PASSWORD=<< db_password >>
- MARIADB_ROOT_PASSWORD=<< db_password >>
volumes:
- << appdata_dir >>/<< service_name >>-db:/var/lib/mysql
restart: unless-stopped

View file

@ -0,0 +1,104 @@
{
"kind": "compose",
"metadata": {
"name": "FreeScout",
"description": "Gedeelde postbus voor klantvragen: e-mails worden tickets, met notities en toewijzing per medewerker.",
"tags": [
"helpdesk",
"tickets",
"e-mail",
"klanten"
],
"icon": {
"provider": "selfhst",
"id": "freescout"
},
"version": {
"name": "latest"
},
"categories": [
"zakelijk",
"communicatie"
]
},
"variables": [
{
"title": "Algemeen",
"items": [
{
"name": "service_name",
"type": "str",
"title": "Servicenaam",
"default": "freescout",
"required": true
},
{
"name": "port",
"type": "int",
"title": "Webinterface",
"default": 8170,
"required": true,
"description": "Standaard 80; hier verplaatst omdat die poort al bezet is"
},
{
"name": "appdata_dir",
"type": "str",
"title": "Appdata-map",
"default": "/opt/serverup/appdata",
"required": true,
"description": "Basismap voor de gegevens van deze app"
},
{
"name": "timezone",
"type": "str",
"title": "Tijdzone",
"default": "Europe/Amsterdam",
"required": true
}
]
},
{
"title": "Instellingen",
"items": [
{
"name": "app_url",
"type": "str",
"title": "Publiek adres",
"default": "http://localhost:8170",
"required": true
},
{
"name": "admin_email",
"type": "str",
"title": "E-mailadres beheerder",
"default": "admin@example.com",
"required": true
}
]
},
{
"title": "Toegang",
"items": [
{
"name": "db_password",
"type": "str",
"title": "Databasewachtwoord",
"default": "",
"required": true,
"secret": true,
"generate": "auto",
"description": "Wordt automatisch ingevuld en in .env bewaard"
},
{
"name": "admin_password",
"type": "str",
"title": "Beheerderswachtwoord",
"default": "",
"required": true,
"secret": true,
"eigen_invoer": true
}
]
}
]
}

View file

@ -0,0 +1,12 @@
services:
<< service_name >>:
image: twinproduction/gatus:latest
container_name: << service_name >>
environment:
- TZ=<< timezone >>
volumes:
- << appdata_dir >>/<< service_name >>:/config
- ./config.yaml:/config/config.yaml
ports:
- "<< port >>:8080"
restart: unless-stopped

View file

@ -0,0 +1,6 @@
endpoints:
- name: server-up
url: "http://<< service_name >>:8080/health"
interval: 60s
conditions:
- "[STATUS] == 200"

59
apps/gatus/template.json Normal file
View file

@ -0,0 +1,59 @@
{
"kind": "compose",
"metadata": {
"name": "Gatus",
"description": "Bewaakt je diensten en toont per dienst een statuspagina met geschiedenis. Stuurt bericht als iets eruit ligt.",
"tags": [
"monitoring",
"status",
"uptime"
],
"icon": {
"provider": "selfhst",
"id": "gatus"
},
"version": {
"name": "latest"
},
"categories": [
"monitoring"
]
},
"variables": [
{
"title": "Algemeen",
"items": [
{
"name": "service_name",
"type": "str",
"title": "Servicenaam",
"default": "gatus",
"required": true
},
{
"name": "port",
"type": "int",
"title": "Webinterface",
"default": 8125,
"required": true,
"description": "Standaard 8080; hier verplaatst omdat die poort al bezet is"
},
{
"name": "appdata_dir",
"type": "str",
"title": "Appdata-map",
"default": "/opt/serverup/appdata",
"required": true,
"description": "Basismap voor de gegevens van deze app"
},
{
"name": "timezone",
"type": "str",
"title": "Tijdzone",
"default": "Europe/Amsterdam",
"required": true
}
]
}
]
}

View file

@ -0,0 +1,37 @@
services:
<< service_name >>:
image: ghostfolio/ghostfolio:latest
container_name: << service_name >>
environment:
- TZ=<< timezone >>
- DATABASE_URL=postgresql://ghostfolio:<< db_password >>@<< service_name >>-db:5432/ghostfolio?sslmode=prefer
- REDIS_HOST=<< service_name >>-redis
- REDIS_PORT=6379
- ACCESS_TOKEN_SALT=<< access_token_salt >>
- JWT_SECRET_KEY=<< jwt_secret >>
- NODE_ENV=production
volumes:
- << appdata_dir >>/<< service_name >>:/tmp/ghostfolio
ports:
- "<< port >>:3333"
depends_on:
- << service_name >>-db
- << service_name >>-redis
restart: unless-stopped
<< service_name >>-db:
image: postgres:16-alpine
container_name: << service_name >>-db
environment:
- POSTGRES_DB=ghostfolio
- POSTGRES_USER=ghostfolio
- POSTGRES_PASSWORD=<< db_password >>
volumes:
- << appdata_dir >>/<< service_name >>-db:/var/lib/postgresql/data
restart: unless-stopped
<< service_name >>-redis:
image: valkey/valkey:8-alpine
container_name: << service_name >>-redis
command: valkey-server --save 60 1
volumes:
- << appdata_dir >>/<< service_name >>-redis:/data
restart: unless-stopped

View file

@ -0,0 +1,92 @@
{
"kind": "compose",
"metadata": {
"name": "Ghostfolio",
"description": "Houdt je beleggingen bij over meerdere rekeningen heen, met spreiding, rendement en een tijdlijn.",
"tags": [
"beleggen",
"portefeuille",
"financien"
],
"icon": {
"provider": "selfhst",
"id": "ghostfolio"
},
"version": {
"name": "latest"
},
"categories": [
"financien"
]
},
"variables": [
{
"title": "Algemeen",
"items": [
{
"name": "service_name",
"type": "str",
"title": "Servicenaam",
"default": "ghostfolio",
"required": true
},
{
"name": "port",
"type": "int",
"title": "Webinterface",
"default": 8144,
"required": true,
"description": "Standaard 3333; hier verplaatst omdat die poort al bezet is"
},
{
"name": "appdata_dir",
"type": "str",
"title": "Appdata-map",
"default": "/opt/serverup/appdata",
"required": true,
"description": "Basismap voor de gegevens van deze app"
},
{
"name": "timezone",
"type": "str",
"title": "Tijdzone",
"default": "Europe/Amsterdam",
"required": true
}
]
},
{
"title": "Toegang",
"items": [
{
"name": "db_password",
"type": "str",
"title": "Databasewachtwoord",
"default": "",
"required": true,
"secret": true,
"generate": "auto",
"description": "Wordt automatisch ingevuld en in .env bewaard"
},
{
"name": "access_token_salt",
"type": "str",
"title": "Salt voor toegangstokens",
"default": "",
"required": true,
"secret": true,
"generate": "auto"
},
{
"name": "jwt_secret",
"type": "str",
"title": "JWT-sleutel",
"default": "",
"required": true,
"secret": true,
"generate": "auto"
}
]
}
]
}

View file

@ -0,0 +1,17 @@
services:
<< service_name >>:
image: gitea/gitea:latest
container_name: << service_name >>
environment:
- TZ=<< timezone >>
- USER_UID=<< puid >>
- USER_GID=<< pgid >>
- GITEA__database__DB_TYPE=sqlite3
- GITEA__server__ROOT_URL=<< root_url >>
- GITEA__server__SSH_PORT=<< port_ssh >>
volumes:
- << appdata_dir >>/<< service_name >>:/data
ports:
- "<< port >>:3000"
- "<< port_ssh >>:22"
restart: unless-stopped

100
apps/gitea/template.json Normal file
View file

@ -0,0 +1,100 @@
{
"kind": "compose",
"metadata": {
"name": "Gitea",
"description": "Git-hosting met issues, pull requests en een ingebouwde registry. Het project waar Forgejo uit voortkwam.",
"tags": [
"git",
"code",
"ontwikkeling"
],
"icon": {
"provider": "selfhst",
"id": "gitea"
},
"version": {
"name": "latest"
},
"categories": [
"ontwikkeling"
]
},
"variables": [
{
"title": "Algemeen",
"items": [
{
"name": "service_name",
"type": "str",
"title": "Servicenaam",
"default": "gitea",
"required": true
},
{
"name": "port",
"type": "int",
"title": "Webinterface",
"default": 8159,
"required": true,
"description": "Standaard 3000; hier verplaatst omdat die poort al bezet is"
},
{
"name": "port_ssh",
"type": "int",
"title": "SSH-poort",
"default": 2223,
"required": true,
"description": "Voor git via ssh"
},
{
"name": "appdata_dir",
"type": "str",
"title": "Appdata-map",
"default": "/opt/serverup/appdata",
"required": true,
"description": "Basismap voor de gegevens van deze app"
},
{
"name": "timezone",
"type": "str",
"title": "Tijdzone",
"default": "Europe/Amsterdam",
"required": true
}
]
},
{
"title": "Gebruiker",
"items": [
{
"name": "puid",
"type": "int",
"title": "Gebruikers-ID (PUID)",
"default": 1000,
"required": true,
"description": "`id -u` op je server; bepaalt de eigenaar van de bestanden"
},
{
"name": "pgid",
"type": "int",
"title": "Groeps-ID (PGID)",
"default": 1000,
"required": true
}
]
},
{
"title": "Instellingen",
"items": [
{
"name": "root_url",
"type": "str",
"title": "Publiek adres",
"default": "http://localhost:8159/",
"required": true,
"description": "Met een schuine streep aan het eind"
}
]
}
]
}

View file

@ -0,0 +1,13 @@
services:
<< service_name >>:
image: glanceapp/glance:latest
container_name: << service_name >>
environment:
- TZ=<< timezone >>
volumes:
- << appdata_dir >>/<< service_name >>:/app/config
- /var/run/docker.sock:/var/run/docker.sock:ro
- ./glance.yml:/app/config/glance.yml
ports:
- "<< port >>:8080"
restart: unless-stopped

View file

@ -0,0 +1,7 @@
pages:
- name: Start
columns:
- size: full
widgets:
- type: docker-containers
- type: server-stats

59
apps/glance/template.json Normal file
View file

@ -0,0 +1,59 @@
{
"kind": "compose",
"metadata": {
"name": "Glance",
"description": "Startpagina die je feeds, servercijfers, weer en agenda's op één scherm zet. Volledig in te richten met een configuratiebestand.",
"tags": [
"dashboard",
"startpagina",
"overzicht"
],
"icon": {
"provider": "selfhst",
"id": "glance"
},
"version": {
"name": "latest"
},
"categories": [
"beheer"
]
},
"variables": [
{
"title": "Algemeen",
"items": [
{
"name": "service_name",
"type": "str",
"title": "Servicenaam",
"default": "glance",
"required": true
},
{
"name": "port",
"type": "int",
"title": "Webinterface",
"default": 8124,
"required": true,
"description": "Standaard 8080; hier verplaatst omdat die poort al bezet is"
},
{
"name": "appdata_dir",
"type": "str",
"title": "Appdata-map",
"default": "/opt/serverup/appdata",
"required": true,
"description": "Basismap voor de gegevens van deze app"
},
{
"name": "timezone",
"type": "str",
"title": "Tijdzone",
"default": "Europe/Amsterdam",
"required": true
}
]
}
]
}

View file

@ -0,0 +1,14 @@
services:
<< service_name >>:
image: headscale/headscale:latest
container_name: << service_name >>
environment:
- TZ=<< timezone >>
volumes:
- << appdata_dir >>/<< service_name >>:/etc/headscale
- << appdata_dir >>/<< service_name >>-lib:/var/lib/headscale
- ./config.yaml:/etc/headscale/config.yaml
command: serve
ports:
- "<< port >>:8080"
restart: unless-stopped

View file

@ -0,0 +1,11 @@
server_url: http://<< server_url >>
listen_addr: 0.0.0.0:8080
metrics_listen_addr: 127.0.0.1:9090
noise:
private_key_path: /var/lib/headscale/noise_private.key
prefixes:
v4: 100.64.0.0/10
database:
type: sqlite
sqlite:
path: /var/lib/headscale/db.sqlite

View file

@ -0,0 +1,74 @@
{
"kind": "compose",
"metadata": {
"name": "Headscale",
"description": "Eigen coördinatieserver voor Tailscale-clients, zodat je mesh-VPN niet van een externe dienst afhangt. Let op: Zet Headscale niet achter een andere reverse proxy van jezelf zonder websockets door te laten; de clients houden een verbinding open.",
"tags": [
"vpn",
"netwerk",
"tailscale",
"wireguard"
],
"icon": {
"provider": "selfhst",
"id": "headscale"
},
"version": {
"name": "latest"
},
"categories": [
"netwerk",
"beveiliging"
]
},
"variables": [
{
"title": "Algemeen",
"items": [
{
"name": "service_name",
"type": "str",
"title": "Servicenaam",
"default": "headscale",
"required": true
},
{
"name": "port",
"type": "int",
"title": "Webinterface",
"default": 8128,
"required": true,
"description": "Standaard 8080; hier verplaatst omdat die poort al bezet is"
},
{
"name": "appdata_dir",
"type": "str",
"title": "Appdata-map",
"default": "/opt/serverup/appdata",
"required": true,
"description": "Basismap voor de gegevens van deze app"
},
{
"name": "timezone",
"type": "str",
"title": "Tijdzone",
"default": "Europe/Amsterdam",
"required": true
}
]
},
{
"title": "Instellingen",
"items": [
{
"name": "server_url",
"type": "str",
"title": "Publiek adres",
"default": "headscale.example.com:8128",
"required": true,
"description": "Het adres waarop je clients Headscale bereiken"
}
]
}
]
}

View file

@ -0,0 +1,13 @@
services:
<< service_name >>:
image: ghcr.io/sysadminsmedia/homebox:latest
container_name: << service_name >>
environment:
- TZ=<< timezone >>
- HBOX_LOG_LEVEL=info
- HBOX_OPTIONS_ALLOW_REGISTRATION=false
volumes:
- << appdata_dir >>/<< service_name >>:/data
ports:
- "<< port >>:7745"
restart: unless-stopped

View file

@ -0,0 +1,59 @@
{
"kind": "compose",
"metadata": {
"name": "Homebox",
"description": "Houdt bij wat je in huis hebt: waar het ligt, wat het kostte, wanneer de garantie afloopt. Met etiketten en QR-codes.",
"tags": [
"inventaris",
"huishouden",
"spullen"
],
"icon": {
"provider": "selfhst",
"id": "homebox"
},
"version": {
"name": "latest"
},
"categories": [
"gezin"
]
},
"variables": [
{
"title": "Algemeen",
"items": [
{
"name": "service_name",
"type": "str",
"title": "Servicenaam",
"default": "homebox",
"required": true
},
{
"name": "port",
"type": "int",
"title": "Webinterface",
"default": 8149,
"required": true,
"description": "Standaard 7745; hier verplaatst omdat die poort al bezet is"
},
{
"name": "appdata_dir",
"type": "str",
"title": "Appdata-map",
"default": "/opt/serverup/appdata",
"required": true,
"description": "Basismap voor de gegevens van deze app"
},
{
"name": "timezone",
"type": "str",
"title": "Tijdzone",
"default": "Europe/Amsterdam",
"required": true
}
]
}
]
}

View file

@ -0,0 +1,12 @@
services:
<< service_name >>:
image: ghcr.io/kiwix/kiwix-serve:latest
container_name: << service_name >>
environment:
- TZ=<< timezone >>
volumes:
- << appdata_dir >>/<< service_name >>:/data
command: "*.zim"
ports:
- "<< port >>:8080"
restart: unless-stopped

59
apps/kiwix/template.json Normal file
View file

@ -0,0 +1,59 @@
{
"kind": "compose",
"metadata": {
"name": "Kiwix",
"description": "Serveert offline kopieën van Wikipedia, Stack Overflow en meer uit zim-bestanden. Werkt zonder internet. Let op: Zet eerst een of meer .zim-bestanden in de datamap; download ze op library.kiwix.org. Zonder bestand start de container niet.",
"tags": [
"offline",
"wikipedia",
"naslag"
],
"icon": {
"provider": "selfhst",
"id": "kiwix"
},
"version": {
"name": "latest"
},
"categories": [
"documenten"
]
},
"variables": [
{
"title": "Algemeen",
"items": [
{
"name": "service_name",
"type": "str",
"title": "Servicenaam",
"default": "kiwix",
"required": true
},
{
"name": "port",
"type": "int",
"title": "Webinterface",
"default": 8158,
"required": true,
"description": "Standaard 8080; hier verplaatst omdat die poort al bezet is"
},
{
"name": "appdata_dir",
"type": "str",
"title": "Appdata-map",
"default": "/opt/serverup/appdata",
"required": true,
"description": "Basismap voor de gegevens van deze app"
},
{
"name": "timezone",
"type": "str",
"title": "Tijdzone",
"default": "Europe/Amsterdam",
"required": true
}
]
}
]
}

View file

@ -0,0 +1,30 @@
services:
<< service_name >>:
image: leantime/leantime:latest
container_name: << service_name >>
environment:
- TZ=<< timezone >>
- LEAN_DB_HOST=<< service_name >>-db
- LEAN_DB_USER=leantime
- LEAN_DB_PASSWORD=<< db_password >>
- LEAN_DB_DATABASE=leantime
- LEAN_APP_URL=<< app_url >>
- LEAN_SESSION_PASSWORD=<< session_password >>
volumes:
- << appdata_dir >>/<< service_name >>:/var/www/html/public/userfiles
ports:
- "<< port >>:8080"
depends_on:
- << service_name >>-db
restart: unless-stopped
<< service_name >>-db:
image: mariadb:11
container_name: << service_name >>-db
environment:
- MARIADB_DATABASE=leantime
- MARIADB_USER=leantime
- MARIADB_PASSWORD=<< db_password >>
- MARIADB_ROOT_PASSWORD=<< db_password >>
volumes:
- << appdata_dir >>/<< service_name >>-db:/var/lib/mysql
restart: unless-stopped

View file

@ -0,0 +1,96 @@
{
"kind": "compose",
"metadata": {
"name": "Leantime",
"description": "Projectbeheer voor kleine teams: doelen, taken, tijdregistratie en een planbord, zonder de overdaad van de grote pakketten.",
"tags": [
"projecten",
"taken",
"planning"
],
"icon": {
"provider": "selfhst",
"id": "leantime"
},
"version": {
"name": "latest"
},
"categories": [
"productiviteit",
"zakelijk"
]
},
"variables": [
{
"title": "Algemeen",
"items": [
{
"name": "service_name",
"type": "str",
"title": "Servicenaam",
"default": "leantime",
"required": true
},
{
"name": "port",
"type": "int",
"title": "Webinterface",
"default": 8173,
"required": true,
"description": "Standaard 8080; hier verplaatst omdat die poort al bezet is"
},
{
"name": "appdata_dir",
"type": "str",
"title": "Appdata-map",
"default": "/opt/serverup/appdata",
"required": true,
"description": "Basismap voor de gegevens van deze app"
},
{
"name": "timezone",
"type": "str",
"title": "Tijdzone",
"default": "Europe/Amsterdam",
"required": true
}
]
},
{
"title": "Instellingen",
"items": [
{
"name": "app_url",
"type": "str",
"title": "Publiek adres",
"default": "http://localhost:8173",
"required": true
}
]
},
{
"title": "Toegang",
"items": [
{
"name": "db_password",
"type": "str",
"title": "Databasewachtwoord",
"default": "",
"required": true,
"secret": true,
"generate": "auto",
"description": "Wordt automatisch ingevuld en in .env bewaard"
},
{
"name": "session_password",
"type": "str",
"title": "Sleutel voor de sessies",
"default": "",
"required": true,
"secret": true,
"generate": "auto"
}
]
}
]
}

View file

@ -0,0 +1,29 @@
services:
<< service_name >>:
image: ghcr.io/danny-avila/librechat:latest
container_name: << service_name >>
environment:
- TZ=<< timezone >>
- HOST=0.0.0.0
- PORT=3080
- MONGO_URI=mongodb://app:<< db_password >>@<< service_name >>-db:27017/LibreChat?authSource=admin
- CREDS_KEY=<< creds_key >>
- CREDS_IV=<< creds_iv >>
- JWT_SECRET=<< jwt_secret >>
- JWT_REFRESH_SECRET=<< jwt_refresh_secret >>
volumes:
- << appdata_dir >>/<< service_name >>:/app/client/public/images
ports:
- "<< port >>:3080"
depends_on:
- << service_name >>-db
restart: unless-stopped
<< service_name >>-db:
image: mongo:8
container_name: << service_name >>-db
environment:
- MONGO_INITDB_ROOT_USERNAME=app
- MONGO_INITDB_ROOT_PASSWORD=<< db_password >>
volumes:
- << appdata_dir >>/<< service_name >>-db:/data/db
restart: unless-stopped

View file

@ -0,0 +1,110 @@
{
"kind": "compose",
"metadata": {
"name": "LibreChat",
"description": "Chatinterface voor meerdere AI-aanbieders tegelijk, met gesprekken, presets en gedeelde prompts.",
"tags": [
"ai",
"llm",
"chat"
],
"icon": {
"provider": "selfhst",
"id": "librechat"
},
"version": {
"name": "latest"
},
"categories": [
"ai"
]
},
"variables": [
{
"title": "Algemeen",
"items": [
{
"name": "service_name",
"type": "str",
"title": "Servicenaam",
"default": "librechat",
"required": true
},
{
"name": "port",
"type": "int",
"title": "Webinterface",
"default": 8141,
"required": true,
"description": "Standaard 3080; hier verplaatst omdat die poort al bezet is"
},
{
"name": "appdata_dir",
"type": "str",
"title": "Appdata-map",
"default": "/opt/serverup/appdata",
"required": true,
"description": "Basismap voor de gegevens van deze app"
},
{
"name": "timezone",
"type": "str",
"title": "Tijdzone",
"default": "Europe/Amsterdam",
"required": true
}
]
},
{
"title": "Toegang",
"items": [
{
"name": "db_password",
"type": "str",
"title": "Databasewachtwoord",
"default": "",
"required": true,
"secret": true,
"generate": "auto",
"description": "Wordt automatisch ingevuld en in .env bewaard"
},
{
"name": "creds_key",
"type": "str",
"title": "Sleutel voor opgeslagen gegevens",
"default": "",
"required": true,
"secret": true,
"generate": "auto"
},
{
"name": "creds_iv",
"type": "str",
"title": "Beginwaarde voor de versleuteling",
"default": "",
"required": true,
"secret": true,
"generate": "auto"
},
{
"name": "jwt_secret",
"type": "str",
"title": "JWT-sleutel",
"default": "",
"required": true,
"secret": true,
"generate": "auto"
},
{
"name": "jwt_refresh_secret",
"type": "str",
"title": "JWT-vernieuwsleutel",
"default": "",
"required": true,
"secret": true,
"generate": "auto"
}
]
}
]
}

View file

@ -0,0 +1,33 @@
services:
<< service_name >>:
image: listmonk/listmonk:latest
container_name: << service_name >>
environment:
- TZ=<< timezone >>
- LISTMONK_app__address=0.0.0.0:9000
- LISTMONK_db__host=<< service_name >>-db
- LISTMONK_db__port=5432
- LISTMONK_db__user=listmonk
- LISTMONK_db__password=<< db_password >>
- LISTMONK_db__database=listmonk
- LISTMONK_db__ssl_mode=disable
- LISTMONK_app__admin_username=<< admin_user >>
- LISTMONK_app__admin_password=<< admin_password >>
volumes:
- << appdata_dir >>/<< service_name >>:/listmonk/uploads
command: sh -c "./listmonk --install --idempotent --yes --config '' && ./listmonk --config ''"
ports:
- "<< port >>:9000"
depends_on:
- << service_name >>-db
restart: unless-stopped
<< service_name >>-db:
image: postgres:16-alpine
container_name: << service_name >>-db
environment:
- POSTGRES_DB=listmonk
- POSTGRES_USER=listmonk
- POSTGRES_PASSWORD=<< db_password >>
volumes:
- << appdata_dir >>/<< service_name >>-db:/var/lib/postgresql/data
restart: unless-stopped

View file

@ -0,0 +1,97 @@
{
"kind": "compose",
"metadata": {
"name": "Listmonk",
"description": "Nieuwsbrieven en mailinglijsten versturen, met sjablonen, segmenten en statistieken per campagne.",
"tags": [
"nieuwsbrief",
"e-mail",
"campagnes"
],
"icon": {
"provider": "selfhst",
"id": "listmonk"
},
"version": {
"name": "latest"
},
"categories": [
"communicatie",
"zakelijk"
]
},
"variables": [
{
"title": "Algemeen",
"items": [
{
"name": "service_name",
"type": "str",
"title": "Servicenaam",
"default": "listmonk",
"required": true
},
{
"name": "port",
"type": "int",
"title": "Webinterface",
"default": 8137,
"required": true,
"description": "Standaard 9000; hier verplaatst omdat die poort al bezet is"
},
{
"name": "appdata_dir",
"type": "str",
"title": "Appdata-map",
"default": "/opt/serverup/appdata",
"required": true,
"description": "Basismap voor de gegevens van deze app"
},
{
"name": "timezone",
"type": "str",
"title": "Tijdzone",
"default": "Europe/Amsterdam",
"required": true
}
]
},
{
"title": "Instellingen",
"items": [
{
"name": "admin_user",
"type": "str",
"title": "Beheerdersnaam",
"default": "admin",
"required": true
}
]
},
{
"title": "Toegang",
"items": [
{
"name": "db_password",
"type": "str",
"title": "Databasewachtwoord",
"default": "",
"required": true,
"secret": true,
"generate": "auto",
"description": "Wordt automatisch ingevuld en in .env bewaard"
},
{
"name": "admin_password",
"type": "str",
"title": "Beheerderswachtwoord",
"default": "",
"required": true,
"secret": true,
"eigen_invoer": true,
"description": "Minimaal 8 tekens"
}
]
}
]
}

View file

@ -0,0 +1,13 @@
services:
<< service_name >>:
image: localai/localai:latest
container_name: << service_name >>
environment:
- TZ=<< timezone >>
- MODELS_PATH=/models
- THREADS=4
volumes:
- << appdata_dir >>/<< service_name >>:/models
ports:
- "<< port >>:8080"
restart: unless-stopped

View file

@ -0,0 +1,59 @@
{
"kind": "compose",
"metadata": {
"name": "LocalAI",
"description": "Draait taalmodellen lokaal achter een API die dezelfde vorm heeft als die van OpenAI, zodat bestaande tools er zo op aansluiten.",
"tags": [
"ai",
"llm",
"api"
],
"icon": {
"provider": "selfhst",
"id": "localai"
},
"version": {
"name": "latest"
},
"categories": [
"ai"
]
},
"variables": [
{
"title": "Algemeen",
"items": [
{
"name": "service_name",
"type": "str",
"title": "Servicenaam",
"default": "localai",
"required": true
},
{
"name": "port",
"type": "int",
"title": "Webinterface",
"default": 8143,
"required": true,
"description": "Standaard 8080; hier verplaatst omdat die poort al bezet is"
},
{
"name": "appdata_dir",
"type": "str",
"title": "Appdata-map",
"default": "/opt/serverup/appdata",
"required": true,
"description": "Basismap voor de gegevens van deze app"
},
{
"name": "timezone",
"type": "str",
"title": "Tijdzone",
"default": "Europe/Amsterdam",
"required": true
}
]
}
]
}

View file

@ -0,0 +1,15 @@
services:
<< service_name >>:
image: lycheeorg/lychee:latest
container_name: << service_name >>
environment:
- DB_CONNECTION=sqlite
- APP_URL=<< app_url >>
- TIMEZONE=<< timezone >>
volumes:
- << appdata_dir >>/<< service_name >>:/conf
- << appdata_dir >>/<< service_name >>-uploads:/uploads
- << appdata_dir >>/<< service_name >>-sym:/sym
ports:
- "<< port >>:80"
restart: unless-stopped

71
apps/lychee/template.json Normal file
View file

@ -0,0 +1,71 @@
{
"kind": "compose",
"metadata": {
"name": "Lychee",
"description": "Fotoalbums die je kunt delen, met wachtwoorden per album en een importmap. Lichter dan Immich als je geen telefoonsynchronisatie nodig hebt.",
"tags": [
"fotos",
"albums",
"delen"
],
"icon": {
"provider": "selfhst",
"id": "lychee"
},
"version": {
"name": "latest"
},
"categories": [
"fotos"
]
},
"variables": [
{
"title": "Algemeen",
"items": [
{
"name": "service_name",
"type": "str",
"title": "Servicenaam",
"default": "lychee",
"required": true
},
{
"name": "port",
"type": "int",
"title": "Webinterface",
"default": 8147,
"required": true,
"description": "Standaard 80; hier verplaatst omdat die poort al bezet is"
},
{
"name": "appdata_dir",
"type": "str",
"title": "Appdata-map",
"default": "/opt/serverup/appdata",
"required": true,
"description": "Basismap voor de gegevens van deze app"
},
{
"name": "timezone",
"type": "str",
"title": "Tijdzone",
"default": "Europe/Amsterdam",
"required": true
}
]
},
{
"title": "Instellingen",
"items": [
{
"name": "app_url",
"type": "str",
"title": "Publiek adres",
"default": "http://localhost:8147",
"required": true
}
]
}
]
}

View file

@ -0,0 +1,28 @@
services:
<< service_name >>:
image: matomo:latest
container_name: << service_name >>
environment:
- TZ=<< timezone >>
- MATOMO_DATABASE_HOST=<< service_name >>-db
- MATOMO_DATABASE_USERNAME=matomo
- MATOMO_DATABASE_PASSWORD=<< db_password >>
- MATOMO_DATABASE_DBNAME=matomo
volumes:
- << appdata_dir >>/<< service_name >>:/var/www/html
ports:
- "<< port >>:80"
depends_on:
- << service_name >>-db
restart: unless-stopped
<< service_name >>-db:
image: mariadb:11
container_name: << service_name >>-db
environment:
- MARIADB_DATABASE=matomo
- MARIADB_USER=matomo
- MARIADB_PASSWORD=<< db_password >>
- MARIADB_ROOT_PASSWORD=<< db_password >>
volumes:
- << appdata_dir >>/<< service_name >>-db:/var/lib/mysql
restart: unless-stopped

74
apps/matomo/template.json Normal file
View file

@ -0,0 +1,74 @@
{
"kind": "compose",
"metadata": {
"name": "Matomo",
"description": "Uitgebreide webstatistieken met trechters, doelen en heatmaps, waarbij de gegevens bij jou blijven.",
"tags": [
"analytics",
"bezoekers",
"privacy"
],
"icon": {
"provider": "selfhst",
"id": "matomo"
},
"version": {
"name": "latest"
},
"categories": [
"analytics"
]
},
"variables": [
{
"title": "Algemeen",
"items": [
{
"name": "service_name",
"type": "str",
"title": "Servicenaam",
"default": "matomo",
"required": true
},
{
"name": "port",
"type": "int",
"title": "Webinterface",
"default": 8168,
"required": true,
"description": "Standaard 80; hier verplaatst omdat die poort al bezet is"
},
{
"name": "appdata_dir",
"type": "str",
"title": "Appdata-map",
"default": "/opt/serverup/appdata",
"required": true,
"description": "Basismap voor de gegevens van deze app"
},
{
"name": "timezone",
"type": "str",
"title": "Tijdzone",
"default": "Europe/Amsterdam",
"required": true
}
]
},
{
"title": "Toegang",
"items": [
{
"name": "db_password",
"type": "str",
"title": "Databasewachtwoord",
"default": "",
"required": true,
"secret": true,
"generate": "auto",
"description": "Wordt automatisch ingevuld en in .env bewaard"
}
]
}
]
}

View file

@ -0,0 +1,29 @@
services:
<< service_name >>:
image: mattermost/mattermost-team-edition:latest
container_name: << service_name >>
environment:
- TZ=<< timezone >>
- MM_SQLSETTINGS_DRIVERNAME=postgres
- MM_SQLSETTINGS_DATASOURCE=postgres://mattermost:<< db_password >>@<< service_name >>-db:5432/mattermost?sslmode=disable
- MM_SERVICESETTINGS_SITEURL=<< site_url >>
volumes:
- << appdata_dir >>/<< service_name >>:/mattermost/config
- << appdata_dir >>/<< service_name >>-data:/mattermost/data
- << appdata_dir >>/<< service_name >>-logs:/mattermost/logs
- << appdata_dir >>/<< service_name >>-plugins:/mattermost/plugins
ports:
- "<< port >>:8065"
depends_on:
- << service_name >>-db
restart: unless-stopped
<< service_name >>-db:
image: postgres:16-alpine
container_name: << service_name >>-db
environment:
- POSTGRES_DB=mattermost
- POSTGRES_USER=mattermost
- POSTGRES_PASSWORD=<< db_password >>
volumes:
- << appdata_dir >>/<< service_name >>-db:/var/lib/postgresql/data
restart: unless-stopped

View file

@ -0,0 +1,88 @@
{
"kind": "compose",
"metadata": {
"name": "Mattermost",
"description": "Teamchat in kanalen, met threads, zoeken en koppelingen. Het zelfgehoste alternatief voor Slack.",
"tags": [
"chat",
"team",
"communicatie"
],
"icon": {
"provider": "selfhst",
"id": "mattermost"
},
"version": {
"name": "latest"
},
"categories": [
"communicatie",
"productiviteit"
]
},
"variables": [
{
"title": "Algemeen",
"items": [
{
"name": "service_name",
"type": "str",
"title": "Servicenaam",
"default": "mattermost",
"required": true
},
{
"name": "port",
"type": "int",
"title": "Webinterface",
"default": 8134,
"required": true,
"description": "Standaard 8065; hier verplaatst omdat die poort al bezet is"
},
{
"name": "appdata_dir",
"type": "str",
"title": "Appdata-map",
"default": "/opt/serverup/appdata",
"required": true,
"description": "Basismap voor de gegevens van deze app"
},
{
"name": "timezone",
"type": "str",
"title": "Tijdzone",
"default": "Europe/Amsterdam",
"required": true
}
]
},
{
"title": "Instellingen",
"items": [
{
"name": "site_url",
"type": "str",
"title": "Publiek adres",
"default": "http://localhost:8134",
"required": true,
"description": "Nodig voor uitnodigingen en meldingen"
}
]
},
{
"title": "Toegang",
"items": [
{
"name": "db_password",
"type": "str",
"title": "Databasewachtwoord",
"default": "",
"required": true,
"secret": true,
"generate": "auto",
"description": "Wordt automatisch ingevuld en in .env bewaard"
}
]
}
]
}

View file

@ -0,0 +1,31 @@
services:
<< service_name >>:
image: ghcr.io/maybe-finance/maybe:latest
container_name: << service_name >>
environment:
- TZ=<< timezone >>
- SELF_HOSTED=true
- RAILS_FORCE_SSL=false
- RAILS_ASSUME_SSL=false
- SECRET_KEY_BASE=<< secret_key_base >>
- DB_HOST=<< service_name >>-db
- POSTGRES_DB=maybe
- POSTGRES_USER=maybe
- POSTGRES_PASSWORD=<< db_password >>
volumes:
- << appdata_dir >>/<< service_name >>:/rails/storage
ports:
- "<< port >>:3000"
depends_on:
- << service_name >>-db
restart: unless-stopped
<< service_name >>-db:
image: postgres:16-alpine
container_name: << service_name >>-db
environment:
- POSTGRES_DB=maybe
- POSTGRES_USER=maybe
- POSTGRES_PASSWORD=<< db_password >>
volumes:
- << appdata_dir >>/<< service_name >>-db:/var/lib/postgresql/data
restart: unless-stopped

83
apps/maybe/template.json Normal file
View file

@ -0,0 +1,83 @@
{
"kind": "compose",
"metadata": {
"name": "Maybe",
"description": "Persoonlijke financiën op één plek: rekeningen, uitgaven, vermogen en waar het naartoe gaat.",
"tags": [
"budget",
"vermogen",
"financien"
],
"icon": {
"provider": "selfhst",
"id": "maybe"
},
"version": {
"name": "latest"
},
"categories": [
"financien"
]
},
"variables": [
{
"title": "Algemeen",
"items": [
{
"name": "service_name",
"type": "str",
"title": "Servicenaam",
"default": "maybe",
"required": true
},
{
"name": "port",
"type": "int",
"title": "Webinterface",
"default": 8146,
"required": true,
"description": "Standaard 3000; hier verplaatst omdat die poort al bezet is"
},
{
"name": "appdata_dir",
"type": "str",
"title": "Appdata-map",
"default": "/opt/serverup/appdata",
"required": true,
"description": "Basismap voor de gegevens van deze app"
},
{
"name": "timezone",
"type": "str",
"title": "Tijdzone",
"default": "Europe/Amsterdam",
"required": true
}
]
},
{
"title": "Toegang",
"items": [
{
"name": "db_password",
"type": "str",
"title": "Databasewachtwoord",
"default": "",
"required": true,
"secret": true,
"generate": "auto",
"description": "Wordt automatisch ingevuld en in .env bewaard"
},
{
"name": "secret_key_base",
"type": "str",
"title": "Rails-sleutel",
"default": "",
"required": true,
"secret": true,
"generate": "auto"
}
]
}
]
}

View file

@ -0,0 +1,14 @@
services:
<< service_name >>:
image: itzg/minecraft-server:latest
container_name: << service_name >>
environment:
- EULA=<< eula >>
- TYPE=<< server_type >>
- MEMORY=<< geheugen >>
- TZ=<< timezone >>
volumes:
- << appdata_dir >>/<< service_name >>:/data
ports:
- "<< port >>:25565"
restart: unless-stopped

View file

@ -0,0 +1,96 @@
{
"kind": "compose",
"metadata": {
"name": "Minecraft-server",
"description": "Eigen Minecraft-server, met keuze uit vanilla, Paper, Fabric en Forge. Werkt met mods en plugins.",
"tags": [
"spellen",
"minecraft",
"gameserver"
],
"icon": {
"provider": "selfhst",
"id": "minecraft"
},
"version": {
"name": "latest"
},
"categories": [
"spellen"
]
},
"variables": [
{
"title": "Algemeen",
"items": [
{
"name": "service_name",
"type": "str",
"title": "Servicenaam",
"default": "minecraft",
"required": true
},
{
"name": "port",
"type": "int",
"title": "Serverpoort",
"default": 25565,
"required": true,
"description": "Zet deze poort open in je router als je van buitenaf wilt spelen"
},
{
"name": "appdata_dir",
"type": "str",
"title": "Appdata-map",
"default": "/opt/serverup/appdata",
"required": true,
"description": "Basismap voor de gegevens van deze app"
},
{
"name": "timezone",
"type": "str",
"title": "Tijdzone",
"default": "Europe/Amsterdam",
"required": true
}
]
},
{
"title": "Instellingen",
"items": [
{
"name": "eula",
"type": "bool",
"title": "Ik ga akkoord met de Minecraft-EULA",
"default": false,
"required": false,
"description": "Zonder akkoord start de server niet — zie minecraft.net/eula"
},
{
"name": "server_type",
"type": "enum",
"title": "Serversoort",
"default": "PAPER",
"required": true,
"config": {
"options": [
"VANILLA",
"PAPER",
"FABRIC",
"FORGE",
"SPIGOT"
]
}
},
{
"name": "geheugen",
"type": "str",
"title": "Geheugen",
"default": "2G",
"required": true,
"description": "Bijvoorbeeld 2G of 4G"
}
]
}
]
}

View file

@ -0,0 +1,15 @@
services:
<< service_name >>:
image: minio/minio:latest
container_name: << service_name >>
environment:
- TZ=<< timezone >>
- MINIO_ROOT_USER=<< root_user >>
- MINIO_ROOT_PASSWORD=<< root_password >>
volumes:
- << appdata_dir >>/<< service_name >>:/data
command: server /data --console-address ":9001"
ports:
- "<< port >>:9000"
- "<< port_console >>:9001"
restart: unless-stopped

94
apps/minio/template.json Normal file
View file

@ -0,0 +1,94 @@
{
"kind": "compose",
"metadata": {
"name": "MinIO",
"description": "Objectopslag die de S3-API spreekt, zodat back-uptools en applicaties er zonder aanpassing op aansluiten.",
"tags": [
"opslag",
"s3",
"objecten"
],
"icon": {
"provider": "selfhst",
"id": "minio"
},
"version": {
"name": "latest"
},
"categories": [
"opslag",
"ontwikkeling"
]
},
"variables": [
{
"title": "Algemeen",
"items": [
{
"name": "service_name",
"type": "str",
"title": "Servicenaam",
"default": "minio",
"required": true
},
{
"name": "port",
"type": "int",
"title": "API-poort",
"default": 8164,
"required": true,
"description": "Standaard 9000; hier verplaatst omdat die poort al bezet is"
},
{
"name": "port_console",
"type": "int",
"title": "Beheerinterface",
"default": 8165,
"required": true
},
{
"name": "appdata_dir",
"type": "str",
"title": "Appdata-map",
"default": "/opt/serverup/appdata",
"required": true,
"description": "Basismap voor de gegevens van deze app"
},
{
"name": "timezone",
"type": "str",
"title": "Tijdzone",
"default": "Europe/Amsterdam",
"required": true
}
]
},
{
"title": "Instellingen",
"items": [
{
"name": "root_user",
"type": "str",
"title": "Beheerdersnaam",
"default": "minioadmin",
"required": true
}
]
},
{
"title": "Toegang",
"items": [
{
"name": "root_password",
"type": "str",
"title": "Beheerderswachtwoord",
"default": "",
"required": true,
"secret": true,
"generate": "auto",
"description": "Minimaal 8 tekens"
}
]
}
]
}

View file

@ -0,0 +1,14 @@
services:
<< service_name >>:
image: mumblevoip/mumble-server:latest
container_name: << service_name >>
environment:
- TZ=<< timezone >>
- MUMBLE_CONFIG_welcometext=<< welkomsttekst >>
- MUMBLE_SUPERUSER_PASSWORD=<< superuser_password >>
volumes:
- << appdata_dir >>/<< service_name >>:/data
ports:
- "<< port >>:64738"
- "<< port >>:64738/udp"
restart: unless-stopped

86
apps/mumble/template.json Normal file
View file

@ -0,0 +1,86 @@
{
"kind": "compose",
"metadata": {
"name": "Mumble",
"description": "Spraakserver met lage vertraging, oorspronkelijk voor gamers maar prima voor elk gesprek waar geluid telt.",
"tags": [
"spraak",
"voip",
"communicatie"
],
"icon": {
"provider": "selfhst",
"id": "mumble"
},
"version": {
"name": "latest"
},
"categories": [
"communicatie"
]
},
"variables": [
{
"title": "Algemeen",
"items": [
{
"name": "service_name",
"type": "str",
"title": "Servicenaam",
"default": "mumble",
"required": true
},
{
"name": "port",
"type": "int",
"title": "Serverpoort",
"default": 64738,
"required": true,
"description": "TCP en UDP op hetzelfde nummer"
},
{
"name": "appdata_dir",
"type": "str",
"title": "Appdata-map",
"default": "/opt/serverup/appdata",
"required": true,
"description": "Basismap voor de gegevens van deze app"
},
{
"name": "timezone",
"type": "str",
"title": "Tijdzone",
"default": "Europe/Amsterdam",
"required": true
}
]
},
{
"title": "Instellingen",
"items": [
{
"name": "welkomsttekst",
"type": "str",
"title": "Welkomsttekst",
"default": "Welkom op deze Mumble-server",
"required": false
}
]
},
{
"title": "Toegang",
"items": [
{
"name": "superuser_password",
"type": "str",
"title": "SuperUser-wachtwoord",
"default": "",
"required": true,
"secret": true,
"generate": "auto",
"description": "Waarmee je de server beheert"
}
]
}
]
}

View file

@ -0,0 +1,12 @@
services:
<< service_name >>:
image: jokobsk/netalertx:latest
container_name: << service_name >>
environment:
- TZ=<< timezone >>
- PORT=20211
volumes:
- << appdata_dir >>/<< service_name >>:/app/config
- << appdata_dir >>/<< service_name >>-db:/app/db
network_mode: host
restart: unless-stopped

View file

@ -0,0 +1,52 @@
{
"kind": "compose",
"metadata": {
"name": "NetAlertX",
"description": "Scant je netwerk en meldt het zodra er een apparaat bijkomt dat je niet kent. Let op: Draait op het netwerk van de host, want anders ziet de scanner alleen het Docker-netwerk. Bereikbaar op poort 20211 van je server.",
"tags": [
"netwerk",
"monitoring",
"beveiliging"
],
"icon": {
"provider": "selfhst",
"id": "netalertx"
},
"version": {
"name": "latest"
},
"categories": [
"netwerk",
"monitoring"
]
},
"variables": [
{
"title": "Algemeen",
"items": [
{
"name": "service_name",
"type": "str",
"title": "Servicenaam",
"default": "netalertx",
"required": true
},
{
"name": "appdata_dir",
"type": "str",
"title": "Appdata-map",
"default": "/opt/serverup/appdata",
"required": true,
"description": "Basismap voor de gegevens van deze app"
},
{
"name": "timezone",
"type": "str",
"title": "Tijdzone",
"default": "Europe/Amsterdam",
"required": true
}
]
}
]
}

View file

@ -0,0 +1,26 @@
services:
<< service_name >>:
image: odoo:latest
container_name: << service_name >>
environment:
- TZ=<< timezone >>
- HOST=<< service_name >>-db
- USER=odoo
- PASSWORD=<< db_password >>
volumes:
- << appdata_dir >>/<< service_name >>:/var/lib/odoo
ports:
- "<< port >>:8069"
depends_on:
- << service_name >>-db
restart: unless-stopped
<< service_name >>-db:
image: postgres:16-alpine
container_name: << service_name >>-db
environment:
- POSTGRES_DB=postgres
- POSTGRES_USER=odoo
- POSTGRES_PASSWORD=<< db_password >>
volumes:
- << appdata_dir >>/<< service_name >>-db:/var/lib/postgresql/data
restart: unless-stopped

75
apps/odoo/template.json Normal file
View file

@ -0,0 +1,75 @@
{
"kind": "compose",
"metadata": {
"name": "Odoo",
"description": "Bedrijfssoftware in modules: verkoop, voorraad, facturen, CRM en boekhouding. Je zet aan wat je nodig hebt.",
"tags": [
"erp",
"crm",
"facturen",
"boekhouding"
],
"icon": {
"provider": "selfhst",
"id": "odoo"
},
"version": {
"name": "latest"
},
"categories": [
"zakelijk"
]
},
"variables": [
{
"title": "Algemeen",
"items": [
{
"name": "service_name",
"type": "str",
"title": "Servicenaam",
"default": "odoo",
"required": true
},
{
"name": "port",
"type": "int",
"title": "Webinterface",
"default": 8169,
"required": true,
"description": "Standaard 8069; hier verplaatst omdat die poort al bezet is"
},
{
"name": "appdata_dir",
"type": "str",
"title": "Appdata-map",
"default": "/opt/serverup/appdata",
"required": true,
"description": "Basismap voor de gegevens van deze app"
},
{
"name": "timezone",
"type": "str",
"title": "Tijdzone",
"default": "Europe/Amsterdam",
"required": true
}
]
},
{
"title": "Toegang",
"items": [
{
"name": "db_password",
"type": "str",
"title": "Databasewachtwoord",
"default": "",
"required": true,
"secret": true,
"generate": "auto",
"description": "Wordt automatisch ingevuld en in .env bewaard"
}
]
}
]
}

View file

@ -0,0 +1,15 @@
services:
<< service_name >>:
image: ghcr.io/thomiceli/opengist:latest
container_name: << service_name >>
environment:
- TZ=<< timezone >>
- OG_EXTERNAL_URL=<< app_url >>
- OG_SSH_GIT_ENABLED=true
- OG_SSH_GIT_PORT=<< port_ssh >>
volumes:
- << appdata_dir >>/<< service_name >>:/opengist
ports:
- "<< port >>:6157"
- "<< port_ssh >>:2222"
restart: unless-stopped

View file

@ -0,0 +1,79 @@
{
"kind": "compose",
"metadata": {
"name": "Opengist",
"description": "Eigen plek voor codefragmenten, met versiegeschiedenis via git. Zelfgehoste GitHub Gist.",
"tags": [
"code",
"snippets",
"git"
],
"icon": {
"provider": "selfhst",
"id": "opengist"
},
"version": {
"name": "latest"
},
"categories": [
"ontwikkeling"
]
},
"variables": [
{
"title": "Algemeen",
"items": [
{
"name": "service_name",
"type": "str",
"title": "Servicenaam",
"default": "opengist",
"required": true
},
{
"name": "port",
"type": "int",
"title": "Webinterface",
"default": 8177,
"required": true,
"description": "Standaard 6157; hier verplaatst omdat die poort al bezet is"
},
{
"name": "port_ssh",
"type": "int",
"title": "SSH-poort",
"default": 2224,
"required": true,
"description": "Voor git via ssh"
},
{
"name": "appdata_dir",
"type": "str",
"title": "Appdata-map",
"default": "/opt/serverup/appdata",
"required": true,
"description": "Basismap voor de gegevens van deze app"
},
{
"name": "timezone",
"type": "str",
"title": "Tijdzone",
"default": "Europe/Amsterdam",
"required": true
}
]
},
{
"title": "Instellingen",
"items": [
{
"name": "app_url",
"type": "str",
"title": "Publiek adres",
"default": "http://localhost:8177",
"required": true
}
]
}
]
}

View file

@ -0,0 +1,47 @@
services:
<< service_name >>:
image: outlinewiki/outline:latest
container_name: << service_name >>
environment:
- TZ=<< timezone >>
- NODE_ENV=production
- URL=<< app_url >>
- PORT=3000
- SECRET_KEY=<< secret_key >>
- UTILS_SECRET=<< utils_secret >>
- DATABASE_URL=postgres://outline:<< db_password >>@<< service_name >>-db:5432/outline
- PGSSLMODE=disable
- REDIS_URL=redis://<< service_name >>-redis:6379
- FILE_STORAGE=local
- FILE_STORAGE_LOCAL_ROOT_DIR=/var/lib/outline/data
- OIDC_CLIENT_ID=<< oidc_client_id >>
- OIDC_CLIENT_SECRET=<< oidc_client_secret >>
- OIDC_AUTH_URI=<< oidc_url_inloggen >>
- OIDC_TOKEN_URI=<< oidc_url_uitwisselen >>
- OIDC_USERINFO_URI=<< oidc_url_profiel >>
- OIDC_DISPLAY_NAME=<< oidc_naam >>
volumes:
- << appdata_dir >>/<< service_name >>:/var/lib/outline/data
ports:
- "<< port >>:3000"
depends_on:
- << service_name >>-db
- << service_name >>-redis
restart: unless-stopped
<< service_name >>-db:
image: postgres:16-alpine
container_name: << service_name >>-db
environment:
- POSTGRES_DB=outline
- POSTGRES_USER=outline
- POSTGRES_PASSWORD=<< db_password >>
volumes:
- << appdata_dir >>/<< service_name >>-db:/var/lib/postgresql/data
restart: unless-stopped
<< service_name >>-redis:
image: valkey/valkey:8-alpine
container_name: << service_name >>-redis
command: valkey-server --save 60 1
volumes:
- << appdata_dir >>/<< service_name >>-redis:/data
restart: unless-stopped

156
apps/outline/template.json Normal file
View file

@ -0,0 +1,156 @@
{
"kind": "compose",
"metadata": {
"name": "Outline",
"description": "Kennisbank voor teams: gedeelde documenten met versies, rechten per collectie en goed zoeken. Let op: Outline kent geen eigen wachtwoorden. Zonder werkende OIDC-instellingen kom je niet voorbij het inlogscherm.",
"tags": [
"wiki",
"kennis",
"documenten",
"samenwerken"
],
"icon": {
"provider": "selfhst",
"id": "outline"
},
"version": {
"name": "latest"
},
"categories": [
"documenten",
"productiviteit"
]
},
"variables": [
{
"title": "Algemeen",
"items": [
{
"name": "service_name",
"type": "str",
"title": "Servicenaam",
"default": "outline",
"required": true
},
{
"name": "port",
"type": "int",
"title": "Webinterface",
"default": 8153,
"required": true,
"description": "Standaard 3000; hier verplaatst omdat die poort al bezet is"
},
{
"name": "appdata_dir",
"type": "str",
"title": "Appdata-map",
"default": "/opt/serverup/appdata",
"required": true,
"description": "Basismap voor de gegevens van deze app"
},
{
"name": "timezone",
"type": "str",
"title": "Tijdzone",
"default": "Europe/Amsterdam",
"required": true
}
]
},
{
"title": "Instellingen",
"items": [
{
"name": "app_url",
"type": "str",
"title": "Publiek adres",
"default": "http://localhost:8153",
"required": true
},
{
"name": "oidc_naam",
"type": "str",
"title": "Naam van je inlogdienst",
"default": "Authentik",
"required": true
},
{
"name": "oidc_client_id",
"type": "str",
"title": "OIDC client-id",
"default": "",
"required": true,
"connect": {
"app": "authentik",
"scheme": "http",
"port": 9000
},
"help": "Outline heeft geen eigen accounts: je logt altijd in via een externe dienst. Maak in Authentik, Keycloak of Pocket ID een OIDC-toepassing aan en neem de gegevens hier over."
},
{
"name": "oidc_url_inloggen",
"type": "str",
"title": "OIDC-adres om in te loggen",
"default": "",
"required": true
},
{
"name": "oidc_url_uitwisselen",
"type": "str",
"title": "OIDC-adres om de code in te wisselen",
"default": "",
"required": true
},
{
"name": "oidc_url_profiel",
"type": "str",
"title": "OIDC-adres met de profielgegevens",
"default": "",
"required": true
}
]
},
{
"title": "Toegang",
"items": [
{
"name": "db_password",
"type": "str",
"title": "Databasewachtwoord",
"default": "",
"required": true,
"secret": true,
"generate": "auto",
"description": "Wordt automatisch ingevuld en in .env bewaard"
},
{
"name": "secret_key",
"type": "str",
"title": "Geheime sleutel",
"default": "",
"required": true,
"secret": true,
"generate": "auto"
},
{
"name": "utils_secret",
"type": "str",
"title": "Sleutel voor hulpfuncties",
"default": "",
"required": true,
"secret": true,
"generate": "auto"
},
{
"name": "oidc_client_secret",
"type": "str",
"title": "OIDC client-secret",
"default": "",
"required": true,
"secret": true,
"eigen_invoer": true
}
]
}
]
}

View file

@ -0,0 +1,12 @@
services:
<< service_name >>:
image: stonith404/pingvin-share:latest
container_name: << service_name >>
environment:
- TZ=<< timezone >>
volumes:
- << appdata_dir >>/<< service_name >>:/opt/app/backend/data
- << appdata_dir >>/<< service_name >>-img:/opt/app/frontend/public/img
ports:
- "<< port >>:3000"
restart: unless-stopped

View file

@ -0,0 +1,59 @@
{
"kind": "compose",
"metadata": {
"name": "Pingvin Share",
"description": "Bestanden delen via een link die vanzelf verloopt, met een limiet op het aantal downloads.",
"tags": [
"bestanden",
"delen",
"opslag"
],
"icon": {
"provider": "selfhst",
"id": "pingvin-share"
},
"version": {
"name": "latest"
},
"categories": [
"opslag"
]
},
"variables": [
{
"title": "Algemeen",
"items": [
{
"name": "service_name",
"type": "str",
"title": "Servicenaam",
"default": "pingvinshare",
"required": true
},
{
"name": "port",
"type": "int",
"title": "Webinterface",
"default": 8166,
"required": true,
"description": "Standaard 3000; hier verplaatst omdat die poort al bezet is"
},
{
"name": "appdata_dir",
"type": "str",
"title": "Appdata-map",
"default": "/opt/serverup/appdata",
"required": true,
"description": "Basismap voor de gegevens van deze app"
},
{
"name": "timezone",
"type": "str",
"title": "Tijdzone",
"default": "Europe/Amsterdam",
"required": true
}
]
}
]
}

View file

@ -0,0 +1,27 @@
services:
<< service_name >>:
image: lscr.io/linuxserver/piwigo:latest
container_name: << service_name >>
environment:
- PUID=<< puid >>
- PGID=<< pgid >>
- TZ=<< timezone >>
- UMASK=002
volumes:
- << appdata_dir >>/<< service_name >>:/config
ports:
- "<< port >>:80"
depends_on:
- << service_name >>-db
restart: unless-stopped
<< service_name >>-db:
image: mariadb:11
container_name: << service_name >>-db
environment:
- MARIADB_DATABASE=piwigo
- MARIADB_USER=piwigo
- MARIADB_PASSWORD=<< db_password >>
- MARIADB_ROOT_PASSWORD=<< db_password >>
volumes:
- << appdata_dir >>/<< service_name >>-db:/var/lib/mysql
restart: unless-stopped

93
apps/piwigo/template.json Normal file
View file

@ -0,0 +1,93 @@
{
"kind": "compose",
"metadata": {
"name": "Piwigo",
"description": "Fotobibliotheek met een eigen database, tags, gebruikersrechten en een groot aanbod aan uitbreidingen.",
"tags": [
"fotos",
"albums"
],
"icon": {
"provider": "selfhst",
"id": "piwigo"
},
"version": {
"name": "latest"
},
"categories": [
"fotos"
]
},
"variables": [
{
"title": "Algemeen",
"items": [
{
"name": "service_name",
"type": "str",
"title": "Servicenaam",
"default": "piwigo",
"required": true
},
{
"name": "port",
"type": "int",
"title": "Webinterface",
"default": 8148,
"required": true,
"description": "Standaard 80; hier verplaatst omdat die poort al bezet is"
},
{
"name": "appdata_dir",
"type": "str",
"title": "Appdata-map",
"default": "/opt/serverup/appdata",
"required": true,
"description": "Basismap voor de gegevens van deze app"
},
{
"name": "timezone",
"type": "str",
"title": "Tijdzone",
"default": "Europe/Amsterdam",
"required": true
}
]
},
{
"title": "Gebruiker",
"items": [
{
"name": "puid",
"type": "int",
"title": "Gebruikers-ID (PUID)",
"default": 1000,
"required": true,
"description": "`id -u` op je server; bepaalt de eigenaar van de bestanden"
},
{
"name": "pgid",
"type": "int",
"title": "Groeps-ID (PGID)",
"default": 1000,
"required": true
}
]
},
{
"title": "Toegang",
"items": [
{
"name": "db_password",
"type": "str",
"title": "Databasewachtwoord",
"default": "",
"required": true,
"secret": true,
"generate": "auto",
"description": "Wordt automatisch ingevuld en in .env bewaard"
}
]
}
]
}

View file

@ -1,6 +1,6 @@
services: services:
<< service_name >>: << service_name >>:
image: ghcr.io/plankanban/planka:1 image: ghcr.io/plankanban/planka:latest
container_name: << service_name >> container_name: << service_name >>
ports: ports:
- "<< port >>:1337" - "<< port >>:1337"

View file

@ -0,0 +1,13 @@
services:
<< service_name >>:
image: ghcr.io/pocket-id/pocket-id:latest
container_name: << service_name >>
environment:
- TZ=<< timezone >>
- APP_URL=<< app_url >>
- TRUST_PROXY=true
volumes:
- << appdata_dir >>/<< service_name >>:/app/data
ports:
- "<< port >>:1411"
restart: unless-stopped

View file

@ -0,0 +1,74 @@
{
"kind": "compose",
"metadata": {
"name": "Pocket ID",
"description": "Inloggen met passkeys voor al je apps. Eenvoudiger dan Authentik of Keycloak als je alleen OIDC nodig hebt.",
"tags": [
"sso",
"oidc",
"passkeys",
"authenticatie"
],
"icon": {
"provider": "selfhst",
"id": "pocket-id"
},
"version": {
"name": "latest"
},
"categories": [
"beveiliging"
]
},
"variables": [
{
"title": "Algemeen",
"items": [
{
"name": "service_name",
"type": "str",
"title": "Servicenaam",
"default": "pocketid",
"required": true
},
{
"name": "port",
"type": "int",
"title": "Webinterface",
"default": 8132,
"required": true,
"description": "Standaard 1411; hier verplaatst omdat die poort al bezet is"
},
{
"name": "appdata_dir",
"type": "str",
"title": "Appdata-map",
"default": "/opt/serverup/appdata",
"required": true,
"description": "Basismap voor de gegevens van deze app"
},
{
"name": "timezone",
"type": "str",
"title": "Tijdzone",
"default": "Europe/Amsterdam",
"required": true
}
]
},
{
"title": "Instellingen",
"items": [
{
"name": "app_url",
"type": "str",
"title": "Publiek adres",
"default": "https://id.example.com",
"required": true,
"description": "Passkeys zijn aan het exacte adres gebonden",
"help": "Een passkey wordt vastgelegd op het domein waar je hem aanmaakt. Verandert dit adres later, dan werken bestaande passkeys niet meer en moet iedereen opnieuw registreren."
}
]
}
]
}

View file

@ -0,0 +1,11 @@
services:
<< service_name >>:
image: privatebin/nginx-fpm-alpine:latest
container_name: << service_name >>
environment:
- TZ=<< timezone >>
volumes:
- << appdata_dir >>/<< service_name >>:/srv/data
ports:
- "<< port >>:8080"
restart: unless-stopped

View file

@ -0,0 +1,60 @@
{
"kind": "compose",
"metadata": {
"name": "PrivateBin",
"description": "Tekst delen die in je browser versleuteld wordt, zodat de server zelf niet kan lezen wat erin staat.",
"tags": [
"pastebin",
"delen",
"privacy"
],
"icon": {
"provider": "selfhst",
"id": "privatebin"
},
"version": {
"name": "latest"
},
"categories": [
"productiviteit",
"beveiliging"
]
},
"variables": [
{
"title": "Algemeen",
"items": [
{
"name": "service_name",
"type": "str",
"title": "Servicenaam",
"default": "privatebin",
"required": true
},
{
"name": "port",
"type": "int",
"title": "Webinterface",
"default": 8174,
"required": true,
"description": "Standaard 8080; hier verplaatst omdat die poort al bezet is"
},
{
"name": "appdata_dir",
"type": "str",
"title": "Appdata-map",
"default": "/opt/serverup/appdata",
"required": true,
"description": "Basismap voor de gegevens van deze app"
},
{
"name": "timezone",
"type": "str",
"title": "Tijdzone",
"default": "Europe/Amsterdam",
"required": true
}
]
}
]
}

View file

@ -0,0 +1,13 @@
services:
<< service_name >>:
image: codeberg.org/readeck/readeck:latest
container_name: << service_name >>
environment:
- TZ=<< timezone >>
- READECK_LOG_LEVEL=info
- READECK_ALLOWED_HOSTS=<< toegestane_hosts >>
volumes:
- << appdata_dir >>/<< service_name >>:/readeck
ports:
- "<< port >>:8000"
restart: unless-stopped

View file

@ -0,0 +1,72 @@
{
"kind": "compose",
"metadata": {
"name": "Readeck",
"description": "Bewaart artikelen om later te lezen, ontdaan van reclame en opmaak. Met markeringen en eigen labels.",
"tags": [
"lezen",
"artikelen",
"bladwijzers"
],
"icon": {
"provider": "selfhst",
"id": "readeck"
},
"version": {
"name": "latest"
},
"categories": [
"documenten"
]
},
"variables": [
{
"title": "Algemeen",
"items": [
{
"name": "service_name",
"type": "str",
"title": "Servicenaam",
"default": "readeck",
"required": true
},
{
"name": "port",
"type": "int",
"title": "Webinterface",
"default": 8156,
"required": true,
"description": "Standaard 8000; hier verplaatst omdat die poort al bezet is"
},
{
"name": "appdata_dir",
"type": "str",
"title": "Appdata-map",
"default": "/opt/serverup/appdata",
"required": true,
"description": "Basismap voor de gegevens van deze app"
},
{
"name": "timezone",
"type": "str",
"title": "Tijdzone",
"default": "Europe/Amsterdam",
"required": true
}
]
},
{
"title": "Instellingen",
"items": [
{
"name": "toegestane_hosts",
"type": "str",
"title": "Toegestane adressen",
"default": "localhost",
"required": true,
"description": "Komma-gescheiden lijst van namen waarop je Readeck opent"
}
]
}
]
}

View file

@ -0,0 +1,32 @@
services:
<< service_name >>:
image: rommapp/romm:latest
container_name: << service_name >>
environment:
- TZ=<< timezone >>
- DB_HOST=<< service_name >>-db
- DB_NAME=romm
- DB_USER=romm
- DB_PASSWD=<< db_password >>
- ROMM_AUTH_SECRET_KEY=<< auth_secret >>
volumes:
- << appdata_dir >>/<< service_name >>:/romm/config
- << data_root >>:/data
- << appdata_dir >>/<< service_name >>-resources:/romm/resources
- << appdata_dir >>/<< service_name >>-redis:/redis-data
ports:
- "<< port >>:8080"
depends_on:
- << service_name >>-db
restart: unless-stopped
<< service_name >>-db:
image: mariadb:11
container_name: << service_name >>-db
environment:
- MARIADB_DATABASE=romm
- MARIADB_USER=romm
- MARIADB_PASSWORD=<< db_password >>
- MARIADB_ROOT_PASSWORD=<< db_password >>
volumes:
- << appdata_dir >>/<< service_name >>-db:/var/lib/mysql
restart: unless-stopped

93
apps/romm/template.json Normal file
View file

@ -0,0 +1,93 @@
{
"kind": "compose",
"metadata": {
"name": "RomM",
"description": "Beheert je verzameling retro-spellen, haalt er omslagen en gegevens bij, en laat je ze in de browser spelen. Let op: Zet je roms onder /data/roms, met een submap per platform (bijvoorbeeld /data/roms/snes).",
"tags": [
"retro",
"spellen",
"emulator"
],
"icon": {
"provider": "selfhst",
"id": "romm"
},
"version": {
"name": "latest"
},
"categories": [
"spellen",
"media"
]
},
"variables": [
{
"title": "Algemeen",
"items": [
{
"name": "service_name",
"type": "str",
"title": "Servicenaam",
"default": "romm",
"required": true
},
{
"name": "port",
"type": "int",
"title": "Webinterface",
"default": 8172,
"required": true,
"description": "Standaard 8080; hier verplaatst omdat die poort al bezet is"
},
{
"name": "appdata_dir",
"type": "str",
"title": "Appdata-map",
"default": "/opt/serverup/appdata",
"required": true,
"description": "Basismap voor de gegevens van deze app"
},
{
"name": "data_root",
"type": "str",
"title": "Gedeelde datamap",
"default": "/mnt/data",
"required": true,
"description": "Eén map met je media, gekoppeld als /data",
"help": "Media en downloads horen onder één map te staan, die als /data in elke container komt. Alleen dan kan een voltooide download met een hardlink naar je bibliotheek: geen kopie, geen dubbele opslag, en je torrent blijft seeden. Zet je ze op gescheiden paden, dan kopieert elke download opnieuw. Eronder: media/films, media/series, torrents/ en usenet/."
},
{
"name": "timezone",
"type": "str",
"title": "Tijdzone",
"default": "Europe/Amsterdam",
"required": true
}
]
},
{
"title": "Toegang",
"items": [
{
"name": "db_password",
"type": "str",
"title": "Databasewachtwoord",
"default": "",
"required": true,
"secret": true,
"generate": "auto",
"description": "Wordt automatisch ingevuld en in .env bewaard"
},
{
"name": "auth_secret",
"type": "str",
"title": "Sleutel voor de inlogsessies",
"default": "",
"required": true,
"secret": true,
"generate": "auto"
}
]
}
]
}

View file

@ -0,0 +1,14 @@
services:
<< service_name >>:
image: roundcube/roundcubemail:latest
container_name: << service_name >>
environment:
- TZ=<< timezone >>
- ROUNDCUBEMAIL_DB_TYPE=sqlite
- ROUNDCUBEMAIL_DEFAULT_HOST=<< imap_server >>
- ROUNDCUBEMAIL_SMTP_SERVER=<< smtp_server >>
volumes:
- << appdata_dir >>/<< service_name >>:/var/www/html
ports:
- "<< port >>:80"
restart: unless-stopped

View file

@ -0,0 +1,79 @@
{
"kind": "compose",
"metadata": {
"name": "Roundcube",
"description": "Webmail voor een bestaande mailserver. Geen mailserver zelf: je logt in op je eigen IMAP-account.",
"tags": [
"e-mail",
"webmail",
"imap"
],
"icon": {
"provider": "selfhst",
"id": "roundcube"
},
"version": {
"name": "latest"
},
"categories": [
"communicatie"
]
},
"variables": [
{
"title": "Algemeen",
"items": [
{
"name": "service_name",
"type": "str",
"title": "Servicenaam",
"default": "roundcube",
"required": true
},
{
"name": "port",
"type": "int",
"title": "Webinterface",
"default": 8139,
"required": true,
"description": "Standaard 80; hier verplaatst omdat die poort al bezet is"
},
{
"name": "appdata_dir",
"type": "str",
"title": "Appdata-map",
"default": "/opt/serverup/appdata",
"required": true,
"description": "Basismap voor de gegevens van deze app"
},
{
"name": "timezone",
"type": "str",
"title": "Tijdzone",
"default": "Europe/Amsterdam",
"required": true
}
]
},
{
"title": "Instellingen",
"items": [
{
"name": "imap_server",
"type": "str",
"title": "IMAP-server",
"default": "ssl://imap.example.com",
"required": true,
"description": "Met ssl:// of tls:// ervoor"
},
{
"name": "smtp_server",
"type": "str",
"title": "SMTP-server",
"default": "tls://smtp.example.com",
"required": true
}
]
}
]
}

View file

@ -0,0 +1,17 @@
services:
<< service_name >>:
image: ghcr.io/analogj/scrutiny:master-omnibus
container_name: << service_name >>
environment:
- TZ=<< timezone >>
volumes:
- << appdata_dir >>/<< service_name >>:/opt/scrutiny/config
- << appdata_dir >>/<< service_name >>-influxdb:/opt/scrutiny/influxdb
- /run/udev:/run/udev:ro
ports:
- "<< port >>:8080"
cap_add:
- SYS_RAWIO
devices:
- /dev/sda:/dev/sda
restart: unless-stopped

View file

@ -0,0 +1,61 @@
{
"kind": "compose",
"metadata": {
"name": "Scrutiny",
"description": "Leest de SMART-gegevens van je schijven uit en waarschuwt vóórdat er een stukgaat, in plaats van erna. Let op: Pas de lijst onder `devices` aan naar de schijven in jouw server; zonder toegang tot het apparaat zelf kan Scrutiny niets uitlezen.",
"tags": [
"schijven",
"smart",
"monitoring",
"hardware"
],
"icon": {
"provider": "selfhst",
"id": "scrutiny"
},
"version": {
"name": "latest"
},
"categories": [
"monitoring",
"opslag"
]
},
"variables": [
{
"title": "Algemeen",
"items": [
{
"name": "service_name",
"type": "str",
"title": "Servicenaam",
"default": "scrutiny",
"required": true
},
{
"name": "port",
"type": "int",
"title": "Webinterface",
"default": 8126,
"required": true,
"description": "Standaard 8080; hier verplaatst omdat die poort al bezet is"
},
{
"name": "appdata_dir",
"type": "str",
"title": "Appdata-map",
"default": "/opt/serverup/appdata",
"required": true,
"description": "Basismap voor de gegevens van deze app"
},
{
"name": "timezone",
"type": "str",
"title": "Tijdzone",
"default": "Europe/Amsterdam",
"required": true
}
]
}
]
}

Some files were not shown because too many files have changed in this diff Show more