Compare commits
No commits in common. "main" and "v0.3.02" have entirely different histories.
727 changed files with 999 additions and 65968 deletions
68
.env.example
68
.env.example
|
|
@ -1,68 +0,0 @@
|
|||
# Instellingen van deze Server Up-installatie.
|
||||
#
|
||||
# Kopieer naar `.env` in dezelfde map als docker-compose.yml. Het bestand staat
|
||||
# in .gitignore en wordt door de deploy-workflow met rust gelaten, dus wat je
|
||||
# hier zet blijft staan bij een update.
|
||||
#
|
||||
# cp .env.example .env
|
||||
|
||||
# ── Bereikbaarheid ───────────────────────────────────────────────────────────
|
||||
|
||||
# Op welk adres de poort wordt gepubliceerd.
|
||||
# 127.0.0.1 alleen vanaf de server zelf (standaard, veiligst)
|
||||
# 0.0.0.0 vanaf het hele netwerk — doe dit alleen achter een reverse proxy
|
||||
# met TLS, want Server Up beheert Docker als root
|
||||
BIND=127.0.0.1
|
||||
|
||||
# Poort op de host.
|
||||
PORT=5000
|
||||
|
||||
# ── Versie en bijwerken ──────────────────────────────────────────────────────
|
||||
|
||||
# Welke image-tag draait. De deploy-workflow schrijft deze waarde zelf; met de
|
||||
# hand aanpassen kan om terug te rollen naar een eerdere versie.
|
||||
#SU_TAG=0.5.40-beta
|
||||
|
||||
# De versie die bij die image-tag hoort. De deploy-workflow en updatehelper
|
||||
# houden SU_TAG en SU_VERSION samen bij; normaal hoef je dit niet zelf te zetten.
|
||||
#SU_VERSION=0.5.40-beta
|
||||
|
||||
# Registry-image, zónder tag. Staat dit ingevuld, dan draait deze server vanaf
|
||||
# een registry en werkt de knop "Nu bijwerken" in de interface. Laat het leeg
|
||||
# als de server zelf bouwt na een push naar Git — dan is Git de update-route.
|
||||
# Zie docs/updates.md.
|
||||
#SU_IMAGE=git.example.com/bes-r/server-up
|
||||
|
||||
# ── Overig ───────────────────────────────────────────────────────────────────
|
||||
|
||||
# De hoofdmap voor stacks, appdata en backups. Dit pad wordt in de container op
|
||||
# hetzelfde pad gemount, zodat compose-bestanden kloppen, én meegegeven aan de
|
||||
# app, zodat de standaarden eronder vallen:
|
||||
# <BASE_DIR>/stacks <BASE_DIR>/appdata <BASE_DIR>/backups
|
||||
#
|
||||
# Wijzig je dit ná de installatie, dan moet je ook de bestaande data verplaatsen.
|
||||
# Doe dat via Instellingen → Paden; die knop kopieert eerst, controleert, en
|
||||
# ruimt het oude pas daarna op. Alleen deze regel aanpassen laat je data staan
|
||||
# waar hij stond.
|
||||
#BASE_DIR=/opt/serverup
|
||||
|
||||
# Onder welk account Server Up draait. install.sh vult dit in; 0 (of leeg) is
|
||||
# root, zoals vóór v0.7.93. De container start altijd als root — dat moet, want
|
||||
# het docker-volume is van root — en zakt daarna af naar deze uid/gid.
|
||||
#
|
||||
# Loop je ergens tegenaan, zet ze dan allebei op 0 en draai `docker compose up -d`.
|
||||
# Zie docs/beveiliging.md voor wat dit wel en niet oplevert.
|
||||
#SU_UID=0
|
||||
#SU_GID=0
|
||||
|
||||
# Zet op 1 zodra alles via HTTPS loopt: de sessiecookie krijgt dan de
|
||||
# Secure-vlag.
|
||||
#SU_HTTPS=1
|
||||
|
||||
# Extra app-repositories zonder de wizard, als JSON-array. Eenmalig ingelezen
|
||||
# en daarna opgeslagen in config.json.
|
||||
#SU_BOOT_REPOS=[{"id":"mijn-apps","name":"Mijn Apps","url":"https://…","branch":"main","subdir":"apps"}]
|
||||
|
||||
# Debug-endpoints (/api/debug/*) inschakelen. Alleen tijdelijk gebruiken:
|
||||
# /api/debug/config toont de volledige configuratie.
|
||||
#SU_DEBUG=1
|
||||
|
|
@ -1,151 +0,0 @@
|
|||
# Forgejo Actions — bouw het image en push het naar de container-registry.
|
||||
#
|
||||
# Dit image is wat de "Nu bijwerken"-knop in Server Up ophaalt. Draait bij elke
|
||||
# v*-tag, zodat elke release (en pre-release) een image krijgt met dezelfde tag
|
||||
# als de release zelf: v0.5.10 → server-up:0.5.10.
|
||||
#
|
||||
# Vereisten (Repository → Settings):
|
||||
# Variables → REGISTRY = git.example.com (host van je Forgejo)
|
||||
# OWNER = bes-r (gebruiker/organisatie)
|
||||
# Secrets → PACKAGE_TOKEN = <token met write:package>
|
||||
#
|
||||
# Zie docs/updates.md voor de complete instelling.
|
||||
|
||||
name: Build en push image (handmatig)
|
||||
|
||||
# Alleen handmatig. Bij een v*-tag bouwt en pusht deploy-prod.yml het image al
|
||||
# in dezelfde job — zo kan er geen wachtrij ontstaan waarin de deploy op een
|
||||
# build wacht die zelf nog in de rij staat.
|
||||
on:
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
tag:
|
||||
description: "Versie om te bouwen (bv. 0.5.10). Leeg = VERSION-bestand"
|
||||
required: false
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: [self-hosted, prod]
|
||||
timeout-minutes: 30
|
||||
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Versie en tags bepalen
|
||||
id: meta
|
||||
run: |
|
||||
set -euo pipefail
|
||||
VERSION="${{ inputs.tag }}"
|
||||
if [ -z "$VERSION" ]; then
|
||||
VERSION="$(tr -d '[:space:]' < VERSION)"
|
||||
fi
|
||||
VERSION="${VERSION#v}"
|
||||
IMAGE="${{ vars.REGISTRY }}/${{ vars.OWNER }}/server-up"
|
||||
echo "VERSION=${VERSION}" >> "$GITHUB_ENV"
|
||||
echo "IMAGE=${IMAGE}" >> "$GITHUB_ENV"
|
||||
|
||||
# Pre-release (tag met een streepje, bv. v0.5.10-beta1) krijgt géén
|
||||
# 'latest'-tag: die hoort bij het stable-kanaal.
|
||||
if [[ "$VERSION" == *-* ]]; then
|
||||
echo "EXTRA_TAG=beta" >> "$GITHUB_ENV"
|
||||
else
|
||||
echo "EXTRA_TAG=latest" >> "$GITHUB_ENV"
|
||||
fi
|
||||
echo "Bouwen: ${IMAGE}:${VERSION}"
|
||||
|
||||
- name: Tests draaien
|
||||
run: |
|
||||
set -euo pipefail
|
||||
# In een container in plaats van een venv op de runner: die heeft
|
||||
# geen python3-venv, en zo draaien de tests bovendien op exact de
|
||||
# Python-versie waarop de app in productie draait.
|
||||
# PYTHONDONTWRITEBYTECODE + no:cacheprovider voorkomen dat er
|
||||
# root-eigen bestanden in de werkmap achterblijven.
|
||||
docker run --rm \
|
||||
-v "$PWD:/w" -w /w \
|
||||
-v su-pip-cache:/root/.cache/pip \
|
||||
-e PYTHONDONTWRITEBYTECODE=1 \
|
||||
python:3.12-slim \
|
||||
sh -c "pip install -q -r server-up/requirements.txt pytest \
|
||||
&& python -m pytest tests -q -p no:cacheprovider"
|
||||
|
||||
- name: Compose-bestanden valideren
|
||||
run: |
|
||||
set -euo pipefail
|
||||
# De testsuite controleert of de sjablonen geldige YAML opleveren.
|
||||
# Of `docker compose` ze ook accepteert is een andere vraag: een
|
||||
# depends_on in de verkeerde vorm of network_mode naast networks is
|
||||
# prima YAML en een kapotte stack. Dat merk je anders pas als iemand
|
||||
# de app installeert.
|
||||
#
|
||||
# Renderen kan alleen waar Python staat (in de container), valideren
|
||||
# alleen waar Docker staat (op de runner). Vandaar twee helften.
|
||||
docker run --rm \
|
||||
-v "$PWD:/w" -w /w \
|
||||
-v su-pip-cache:/root/.cache/pip \
|
||||
-e PYTHONDONTWRITEBYTECODE=1 \
|
||||
python:3.12-slim \
|
||||
sh -c "pip install -q -r server-up/requirements.txt \
|
||||
&& python tools/render_voor_validatie.py .compose-check \
|
||||
&& chown -R $(id -u):$(id -g) .compose-check"
|
||||
fouten=0
|
||||
for f in .compose-check/*/docker-compose.yml; do
|
||||
if ! uitvoer=$(docker compose -f "$f" config -q 2>&1); then
|
||||
echo "✖ $(basename "$(dirname "$f")")"
|
||||
echo "$uitvoer" | sed 's/^/ /'
|
||||
fouten=$((fouten + 1))
|
||||
fi
|
||||
done
|
||||
rm -rf .compose-check
|
||||
if [ "$fouten" -ne 0 ]; then
|
||||
echo "$fouten sjablo(o)n(en) leveren een compose-bestand op dat docker weigert"
|
||||
exit 1
|
||||
fi
|
||||
echo "Alle compose-bestanden zijn geldig"
|
||||
|
||||
- name: Images controleren
|
||||
run: |
|
||||
set -euo pipefail
|
||||
# Een image dat niet meer bestaat merk je anders pas als iemand op
|
||||
# installeren drukt. Zo verdween Huntarr nadat dat project offline
|
||||
# ging, en wezen Forgejo, Planka en Baby Buddy naar tags die er niet
|
||||
# zijn. Draait bewust rustig: registries knijpen af, en een afgeknepen
|
||||
# verzoek is niet te onderscheiden van een ontbrekend image.
|
||||
docker run --rm \
|
||||
-v "$PWD:/w" -w /w \
|
||||
-e PYTHONDONTWRITEBYTECODE=1 \
|
||||
python:3.12-slim \
|
||||
python tools/controleer_images.py
|
||||
|
||||
- name: Inloggen op de registry
|
||||
run: |
|
||||
set -euo pipefail
|
||||
echo "${{ secrets.PACKAGE_TOKEN }}" \
|
||||
| docker login "${{ vars.REGISTRY }}" \
|
||||
-u "${{ vars.OWNER }}" --password-stdin
|
||||
|
||||
- name: Bouwen
|
||||
run: |
|
||||
set -euo pipefail
|
||||
docker build \
|
||||
--pull \
|
||||
--build-arg "SU_VERSION=${VERSION}" \
|
||||
-t "${IMAGE}:${VERSION}" \
|
||||
-t "${IMAGE}:v${VERSION}" \
|
||||
-t "${IMAGE}:${EXTRA_TAG}" \
|
||||
.
|
||||
|
||||
- name: Pushen
|
||||
run: |
|
||||
set -euo pipefail
|
||||
docker push "${IMAGE}:${VERSION}"
|
||||
# Compatibiliteit met Server Up <= 0.8.12: die vroeg ten onrechte
|
||||
# om de Forgejo-tag mét v. Nieuwe versies gebruiken de kale tag.
|
||||
docker push "${IMAGE}:v${VERSION}"
|
||||
docker push "${IMAGE}:${EXTRA_TAG}"
|
||||
echo "Gepusht: ${IMAGE}:${VERSION}, :v${VERSION} en :${EXTRA_TAG}"
|
||||
|
||||
- name: Uitloggen
|
||||
if: always()
|
||||
run: docker logout "${{ vars.REGISTRY }}" || true
|
||||
|
|
@ -1,231 +0,0 @@
|
|||
name: Deploy server-up (prod)
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [main]
|
||||
tags: ['v*']
|
||||
workflow_dispatch:
|
||||
|
||||
concurrency:
|
||||
group: server-up-deploy-prod
|
||||
cancel-in-progress: false
|
||||
|
||||
jobs:
|
||||
deploy:
|
||||
runs-on: [self-hosted, prod]
|
||||
timeout-minutes: 20
|
||||
|
||||
env:
|
||||
DEPLOY_DIR: /opt/server-up
|
||||
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 1
|
||||
|
||||
- name: Bepaal versie
|
||||
id: version
|
||||
run: |
|
||||
set -euo pipefail
|
||||
BASE="$(tr -d '[:space:]' < VERSION 2>/dev/null || echo 0.0.0)"
|
||||
if [[ "${GITHUB_REF}" == refs/tags/* ]]; then
|
||||
VERSION="${GITHUB_REF_NAME#v}"
|
||||
CHANNEL="release"
|
||||
else
|
||||
VERSION="${BASE}"
|
||||
CHANNEL="main"
|
||||
fi
|
||||
echo "VERSION=${VERSION}" >> "$GITHUB_ENV"
|
||||
echo "CHANNEL=${CHANNEL}" >> "$GITHUB_ENV"
|
||||
echo "SU_VERSION=${VERSION}" >> "$GITHUB_ENV"
|
||||
echo "Deploying version: ${VERSION} (${CHANNEL})"
|
||||
|
||||
- name: Tests draaien
|
||||
run: |
|
||||
set -euo pipefail
|
||||
# In een container in plaats van een venv op de runner: die heeft
|
||||
# geen python3-venv, en zo draaien de tests bovendien op exact de
|
||||
# Python-versie waarop de app in productie draait.
|
||||
# PYTHONDONTWRITEBYTECODE + no:cacheprovider voorkomen dat er
|
||||
# root-eigen bestanden in de werkmap achterblijven.
|
||||
docker run --rm \
|
||||
-v "$PWD:/w" -w /w \
|
||||
-v su-pip-cache:/root/.cache/pip \
|
||||
-e PYTHONDONTWRITEBYTECODE=1 \
|
||||
python:3.12-slim \
|
||||
sh -c "pip install -q -r server-up/requirements.txt pytest \
|
||||
&& python -m pytest tests -q -p no:cacheprovider"
|
||||
|
||||
- name: Compose-bestanden valideren
|
||||
run: |
|
||||
set -euo pipefail
|
||||
# De testsuite controleert of de sjablonen geldige YAML opleveren.
|
||||
# Of `docker compose` ze ook accepteert is een andere vraag: een
|
||||
# depends_on in de verkeerde vorm of network_mode naast networks is
|
||||
# prima YAML en een kapotte stack. Dat merk je anders pas als iemand
|
||||
# de app installeert.
|
||||
#
|
||||
# Renderen kan alleen waar Python staat (in de container), valideren
|
||||
# alleen waar Docker staat (op de runner). Vandaar twee helften.
|
||||
docker run --rm \
|
||||
-v "$PWD:/w" -w /w \
|
||||
-v su-pip-cache:/root/.cache/pip \
|
||||
-e PYTHONDONTWRITEBYTECODE=1 \
|
||||
python:3.12-slim \
|
||||
sh -c "pip install -q -r server-up/requirements.txt \
|
||||
&& python tools/render_voor_validatie.py .compose-check \
|
||||
&& chown -R $(id -u):$(id -g) .compose-check"
|
||||
fouten=0
|
||||
for f in .compose-check/*/docker-compose.yml; do
|
||||
if ! uitvoer=$(docker compose -f "$f" config -q 2>&1); then
|
||||
echo "✖ $(basename "$(dirname "$f")")"
|
||||
echo "$uitvoer" | sed 's/^/ /'
|
||||
fouten=$((fouten + 1))
|
||||
fi
|
||||
done
|
||||
rm -rf .compose-check
|
||||
if [ "$fouten" -ne 0 ]; then
|
||||
echo "$fouten sjablo(o)n(en) leveren een compose-bestand op dat docker weigert"
|
||||
exit 1
|
||||
fi
|
||||
echo "Alle compose-bestanden zijn geldig"
|
||||
|
||||
- name: Images controleren
|
||||
run: |
|
||||
set -euo pipefail
|
||||
# Een image dat niet meer bestaat merk je anders pas als iemand op
|
||||
# installeren drukt. Zo verdween Huntarr nadat dat project offline
|
||||
# ging, en wezen Forgejo, Planka en Baby Buddy naar tags die er niet
|
||||
# zijn. Draait bewust rustig: registries knijpen af, en een afgeknepen
|
||||
# verzoek is niet te onderscheiden van een ontbrekend image.
|
||||
docker run --rm \
|
||||
-v "$PWD:/w" -w /w \
|
||||
-e PYTHONDONTWRITEBYTECODE=1 \
|
||||
python:3.12-slim \
|
||||
python tools/controleer_images.py
|
||||
|
||||
- name: Sync code naar deploy-directory
|
||||
run: |
|
||||
set -euo pipefail
|
||||
# .env staat in .gitignore, dus de checkout heeft er geen. Zonder deze
|
||||
# uitzondering wist --delete de lokale instellingen van de server
|
||||
# (BIND, SU_IMAGE, PORT) bij elke deploy.
|
||||
rsync -a --delete \
|
||||
--exclude='.git/' \
|
||||
--exclude='.forgejo/' \
|
||||
--exclude='.env' \
|
||||
./ "$DEPLOY_DIR/"
|
||||
|
||||
- name: Schrijf VERSION-bestand
|
||||
run: |
|
||||
set -euo pipefail
|
||||
# Expliciet cd in plaats van 'working-directory:'; dat laatste wordt
|
||||
# niet door elke runner even betrouwbaar toegepast.
|
||||
cd "$DEPLOY_DIR"
|
||||
echo "${VERSION}" > VERSION
|
||||
echo "Werkmap: $(pwd)"
|
||||
|
||||
- name: Bouwen (en pushen naar de registry)
|
||||
run: |
|
||||
set -euo pipefail
|
||||
cd "$DEPLOY_DIR"
|
||||
# SU_TAG vastleggen zodat compose en de "Nu bijwerken"-knop in de app
|
||||
# naar hetzelfde image wijzen (zie docs/updates.md).
|
||||
#
|
||||
# SU_TAG bepaalt welk image compose start. We schrijven dat bij
|
||||
# voorkeur in .env zodat het een handmatige `docker compose up`
|
||||
# overleeft, maar dat bestand kan van een andere gebruiker zijn (bv.
|
||||
# met sudo aangemaakt). Lukt schrijven niet, dan geven we SU_TAG mee
|
||||
# via de omgeving: compose gebruikt die en de deploy loopt gewoon door.
|
||||
if [ ! -f .env ] && [ -f .env.example ]; then
|
||||
cp .env.example .env 2>/dev/null \
|
||||
&& echo "Nieuwe .env aangemaakt vanuit .env.example" \
|
||||
|| echo "LET OP: kon geen .env aanmaken in $(pwd)"
|
||||
fi
|
||||
|
||||
if [ -w .env ] || { [ ! -e .env ] && [ -w . ]; }; then
|
||||
touch .env
|
||||
sed -i '/^SU_TAG=/d; /^SU_VERSION=/d' .env
|
||||
printf 'SU_TAG=%s\nSU_VERSION=%s\n' "${VERSION}" "${VERSION}" >> .env
|
||||
echo "Inhoud van $(pwd)/.env:"
|
||||
grep -vE '^\s*(#|$)' .env | sed 's/^/ /'
|
||||
else
|
||||
echo "LET OP: $(pwd)/.env is niet schrijfbaar voor $(id -un)."
|
||||
echo " Eigenaar: $(stat -c '%U:%G %a' .env 2>/dev/null || echo onbekend)"
|
||||
echo " Herstel eenmalig met:"
|
||||
echo " sudo chown $(stat -c '%U:%G' . ) $(pwd)/.env"
|
||||
echo " SU_TAG wordt nu via de omgeving meegegeven."
|
||||
fi
|
||||
|
||||
# Draait deze server vanaf de registry (SU_IMAGE in .env), dan bouwen
|
||||
# we hier én pushen we het resultaat, zodat de in-app updateknop het
|
||||
# image kan ophalen. Bouwen en pushen zitten bewust in dezelfde job:
|
||||
# een aparte build-workflow zou met deze deploy om de runner strijden.
|
||||
export SU_TAG="${VERSION}"
|
||||
SU_IMAGE="$(grep -E '^SU_IMAGE=' .env 2>/dev/null | cut -d= -f2- || true)"
|
||||
docker compose build --pull
|
||||
|
||||
if [ -n "$SU_IMAGE" ]; then
|
||||
echo "Registry-modus: ${SU_IMAGE}:${VERSION} pushen"
|
||||
echo "${{ secrets.PACKAGE_TOKEN }}" \
|
||||
| docker login "${{ vars.REGISTRY }}" -u "${{ vars.OWNER }}" --password-stdin
|
||||
docker tag "${SU_IMAGE}:${VERSION}" "${SU_IMAGE}:${CHANNEL}" || true
|
||||
docker push "${SU_IMAGE}:${VERSION}"
|
||||
# Compatibiliteit met Server Up <= 0.8.12: de oude updater vroeg
|
||||
# om de Forgejo-tag mét v. Hiermee kan die zichzelf één keer naar
|
||||
# de gerepareerde updater brengen; nieuwe versies gebruiken de kale tag.
|
||||
docker tag "${SU_IMAGE}:${VERSION}" "${SU_IMAGE}:v${VERSION}"
|
||||
docker push "${SU_IMAGE}:v${VERSION}"
|
||||
# Pre-releases krijgen geen 'latest': dat hoort bij stable.
|
||||
case "$VERSION" in
|
||||
*-*) docker tag "${SU_IMAGE}:${VERSION}" "${SU_IMAGE}:beta"
|
||||
docker push "${SU_IMAGE}:beta" ;;
|
||||
*) docker tag "${SU_IMAGE}:${VERSION}" "${SU_IMAGE}:latest"
|
||||
docker push "${SU_IMAGE}:latest" ;;
|
||||
esac
|
||||
docker logout "${{ vars.REGISTRY }}" || true
|
||||
else
|
||||
echo "Lokale bouwmodus (geen SU_IMAGE ingesteld)"
|
||||
docker tag "server-up:${VERSION}" "server-up:${CHANNEL}" || true
|
||||
fi
|
||||
|
||||
- name: Deploy
|
||||
run: |
|
||||
set -euo pipefail
|
||||
cd "$DEPLOY_DIR"
|
||||
export SU_TAG="${VERSION}"
|
||||
docker compose up -d --remove-orphans
|
||||
docker compose ps
|
||||
echo "Compose-projectmap volgens de container:"
|
||||
docker inspect server-up \
|
||||
--format ' {{index .Config.Labels "com.docker.compose.project.working_dir"}}'
|
||||
echo "Poortbinding:"
|
||||
docker inspect server-up \
|
||||
--format ' {{range $p, $c := .NetworkSettings.Ports}}{{$p}} -> {{range $c}}{{.HostIp}}:{{.HostPort}}{{end}}{{"\n"}}{{end}}'
|
||||
|
||||
- name: Wachten op healthcheck
|
||||
run: |
|
||||
set -euo pipefail
|
||||
for i in {1..40}; do
|
||||
status=$(docker inspect --format '{{.State.Health.Status}}' server-up 2>/dev/null || echo "starting")
|
||||
echo "poll $i: $status"
|
||||
if [ "$status" = "healthy" ]; then
|
||||
echo "server-up is healthy als versie ${VERSION}"
|
||||
exit 0
|
||||
fi
|
||||
sleep 3
|
||||
done
|
||||
echo "server-up werd niet healthy in tijd — logs:"
|
||||
cd "$DEPLOY_DIR" && docker compose logs --tail=200
|
||||
exit 1
|
||||
|
||||
- name: Oude images opruimen (behoud laatste 5)
|
||||
if: success()
|
||||
run: |
|
||||
docker images server-up --format '{{.Tag}} {{.ID}}' \
|
||||
| grep -vE '^(latest|release|main) ' \
|
||||
| tail -n +6 \
|
||||
| awk '{print $2}' \
|
||||
| xargs -r docker rmi -f || true
|
||||
docker image prune -f
|
||||
|
|
@ -1,21 +1,22 @@
|
|||
name: Deploy server-up (dev)
|
||||
name: Deploy server-up
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [dev]
|
||||
branches: [main]
|
||||
tags: ['v*']
|
||||
workflow_dispatch:
|
||||
|
||||
concurrency:
|
||||
group: server-up-deploy-dev
|
||||
group: server-up-deploy
|
||||
cancel-in-progress: false
|
||||
|
||||
jobs:
|
||||
deploy:
|
||||
runs-on: [self-hosted, dev]
|
||||
runs-on: self-hosted
|
||||
timeout-minutes: 20
|
||||
|
||||
env:
|
||||
DEPLOY_DIR: /opt/docker/server-up
|
||||
DEPLOY_DIR: /opt/server-up
|
||||
|
||||
steps:
|
||||
- name: Checkout
|
||||
|
|
@ -27,205 +28,43 @@ jobs:
|
|||
id: version
|
||||
run: |
|
||||
set -euo pipefail
|
||||
BASE="$(tr -d '[:space:]' < VERSION 2>/dev/null || echo 0.0.0)"
|
||||
if [[ "${GITHUB_REF}" == refs/tags/* ]]; then
|
||||
VERSION="${GITHUB_REF_NAME#v}"
|
||||
VERSION="${GITHUB_REF_NAME}"
|
||||
CHANNEL="release"
|
||||
else
|
||||
VERSION="${BASE}"
|
||||
VERSION="dev-${GITHUB_SHA:0:8}"
|
||||
CHANNEL="dev"
|
||||
fi
|
||||
echo "VERSION=${VERSION}" >> "$GITHUB_ENV"
|
||||
echo "CHANNEL=${CHANNEL}" >> "$GITHUB_ENV"
|
||||
# SU_VERSION wordt door docker compose gebruikt als build-arg
|
||||
echo "SU_VERSION=${VERSION}" >> "$GITHUB_ENV"
|
||||
echo "Deploying version: ${VERSION} (${CHANNEL})"
|
||||
|
||||
- name: Tests draaien
|
||||
run: |
|
||||
set -euo pipefail
|
||||
# In een container in plaats van een venv op de runner: die heeft
|
||||
# geen python3-venv, en zo draaien de tests bovendien op exact de
|
||||
# Python-versie waarop de app in productie draait.
|
||||
# PYTHONDONTWRITEBYTECODE + no:cacheprovider voorkomen dat er
|
||||
# root-eigen bestanden in de werkmap achterblijven.
|
||||
docker run --rm \
|
||||
-v "$PWD:/w" -w /w \
|
||||
-v su-pip-cache:/root/.cache/pip \
|
||||
-e PYTHONDONTWRITEBYTECODE=1 \
|
||||
python:3.12-slim \
|
||||
sh -c "pip install -q -r server-up/requirements.txt pytest \
|
||||
&& python -m pytest tests -q -p no:cacheprovider"
|
||||
|
||||
- name: Compose-bestanden valideren
|
||||
run: |
|
||||
set -euo pipefail
|
||||
# De testsuite controleert of de sjablonen geldige YAML opleveren.
|
||||
# Of `docker compose` ze ook accepteert is een andere vraag: een
|
||||
# depends_on in de verkeerde vorm of network_mode naast networks is
|
||||
# prima YAML en een kapotte stack. Dat merk je anders pas als iemand
|
||||
# de app installeert.
|
||||
#
|
||||
# Renderen kan alleen waar Python staat (in de container), valideren
|
||||
# alleen waar Docker staat (op de runner). Vandaar twee helften.
|
||||
docker run --rm \
|
||||
-v "$PWD:/w" -w /w \
|
||||
-v su-pip-cache:/root/.cache/pip \
|
||||
-e PYTHONDONTWRITEBYTECODE=1 \
|
||||
python:3.12-slim \
|
||||
sh -c "pip install -q -r server-up/requirements.txt \
|
||||
&& python tools/render_voor_validatie.py .compose-check \
|
||||
&& chown -R $(id -u):$(id -g) .compose-check"
|
||||
fouten=0
|
||||
for f in .compose-check/*/docker-compose.yml; do
|
||||
if ! uitvoer=$(docker compose -f "$f" config -q 2>&1); then
|
||||
echo "✖ $(basename "$(dirname "$f")")"
|
||||
echo "$uitvoer" | sed 's/^/ /'
|
||||
fouten=$((fouten + 1))
|
||||
fi
|
||||
done
|
||||
rm -rf .compose-check
|
||||
if [ "$fouten" -ne 0 ]; then
|
||||
echo "$fouten sjablo(o)n(en) leveren een compose-bestand op dat docker weigert"
|
||||
exit 1
|
||||
fi
|
||||
echo "Alle compose-bestanden zijn geldig"
|
||||
|
||||
- name: Images controleren
|
||||
run: |
|
||||
set -euo pipefail
|
||||
# Een image dat niet meer bestaat merk je anders pas als iemand op
|
||||
# installeren drukt. Zo verdween Huntarr nadat dat project offline
|
||||
# ging, en wezen Forgejo, Planka en Baby Buddy naar tags die er niet
|
||||
# zijn. Draait bewust rustig: registries knijpen af, en een afgeknepen
|
||||
# verzoek is niet te onderscheiden van een ontbrekend image.
|
||||
#
|
||||
# Geslaagde controles blijven een week staan in su-image-cache, met
|
||||
# spreiding zodat niet alles op dezelfde dag verloopt. Een sjabloon
|
||||
# dat naar een andere tag gaat wijzen levert een nieuwe sleutel op en
|
||||
# wordt dus altijd gecontroleerd; mislukkingen komen nooit in de cache.
|
||||
docker run --rm \
|
||||
-v "$PWD:/w" -w /w \
|
||||
-v su-image-cache:/cache \
|
||||
-e PYTHONDONTWRITEBYTECODE=1 \
|
||||
-e SU_IMAGE_CACHE=/cache/images.json \
|
||||
python:3.12-slim \
|
||||
python tools/controleer_images.py
|
||||
|
||||
- name: Sync code naar deploy-directory
|
||||
run: |
|
||||
set -euo pipefail
|
||||
# .env staat in .gitignore, dus de checkout heeft er geen. Zonder deze
|
||||
# uitzondering wist --delete de lokale instellingen van de server
|
||||
# (BIND, SU_IMAGE, PORT) bij elke deploy.
|
||||
rsync -a --no-group --delete \
|
||||
rsync -a --delete \
|
||||
--exclude='.git/' \
|
||||
--exclude='.forgejo/' \
|
||||
--exclude='.env' \
|
||||
./ "$DEPLOY_DIR/"
|
||||
|
||||
- name: Instellingen en versie klaarzetten
|
||||
run: |
|
||||
set -euo pipefail
|
||||
# Expliciet cd in plaats van 'working-directory:'. Dat laatste wordt
|
||||
# niet door elke runner-implementatie even betrouwbaar toegepast, en
|
||||
# als het misgaat belanden VERSION, .env en de container stilletjes in
|
||||
# de werkmap van de runner in plaats van in de deploy-map.
|
||||
cd "$DEPLOY_DIR"
|
||||
echo "Werkmap: $(pwd)"
|
||||
|
||||
echo "${VERSION}" > VERSION
|
||||
|
||||
# SU_TAG bepaalt welk image compose start. We schrijven dat bij
|
||||
# voorkeur in .env zodat het een handmatige `docker compose up`
|
||||
# overleeft, maar dat bestand kan van een andere gebruiker zijn (bv.
|
||||
# met sudo aangemaakt). Lukt schrijven niet, dan geven we SU_TAG mee
|
||||
# via de omgeving: compose gebruikt die en de deploy loopt gewoon door.
|
||||
if [ ! -f .env ] && [ -f .env.example ]; then
|
||||
cp .env.example .env 2>/dev/null \
|
||||
&& echo "Nieuwe .env aangemaakt vanuit .env.example" \
|
||||
|| echo "LET OP: kon geen .env aanmaken in $(pwd)"
|
||||
fi
|
||||
|
||||
if [ -w .env ] || { [ ! -e .env ] && [ -w . ]; }; then
|
||||
touch .env
|
||||
sed -i '/^SU_TAG=/d; /^SU_VERSION=/d' .env
|
||||
printf 'SU_TAG=%s\nSU_VERSION=%s\n' "${VERSION}" "${VERSION}" >> .env
|
||||
echo "Inhoud van $(pwd)/.env:"
|
||||
grep -vE '^\s*(#|$)' .env | sed 's/^/ /'
|
||||
else
|
||||
echo "LET OP: $(pwd)/.env is niet schrijfbaar voor $(id -un)."
|
||||
echo " Eigenaar: $(stat -c '%U:%G %a' .env 2>/dev/null || echo onbekend)"
|
||||
echo " Herstel eenmalig met:"
|
||||
echo " sudo chown $(stat -c '%U:%G' . ) $(pwd)/.env"
|
||||
echo " SU_TAG wordt nu via de omgeving meegegeven."
|
||||
fi
|
||||
- name: Schrijf VERSION-bestand
|
||||
working-directory: ${{ env.DEPLOY_DIR }}
|
||||
run: echo "${VERSION}" > VERSION
|
||||
|
||||
- name: Build image
|
||||
working-directory: ${{ env.DEPLOY_DIR }}
|
||||
run: |
|
||||
set -euo pipefail
|
||||
cd "$DEPLOY_DIR"
|
||||
export SU_TAG="${VERSION}"
|
||||
docker compose build --pull
|
||||
docker tag "server-up:${VERSION}" "server-up:${CHANNEL}" || true
|
||||
|
||||
# Server Up draait niet meer als root. Dat hangt aan het entrypoint en aan
|
||||
# `setpriv`, en beide zijn alleen in een echte container te toetsen — de
|
||||
# pytest-suite kan er niet bij. Zonder deze stap merk je een regressie hier
|
||||
# pas als iemands installatie niet meer opkomt.
|
||||
- name: Niet-root modus controleren
|
||||
run: |
|
||||
set -euo pipefail
|
||||
IMG="server-up:${VERSION}"
|
||||
|
||||
echo "1. setpriv aanwezig in het image"
|
||||
docker run --rm --entrypoint setpriv "$IMG" --help >/dev/null
|
||||
echo " ok"
|
||||
|
||||
echo "2. zakt af naar de opgegeven gebruiker"
|
||||
uit=$(docker run --rm -e SU_UID=1000 -e SU_GID=1000 \
|
||||
-v /var/run/docker.sock:/var/run/docker.sock "$IMG" id)
|
||||
echo " $uit"
|
||||
case "$uit" in
|
||||
uid=1000*) ;;
|
||||
*) echo "FOUT: draait niet als uid 1000"; exit 1 ;;
|
||||
esac
|
||||
|
||||
echo "3. zit in de groep van de docker-socket"
|
||||
sok_gid=$(stat -c %g /var/run/docker.sock)
|
||||
case "$uit" in
|
||||
*"$sok_gid"*) echo " gid $sok_gid aanwezig" ;;
|
||||
*) echo "FOUT: gid $sok_gid van de socket ontbreekt"; exit 1 ;;
|
||||
esac
|
||||
|
||||
echo "4. kan schrijven in /data"
|
||||
docker run --rm -e SU_UID=1000 -e SU_GID=1000 \
|
||||
-v "su-nietroot-proef-${VERSION}:/data" "$IMG" \
|
||||
sh -c 'touch /data/proef && echo " ok"'
|
||||
docker volume rm "su-nietroot-proef-${VERSION}" >/dev/null
|
||||
|
||||
echo "5. zonder SU_UID blijft het root — de ontsnappingsklep"
|
||||
uit0=$(docker run --rm "$IMG" id)
|
||||
echo " $uit0"
|
||||
case "$uit0" in
|
||||
uid=0*) ;;
|
||||
*) echo "FOUT: SU_UID=0 hoort root te blijven"; exit 1 ;;
|
||||
esac
|
||||
# Extra tags zodat 'latest' altijd op de laatste deploy wijst
|
||||
docker tag "server-up:${VERSION}" server-up:latest
|
||||
docker tag "server-up:${VERSION}" "server-up:${CHANNEL}"
|
||||
|
||||
- name: Deploy
|
||||
working-directory: ${{ env.DEPLOY_DIR }}
|
||||
run: |
|
||||
set -euo pipefail
|
||||
cd "$DEPLOY_DIR"
|
||||
export SU_TAG="${VERSION}"
|
||||
docker compose up -d --remove-orphans
|
||||
docker compose ps
|
||||
# Waar draait de container vandaan, en op welk adres luistert hij?
|
||||
echo "Compose-projectmap volgens de container:"
|
||||
docker inspect server-up \
|
||||
--format ' {{index .Config.Labels "com.docker.compose.project.working_dir"}}'
|
||||
echo "Poortbinding:"
|
||||
docker inspect server-up \
|
||||
--format ' {{range $p, $c := .NetworkSettings.Ports}}{{$p}} -> {{range $c}}{{.HostIp}}:{{.HostPort}}{{end}}{{"\n"}}{{end}}'
|
||||
|
||||
- name: Wachten op healthcheck
|
||||
run: |
|
||||
|
|
@ -243,62 +82,6 @@ jobs:
|
|||
cd "$DEPLOY_DIR" && docker compose logs --tail=200
|
||||
exit 1
|
||||
|
||||
# De backuptests vervangen Docker allemaal door een nepversie. Dat toetst
|
||||
# de logica maar niet de keten: pg_dump via `docker exec`, het archief,
|
||||
# het terugzetten, en of de database daarna nog schrijft. Juist daar
|
||||
# betekent fout zijn gegevensverlies.
|
||||
#
|
||||
# Draait op het zojuist gebouwde image — dus met exact de Python en de
|
||||
# docker-CLI van productie. De werkmap wordt op hetzelfde pad gemount,
|
||||
# want de bind mount van de postgres-container wordt door de daemon op de
|
||||
# host opgezocht, niet in deze container.
|
||||
- name: Backup en terugzetten met echte Docker
|
||||
run: |
|
||||
set -uo pipefail
|
||||
PROEF="$DEPLOY_DIR/.backup-rondgang"
|
||||
rm -rf "$PROEF"; mkdir -p "$PROEF"
|
||||
docker run --rm \
|
||||
-v /var/run/docker.sock:/var/run/docker.sock \
|
||||
-v "$PROEF:$PROEF" \
|
||||
-v "$PWD:/w" -w /w \
|
||||
-e PYTHONDONTWRITEBYTECODE=1 \
|
||||
"server-up:${VERSION}" \
|
||||
python tools/backup_rondgang.py "$PROEF"
|
||||
code=$?
|
||||
# De exitcode expliciet tonen. Een run die "Rondgang geslaagd" op het
|
||||
# scherm zette en tóch rood werd, liet nergens zien waar dat vandaan
|
||||
# kwam — en zonder dit getal is dat niet te achterhalen.
|
||||
echo "rondgang exitcode: $code"
|
||||
rm -rf "$PROEF" || true
|
||||
[ "$code" -eq 0 ] || exit 1
|
||||
|
||||
# `--doctor` is ruim honderd regels shell die alleen tegen een échte
|
||||
# installatie draaien. De pytest-suite komt niet verder dan "er is geen
|
||||
# Docker"; hier wel.
|
||||
- name: install.sh --doctor doorlichten
|
||||
if: success()
|
||||
run: |
|
||||
set -uo pipefail
|
||||
uit="$(sh "$DEPLOY_DIR/install.sh" --doctor --dir "$DEPLOY_DIR" 2>&1)"
|
||||
code=$?
|
||||
printf '%s\n' "$uit"
|
||||
|
||||
# Alle secties moeten gedraaid hebben: een shell-fout halverwege zou
|
||||
# anders als "niets aan de hand" langskomen.
|
||||
for kop in "Installatie" "Docker" "Container" "Bereikbaarheid" \
|
||||
"Account" "Mappen" "Bijwerken vanuit de interface"; do
|
||||
printf '%s\n' "$uit" | grep -q "^$kop$" || {
|
||||
echo "FOUT: --doctor kwam niet tot de sectie '$kop'"; exit 1; }
|
||||
done
|
||||
|
||||
# En de uitslag telt mee. Waarschuwingen mogen (deze deploy draait
|
||||
# bewust nog als root), fouten niet.
|
||||
if [ "$code" -ne 0 ]; then
|
||||
echo "FOUT: --doctor meldt problemen met de deploy"
|
||||
exit 1
|
||||
fi
|
||||
echo "--doctor liep van begin tot eind, zonder fouten"
|
||||
|
||||
- name: Oude images opruimen (behoud laatste 5)
|
||||
if: success()
|
||||
run: |
|
||||
|
|
|
|||
|
|
@ -1,112 +0,0 @@
|
|||
# Forgejo Actions — maak automatisch een Release bij een v*-tag.
|
||||
#
|
||||
# Bouwt de release-notes uit:
|
||||
# 1) de bijbehorende sectie in CHANGELOG.md
|
||||
# 2) een commit-overzicht sinds de vorige tag
|
||||
# en publiceert die als Forgejo-Release via de API. Pre-release tags
|
||||
# (bv. v0.8.4-beta1) worden als pre-release gemarkeerd.
|
||||
#
|
||||
# Token: gebruikt de automatische GITHUB_TOKEN van Forgejo Actions. Werkt dat
|
||||
# niet (onvoldoende rechten), zet dan een secret RELEASE_TOKEN met repo-write.
|
||||
|
||||
name: Release
|
||||
|
||||
on:
|
||||
push:
|
||||
tags:
|
||||
- "v*"
|
||||
|
||||
jobs:
|
||||
release:
|
||||
runs-on: [self-hosted, prod]
|
||||
timeout-minutes: 10
|
||||
|
||||
steps:
|
||||
- name: Checkout (volledige historie + tags)
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Release-notes opbouwen
|
||||
id: notes
|
||||
run: |
|
||||
set -euo pipefail
|
||||
TAG="${GITHUB_REF_NAME}"
|
||||
VERSION="${TAG#v}"
|
||||
echo "TAG=${TAG}" >> "$GITHUB_ENV"
|
||||
|
||||
# Pre-release? (tag bevat een suffix met streepje, bv. -beta1 / -rc.1)
|
||||
if [[ "$VERSION" == *-* ]]; then
|
||||
echo "PRERELEASE=true" >> "$GITHUB_ENV"
|
||||
else
|
||||
echo "PRERELEASE=false" >> "$GITHUB_ENV"
|
||||
fi
|
||||
|
||||
NOTES="$(mktemp)"
|
||||
# 1) Sectie uit CHANGELOG.md (van "# vX..." tot de volgende "# v...")
|
||||
awk -v ver="$VERSION" '
|
||||
$0 ~ ("^# v?" ver "([ \t).—-]|$)") {grab=1; print; next}
|
||||
grab && /^# v/ {exit}
|
||||
grab {print}
|
||||
' CHANGELOG.md > "$NOTES" || true
|
||||
|
||||
# 2) Commit-overzicht sinds de vorige tag
|
||||
PREV="$(git describe --tags --abbrev=0 "${TAG}^" 2>/dev/null || echo "")"
|
||||
{
|
||||
echo ""
|
||||
echo "## Commits"
|
||||
if [ -n "$PREV" ]; then
|
||||
git log --no-merges --pretty="- %s (%h)" "${PREV}..${TAG}"
|
||||
echo ""
|
||||
echo "**Volledige changelog:** ${PREV}...${TAG}"
|
||||
else
|
||||
git log --no-merges --pretty="- %s (%h)" "${TAG}"
|
||||
fi
|
||||
} >> "$NOTES"
|
||||
|
||||
echo "NOTES_FILE=${NOTES}" >> "$GITHUB_ENV"
|
||||
echo "----- release notes -----"; cat "$NOTES"
|
||||
|
||||
- name: Release aanmaken via Forgejo API
|
||||
run: |
|
||||
set -euo pipefail
|
||||
TOKEN="${{ secrets.RELEASE_TOKEN }}"
|
||||
if [ -z "$TOKEN" ]; then TOKEN="${{ secrets.GITHUB_TOKEN }}"; fi
|
||||
|
||||
# Bouw JSON-payload (body veilig ge-escaped via python)
|
||||
python3 - "$TAG" "$NOTES_FILE" "$PRERELEASE" > payload.json <<'PY'
|
||||
import json, sys
|
||||
tag, notes_file, pre = sys.argv[1], sys.argv[2], sys.argv[3]
|
||||
body = open(notes_file, encoding="utf-8").read()
|
||||
print(json.dumps({
|
||||
"tag_name": tag,
|
||||
"name": tag,
|
||||
"body": body,
|
||||
"draft": False,
|
||||
"prerelease": pre == "true",
|
||||
}))
|
||||
PY
|
||||
|
||||
API="${GITHUB_SERVER_URL}/api/v1/repos/${GITHUB_REPOSITORY}/releases"
|
||||
code=$(curl -sS -o resp.json -w "%{http_code}" -X POST \
|
||||
-H "Authorization: token ${TOKEN}" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d @payload.json "$API")
|
||||
echo "HTTP ${code}"; cat resp.json || true
|
||||
|
||||
if [ "$code" = "201" ]; then
|
||||
echo "Release ${TAG} aangemaakt."
|
||||
elif [ "$code" = "409" ]; then
|
||||
# Bestaat al: update de bestaande release
|
||||
ID=$(curl -sS -H "Authorization: token ${TOKEN}" \
|
||||
"${API}/tags/${TAG}" | python3 -c "import json,sys;print(json.load(sys.stdin).get('id',''))")
|
||||
if [ -n "$ID" ]; then
|
||||
curl -fsS -X PATCH \
|
||||
-H "Authorization: token ${TOKEN}" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d @payload.json "${API}/${ID}" >/dev/null
|
||||
echo "Bestaande release ${TAG} bijgewerkt."
|
||||
fi
|
||||
else
|
||||
echo "Release aanmaken faalde (HTTP ${code})"; exit 1
|
||||
fi
|
||||
5
.gitattributes
vendored
5
.gitattributes
vendored
|
|
@ -1,5 +0,0 @@
|
|||
# Houd VERSION en shell/workflow-bestanden op LF, ook op Windows,
|
||||
# zodat de CI ze correct leest.
|
||||
VERSION text eol=lf
|
||||
*.sh text eol=lf
|
||||
*.yml text eol=lf
|
||||
5
.gitignore
vendored
5
.gitignore
vendored
|
|
@ -2,8 +2,3 @@ __pycache__/
|
|||
*.pyc
|
||||
*.pyo
|
||||
.env
|
||||
.pytest_cache/
|
||||
venv/
|
||||
node_modules/
|
||||
.compose-check/
|
||||
venv/
|
||||
|
|
|
|||
11
AGENTS.md
11
AGENTS.md
|
|
@ -1,11 +0,0 @@
|
|||
# Projectafspraken
|
||||
- Werk nooit rechtstreeks op main
|
||||
- Push naar de dev branch
|
||||
- Werk met versienummering (v0.0.00)
|
||||
- In de dev-branch altijd beta weergeven bij de versienummering
|
||||
- Beschrijf gewijzigde functionaliteiten puntsgewijs in de pull request.
|
||||
- Gebruik geen sudo
|
||||
- Commit geen wachtwoorden, tokens, `.env`-bestanden of privésleutels.
|
||||
- Voer relevante tests uit voor iedere commit.
|
||||
- Push wijzigingen naar Forgejo, maar merge niet zelfstandig.
|
||||
- Bij opdracht "Release versie" maak een versie releaseversie
|
||||
2603
CHANGELOG.md
2603
CHANGELOG.md
File diff suppressed because it is too large
Load diff
13
CLAUDE.md
13
CLAUDE.md
|
|
@ -1,13 +0,0 @@
|
|||
# Projectafspraken
|
||||
- Werk nooit rechtstreeks op main
|
||||
- Push naar de dev branch
|
||||
- Werk met versienummering (v0.0.00)
|
||||
- Verhoog per uitgave met 0.0.01, dus 0.7.95 → 0.7.96. Geen sprongen van tien,
|
||||
en de middelste positie blijft één cijfer: na 0.7.99 komt 0.8.00.
|
||||
- In de dev-branch altijd beta weergeven bij de versienummering
|
||||
- Beschrijf gewijzigde functionaliteiten puntsgewijs in de pull request.
|
||||
- Gebruik geen sudo
|
||||
- Commit geen wachtwoorden, tokens, `.env`-bestanden of privésleutels.
|
||||
- Voer relevante tests uit voor iedere commit.
|
||||
- Push wijzigingen naar Forgejo, maar merge niet zelfstandig.
|
||||
- Bij opdracht "Release versie" maak een versie releaseversie
|
||||
81
Dockerfile
81
Dockerfile
|
|
@ -4,24 +4,16 @@ COPY server-up/requirements.txt .
|
|||
RUN pip install --no-cache-dir --prefix=/inst -r requirements.txt
|
||||
|
||||
FROM python:3.12-slim
|
||||
# De volgorde hieronder is met opzet: alles wat zelden verandert staat boven,
|
||||
# alles wat bij elke commit verandert onderaan. Docker hergebruikt een laag
|
||||
# alleen zolang niets ervóór is gewijzigd, dus één regel op de verkeerde plek
|
||||
# kost bij elke build opnieuw de hele rit.
|
||||
#
|
||||
# Wat hier eerder misging: `ARG SU_VERSION` met een LABEL erachter stond
|
||||
# bovenaan. Die waarde verandert per release, dus elke uitgave gooide álle
|
||||
# lagen erna weg — apt-get, de Docker-CLI van 70 MB, de front-end-bestanden,
|
||||
# alles. Vandaar dat versie en label nu helemaal onderaan staan.
|
||||
|
||||
# util-linux levert `setpriv`, waarmee het entrypoint naar een gewone gebruiker
|
||||
# afzakt zonder de capabilities te verliezen die Server Up nodig heeft. Het is
|
||||
# een Essential-pakket en dus al aanwezig, maar expliciet noemen zorgt dat een
|
||||
# uitgeklede basis-image het niet stilletjes wegbezuinigt.
|
||||
# Build-arg: zet bij build naar de git-tag, zodat de image z'n eigen versie kent.
|
||||
# docker build --build-arg SU_VERSION=$(git describe --tags --always) ...
|
||||
# Forgejo Actions doet dit automatisch (zie server-up-deploy/README.md).
|
||||
ARG SU_VERSION=dev
|
||||
LABEL org.opencontainers.image.title="Server Up" \
|
||||
org.opencontainers.image.version="${SU_VERSION}" \
|
||||
org.opencontainers.image.source="https://git.example.com/bes-r/server-up"
|
||||
RUN apt-get update && apt-get install -y --no-install-recommends \
|
||||
git openssh-client curl tar gzip ca-certificates util-linux passwd \
|
||||
&& rm -rf /var/lib/apt/lists/* \
|
||||
&& setpriv --help >/dev/null
|
||||
git openssh-client curl tar gzip ca-certificates \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
|
||||
# Install Docker CLI + docker-compose inside container
|
||||
RUN DPKG_ARCH=$(dpkg --print-architecture) \
|
||||
|
|
@ -43,66 +35,21 @@ RUN DPKG_ARCH=$(dpkg --print-architecture) \
|
|||
|
||||
COPY --from=build /inst /usr/local
|
||||
WORKDIR /app
|
||||
|
||||
# De front-end-bestanden staan vóór de broncode: hun versies staan hier vast,
|
||||
# dus deze lagen blijven staan zolang je ze niet zelf wijzigt. Stonden ze erna,
|
||||
# dan haalde elke commit ze opnieuw van het CDN én werden ze bij elke push
|
||||
# opnieuw geüpload.
|
||||
COPY server-up/ ./
|
||||
COPY modules/ ./modules-bundled/
|
||||
RUN mkdir -p static/fonts \
|
||||
&& curl -fsSL "https://cdn.jsdelivr.net/npm/@mdi/font@7.4.47/css/materialdesignicons.min.css" -o static/fonts/mdi.min.css \
|
||||
&& curl -fsSL "https://cdn.jsdelivr.net/npm/@mdi/font@7.4.47/fonts/materialdesignicons-webfont.woff2" -o static/fonts/materialdesignicons-webfont.woff2 \
|
||||
&& sed -i "s|https://cdn.jsdelivr.net/npm/@mdi/font@7.4.47/fonts/||g" static/fonts/mdi.min.css
|
||||
|
||||
# Front-end libraries meeleveren in plaats van vanaf een CDN laden. Zo kan de
|
||||
# Content-Security-Policy op 'self' blijven, is er geen supply-chain-risico van
|
||||
# unpkg/jsdelivr op runtime, en werkt de UI ook zonder internetverbinding.
|
||||
RUN mkdir -p static/vendor \
|
||||
&& curl -fsSL "https://cdn.tailwindcss.com/3.4.16?plugins=forms,typography" \
|
||||
-o static/vendor/tailwind.js \
|
||||
&& curl -fsSL "https://cdn.jsdelivr.net/npm/alpinejs@3.14.1/dist/cdn.min.js" \
|
||||
-o static/vendor/alpine.min.js \
|
||||
&& curl -fsSL "https://cdn.jsdelivr.net/npm/htmx.org@2.0.3/dist/htmx.min.js" \
|
||||
-o static/vendor/htmx.min.js \
|
||||
&& for f in static/vendor/tailwind.js static/vendor/alpine.min.js static/vendor/htmx.min.js; do \
|
||||
test -s "$f" || { echo "LEEG: $f"; exit 1; }; \
|
||||
done
|
||||
|
||||
# Directories + git safe.directory (fix dubious ownership)
|
||||
RUN mkdir -p /data/stacks /data/appdata /data/backups /data/git modules /root \
|
||||
&& printf '[safe]\n\tdirectory = *\n' > /root/.gitconfig
|
||||
|
||||
# GIT_SSH_COMMAND: StrictHostKeyChecking=accept-new vertrouwt een host bij de
|
||||
# eerste verbinding en bewaart de sleutel in /data/known_hosts. Wijzigt die
|
||||
# sleutel later, dan faalt de verbinding — met `no` was elke MITM onzichtbaar.
|
||||
ENV PYTHONUNBUFFERED=1 PORT=5000 HOME=/root \
|
||||
SU_VERSION=${SU_VERSION} \
|
||||
SU_CONFIG=/data/config.json SU_AUDIT=/data/audit.db SU_GIT_CACHE=/data/git \
|
||||
SU_SECRET=/data/secret.key SU_JOBS=/data/jobs \
|
||||
GIT_SSH_COMMAND="ssh -o StrictHostKeyChecking=accept-new -o UserKnownHostsFile=/data/known_hosts"
|
||||
COPY docker-entrypoint.sh /usr/local/bin/docker-entrypoint.sh
|
||||
RUN chmod +x /usr/local/bin/docker-entrypoint.sh
|
||||
|
||||
GIT_SSH_COMMAND="ssh -F /dev/null -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null"
|
||||
EXPOSE 5000
|
||||
HEALTHCHECK --interval=30s --timeout=8s --start-period=15s CMD curl -fs http://localhost:5000/healthz || exit 1
|
||||
# Het entrypoint start als root, zet /data klaar en zakt daarna af naar
|
||||
# SU_UID:SU_GID. Zonder die variabelen verandert er niets: dan blijft het root.
|
||||
ENTRYPOINT ["/usr/local/bin/docker-entrypoint.sh"]
|
||||
HEALTHCHECK --interval=30s --timeout=8s --start-period=15s CMD curl -fs http://localhost:5000/api/docker/info || exit 1
|
||||
CMD ["python","app.py"]
|
||||
|
||||
# ── Vanaf hier verandert er iets bij elke commit ─────────────────────────────
|
||||
# Alles hierboven blijft in de cache staan; alleen deze laatste lagen worden
|
||||
# opnieuw gebouwd. Daardoor duurt een release een halve minuut in plaats van
|
||||
# een kwartier, en hoeft de push alleen deze lagen te uploaden.
|
||||
COPY server-up/ ./
|
||||
COPY modules/ ./modules-bundled/
|
||||
COPY VERSION ./VERSION
|
||||
|
||||
# Build-arg: zet bij build naar de git-tag, zodat de image z'n eigen versie kent.
|
||||
# docker build --build-arg SU_VERSION=$(git describe --tags --always) ...
|
||||
# Forgejo Actions doet dit automatisch (zie server-up-deploy/README.md).
|
||||
# Helemaal onderaan, want deze waarde verandert per uitgave en zou alles
|
||||
# eronder ongeldig maken.
|
||||
ARG SU_VERSION=dev
|
||||
ENV SU_VERSION=${SU_VERSION}
|
||||
LABEL org.opencontainers.image.title="Server Up" \
|
||||
org.opencontainers.image.version="${SU_VERSION}" \
|
||||
org.opencontainers.image.source="https://git.example.com/bes-r/server-up"
|
||||
|
|
|
|||
155
README.md
155
README.md
|
|
@ -1,155 +0,0 @@
|
|||
# Server Up
|
||||
|
||||
Zelfgehoste beheerinterface voor Docker: apps installeren uit een catalogus,
|
||||
stacks starten en stoppen, backups maken en terugzetten, en containers een eigen
|
||||
IP-adres in je netwerk geven.
|
||||
|
||||
> ⚠️ **Toegang tot Server Up staat gelijk aan root op de host.** De applicatie
|
||||
> beheert de Docker-daemon, en wie containers kan starten kan willekeurige mappen
|
||||
> van de host mounten. Behandel de interface navenant: maak direct een account
|
||||
> aan, zet hem niet zonder reverse proxy met TLS op internet, en lees
|
||||
> [docs/beveiliging.md](docs/beveiliging.md).
|
||||
|
||||
---
|
||||
|
||||
## Wat het doet
|
||||
|
||||
| | |
|
||||
|---|---|
|
||||
| **App-catalogus** | 286 kant-en-klare apps, ingedeeld in categorieën met kleur. Zoeken, filteren en installeren met een formulier in plaats van YAML. |
|
||||
| **Stacks beheren** | Starten, stoppen, bijwerken en herstarten — per stack of per losse container, met logs en live CPU-/geheugengebruik. |
|
||||
| **Apps koppelen** | Stacks komen op een gedeeld netwerk, zodat ze elkaar op naam bereiken. Een veld dat naar een andere app verwijst toont een keuzelijst met wat je al draait. |
|
||||
| **Eigen IP per stack** | Met macvlan of ipvlan krijgt een app een eigen adres in je LAN in plaats van poorten op de host. |
|
||||
| **Backups** | Handmatig, gepland, en automatisch vóór een update of verwijdering. Met terugzetten en een bewaarbeleid. |
|
||||
| **Updates** | Voor Server Up zelf (stable of beta) en voor de images van je geïnstalleerde stacks. |
|
||||
| **Toegang** | Lokale accounts met rollen (beheerder, operator, alleen lezen), of SSO via een reverse proxy. |
|
||||
|
||||
## Wat je nodig hebt
|
||||
|
||||
- Een Linux-server met Docker en de compose-plugin
|
||||
- Toegang tot `/var/run/docker.sock`
|
||||
- Ongeveer 300 MB schijfruimte voor de applicatie zelf
|
||||
|
||||
## Installeren
|
||||
|
||||
```bash
|
||||
curl -fsSL https://git.ramonbesselink.nl/bes-r/server-up/raw/branch/main/install.sh | sh
|
||||
```
|
||||
|
||||
Dat controleert je systeem, installeert Docker als het ontbreekt, zet Server Up
|
||||
in `/opt/server-up` en start het. Onderweg vraagt het waarop de interface moet
|
||||
luisteren en of het meteen een beheerdersaccount voor je aanmaakt — die twee
|
||||
vragen komen vooraf, zodat je kunt weglopen terwijl het image gebouwd wordt.
|
||||
|
||||
Liever eerst lezen wat je uitvoert — verstandig, want het script gebruikt
|
||||
root-rechten:
|
||||
|
||||
```bash
|
||||
curl -fsSL https://git.ramonbesselink.nl/bes-r/server-up/raw/branch/main/install.sh -o install.sh
|
||||
less install.sh
|
||||
sh install.sh --dry-run # toont wat het zou doen, zonder iets te wijzigen
|
||||
sh install.sh
|
||||
```
|
||||
|
||||
Handmatig kan ook:
|
||||
|
||||
```bash
|
||||
git clone https://git.ramonbesselink.nl/bes-r/server-up.git /opt/server-up
|
||||
cd /opt/server-up
|
||||
cp .env.example .env
|
||||
docker compose up -d --build
|
||||
```
|
||||
|
||||
Alle opties staan in [docs/installeren.md](docs/installeren.md): `--dir`,
|
||||
`--port`, `--bind`, `--branch`, `--token`, `--admin`, `--create-admin`,
|
||||
`--update`, `--uninstall`.
|
||||
|
||||
### Het beheerdersaccount
|
||||
|
||||
Zolang er nog geen account is, kan iedereen die de pagina bereikt het claimen —
|
||||
de container waarschuwt daar bij het opstarten ook voor. Laat het script het
|
||||
daarom meteen aanmaken:
|
||||
|
||||
```bash
|
||||
sh install.sh --admin ramon # vraagt om een wachtwoord
|
||||
SU_ADMIN_PASSWORD='...' sh install.sh --admin ramon --yes # zonder vragen
|
||||
```
|
||||
|
||||
Zonder wachtwoordbron en zonder terminal maakt het script er zelf een en toont
|
||||
die. Overgeslagen of misgegaan? `sh /opt/server-up/install.sh --create-admin
|
||||
--admin ramon` doet het achteraf. Een wachtwoord als opdrachtregeloptie wordt
|
||||
geweigerd: dat is zichtbaar in `ps`.
|
||||
|
||||
### Instellingen
|
||||
|
||||
Alles staat met uitleg in [`.env.example`](.env.example). De twee die je
|
||||
waarschijnlijk meteen nodig hebt:
|
||||
|
||||
```bash
|
||||
BIND=127.0.0.1 # 0.0.0.0 om er van buiten de server bij te kunnen
|
||||
PORT=5000
|
||||
```
|
||||
|
||||
De poort bindt standaard op `127.0.0.1`. Zet hem pas open als er een reverse
|
||||
proxy met TLS voor staat. Achteraf wijzigen kan met
|
||||
`sh /opt/server-up/install.sh --update --bind 0.0.0.0`; pas het anders aan in
|
||||
`.env` en **niet** in `docker-compose.yml`, want dat bestand komt uit de repo en
|
||||
wordt bij elke update overschreven.
|
||||
|
||||
## Documentatie
|
||||
|
||||
| Document | Waarover |
|
||||
|---|---|
|
||||
| [docs/installeren.md](docs/installeren.md) | Het installatiescript, opties, bijwerken en verwijderen |
|
||||
| [docs/beveiliging.md](docs/beveiliging.md) | Accounts, rollen, SSO, reverse proxy, wat wel en niet is afgedekt |
|
||||
| [docs/apps-maken.md](docs/apps-maken.md) | Eigen apps toevoegen: het volledige templateformaat |
|
||||
| [docs/netwerken.md](docs/netwerken.md) | Stacks een eigen IP geven met macvlan of ipvlan |
|
||||
| [docs/backups.md](docs/backups.md) | Wat er wél en niet in een backup zit, terugzetten, bewaarbeleid |
|
||||
| [docs/updates.md](docs/updates.md) | Update-kanalen en de Forgejo-registry inrichten |
|
||||
| [docs/synchroniseren.md](docs/synchroniseren.md) | Code van je apparaat naar de server via Forgejo |
|
||||
| [docs/forgejo-actions-setup.md](docs/forgejo-actions-setup.md) | Runners instellen |
|
||||
|
||||
## Eigen apps toevoegen
|
||||
|
||||
Wijs Server Up naar je eigen git-repo met app-sjablonen (Instellingen → App
|
||||
Store → Repository), of voeg een map toe onder `apps/`:
|
||||
|
||||
```
|
||||
apps/mijn-app/
|
||||
├── template.json metadata en de vragen bij het installeren
|
||||
└── files/
|
||||
└── compose.yaml het compose-bestand met << variabelen >>
|
||||
```
|
||||
|
||||
Het volledige formaat staat in [docs/apps-maken.md](docs/apps-maken.md).
|
||||
|
||||
## Bijwerken en verwijderen
|
||||
|
||||
```bash
|
||||
sh /opt/server-up/install.sh --update # nieuwste versie ophalen en herstarten
|
||||
sh /opt/server-up/install.sh --uninstall # stoppen; je gegevens blijven staan
|
||||
```
|
||||
|
||||
Draait Server Up vanaf een registry-image, dan kan bijwerken ook met een knop in
|
||||
de interface — zie [docs/updates.md](docs/updates.md).
|
||||
|
||||
## Ontwikkelen
|
||||
|
||||
```bash
|
||||
python3 -m venv venv && venv/bin/pip install -r server-up/requirements.txt pytest
|
||||
venv/bin/python -m pytest tests -q # de volledige suite
|
||||
cd server-up && SU_DEV=1 python app.py # lokaal draaien op poort 5000
|
||||
```
|
||||
|
||||
De testsuite draait ook over alle app-sjablonen: elke app moet renderen naar
|
||||
geldige compose-YAML, met gedeclareerde volumes en zonder onvervangen
|
||||
variabelen. Voeg je een app toe, dan wordt die automatisch meegenomen.
|
||||
|
||||
De deploy-workflows draaien de tests in een container (`python:3.12-slim`), dus
|
||||
op de runner is verder niets nodig dan Docker.
|
||||
|
||||
## Licentie en bijdragen
|
||||
|
||||
Zie `CHANGELOG.md` voor de geschiedenis. Werk op de `dev`-branch en bump
|
||||
`VERSION` bij elke wijziging; een test bewaakt dat er een changelog-sectie bij
|
||||
hoort.
|
||||
1
VERSION
1
VERSION
|
|
@ -1 +0,0 @@
|
|||
0.8.31
|
||||
|
|
@ -1,15 +0,0 @@
|
|||
services:
|
||||
<< service_name >>:
|
||||
image: 2fauth/2fauth:latest
|
||||
container_name: << service_name >>
|
||||
environment:
|
||||
- TZ=<< timezone >>
|
||||
- APP_KEY=<< app_key >>
|
||||
- APP_URL=<< app_url >>
|
||||
- IS_DEMO_APP=false
|
||||
- TRUSTED_PROXIES=*
|
||||
volumes:
|
||||
- << appdata_dir >>/<< service_name >>:/2fauth
|
||||
ports:
|
||||
- "<< port >>:8000"
|
||||
restart: unless-stopped
|
||||
|
|
@ -1,88 +0,0 @@
|
|||
{
|
||||
"kind": "compose",
|
||||
"metadata": {
|
||||
"name": "2FAuth",
|
||||
"description": "Bewaart je tweestapscodes op je eigen server, zodat je ze niet kwijt bent met je telefoon. Naast Vaultwarden, niet erin — dan liggen wachtwoord en code niet op dezelfde plek.",
|
||||
"tags": [
|
||||
"2fa",
|
||||
"totp",
|
||||
"beveiliging"
|
||||
],
|
||||
"icon": {
|
||||
"provider": "selfhst",
|
||||
"id": "2fauth"
|
||||
},
|
||||
"version": {
|
||||
"name": "latest"
|
||||
},
|
||||
"categories": [
|
||||
"beveiliging"
|
||||
]
|
||||
},
|
||||
"variables": [
|
||||
{
|
||||
"title": "Algemeen",
|
||||
"items": [
|
||||
{
|
||||
"name": "service_name",
|
||||
"type": "str",
|
||||
"title": "Servicenaam",
|
||||
"default": "2fauth",
|
||||
"required": true
|
||||
},
|
||||
{
|
||||
"name": "port",
|
||||
"type": "int",
|
||||
"title": "Webinterface",
|
||||
"default": 8230,
|
||||
"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": "app_url",
|
||||
"type": "str",
|
||||
"title": "Publiek adres",
|
||||
"default": "http://localhost:8230",
|
||||
"required": true
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Toegang",
|
||||
"items": [
|
||||
{
|
||||
"name": "app_key",
|
||||
"type": "str",
|
||||
"title": "Applicatiesleutel",
|
||||
"default": "",
|
||||
"required": true,
|
||||
"secret": true,
|
||||
"generate": "auto",
|
||||
"secret_format": "laravel",
|
||||
"secret_bytes": 32,
|
||||
"description": "Laravel-formaat; wordt automatisch in de juiste vorm gemaakt"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
@ -1,13 +0,0 @@
|
|||
services:
|
||||
<< service_name >>:
|
||||
image: activepieces/activepieces:latest
|
||||
container_name: << service_name >>
|
||||
ports:
|
||||
- "<< port >>:80"
|
||||
environment:
|
||||
- AP_REDIS_TYPE=MEMORY
|
||||
- AP_DB_TYPE=PGLITE
|
||||
- AP_FRONTEND_URL=<< frontend_url >>
|
||||
volumes:
|
||||
- << appdata_dir >>/<< service_name >>:/root/.activepieces
|
||||
restart: unless-stopped
|
||||
|
|
@ -1,24 +0,0 @@
|
|||
{
|
||||
"kind": "compose",
|
||||
"metadata": {
|
||||
"name": "Activepieces",
|
||||
"description": "Visuele workflow-automatisering als toegankelijk alternatief voor n8n. Deze lichte één-containeropzet gebruikt PGLite en een geheugenqueue en is bedoeld voor persoonlijk gebruik op één server.",
|
||||
"tags": ["automatisering", "workflows", "integraties", "no-code"],
|
||||
"icon": {"provider": "selfhst", "id": "activepieces"},
|
||||
"version": {"name": "latest"},
|
||||
"categories": ["productiviteit", "ontwikkeling"],
|
||||
"architectures": ["amd64", "arm64"],
|
||||
"architecture_note": "De officiële Activepieces-image ondersteunt AMD64 en ARM64."
|
||||
},
|
||||
"variables": [
|
||||
{
|
||||
"title": "Algemeen",
|
||||
"items": [
|
||||
{"name": "service_name", "type": "str", "title": "Servicenaam", "default": "activepieces", "required": true},
|
||||
{"name": "port", "type": "int", "title": "Webinterface", "default": 14003, "required": true},
|
||||
{"name": "appdata_dir", "type": "str", "title": "Appdata-map", "default": "/opt/serverup/appdata", "required": true},
|
||||
{"name": "frontend_url", "type": "str", "title": "Publiek adres", "default": "http://localhost:14003", "required": true, "description": "Gebruik voor webhooks het HTTPS-adres van je reverse proxy."}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
@ -5,5 +5,5 @@ services:
|
|||
ports:
|
||||
- "<< port >>:5006"
|
||||
volumes:
|
||||
- << appdata_dir >>/<< service_name >>/data:/data
|
||||
- << data_dir >>/<< service_name >>/data:/data
|
||||
restart: unless-stopped
|
||||
|
|
|
|||
|
|
@ -3,22 +3,9 @@
|
|||
"metadata": {
|
||||
"name": "Actual Budget",
|
||||
"description": "Lokaal persoonlijk financieel beheer en budgettering zonder cloudafhankelijkheid.",
|
||||
"tags": [
|
||||
"financiën",
|
||||
"budget",
|
||||
"persoonlijk",
|
||||
"privacy"
|
||||
],
|
||||
"icon": {
|
||||
"provider": "selfhst",
|
||||
"id": "actual-budget"
|
||||
},
|
||||
"version": {
|
||||
"name": "latest"
|
||||
},
|
||||
"categories": [
|
||||
"financien"
|
||||
]
|
||||
"tags": ["financiën", "budget", "persoonlijk", "privacy"],
|
||||
"icon": {"provider": "selfhst", "id": "actual-budget"},
|
||||
"version": {"name": "latest"}
|
||||
},
|
||||
"variables": [
|
||||
{
|
||||
|
|
@ -39,9 +26,9 @@
|
|||
"required": true
|
||||
},
|
||||
{
|
||||
"name": "appdata_dir",
|
||||
"name": "data_dir",
|
||||
"type": "str",
|
||||
"title": "Appdata-map",
|
||||
"title": "Data directory",
|
||||
"default": "/opt/serverup/appdata",
|
||||
"required": true
|
||||
}
|
||||
|
|
|
|||
|
|
@ -7,6 +7,6 @@ services:
|
|||
- "<< port_dns >>:53/tcp"
|
||||
- "<< port_dns >>:53/udp"
|
||||
volumes:
|
||||
- << appdata_dir >>/<< service_name >>/work:/opt/adguardhome/work
|
||||
- << appdata_dir >>/<< service_name >>/conf:/opt/adguardhome/conf
|
||||
- << data_dir >>/<< service_name >>/work:/opt/adguardhome/work
|
||||
- << data_dir >>/<< service_name >>/conf:/opt/adguardhome/conf
|
||||
restart: unless-stopped
|
||||
|
|
|
|||
|
|
@ -3,23 +3,9 @@
|
|||
"metadata": {
|
||||
"name": "AdGuard Home",
|
||||
"description": "DNS-level advertentie- en trackerblokkering voor het hele netwerk",
|
||||
"tags": [
|
||||
"dns",
|
||||
"adblock",
|
||||
"netwerk",
|
||||
"privacy"
|
||||
],
|
||||
"icon": {
|
||||
"provider": "selfhst",
|
||||
"id": "adguard-home"
|
||||
},
|
||||
"version": {
|
||||
"name": "latest"
|
||||
},
|
||||
"categories": [
|
||||
"netwerk",
|
||||
"beveiliging"
|
||||
]
|
||||
"tags": ["dns", "adblock", "netwerk", "privacy"],
|
||||
"icon": {"provider": "selfhst", "id": "adguard-home"},
|
||||
"version": {"name": "latest"}
|
||||
},
|
||||
"variables": [
|
||||
{
|
||||
|
|
@ -33,9 +19,9 @@
|
|||
"required": true
|
||||
},
|
||||
{
|
||||
"name": "appdata_dir",
|
||||
"name": "data_dir",
|
||||
"type": "str",
|
||||
"title": "Appdata-map",
|
||||
"title": "Data directory",
|
||||
"default": "/opt/serverup/appdata",
|
||||
"required": true
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,9 +0,0 @@
|
|||
services:
|
||||
<< service_name >>:
|
||||
image: adminer:latest
|
||||
container_name: << service_name >>
|
||||
environment:
|
||||
- TZ=<< timezone >>
|
||||
ports:
|
||||
- "<< port >>:8080"
|
||||
restart: unless-stopped
|
||||
|
|
@ -1,51 +0,0 @@
|
|||
{
|
||||
"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
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
@ -1,13 +0,0 @@
|
|||
# Startconfiguratie. Zonder dit bestand weigert Alertmanager te starten.
|
||||
route:
|
||||
receiver: standaard
|
||||
group_by: [alertname]
|
||||
group_wait: 30s
|
||||
repeat_interval: 4h
|
||||
|
||||
receivers:
|
||||
- name: standaard
|
||||
<%- if webhook_url %>
|
||||
webhook_configs:
|
||||
- url: "<< webhook_url >>"
|
||||
<%- endif %>
|
||||
|
|
@ -1,13 +0,0 @@
|
|||
services:
|
||||
<< service_name >>:
|
||||
image: quay.io/prometheus/alertmanager:latest
|
||||
container_name: << service_name >>
|
||||
environment:
|
||||
- TZ=<< timezone >>
|
||||
volumes:
|
||||
- << appdata_dir >>/<< service_name >>:/etc/alertmanager
|
||||
- ./alertmanager.yml:/etc/alertmanager/alertmanager.yml:ro
|
||||
command: --config.file=/etc/alertmanager/alertmanager.yml --storage.path=/alertmanager
|
||||
ports:
|
||||
- "<< port >>:9093"
|
||||
restart: unless-stopped
|
||||
|
|
@ -1,83 +0,0 @@
|
|||
{
|
||||
"kind": "compose",
|
||||
"metadata": {
|
||||
"name": "Alertmanager",
|
||||
"description": "Neemt de alarmen van Prometheus aan, bundelt ze en stuurt ze door naar e-mail, ntfy of Discord. Onderdrukt herhalingen.",
|
||||
"tags": [
|
||||
"monitoring",
|
||||
"meldingen",
|
||||
"prometheus"
|
||||
],
|
||||
"icon": {
|
||||
"provider": "selfhst",
|
||||
"id": "prometheus"
|
||||
},
|
||||
"version": {
|
||||
"name": "latest"
|
||||
},
|
||||
"categories": [
|
||||
"monitoring",
|
||||
"communicatie"
|
||||
],
|
||||
"depends_on": [
|
||||
{
|
||||
"app": "prometheus",
|
||||
"reason": "Alertmanager verwerkt de alarmen die Prometheus opwerpt; los draaiend krijgt hij er nooit een."
|
||||
}
|
||||
]
|
||||
},
|
||||
"variables": [
|
||||
{
|
||||
"title": "Algemeen",
|
||||
"items": [
|
||||
{
|
||||
"name": "service_name",
|
||||
"type": "str",
|
||||
"title": "Servicenaam",
|
||||
"default": "alertmanager",
|
||||
"required": true
|
||||
},
|
||||
{
|
||||
"name": "port",
|
||||
"type": "int",
|
||||
"title": "Webinterface",
|
||||
"default": 9093,
|
||||
"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": "webhook_url",
|
||||
"type": "str",
|
||||
"title": "Webhook",
|
||||
"default": "",
|
||||
"required": false,
|
||||
"connect": {
|
||||
"app": "ntfy",
|
||||
"scheme": "http",
|
||||
"port": 80
|
||||
},
|
||||
"help": "Waar de alarmen naartoe gaan. Wijs dit naar ntfy of Gotify, of laat het leeg en stel het later in het bestand in."
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
@ -1,14 +0,0 @@
|
|||
services:
|
||||
<< service_name >>:
|
||||
image: grafana/alloy:latest
|
||||
container_name: << service_name >>
|
||||
environment:
|
||||
- TZ=<< timezone >>
|
||||
volumes:
|
||||
- << appdata_dir >>/<< service_name >>:/var/lib/alloy/data
|
||||
- ./config.alloy:/etc/alloy/config.alloy:ro
|
||||
- /var/run/docker.sock:/var/run/docker.sock:ro
|
||||
command: run --server.http.listen-addr=0.0.0.0:12345 --storage.path=/var/lib/alloy/data /etc/alloy/config.alloy
|
||||
ports:
|
||||
- "<< port >>:12345"
|
||||
restart: unless-stopped
|
||||
|
|
@ -1,16 +0,0 @@
|
|||
// Leest de logs van elke draaiende container en stuurt ze naar Loki.
|
||||
discovery.docker "containers" {
|
||||
host = "unix:///var/run/docker.sock"
|
||||
}
|
||||
|
||||
loki.source.docker "containers" {
|
||||
host = "unix:///var/run/docker.sock"
|
||||
targets = discovery.docker.containers.targets
|
||||
forward_to = [loki.write.opslag.receiver]
|
||||
}
|
||||
|
||||
loki.write "opslag" {
|
||||
endpoint {
|
||||
url = "<< loki_url >>/loki/api/v1/push"
|
||||
}
|
||||
}
|
||||
|
|
@ -1,82 +0,0 @@
|
|||
{
|
||||
"kind": "compose",
|
||||
"metadata": {
|
||||
"name": "Grafana Alloy",
|
||||
"description": "Verzamelt de logs van je containers en stuurt ze naar Loki. De opvolger van Promtail.",
|
||||
"tags": [
|
||||
"logs",
|
||||
"monitoring",
|
||||
"grafana"
|
||||
],
|
||||
"icon": {
|
||||
"provider": "selfhst",
|
||||
"id": "grafana"
|
||||
},
|
||||
"version": {
|
||||
"name": "latest"
|
||||
},
|
||||
"categories": [
|
||||
"monitoring"
|
||||
],
|
||||
"depends_on": [
|
||||
{
|
||||
"app": "loki",
|
||||
"reason": "Alloy verzamelt logs en stuurt ze door. Zonder Loki om ze te bewaren gaan ze meteen weer verloren."
|
||||
}
|
||||
]
|
||||
},
|
||||
"variables": [
|
||||
{
|
||||
"title": "Algemeen",
|
||||
"items": [
|
||||
{
|
||||
"name": "service_name",
|
||||
"type": "str",
|
||||
"title": "Servicenaam",
|
||||
"default": "alloy",
|
||||
"required": true
|
||||
},
|
||||
{
|
||||
"name": "port",
|
||||
"type": "int",
|
||||
"title": "Webinterface",
|
||||
"default": 12345,
|
||||
"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": "loki_url",
|
||||
"type": "str",
|
||||
"title": "Adres van Loki",
|
||||
"default": "http://loki:3100",
|
||||
"required": true,
|
||||
"connect": {
|
||||
"app": "loki",
|
||||
"scheme": "http",
|
||||
"port": 3100
|
||||
},
|
||||
"help": "Waar Alloy de logs naartoe stuurt. Draaien ze op hetzelfde gedeelde netwerk, dan is de containernaam genoeg."
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
@ -1,14 +0,0 @@
|
|||
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
|
||||
|
|
@ -1,61 +0,0 @@
|
|||
{
|
||||
"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
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
@ -1,14 +0,0 @@
|
|||
services:
|
||||
<< service_name >>:
|
||||
image: acockburn/appdaemon:latest
|
||||
container_name: << service_name >>
|
||||
environment:
|
||||
- TZ=<< timezone >>
|
||||
- HA_URL=<< ha_url >>
|
||||
- TOKEN=<< ha_token >>
|
||||
- DASH_URL=<< dash_url >>
|
||||
volumes:
|
||||
- << appdata_dir >>/<< service_name >>:/conf
|
||||
ports:
|
||||
- "<< port >>:5050"
|
||||
restart: unless-stopped
|
||||
|
|
@ -1,106 +0,0 @@
|
|||
{
|
||||
"kind": "compose",
|
||||
"metadata": {
|
||||
"name": "AppDaemon",
|
||||
"description": "Automatiseringen voor Home Assistant in Python in plaats van YAML. Voor logica die met de ingebouwde automatiseringen onhandig wordt.",
|
||||
"tags": [
|
||||
"domotica",
|
||||
"automatisering",
|
||||
"python"
|
||||
],
|
||||
"icon": {
|
||||
"provider": "selfhst",
|
||||
"id": "appdaemon"
|
||||
},
|
||||
"version": {
|
||||
"name": "latest"
|
||||
},
|
||||
"categories": [
|
||||
"domotica",
|
||||
"ontwikkeling"
|
||||
],
|
||||
"depends_on": [
|
||||
{
|
||||
"app": "home-assistant",
|
||||
"reason": "Dit is een dienst die Home Assistant aanroept; los draaiend doet hij niets."
|
||||
}
|
||||
]
|
||||
},
|
||||
"variables": [
|
||||
{
|
||||
"title": "Algemeen",
|
||||
"items": [
|
||||
{
|
||||
"name": "service_name",
|
||||
"type": "str",
|
||||
"title": "Servicenaam",
|
||||
"default": "appdaemon",
|
||||
"required": true
|
||||
},
|
||||
{
|
||||
"name": "port",
|
||||
"type": "int",
|
||||
"title": "Webinterface",
|
||||
"default": 5050,
|
||||
"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": "ha_url",
|
||||
"type": "str",
|
||||
"title": "Adres van Home Assistant",
|
||||
"default": "http://homeassistant:8123",
|
||||
"required": true,
|
||||
"connect": {
|
||||
"app": "home-assistant",
|
||||
"scheme": "http",
|
||||
"port": 8123
|
||||
},
|
||||
"help": "Waar AppDaemon Home Assistant bereikt."
|
||||
},
|
||||
{
|
||||
"name": "dash_url",
|
||||
"type": "str",
|
||||
"title": "Eigen adres",
|
||||
"default": "http://localhost:5050",
|
||||
"required": true,
|
||||
"description": "Waar het dashboard van AppDaemon zelf op staat"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Toegang",
|
||||
"items": [
|
||||
{
|
||||
"name": "ha_token",
|
||||
"type": "str",
|
||||
"title": "Toegangstoken van Home Assistant",
|
||||
"default": "",
|
||||
"required": true,
|
||||
"secret": true,
|
||||
"eigen_invoer": true,
|
||||
"description": "Maak er een aan onder je profiel in Home Assistant"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
@ -1,13 +0,0 @@
|
|||
services:
|
||||
<< service_name >>:
|
||||
image: caronc/apprise:latest
|
||||
container_name: << service_name >>
|
||||
environment:
|
||||
- TZ=<< timezone >>
|
||||
- APPRISE_STATEFUL_MODE=simple
|
||||
- APPRISE_WORKER_COUNT=1
|
||||
volumes:
|
||||
- << appdata_dir >>/<< service_name >>:/config
|
||||
ports:
|
||||
- "<< port >>:8000"
|
||||
restart: unless-stopped
|
||||
|
|
@ -1,59 +0,0 @@
|
|||
{
|
||||
"kind": "compose",
|
||||
"metadata": {
|
||||
"name": "Apprise",
|
||||
"description": "Eén API die je bericht doorstuurt naar honderd diensten: Discord, Telegram, ntfy, e-mail, Signal. Je apps hoeven maar één adres te kennen.",
|
||||
"tags": [
|
||||
"meldingen",
|
||||
"api",
|
||||
"notificaties"
|
||||
],
|
||||
"icon": {
|
||||
"provider": "selfhst",
|
||||
"id": "apprise"
|
||||
},
|
||||
"version": {
|
||||
"name": "latest"
|
||||
},
|
||||
"categories": [
|
||||
"communicatie"
|
||||
]
|
||||
},
|
||||
"variables": [
|
||||
{
|
||||
"title": "Algemeen",
|
||||
"items": [
|
||||
{
|
||||
"name": "service_name",
|
||||
"type": "str",
|
||||
"title": "Servicenaam",
|
||||
"default": "apprise",
|
||||
"required": true
|
||||
},
|
||||
{
|
||||
"name": "port",
|
||||
"type": "int",
|
||||
"title": "Webinterface",
|
||||
"default": 8251,
|
||||
"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
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
@ -1,845 +0,0 @@
|
|||
# ARR-stack — kies per onderdeel of je het wilt.
|
||||
#
|
||||
# Alles deelt één map, gekoppeld als /data. Dat is geen smaakkwestie:
|
||||
# staan je downloads en je bibliotheek op verschillende mounts, dan kan
|
||||
# Sonarr geen hardlink maken en kopieert elke voltooide download naar je
|
||||
# bibliotheek. Traag, en je hebt alles tijdelijk dubbel op de schijf.
|
||||
#
|
||||
# /data/media/{films,series,muziek,boeken} je bibliotheek
|
||||
# /data/torrents/ torrents (blijven seeden)
|
||||
# /data/usenet/ usenet-downloads
|
||||
#
|
||||
# Draai je met Gluetun, dan zitten de downloadclients in het netwerk van
|
||||
# die container en bereik je hun webinterface via de Gluetun-poorten.
|
||||
services:
|
||||
|
||||
<%- if enable_kapowarr %>
|
||||
<< service_name >>-kapowarr:
|
||||
image: mrcas/kapowarr:latest
|
||||
container_name: << service_name >>-kapowarr
|
||||
environment:
|
||||
- TZ=<< timezone >>
|
||||
volumes:
|
||||
- << appdata_dir >>/<< service_name >>/kapowarr:/app/db
|
||||
- << data_root >>:/data
|
||||
ports:
|
||||
- "<< port_kapowarr >>:5656"
|
||||
restart: unless-stopped
|
||||
<%- endif %>
|
||||
|
||||
<%- if enable_lidarr %>
|
||||
<< service_name >>-lidarr:
|
||||
image: lscr.io/linuxserver/lidarr:latest
|
||||
container_name: << service_name >>-lidarr
|
||||
environment:
|
||||
- PUID=<< puid >>
|
||||
- PGID=<< pgid >>
|
||||
- TZ=<< timezone >>
|
||||
- UMASK=002
|
||||
volumes:
|
||||
- << appdata_dir >>/<< service_name >>/lidarr:/config
|
||||
- << data_root >>:/data
|
||||
ports:
|
||||
- "<< port_lidarr >>:8686"
|
||||
restart: unless-stopped
|
||||
<%- endif %>
|
||||
|
||||
<%- if enable_mylar3 %>
|
||||
<< service_name >>-mylar3:
|
||||
image: lscr.io/linuxserver/mylar3:latest
|
||||
container_name: << service_name >>-mylar3
|
||||
environment:
|
||||
- PUID=<< puid >>
|
||||
- PGID=<< pgid >>
|
||||
- TZ=<< timezone >>
|
||||
- UMASK=002
|
||||
volumes:
|
||||
- << appdata_dir >>/<< service_name >>/mylar3:/config
|
||||
- << data_root >>:/data
|
||||
ports:
|
||||
- "<< port_mylar3 >>:8090"
|
||||
restart: unless-stopped
|
||||
<%- endif %>
|
||||
|
||||
<%- if enable_radarr %>
|
||||
<< service_name >>-radarr:
|
||||
image: lscr.io/linuxserver/radarr:latest
|
||||
container_name: << service_name >>-radarr
|
||||
environment:
|
||||
- PUID=<< puid >>
|
||||
- PGID=<< pgid >>
|
||||
- TZ=<< timezone >>
|
||||
- UMASK=002
|
||||
volumes:
|
||||
- << appdata_dir >>/<< service_name >>/radarr:/config
|
||||
- << data_root >>:/data
|
||||
ports:
|
||||
- "<< port_radarr >>:7878"
|
||||
restart: unless-stopped
|
||||
<%- endif %>
|
||||
|
||||
<%- if enable_readarr %>
|
||||
<< service_name >>-readarr:
|
||||
image: lscr.io/linuxserver/readarr:develop
|
||||
container_name: << service_name >>-readarr
|
||||
environment:
|
||||
- PUID=<< puid >>
|
||||
- PGID=<< pgid >>
|
||||
- TZ=<< timezone >>
|
||||
- UMASK=002
|
||||
volumes:
|
||||
- << appdata_dir >>/<< service_name >>/readarr:/config
|
||||
- << data_root >>:/data
|
||||
ports:
|
||||
- "<< port_readarr >>:8787"
|
||||
restart: unless-stopped
|
||||
<%- endif %>
|
||||
|
||||
<%- if enable_sonarr %>
|
||||
<< service_name >>-sonarr:
|
||||
image: lscr.io/linuxserver/sonarr:latest
|
||||
container_name: << service_name >>-sonarr
|
||||
environment:
|
||||
- PUID=<< puid >>
|
||||
- PGID=<< pgid >>
|
||||
- TZ=<< timezone >>
|
||||
- UMASK=002
|
||||
volumes:
|
||||
- << appdata_dir >>/<< service_name >>/sonarr:/config
|
||||
- << data_root >>:/data
|
||||
ports:
|
||||
- "<< port_sonarr >>:8989"
|
||||
restart: unless-stopped
|
||||
<%- endif %>
|
||||
|
||||
<%- if enable_whisparr %>
|
||||
<< service_name >>-whisparr:
|
||||
image: ghcr.io/hotio/whisparr:latest
|
||||
container_name: << service_name >>-whisparr
|
||||
environment:
|
||||
- PUID=<< puid >>
|
||||
- PGID=<< pgid >>
|
||||
- TZ=<< timezone >>
|
||||
- UMASK=002
|
||||
volumes:
|
||||
- << appdata_dir >>/<< service_name >>/whisparr:/config
|
||||
- << data_root >>:/data
|
||||
ports:
|
||||
- "<< port_whisparr >>:6969"
|
||||
restart: unless-stopped
|
||||
<%- endif %>
|
||||
|
||||
<%- if enable_byparr %>
|
||||
<< service_name >>-byparr:
|
||||
image: ghcr.io/thephaseless/byparr:latest
|
||||
container_name: << service_name >>-byparr
|
||||
environment:
|
||||
- TZ=<< timezone >>
|
||||
volumes:
|
||||
- << appdata_dir >>/<< service_name >>/byparr:/config
|
||||
ports:
|
||||
- "<< port_byparr >>:8191"
|
||||
restart: unless-stopped
|
||||
<%- endif %>
|
||||
|
||||
<%- if enable_flaresolverr %>
|
||||
<< service_name >>-flaresolverr:
|
||||
image: ghcr.io/flaresolverr/flaresolverr:latest
|
||||
container_name: << service_name >>-flaresolverr
|
||||
environment:
|
||||
- TZ=<< timezone >>
|
||||
- LOG_LEVEL=info
|
||||
volumes:
|
||||
- << appdata_dir >>/<< service_name >>/flaresolverr:/config
|
||||
ports:
|
||||
- "<< port_flaresolverr >>:8191"
|
||||
restart: unless-stopped
|
||||
<%- endif %>
|
||||
|
||||
<%- if enable_jackett %>
|
||||
<< service_name >>-jackett:
|
||||
image: lscr.io/linuxserver/jackett:latest
|
||||
container_name: << service_name >>-jackett
|
||||
environment:
|
||||
- PUID=<< puid >>
|
||||
- PGID=<< pgid >>
|
||||
- TZ=<< timezone >>
|
||||
- UMASK=002
|
||||
volumes:
|
||||
- << appdata_dir >>/<< service_name >>/jackett:/config
|
||||
ports:
|
||||
- "<< port_jackett >>:9117"
|
||||
restart: unless-stopped
|
||||
<%- endif %>
|
||||
|
||||
<%- if enable_nzbhydra2 %>
|
||||
<< service_name >>-nzbhydra2:
|
||||
image: lscr.io/linuxserver/nzbhydra2:latest
|
||||
container_name: << service_name >>-nzbhydra2
|
||||
environment:
|
||||
- PUID=<< puid >>
|
||||
- PGID=<< pgid >>
|
||||
- TZ=<< timezone >>
|
||||
- UMASK=002
|
||||
volumes:
|
||||
- << appdata_dir >>/<< service_name >>/nzbhydra2:/config
|
||||
ports:
|
||||
- "<< port_nzbhydra2 >>:5076"
|
||||
restart: unless-stopped
|
||||
<%- endif %>
|
||||
|
||||
<%- if enable_prowlarr %>
|
||||
<< service_name >>-prowlarr:
|
||||
image: lscr.io/linuxserver/prowlarr:latest
|
||||
container_name: << service_name >>-prowlarr
|
||||
environment:
|
||||
- PUID=<< puid >>
|
||||
- PGID=<< pgid >>
|
||||
- TZ=<< timezone >>
|
||||
- UMASK=002
|
||||
volumes:
|
||||
- << appdata_dir >>/<< service_name >>/prowlarr:/config
|
||||
ports:
|
||||
- "<< port_prowlarr >>:9696"
|
||||
restart: unless-stopped
|
||||
<%- endif %>
|
||||
|
||||
<%- if enable_deluge %>
|
||||
<< service_name >>-deluge:
|
||||
image: lscr.io/linuxserver/deluge:latest
|
||||
container_name: << service_name >>-deluge
|
||||
environment:
|
||||
- PUID=<< puid >>
|
||||
- PGID=<< pgid >>
|
||||
- TZ=<< timezone >>
|
||||
- UMASK=002
|
||||
volumes:
|
||||
- << appdata_dir >>/<< service_name >>/deluge:/config
|
||||
- << data_root >>:/data
|
||||
<%- if enable_gluetun %>
|
||||
network_mode: "service:<< service_name >>-gluetun"
|
||||
depends_on:
|
||||
- << service_name >>-gluetun
|
||||
<%- endif %>
|
||||
<%- if not enable_gluetun %>
|
||||
ports:
|
||||
- "<< port_deluge >>:8112"
|
||||
- "<< port_deluge_torrent >>:6881"
|
||||
- "<< port_deluge_torrent >>:6881/udp"
|
||||
<%- endif %>
|
||||
restart: unless-stopped
|
||||
<%- endif %>
|
||||
|
||||
<%- if enable_nzbget %>
|
||||
<< service_name >>-nzbget:
|
||||
image: lscr.io/linuxserver/nzbget:latest
|
||||
container_name: << service_name >>-nzbget
|
||||
environment:
|
||||
- PUID=<< puid >>
|
||||
- PGID=<< pgid >>
|
||||
- TZ=<< timezone >>
|
||||
- UMASK=002
|
||||
volumes:
|
||||
- << appdata_dir >>/<< service_name >>/nzbget:/config
|
||||
- << data_root >>:/data
|
||||
<%- if enable_gluetun %>
|
||||
network_mode: "service:<< service_name >>-gluetun"
|
||||
depends_on:
|
||||
- << service_name >>-gluetun
|
||||
<%- endif %>
|
||||
<%- if not enable_gluetun %>
|
||||
ports:
|
||||
- "<< port_nzbget >>:6789"
|
||||
<%- endif %>
|
||||
restart: unless-stopped
|
||||
<%- endif %>
|
||||
|
||||
<%- if enable_qbittorrent %>
|
||||
<< service_name >>-qbittorrent:
|
||||
image: lscr.io/linuxserver/qbittorrent:latest
|
||||
container_name: << service_name >>-qbittorrent
|
||||
environment:
|
||||
- PUID=<< puid >>
|
||||
- PGID=<< pgid >>
|
||||
- TZ=<< timezone >>
|
||||
- UMASK=002
|
||||
- WEBUI_PORT=8090
|
||||
volumes:
|
||||
- << appdata_dir >>/<< service_name >>/qbittorrent:/config
|
||||
- << data_root >>:/data
|
||||
<%- if enable_gluetun %>
|
||||
network_mode: "service:<< service_name >>-gluetun"
|
||||
depends_on:
|
||||
- << service_name >>-gluetun
|
||||
<%- endif %>
|
||||
<%- if not enable_gluetun %>
|
||||
ports:
|
||||
- "<< port_qbittorrent >>:8090"
|
||||
- "<< port_qbittorrent_torrent >>:6881"
|
||||
- "<< port_qbittorrent_torrent >>:6881/udp"
|
||||
<%- endif %>
|
||||
restart: unless-stopped
|
||||
<%- endif %>
|
||||
|
||||
<%- if enable_sabnzbd %>
|
||||
<< service_name >>-sabnzbd:
|
||||
image: lscr.io/linuxserver/sabnzbd:latest
|
||||
container_name: << service_name >>-sabnzbd
|
||||
environment:
|
||||
- PUID=<< puid >>
|
||||
- PGID=<< pgid >>
|
||||
- TZ=<< timezone >>
|
||||
- UMASK=002
|
||||
volumes:
|
||||
- << appdata_dir >>/<< service_name >>/sabnzbd:/config
|
||||
- << data_root >>:/data
|
||||
<%- if enable_gluetun %>
|
||||
network_mode: "service:<< service_name >>-gluetun"
|
||||
depends_on:
|
||||
- << service_name >>-gluetun
|
||||
<%- endif %>
|
||||
<%- if not enable_gluetun %>
|
||||
ports:
|
||||
- "<< port_sabnzbd >>:8080"
|
||||
<%- endif %>
|
||||
restart: unless-stopped
|
||||
<%- endif %>
|
||||
|
||||
<%- if enable_slskd %>
|
||||
<< service_name >>-slskd:
|
||||
image: slskd/slskd:latest
|
||||
container_name: << service_name >>-slskd
|
||||
environment:
|
||||
- TZ=<< timezone >>
|
||||
- SLSKD_REMOTE_CONFIGURATION=true
|
||||
volumes:
|
||||
- << appdata_dir >>/<< service_name >>/slskd:/app
|
||||
- << data_root >>:/data
|
||||
<%- if enable_gluetun %>
|
||||
network_mode: "service:<< service_name >>-gluetun"
|
||||
depends_on:
|
||||
- << service_name >>-gluetun
|
||||
<%- endif %>
|
||||
<%- if not enable_gluetun %>
|
||||
ports:
|
||||
- "<< port_slskd >>:5030"
|
||||
- "<< port_slskd_listen >>:50300"
|
||||
<%- endif %>
|
||||
restart: unless-stopped
|
||||
<%- endif %>
|
||||
|
||||
<%- if enable_transmission %>
|
||||
<< service_name >>-transmission:
|
||||
image: lscr.io/linuxserver/transmission:latest
|
||||
container_name: << service_name >>-transmission
|
||||
environment:
|
||||
- PUID=<< puid >>
|
||||
- PGID=<< pgid >>
|
||||
- TZ=<< timezone >>
|
||||
- UMASK=002
|
||||
volumes:
|
||||
- << appdata_dir >>/<< service_name >>/transmission:/config
|
||||
- << data_root >>:/data
|
||||
<%- if enable_gluetun %>
|
||||
network_mode: "service:<< service_name >>-gluetun"
|
||||
depends_on:
|
||||
- << service_name >>-gluetun
|
||||
<%- endif %>
|
||||
<%- if not enable_gluetun %>
|
||||
ports:
|
||||
- "<< port_transmission >>:9091"
|
||||
- "<< port_transmission_torrent >>:51413"
|
||||
- "<< port_transmission_torrent >>:51413/udp"
|
||||
<%- endif %>
|
||||
restart: unless-stopped
|
||||
<%- endif %>
|
||||
|
||||
<%- if enable_bazarr %>
|
||||
<< service_name >>-bazarr:
|
||||
image: lscr.io/linuxserver/bazarr:latest
|
||||
container_name: << service_name >>-bazarr
|
||||
environment:
|
||||
- PUID=<< puid >>
|
||||
- PGID=<< pgid >>
|
||||
- TZ=<< timezone >>
|
||||
- UMASK=002
|
||||
volumes:
|
||||
- << appdata_dir >>/<< service_name >>/bazarr:/config
|
||||
- << data_root >>:/data
|
||||
ports:
|
||||
- "<< port_bazarr >>:6767"
|
||||
restart: unless-stopped
|
||||
<%- endif %>
|
||||
|
||||
<%- if enable_lingarr %>
|
||||
<< service_name >>-lingarr:
|
||||
image: lingarr/lingarr:latest
|
||||
container_name: << service_name >>-lingarr
|
||||
environment:
|
||||
- TZ=<< timezone >>
|
||||
volumes:
|
||||
- << appdata_dir >>/<< service_name >>/lingarr:/app/config
|
||||
- << data_root >>:/data
|
||||
ports:
|
||||
- "<< port_lingarr >>:9876"
|
||||
restart: unless-stopped
|
||||
<%- endif %>
|
||||
|
||||
<%- if enable_tdarr %>
|
||||
<< service_name >>-tdarr:
|
||||
image: ghcr.io/haveagitgat/tdarr:latest
|
||||
container_name: << service_name >>-tdarr
|
||||
environment:
|
||||
- PUID=<< puid >>
|
||||
- PGID=<< pgid >>
|
||||
- TZ=<< timezone >>
|
||||
- UMASK=002
|
||||
- serverIP=0.0.0.0
|
||||
- serverPort=8266
|
||||
- webUIPort=8265
|
||||
- internalNode=true
|
||||
volumes:
|
||||
- << appdata_dir >>/<< service_name >>/tdarr:/app/server
|
||||
- << data_root >>:/data
|
||||
- << appdata_dir >>/<< service_name >>/tdarr-configs:/app/configs
|
||||
ports:
|
||||
- "<< port_tdarr >>:8265"
|
||||
- "<< port_tdarr_server >>:8266"
|
||||
restart: unless-stopped
|
||||
<%- endif %>
|
||||
|
||||
<%- if enable_unpackerr %>
|
||||
<< service_name >>-unpackerr:
|
||||
image: ghcr.io/unpackerr/unpackerr:latest
|
||||
container_name: << service_name >>-unpackerr
|
||||
environment:
|
||||
- PUID=<< puid >>
|
||||
- PGID=<< pgid >>
|
||||
- TZ=<< timezone >>
|
||||
- UN_SONARR_0_URL=<< sonarr_url >>
|
||||
- UN_SONARR_0_API_KEY=<< sonarr_apikey >>
|
||||
- UN_RADARR_0_URL=<< radarr_url >>
|
||||
- UN_RADARR_0_API_KEY=<< radarr_apikey >>
|
||||
volumes:
|
||||
- << appdata_dir >>/<< service_name >>/unpackerr:/config
|
||||
- << data_root >>:/data
|
||||
restart: unless-stopped
|
||||
<%- endif %>
|
||||
|
||||
<%- if enable_jellyseerr %>
|
||||
<< service_name >>-jellyseerr:
|
||||
image: fallenbagel/jellyseerr:latest
|
||||
container_name: << service_name >>-jellyseerr
|
||||
environment:
|
||||
- TZ=<< timezone >>
|
||||
- LOG_LEVEL=info
|
||||
volumes:
|
||||
- << appdata_dir >>/<< service_name >>/jellyseerr:/app/config
|
||||
ports:
|
||||
- "<< port_jellyseerr >>:5055"
|
||||
restart: unless-stopped
|
||||
<%- endif %>
|
||||
|
||||
<%- if enable_overseerr %>
|
||||
<< service_name >>-overseerr:
|
||||
image: sctx/overseerr:latest
|
||||
container_name: << service_name >>-overseerr
|
||||
environment:
|
||||
- TZ=<< timezone >>
|
||||
- LOG_LEVEL=info
|
||||
volumes:
|
||||
- << appdata_dir >>/<< service_name >>/overseerr:/app/config
|
||||
ports:
|
||||
- "<< port_overseerr >>:5055"
|
||||
restart: unless-stopped
|
||||
<%- endif %>
|
||||
|
||||
<%- if enable_prefetcharr %>
|
||||
<< service_name >>-prefetcharr:
|
||||
image: phueber/prefetcharr:latest
|
||||
container_name: << service_name >>-prefetcharr
|
||||
environment:
|
||||
- TZ=<< timezone >>
|
||||
volumes:
|
||||
- << appdata_dir >>/<< service_name >>/prefetcharr:/config
|
||||
restart: unless-stopped
|
||||
<%- endif %>
|
||||
|
||||
<%- if enable_pulsarr %>
|
||||
<< service_name >>-pulsarr:
|
||||
image: lakker/pulsarr:latest
|
||||
container_name: << service_name >>-pulsarr
|
||||
environment:
|
||||
- TZ=<< timezone >>
|
||||
volumes:
|
||||
- << appdata_dir >>/<< service_name >>/pulsarr:/app/data
|
||||
ports:
|
||||
- "<< port_pulsarr >>:3003"
|
||||
restart: unless-stopped
|
||||
<%- endif %>
|
||||
|
||||
<%- if enable_requestrr %>
|
||||
<< service_name >>-requestrr:
|
||||
image: thomst08/requestrr:latest
|
||||
container_name: << service_name >>-requestrr
|
||||
environment:
|
||||
- TZ=<< timezone >>
|
||||
volumes:
|
||||
- << appdata_dir >>/<< service_name >>/requestrr:/root/config
|
||||
ports:
|
||||
- "<< port_requestrr >>:4545"
|
||||
restart: unless-stopped
|
||||
<%- endif %>
|
||||
|
||||
<%- if enable_suggestarr %>
|
||||
<< service_name >>-suggestarr:
|
||||
image: ciuse99/suggestarr:latest
|
||||
container_name: << service_name >>-suggestarr
|
||||
environment:
|
||||
- TZ=<< timezone >>
|
||||
volumes:
|
||||
- << appdata_dir >>/<< service_name >>/suggestarr:/app/config
|
||||
ports:
|
||||
- "<< port_suggestarr >>:5000"
|
||||
restart: unless-stopped
|
||||
<%- endif %>
|
||||
|
||||
<%- if enable_wizarr %>
|
||||
<< service_name >>-wizarr:
|
||||
image: ghcr.io/wizarrrr/wizarr:latest
|
||||
container_name: << service_name >>-wizarr
|
||||
environment:
|
||||
- TZ=<< timezone >>
|
||||
volumes:
|
||||
- << appdata_dir >>/<< service_name >>/wizarr:/data/database
|
||||
ports:
|
||||
- "<< port_wizarr >>:5690"
|
||||
restart: unless-stopped
|
||||
<%- endif %>
|
||||
|
||||
<%- if enable_cleanuparr %>
|
||||
<< service_name >>-cleanuparr:
|
||||
image: ghcr.io/cleanuparr/cleanuparr:latest
|
||||
container_name: << service_name >>-cleanuparr
|
||||
environment:
|
||||
- TZ=<< timezone >>
|
||||
volumes:
|
||||
- << appdata_dir >>/<< service_name >>/cleanuparr:/config
|
||||
- << data_root >>:/data
|
||||
ports:
|
||||
- "<< port_cleanuparr >>:11011"
|
||||
restart: unless-stopped
|
||||
<%- endif %>
|
||||
|
||||
<%- if enable_crossseed %>
|
||||
<< service_name >>-crossseed:
|
||||
image: ghcr.io/cross-seed/cross-seed:latest
|
||||
container_name: << service_name >>-crossseed
|
||||
environment:
|
||||
- TZ=<< timezone >>
|
||||
volumes:
|
||||
- << appdata_dir >>/<< service_name >>/crossseed:/config
|
||||
- << data_root >>:/data
|
||||
command: daemon
|
||||
ports:
|
||||
- "<< port_crossseed >>:2468"
|
||||
restart: unless-stopped
|
||||
<%- endif %>
|
||||
|
||||
<%- if enable_decluttarr %>
|
||||
<< service_name >>-decluttarr:
|
||||
image: ghcr.io/manimatter/decluttarr:latest
|
||||
container_name: << service_name >>-decluttarr
|
||||
environment:
|
||||
- TZ=<< timezone >>
|
||||
- SONARR_URL=<< sonarr_url >>
|
||||
- SONARR_KEY=<< sonarr_apikey >>
|
||||
- RADARR_URL=<< radarr_url >>
|
||||
- RADARR_KEY=<< radarr_apikey >>
|
||||
- LOG_LEVEL=INFO
|
||||
volumes:
|
||||
- << appdata_dir >>/<< service_name >>/decluttarr:/config
|
||||
restart: unless-stopped
|
||||
<%- endif %>
|
||||
|
||||
<%- if enable_janitorr %>
|
||||
<< service_name >>-janitorr:
|
||||
image: ghcr.io/schaka/janitorr:native-stable
|
||||
container_name: << service_name >>-janitorr
|
||||
environment:
|
||||
- TZ=<< timezone >>
|
||||
volumes:
|
||||
- << appdata_dir >>/<< service_name >>/janitorr:/config
|
||||
- << data_root >>:/data
|
||||
ports:
|
||||
- "<< port_janitorr >>:8978"
|
||||
restart: unless-stopped
|
||||
<%- endif %>
|
||||
|
||||
<%- if enable_maintainerr %>
|
||||
<< service_name >>-maintainerr:
|
||||
image: ghcr.io/maintainerr/maintainerr:latest
|
||||
container_name: << service_name >>-maintainerr
|
||||
environment:
|
||||
- PUID=<< puid >>
|
||||
- PGID=<< pgid >>
|
||||
- TZ=<< timezone >>
|
||||
volumes:
|
||||
- << appdata_dir >>/<< service_name >>/maintainerr:/opt/data
|
||||
ports:
|
||||
- "<< port_maintainerr >>:6246"
|
||||
restart: unless-stopped
|
||||
<%- endif %>
|
||||
|
||||
<%- if enable_neutarr %>
|
||||
<< service_name >>-neutarr:
|
||||
image: iampuid0/neutarr:latest
|
||||
container_name: << service_name >>-neutarr
|
||||
environment:
|
||||
- TZ=<< timezone >>
|
||||
volumes:
|
||||
- << appdata_dir >>/<< service_name >>/neutarr:/config
|
||||
ports:
|
||||
- "<< port_neutarr >>:9705"
|
||||
restart: unless-stopped
|
||||
<%- endif %>
|
||||
|
||||
<%- if enable_configarr %>
|
||||
<< service_name >>-configarr:
|
||||
image: ghcr.io/raydak-labs/configarr:latest
|
||||
container_name: << service_name >>-configarr
|
||||
environment:
|
||||
- TZ=<< timezone >>
|
||||
volumes:
|
||||
- << appdata_dir >>/<< service_name >>/configarr:/app/config
|
||||
restart: unless-stopped
|
||||
<%- endif %>
|
||||
|
||||
<%- if enable_profilarr %>
|
||||
<< service_name >>-profilarr:
|
||||
image: santiagosayshey/profilarr:latest
|
||||
container_name: << service_name >>-profilarr
|
||||
environment:
|
||||
- TZ=<< timezone >>
|
||||
volumes:
|
||||
- << appdata_dir >>/<< service_name >>/profilarr:/config
|
||||
ports:
|
||||
- "<< port_profilarr >>:6868"
|
||||
restart: unless-stopped
|
||||
<%- endif %>
|
||||
|
||||
<%- if enable_recyclarr %>
|
||||
<< service_name >>-recyclarr:
|
||||
image: ghcr.io/recyclarr/recyclarr:latest
|
||||
container_name: << service_name >>-recyclarr
|
||||
environment:
|
||||
- PUID=<< puid >>
|
||||
- PGID=<< pgid >>
|
||||
- TZ=<< timezone >>
|
||||
volumes:
|
||||
- << appdata_dir >>/<< service_name >>/recyclarr:/config
|
||||
restart: unless-stopped
|
||||
<%- endif %>
|
||||
|
||||
<%- if enable_kometa %>
|
||||
<< service_name >>-kometa:
|
||||
image: kometateam/kometa:latest
|
||||
container_name: << service_name >>-kometa
|
||||
environment:
|
||||
- TZ=<< timezone >>
|
||||
- KOMETA_RUN=false
|
||||
volumes:
|
||||
- << appdata_dir >>/<< service_name >>/kometa:/config
|
||||
- << data_root >>:/data
|
||||
restart: unless-stopped
|
||||
<%- endif %>
|
||||
|
||||
<%- if enable_posterizarr %>
|
||||
<< service_name >>-posterizarr:
|
||||
image: ghcr.io/fscorrupt/posterizarr:latest
|
||||
container_name: << service_name >>-posterizarr
|
||||
environment:
|
||||
- TZ=<< timezone >>
|
||||
- RUN_TIME=disabled
|
||||
volumes:
|
||||
- << appdata_dir >>/<< service_name >>/posterizarr:/config
|
||||
- << data_root >>:/data
|
||||
restart: unless-stopped
|
||||
<%- endif %>
|
||||
|
||||
<%- if enable_trailarr %>
|
||||
<< service_name >>-trailarr:
|
||||
image: nandyalu/trailarr:latest
|
||||
container_name: << service_name >>-trailarr
|
||||
environment:
|
||||
- PUID=<< puid >>
|
||||
- PGID=<< pgid >>
|
||||
- TZ=<< timezone >>
|
||||
- UMASK=002
|
||||
volumes:
|
||||
- << appdata_dir >>/<< service_name >>/trailarr:/config
|
||||
- << data_root >>:/data
|
||||
ports:
|
||||
- "<< port_trailarr >>:7889"
|
||||
restart: unless-stopped
|
||||
<%- endif %>
|
||||
|
||||
<%- if enable_autopulse %>
|
||||
<< service_name >>-autopulse:
|
||||
image: ghcr.io/dan-online/autopulse:latest
|
||||
container_name: << service_name >>-autopulse
|
||||
environment:
|
||||
- TZ=<< timezone >>
|
||||
volumes:
|
||||
- << appdata_dir >>/<< service_name >>/autopulse:/app/config
|
||||
ports:
|
||||
- "<< port_autopulse >>:2875"
|
||||
restart: unless-stopped
|
||||
<%- endif %>
|
||||
|
||||
<%- if enable_exportarr %>
|
||||
<< service_name >>-exportarr:
|
||||
image: ghcr.io/onedr0p/exportarr:latest
|
||||
container_name: << service_name >>-exportarr
|
||||
environment:
|
||||
- TZ=<< timezone >>
|
||||
- URL=<< arr_url >>
|
||||
- APIKEY=<< arr_apikey >>
|
||||
- PORT=<< port_exportarr >>
|
||||
volumes:
|
||||
- << appdata_dir >>/<< service_name >>/exportarr:/config
|
||||
command: << arr_soort >>
|
||||
ports:
|
||||
- "<< port_exportarr >>:9707"
|
||||
restart: unless-stopped
|
||||
<%- endif %>
|
||||
|
||||
<%- if enable_homarr %>
|
||||
<< service_name >>-homarr:
|
||||
image: ghcr.io/homarr-labs/homarr:latest
|
||||
container_name: << service_name >>-homarr
|
||||
environment:
|
||||
- TZ=<< timezone >>
|
||||
- SECRET_ENCRYPTION_KEY=<< homarr_encryption_key >>
|
||||
volumes:
|
||||
- << appdata_dir >>/<< service_name >>/homarr:/appdata
|
||||
ports:
|
||||
- "<< port_homarr >>:7575"
|
||||
restart: unless-stopped
|
||||
<%- endif %>
|
||||
|
||||
<%- if enable_jellystat %>
|
||||
<< service_name >>-jellystat:
|
||||
image: cyfershepard/jellystat:latest
|
||||
container_name: << service_name >>-jellystat
|
||||
environment:
|
||||
- TZ=<< timezone >>
|
||||
- POSTGRES_USER=jellystat
|
||||
- POSTGRES_PASSWORD=<< db_password >>
|
||||
- POSTGRES_IP=<< service_name >>-jellystat-db
|
||||
- POSTGRES_PORT=5432
|
||||
- JWT_SECRET=<< jwt_secret >>
|
||||
volumes:
|
||||
- << appdata_dir >>/<< service_name >>/jellystat:/app/backend/backup-data
|
||||
ports:
|
||||
- "<< port_jellystat >>:3000"
|
||||
depends_on:
|
||||
- << service_name >>-jellystat-db
|
||||
restart: unless-stopped
|
||||
<< service_name >>-jellystat-db:
|
||||
image: postgres:16-alpine
|
||||
container_name: << service_name >>-jellystat-db
|
||||
environment:
|
||||
- POSTGRES_USER=jellystat
|
||||
- POSTGRES_PASSWORD=<< db_password >>
|
||||
- POSTGRES_DB=jfstat
|
||||
volumes:
|
||||
- << appdata_dir >>/<< service_name >>-jellystat-db:/var/lib/postgresql/data
|
||||
restart: unless-stopped
|
||||
<%- endif %>
|
||||
|
||||
<%- if enable_notifiarr %>
|
||||
<< service_name >>-notifiarr:
|
||||
image: golift/notifiarr:latest
|
||||
container_name: << service_name >>-notifiarr
|
||||
environment:
|
||||
- TZ=<< timezone >>
|
||||
- DN_API_KEY=<< notifiarr_apikey >>
|
||||
volumes:
|
||||
- << appdata_dir >>/<< service_name >>/notifiarr:/config
|
||||
ports:
|
||||
- "<< port_notifiarr >>:5454"
|
||||
restart: unless-stopped
|
||||
<%- endif %>
|
||||
|
||||
<%- if enable_tautulli %>
|
||||
<< service_name >>-tautulli:
|
||||
image: lscr.io/linuxserver/tautulli:latest
|
||||
container_name: << service_name >>-tautulli
|
||||
environment:
|
||||
- PUID=<< puid >>
|
||||
- PGID=<< pgid >>
|
||||
- TZ=<< timezone >>
|
||||
- UMASK=002
|
||||
volumes:
|
||||
- << appdata_dir >>/<< service_name >>/tautulli:/config
|
||||
ports:
|
||||
- "<< port_tautulli >>:8181"
|
||||
restart: unless-stopped
|
||||
<%- endif %>
|
||||
|
||||
<%- if enable_soularr %>
|
||||
<< service_name >>-soularr:
|
||||
image: mrusse08/soularr:latest
|
||||
container_name: << service_name >>-soularr
|
||||
environment:
|
||||
- TZ=<< timezone >>
|
||||
volumes:
|
||||
- << appdata_dir >>/<< service_name >>/soularr:/data
|
||||
- << data_root >>:/data
|
||||
restart: unless-stopped
|
||||
<%- endif %>
|
||||
|
||||
<%- if enable_gluetun %>
|
||||
<< service_name >>-gluetun:
|
||||
image: qmcgaw/gluetun:latest
|
||||
container_name: << service_name >>-gluetun
|
||||
environment:
|
||||
- TZ=<< timezone >>
|
||||
- VPN_SERVICE_PROVIDER=<< vpn_provider >>
|
||||
- VPN_TYPE=<< vpn_type >>
|
||||
- SERVER_COUNTRIES=<< vpn_landen >>
|
||||
- WIREGUARD_PRIVATE_KEY=<< wireguard_private_key >>
|
||||
- WIREGUARD_ADDRESSES=<< wireguard_addresses >>
|
||||
- OPENVPN_USER=<< openvpn_user >>
|
||||
- OPENVPN_PASSWORD=<< openvpn_password >>
|
||||
volumes:
|
||||
- << appdata_dir >>/<< service_name >>/gluetun:/gluetun
|
||||
cap_add:
|
||||
- NET_ADMIN
|
||||
devices:
|
||||
- /dev/net/tun:/dev/net/tun
|
||||
ports:
|
||||
# De downloadclients delen dit netwerk, dus hun webinterfaces
|
||||
# staan hier. Inkomende torrentpoorten niet: die regelt je
|
||||
# VPN-aanbieder met port forwarding.
|
||||
<%- if enable_deluge %>
|
||||
- "<< port_deluge >>:8112"
|
||||
<%- endif %>
|
||||
<%- if enable_nzbget %>
|
||||
- "<< port_nzbget >>:6789"
|
||||
<%- endif %>
|
||||
<%- if enable_qbittorrent %>
|
||||
- "<< port_qbittorrent >>:8090"
|
||||
<%- endif %>
|
||||
<%- if enable_sabnzbd %>
|
||||
- "<< port_sabnzbd >>:8080"
|
||||
<%- endif %>
|
||||
<%- if enable_slskd %>
|
||||
- "<< port_slskd >>:5030"
|
||||
<%- endif %>
|
||||
<%- if enable_transmission %>
|
||||
- "<< port_transmission >>:9091"
|
||||
<%- endif %>
|
||||
restart: unless-stopped
|
||||
<%- endif %>
|
||||
File diff suppressed because it is too large
Load diff
|
|
@ -1,13 +0,0 @@
|
|||
services:
|
||||
<< service_name >>:
|
||||
image: ghcr.io/advplyr/audiobookshelf:latest
|
||||
container_name: << service_name >>
|
||||
ports:
|
||||
- "<< port >>:80"
|
||||
environment:
|
||||
- TZ=<< timezone >>
|
||||
volumes:
|
||||
- << media_dir >>:/audiobooks
|
||||
- << appdata_dir >>/<< service_name >>/config:/config
|
||||
- << appdata_dir >>/<< service_name >>/metadata:/metadata
|
||||
restart: unless-stopped
|
||||
|
|
@ -1,64 +0,0 @@
|
|||
{
|
||||
"kind": "compose",
|
||||
"metadata": {
|
||||
"name": "Audiobookshelf",
|
||||
"description": "Server voor luisterboeken en podcasts, met apps voor iOS en Android die je voortgang bijhouden.",
|
||||
"tags": [
|
||||
"media",
|
||||
"luisterboeken",
|
||||
"podcast"
|
||||
],
|
||||
"icon": {
|
||||
"provider": "selfhst",
|
||||
"id": "audiobookshelf"
|
||||
},
|
||||
"version": {
|
||||
"name": "latest"
|
||||
},
|
||||
"categories": [
|
||||
"media"
|
||||
]
|
||||
},
|
||||
"variables": [
|
||||
{
|
||||
"title": "Algemeen",
|
||||
"items": [
|
||||
{
|
||||
"name": "service_name",
|
||||
"type": "str",
|
||||
"title": "Servicenaam",
|
||||
"default": "audiobookshelf",
|
||||
"required": true
|
||||
},
|
||||
{
|
||||
"name": "port",
|
||||
"type": "int",
|
||||
"title": "Web poort",
|
||||
"default": 13378,
|
||||
"required": true
|
||||
},
|
||||
{
|
||||
"name": "appdata_dir",
|
||||
"type": "str",
|
||||
"title": "Appdata-map",
|
||||
"default": "/opt/serverup/appdata",
|
||||
"required": true
|
||||
},
|
||||
{
|
||||
"name": "timezone",
|
||||
"type": "str",
|
||||
"title": "Tijdzone",
|
||||
"default": "Europe/Amsterdam",
|
||||
"required": true
|
||||
},
|
||||
{
|
||||
"name": "media_dir",
|
||||
"type": "str",
|
||||
"title": "Map met luisterboeken",
|
||||
"default": "/opt/serverup/media/audiobooks",
|
||||
"required": true
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
@ -1,15 +0,0 @@
|
|||
services:
|
||||
<< service_name >>:
|
||||
image: authelia/authelia:latest
|
||||
container_name: << service_name >>
|
||||
ports:
|
||||
- "<< port >>:9091"
|
||||
environment:
|
||||
- TZ=<< timezone >>
|
||||
- AUTHELIA_JWT_SECRET=<< jwt_secret >>
|
||||
- AUTHELIA_SESSION_SECRET=<< session_secret >>
|
||||
- AUTHELIA_STORAGE_ENCRYPTION_KEY=<< storage_key >>
|
||||
volumes:
|
||||
# Zet hier configuration.yml en users_database.yml neer voor de eerste start.
|
||||
- << appdata_dir >>/<< service_name >>/config:/config
|
||||
restart: unless-stopped
|
||||
|
|
@ -1,99 +0,0 @@
|
|||
{
|
||||
"kind": "compose",
|
||||
"metadata": {
|
||||
"name": "Authelia",
|
||||
"description": "Inlogportaal met tweestapsverificatie voor al je diensten achter een reverse proxy. Werkt samen met de SSO-instelling van Server Up.",
|
||||
"tags": [
|
||||
"beveiliging",
|
||||
"sso",
|
||||
"authenticatie"
|
||||
],
|
||||
"icon": {
|
||||
"provider": "selfhst",
|
||||
"id": "authelia"
|
||||
},
|
||||
"version": {
|
||||
"name": "latest"
|
||||
},
|
||||
"categories": [
|
||||
"beveiliging"
|
||||
]
|
||||
},
|
||||
"variables": [
|
||||
{
|
||||
"title": "Algemeen",
|
||||
"items": [
|
||||
{
|
||||
"name": "service_name",
|
||||
"type": "str",
|
||||
"title": "Servicenaam",
|
||||
"default": "authelia",
|
||||
"required": true
|
||||
},
|
||||
{
|
||||
"name": "port",
|
||||
"type": "int",
|
||||
"title": "Web poort",
|
||||
"default": 9091,
|
||||
"required": true
|
||||
},
|
||||
{
|
||||
"name": "appdata_dir",
|
||||
"type": "str",
|
||||
"title": "Appdata-map",
|
||||
"default": "/opt/serverup/appdata",
|
||||
"required": true
|
||||
},
|
||||
{
|
||||
"name": "timezone",
|
||||
"type": "str",
|
||||
"title": "Tijdzone",
|
||||
"default": "Europe/Amsterdam",
|
||||
"required": true
|
||||
},
|
||||
{
|
||||
"name": "jwt_secret",
|
||||
"type": "str",
|
||||
"title": "JWT-sleutel",
|
||||
"default": "",
|
||||
"required": true,
|
||||
"description": "Gebruik de dobbelsteenknop voor een willekeurige waarde",
|
||||
"config": {
|
||||
"placeholder": "sterk-wachtwoord"
|
||||
},
|
||||
"advanced": true,
|
||||
"generate": "auto",
|
||||
"secret": true
|
||||
},
|
||||
{
|
||||
"name": "session_secret",
|
||||
"type": "str",
|
||||
"title": "Sessiesleutel",
|
||||
"default": "",
|
||||
"required": true,
|
||||
"description": "Gebruik de dobbelsteenknop voor een willekeurige waarde",
|
||||
"config": {
|
||||
"placeholder": "sterk-wachtwoord"
|
||||
},
|
||||
"advanced": true,
|
||||
"generate": "auto",
|
||||
"secret": true
|
||||
},
|
||||
{
|
||||
"name": "storage_key",
|
||||
"type": "str",
|
||||
"title": "Opslagversleuteling",
|
||||
"default": "",
|
||||
"required": true,
|
||||
"description": "Gebruik de dobbelsteenknop voor een willekeurige waarde",
|
||||
"config": {
|
||||
"placeholder": "sterk-wachtwoord"
|
||||
},
|
||||
"advanced": true,
|
||||
"generate": "auto",
|
||||
"secret": true
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
@ -1,58 +0,0 @@
|
|||
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
|
||||
|
|
@ -1,86 +0,0 @@
|
|||
{
|
||||
"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"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
@ -1,11 +0,0 @@
|
|||
services:
|
||||
<< service_name >>:
|
||||
image: ghcr.io/dan-online/autopulse:latest
|
||||
container_name: << service_name >>
|
||||
environment:
|
||||
- TZ=<< timezone >>
|
||||
volumes:
|
||||
- << appdata_dir >>/<< service_name >>:/app/config
|
||||
ports:
|
||||
- "<< port >>:2875"
|
||||
restart: unless-stopped
|
||||
|
|
@ -1,57 +0,0 @@
|
|||
{
|
||||
"kind": "compose",
|
||||
"metadata": {
|
||||
"name": "Autopulse",
|
||||
"description": "Laat Plex of Jellyfin meteen een nieuwe aflevering zien, in plaats van te wachten op de volgende scan.",
|
||||
"tags": [
|
||||
"media",
|
||||
"automatisering"
|
||||
],
|
||||
"icon": {
|
||||
"provider": "selfhst",
|
||||
"id": "autopulse"
|
||||
},
|
||||
"version": {
|
||||
"name": "latest"
|
||||
},
|
||||
"categories": [
|
||||
"media"
|
||||
]
|
||||
},
|
||||
"variables": [
|
||||
{
|
||||
"title": "Algemeen",
|
||||
"items": [
|
||||
{
|
||||
"name": "service_name",
|
||||
"type": "str",
|
||||
"title": "Servicenaam",
|
||||
"default": "autopulse",
|
||||
"required": true
|
||||
},
|
||||
{
|
||||
"name": "port",
|
||||
"type": "int",
|
||||
"title": "Poort",
|
||||
"default": 2875,
|
||||
"required": true
|
||||
},
|
||||
{
|
||||
"name": "appdata_dir",
|
||||
"type": "str",
|
||||
"title": "Appdata-map",
|
||||
"default": "/opt/serverup/appdata",
|
||||
"required": true,
|
||||
"description": "Basismap voor de instellingen van deze app"
|
||||
},
|
||||
{
|
||||
"name": "timezone",
|
||||
"type": "str",
|
||||
"title": "Tijdzone",
|
||||
"default": "Europe/Amsterdam",
|
||||
"required": true
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
@ -1,16 +0,0 @@
|
|||
services:
|
||||
<< service_name >>:
|
||||
image: lscr.io/linuxserver/babybuddy:latest
|
||||
container_name: << service_name >>
|
||||
ports:
|
||||
- "<< port >>:8000"
|
||||
environment:
|
||||
- TZ=<< timezone >>
|
||||
- PUID=<< puid >>
|
||||
- PGID=<< pgid >>
|
||||
- SECRET_KEY=<< secret_key >>
|
||||
- ALLOWED_HOSTS=<< allowed_hosts >>
|
||||
- CSRF_TRUSTED_ORIGINS=http://<< allowed_hosts >>
|
||||
volumes:
|
||||
- << appdata_dir >>/<< service_name >>:/config
|
||||
restart: unless-stopped
|
||||
|
|
@ -1,96 +0,0 @@
|
|||
{
|
||||
"kind": "compose",
|
||||
"metadata": {
|
||||
"name": "Baby Buddy",
|
||||
"description": "Houdt voedingen, slaap, luiers en groei van je kind bij. Handig om het overzicht te bewaren in de eerste maanden.",
|
||||
"tags": [
|
||||
"gezin",
|
||||
"gezondheid",
|
||||
"logboek"
|
||||
],
|
||||
"icon": {
|
||||
"provider": "selfhst",
|
||||
"id": "baby-buddy"
|
||||
},
|
||||
"version": {
|
||||
"name": "latest"
|
||||
},
|
||||
"categories": [
|
||||
"gezin"
|
||||
]
|
||||
},
|
||||
"variables": [
|
||||
{
|
||||
"title": "Algemeen",
|
||||
"items": [
|
||||
{
|
||||
"name": "service_name",
|
||||
"type": "str",
|
||||
"title": "Servicenaam",
|
||||
"default": "baby-buddy",
|
||||
"required": true
|
||||
},
|
||||
{
|
||||
"name": "port",
|
||||
"type": "int",
|
||||
"title": "Web poort",
|
||||
"default": 8000,
|
||||
"required": true
|
||||
},
|
||||
{
|
||||
"name": "appdata_dir",
|
||||
"type": "str",
|
||||
"title": "Appdata-map",
|
||||
"default": "/opt/serverup/appdata",
|
||||
"required": true
|
||||
},
|
||||
{
|
||||
"name": "timezone",
|
||||
"type": "str",
|
||||
"title": "Tijdzone",
|
||||
"default": "Europe/Amsterdam",
|
||||
"required": true
|
||||
},
|
||||
{
|
||||
"name": "puid",
|
||||
"type": "int",
|
||||
"title": "Gebruikers-ID (PUID)",
|
||||
"default": 1000,
|
||||
"required": true,
|
||||
"description": "Bepaalt de eigenaar van de bestanden; `id -u` op je host",
|
||||
"advanced": true
|
||||
},
|
||||
{
|
||||
"name": "pgid",
|
||||
"type": "int",
|
||||
"title": "Groeps-ID (PGID)",
|
||||
"default": 1000,
|
||||
"required": true,
|
||||
"advanced": true
|
||||
},
|
||||
{
|
||||
"name": "secret_key",
|
||||
"type": "str",
|
||||
"title": "Geheime sleutel",
|
||||
"default": "",
|
||||
"required": true,
|
||||
"description": "Willekeurige waarde voor sessieversleuteling; gebruik de dobbelsteenknop",
|
||||
"config": {
|
||||
"placeholder": "willekeurige-lange-string"
|
||||
},
|
||||
"generate": "auto",
|
||||
"secret": true
|
||||
},
|
||||
{
|
||||
"name": "allowed_hosts",
|
||||
"type": "str",
|
||||
"title": "Toegestane hostnamen",
|
||||
"default": "*",
|
||||
"required": true,
|
||||
"description": "Bijvoorbeeld babybuddy.thuis.nl; * staat alles toe",
|
||||
"advanced": true
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
@ -1,14 +0,0 @@
|
|||
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
|
||||
|
|
@ -1,72 +0,0 @@
|
|||
{
|
||||
"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"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
@ -1,12 +0,0 @@
|
|||
services:
|
||||
<< service_name >>:
|
||||
image: ckulka/baikal:nginx
|
||||
container_name: << service_name >>
|
||||
environment:
|
||||
- TZ=<< timezone >>
|
||||
volumes:
|
||||
- << appdata_dir >>/<< service_name >>:/var/www/baikal/config
|
||||
- << appdata_dir >>/<< service_name >>-specific:/var/www/baikal/Specific
|
||||
ports:
|
||||
- "<< port >>:80"
|
||||
restart: unless-stopped
|
||||
|
|
@ -1,61 +0,0 @@
|
|||
{
|
||||
"kind": "compose",
|
||||
"metadata": {
|
||||
"name": "Baïkal",
|
||||
"description": "Je agenda en contacten op je eigen server, via CalDAV en CardDAV. iPhone, Android en Thunderbird praten er zo mee. Vervangt Google Agenda en Google Contacten.",
|
||||
"tags": [
|
||||
"agenda",
|
||||
"contacten",
|
||||
"caldav",
|
||||
"carddav"
|
||||
],
|
||||
"icon": {
|
||||
"provider": "selfhst",
|
||||
"id": "baikal"
|
||||
},
|
||||
"version": {
|
||||
"name": "latest"
|
||||
},
|
||||
"categories": [
|
||||
"gezin",
|
||||
"productiviteit"
|
||||
]
|
||||
},
|
||||
"variables": [
|
||||
{
|
||||
"title": "Algemeen",
|
||||
"items": [
|
||||
{
|
||||
"name": "service_name",
|
||||
"type": "str",
|
||||
"title": "Servicenaam",
|
||||
"default": "baikal",
|
||||
"required": true
|
||||
},
|
||||
{
|
||||
"name": "port",
|
||||
"type": "int",
|
||||
"title": "Webinterface",
|
||||
"default": 8180,
|
||||
"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
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
@ -1,18 +0,0 @@
|
|||
services:
|
||||
<< service_name >>:
|
||||
image: ghcr.io/maziggy/bambuddy:latest
|
||||
container_name: << service_name >>
|
||||
ports:
|
||||
- "<< port >>:8000"
|
||||
environment:
|
||||
- TZ=<< timezone >>
|
||||
- PUID=<< puid >>
|
||||
- PGID=<< pgid >>
|
||||
- PORT=8000
|
||||
volumes:
|
||||
- << appdata_dir >>/<< service_name >>/data:/app/data
|
||||
- << appdata_dir >>/<< service_name >>/logs:/app/logs
|
||||
cap_add:
|
||||
- NET_BIND_SERVICE
|
||||
stop_grace_period: 30s
|
||||
restart: unless-stopped
|
||||
|
|
@ -1,74 +0,0 @@
|
|||
{
|
||||
"kind": "compose",
|
||||
"metadata": {
|
||||
"name": "Bambuddy",
|
||||
"description": "Zelfgehost bedieningspaneel voor Bambu Lab-printers, van één A1 tot een hele printerfarm. Zonder cloud.",
|
||||
"tags": [
|
||||
"3d-printen",
|
||||
"bambu-lab",
|
||||
"printerbeheer"
|
||||
],
|
||||
"icon": {
|
||||
"provider": "selfhst",
|
||||
"id": "bambuddy"
|
||||
},
|
||||
"version": {
|
||||
"name": "latest"
|
||||
},
|
||||
"categories": [
|
||||
"3d-printen"
|
||||
]
|
||||
},
|
||||
"variables": [
|
||||
{
|
||||
"title": "Algemeen",
|
||||
"items": [
|
||||
{
|
||||
"name": "service_name",
|
||||
"type": "str",
|
||||
"title": "Servicenaam",
|
||||
"default": "bambuddy",
|
||||
"required": true
|
||||
},
|
||||
{
|
||||
"name": "port",
|
||||
"type": "int",
|
||||
"title": "Web poort",
|
||||
"default": 8011,
|
||||
"required": true
|
||||
},
|
||||
{
|
||||
"name": "appdata_dir",
|
||||
"type": "str",
|
||||
"title": "Appdata-map",
|
||||
"default": "/opt/serverup/appdata",
|
||||
"required": true
|
||||
},
|
||||
{
|
||||
"name": "timezone",
|
||||
"type": "str",
|
||||
"title": "Tijdzone",
|
||||
"default": "Europe/Amsterdam",
|
||||
"required": true
|
||||
},
|
||||
{
|
||||
"name": "puid",
|
||||
"type": "int",
|
||||
"title": "Gebruikers-ID (PUID)",
|
||||
"default": 1000,
|
||||
"required": true,
|
||||
"description": "Bepaalt de eigenaar van de bestanden; `id -u` op je host",
|
||||
"advanced": true
|
||||
},
|
||||
{
|
||||
"name": "pgid",
|
||||
"type": "int",
|
||||
"title": "Groeps-ID (PGID)",
|
||||
"default": 1000,
|
||||
"required": true,
|
||||
"advanced": true
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
@ -1,12 +0,0 @@
|
|||
services:
|
||||
<< service_name >>:
|
||||
image: baserow/baserow:latest
|
||||
container_name: << service_name >>
|
||||
ports:
|
||||
- "<< port >>:80"
|
||||
environment:
|
||||
- TZ=<< timezone >>
|
||||
- BASEROW_PUBLIC_URL=<< public_url >>
|
||||
volumes:
|
||||
- << appdata_dir >>/<< service_name >>:/baserow/data
|
||||
restart: unless-stopped
|
||||
|
|
@ -1,67 +0,0 @@
|
|||
{
|
||||
"kind": "compose",
|
||||
"metadata": {
|
||||
"name": "Baserow",
|
||||
"description": "Databases opbouwen zonder te programmeren, met formulieren en weergaven.",
|
||||
"tags": [
|
||||
"database",
|
||||
"no-code",
|
||||
"formulieren"
|
||||
],
|
||||
"icon": {
|
||||
"provider": "selfhst",
|
||||
"id": "baserow"
|
||||
},
|
||||
"version": {
|
||||
"name": "latest"
|
||||
},
|
||||
"categories": [
|
||||
"ontwikkeling",
|
||||
"productiviteit"
|
||||
]
|
||||
},
|
||||
"variables": [
|
||||
{
|
||||
"title": "Algemeen",
|
||||
"items": [
|
||||
{
|
||||
"name": "service_name",
|
||||
"type": "str",
|
||||
"title": "Servicenaam",
|
||||
"default": "baserow",
|
||||
"required": true
|
||||
},
|
||||
{
|
||||
"name": "port",
|
||||
"type": "int",
|
||||
"title": "Web poort",
|
||||
"default": 8099,
|
||||
"required": true
|
||||
},
|
||||
{
|
||||
"name": "appdata_dir",
|
||||
"type": "str",
|
||||
"title": "Appdata-map",
|
||||
"default": "/opt/serverup/appdata",
|
||||
"required": true
|
||||
},
|
||||
{
|
||||
"name": "timezone",
|
||||
"type": "str",
|
||||
"title": "Tijdzone",
|
||||
"default": "Europe/Amsterdam",
|
||||
"required": true
|
||||
},
|
||||
{
|
||||
"name": "public_url",
|
||||
"type": "str",
|
||||
"title": "Publieke URL",
|
||||
"default": "http://localhost:8099",
|
||||
"required": true,
|
||||
"description": "Zonder dit kloppen links en uploads niet",
|
||||
"help": "Het adres waarop je Baserow opent. Baserow bouwt hier zijn links mee op, dus een verkeerde poort levert knoppen op die nergens heen gaan. Benader je de server op zijn IP-adres, vul dan dat adres in: http://10.0.20.5:8099"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
@ -1,15 +0,0 @@
|
|||
services:
|
||||
<< service_name >>:
|
||||
image: lscr.io/linuxserver/bazarr:latest
|
||||
container_name: << service_name >>
|
||||
environment:
|
||||
- PUID=<< puid >>
|
||||
- PGID=<< pgid >>
|
||||
- TZ=<< timezone >>
|
||||
- UMASK=002
|
||||
volumes:
|
||||
- << appdata_dir >>/<< service_name >>:/config
|
||||
- << data_root >>:/data
|
||||
ports:
|
||||
- "<< port >>:6767"
|
||||
restart: unless-stopped
|
||||
|
|
@ -1,86 +0,0 @@
|
|||
{
|
||||
"kind": "compose",
|
||||
"metadata": {
|
||||
"name": "Bazarr",
|
||||
"description": "Zoekt en downloadt ondertitels bij wat Sonarr en Radarr al hebben binnengehaald.",
|
||||
"tags": [
|
||||
"media",
|
||||
"ondertitels"
|
||||
],
|
||||
"icon": {
|
||||
"provider": "selfhst",
|
||||
"id": "bazarr"
|
||||
},
|
||||
"version": {
|
||||
"name": "latest"
|
||||
},
|
||||
"categories": [
|
||||
"media"
|
||||
]
|
||||
},
|
||||
"variables": [
|
||||
{
|
||||
"title": "Algemeen",
|
||||
"items": [
|
||||
{
|
||||
"name": "service_name",
|
||||
"type": "str",
|
||||
"title": "Servicenaam",
|
||||
"default": "bazarr",
|
||||
"required": true
|
||||
},
|
||||
{
|
||||
"name": "port",
|
||||
"type": "int",
|
||||
"title": "Webinterface",
|
||||
"default": 6767,
|
||||
"required": true
|
||||
},
|
||||
{
|
||||
"name": "appdata_dir",
|
||||
"type": "str",
|
||||
"title": "Appdata-map",
|
||||
"default": "/opt/serverup/appdata",
|
||||
"required": true,
|
||||
"description": "Basismap voor de instellingen van deze app"
|
||||
},
|
||||
{
|
||||
"name": "data_root",
|
||||
"type": "str",
|
||||
"title": "Gedeelde datamap",
|
||||
"default": "/mnt/data",
|
||||
"required": true,
|
||||
"description": "Eén map met je media én je downloads, 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
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
@ -1,23 +0,0 @@
|
|||
services:
|
||||
<< service_name >>:
|
||||
image: henrygd/beszel:latest
|
||||
container_name: << service_name >>
|
||||
ports:
|
||||
- "<< port >>:8090"
|
||||
environment:
|
||||
- TZ=<< timezone >>
|
||||
volumes:
|
||||
- << appdata_dir >>/<< service_name >>/data:/beszel_data
|
||||
restart: unless-stopped
|
||||
|
||||
<< service_name >>-agent:
|
||||
image: henrygd/beszel-agent:latest
|
||||
container_name: << service_name >>-agent
|
||||
network_mode: host
|
||||
environment:
|
||||
- TZ=<< timezone >>
|
||||
- PORT=<< agent_port >>
|
||||
- KEY=<< agent_key >>
|
||||
volumes:
|
||||
- /var/run/docker.sock:/var/run/docker.sock:ro
|
||||
restart: unless-stopped
|
||||
|
|
@ -1,73 +0,0 @@
|
|||
{
|
||||
"kind": "compose",
|
||||
"metadata": {
|
||||
"name": "Beszel",
|
||||
"description": "Lichte servermonitoring met grafieken en alarmen, zonder een hele Prometheus-opstelling.",
|
||||
"tags": [
|
||||
"monitoring",
|
||||
"systeem",
|
||||
"lichtgewicht"
|
||||
],
|
||||
"icon": {
|
||||
"provider": "selfhst",
|
||||
"id": "beszel"
|
||||
},
|
||||
"version": {
|
||||
"name": "latest"
|
||||
},
|
||||
"categories": [
|
||||
"monitoring"
|
||||
]
|
||||
},
|
||||
"variables": [
|
||||
{
|
||||
"title": "Algemeen",
|
||||
"items": [
|
||||
{
|
||||
"name": "service_name",
|
||||
"type": "str",
|
||||
"title": "Servicenaam",
|
||||
"default": "beszel",
|
||||
"required": true
|
||||
},
|
||||
{
|
||||
"name": "port",
|
||||
"type": "int",
|
||||
"title": "Web poort",
|
||||
"default": 8100,
|
||||
"required": true
|
||||
},
|
||||
{
|
||||
"name": "appdata_dir",
|
||||
"type": "str",
|
||||
"title": "Appdata-map",
|
||||
"default": "/opt/serverup/appdata",
|
||||
"required": true
|
||||
},
|
||||
{
|
||||
"name": "timezone",
|
||||
"type": "str",
|
||||
"title": "Tijdzone",
|
||||
"default": "Europe/Amsterdam",
|
||||
"required": true
|
||||
},
|
||||
{
|
||||
"name": "agent_port",
|
||||
"type": "int",
|
||||
"title": "Agent-poort",
|
||||
"default": 45876,
|
||||
"required": true,
|
||||
"description": "De agent meet deze host; extra servers wijs je later aan"
|
||||
},
|
||||
{
|
||||
"name": "agent_key",
|
||||
"type": "str",
|
||||
"title": "Publieke sleutel agent",
|
||||
"default": "",
|
||||
"required": false,
|
||||
"description": "Laat leeg bij de eerste installatie; je vindt hem in de webinterface"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
@ -1,36 +0,0 @@
|
|||
services:
|
||||
<< service_name >>:
|
||||
image: lscr.io/linuxserver/bookstack:latest
|
||||
container_name: << service_name >>
|
||||
ports:
|
||||
- "<< port >>:80"
|
||||
environment:
|
||||
- TZ=<< timezone >>
|
||||
- PUID=<< puid >>
|
||||
- PGID=<< pgid >>
|
||||
- APP_URL=<< app_url >>
|
||||
- DB_HOST=<< service_name >>-db
|
||||
- DB_PORT=3306
|
||||
- DB_USERNAME=bookstack
|
||||
- DB_PASSWORD=<< db_password >>
|
||||
- DB_DATABASE=bookstack
|
||||
volumes:
|
||||
- << appdata_dir >>/<< service_name >>/config:/config
|
||||
depends_on:
|
||||
- << service_name >>-db
|
||||
restart: unless-stopped
|
||||
|
||||
<< service_name >>-db:
|
||||
image: lscr.io/linuxserver/mariadb:latest
|
||||
container_name: << service_name >>-db
|
||||
environment:
|
||||
- TZ=<< timezone >>
|
||||
- PUID=<< puid >>
|
||||
- PGID=<< pgid >>
|
||||
- MYSQL_ROOT_PASSWORD=<< db_password >>
|
||||
- MYSQL_DATABASE=bookstack
|
||||
- MYSQL_USER=bookstack
|
||||
- MYSQL_PASSWORD=<< db_password >>
|
||||
volumes:
|
||||
- << appdata_dir >>/<< service_name >>/db:/config
|
||||
restart: unless-stopped
|
||||
|
|
@ -1,96 +0,0 @@
|
|||
{
|
||||
"kind": "compose",
|
||||
"metadata": {
|
||||
"name": "BookStack",
|
||||
"description": "Wiki voor documentatie, geordend in boeken, hoofdstukken en pagina's. Prettig voor handleidingen thuis.",
|
||||
"tags": [
|
||||
"documentatie",
|
||||
"wiki",
|
||||
"kennis"
|
||||
],
|
||||
"icon": {
|
||||
"provider": "selfhst",
|
||||
"id": "bookstack"
|
||||
},
|
||||
"version": {
|
||||
"name": "latest"
|
||||
},
|
||||
"categories": [
|
||||
"documenten"
|
||||
]
|
||||
},
|
||||
"variables": [
|
||||
{
|
||||
"title": "Algemeen",
|
||||
"items": [
|
||||
{
|
||||
"name": "service_name",
|
||||
"type": "str",
|
||||
"title": "Servicenaam",
|
||||
"default": "bookstack",
|
||||
"required": true
|
||||
},
|
||||
{
|
||||
"name": "port",
|
||||
"type": "int",
|
||||
"title": "Web poort",
|
||||
"default": 6875,
|
||||
"required": true
|
||||
},
|
||||
{
|
||||
"name": "appdata_dir",
|
||||
"type": "str",
|
||||
"title": "Appdata-map",
|
||||
"default": "/opt/serverup/appdata",
|
||||
"required": true
|
||||
},
|
||||
{
|
||||
"name": "timezone",
|
||||
"type": "str",
|
||||
"title": "Tijdzone",
|
||||
"default": "Europe/Amsterdam",
|
||||
"required": true
|
||||
},
|
||||
{
|
||||
"name": "puid",
|
||||
"type": "int",
|
||||
"title": "Gebruikers-ID (PUID)",
|
||||
"default": 1000,
|
||||
"required": true,
|
||||
"description": "Bepaalt de eigenaar van de bestanden; `id -u` op je host",
|
||||
"advanced": true
|
||||
},
|
||||
{
|
||||
"name": "pgid",
|
||||
"type": "int",
|
||||
"title": "Groeps-ID (PGID)",
|
||||
"default": 1000,
|
||||
"required": true,
|
||||
"advanced": true
|
||||
},
|
||||
{
|
||||
"name": "db_password",
|
||||
"type": "str",
|
||||
"title": "Database wachtwoord",
|
||||
"default": "",
|
||||
"required": true,
|
||||
"description": "Gebruik de dobbelsteenknop voor een willekeurige waarde",
|
||||
"config": {
|
||||
"placeholder": "sterk-wachtwoord"
|
||||
},
|
||||
"advanced": true,
|
||||
"generate": "auto",
|
||||
"secret": true
|
||||
},
|
||||
{
|
||||
"name": "app_url",
|
||||
"type": "str",
|
||||
"title": "Basis-URL",
|
||||
"default": "http://localhost:6875",
|
||||
"required": true,
|
||||
"description": "Het adres waarop je BookStack benadert; links kloppen anders niet"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
@ -1,11 +0,0 @@
|
|||
services:
|
||||
<< service_name >>:
|
||||
image: ghcr.io/thephaseless/byparr:latest
|
||||
container_name: << service_name >>
|
||||
environment:
|
||||
- TZ=<< timezone >>
|
||||
volumes:
|
||||
- << appdata_dir >>/<< service_name >>:/config
|
||||
ports:
|
||||
- "<< port >>:8191"
|
||||
restart: unless-stopped
|
||||
|
|
@ -1,59 +0,0 @@
|
|||
{
|
||||
"kind": "compose",
|
||||
"metadata": {
|
||||
"name": "Byparr",
|
||||
"description": "Nieuwer alternatief voor FlareSolverr, gebouwd op SeleniumBase. Spreekt dezelfde API, dus je kunt het er zo voor in de plaats zetten.",
|
||||
"tags": [
|
||||
"indexers",
|
||||
"downloaden",
|
||||
"proxy"
|
||||
],
|
||||
"icon": {
|
||||
"provider": "selfhst",
|
||||
"id": "byparr"
|
||||
},
|
||||
"version": {
|
||||
"name": "latest"
|
||||
},
|
||||
"categories": [
|
||||
"downloaden"
|
||||
]
|
||||
},
|
||||
"variables": [
|
||||
{
|
||||
"title": "Algemeen",
|
||||
"items": [
|
||||
{
|
||||
"name": "service_name",
|
||||
"type": "str",
|
||||
"title": "Servicenaam",
|
||||
"default": "byparr",
|
||||
"required": true
|
||||
},
|
||||
{
|
||||
"name": "port",
|
||||
"type": "int",
|
||||
"title": "Poort",
|
||||
"default": 8119,
|
||||
"required": true,
|
||||
"description": "Byparr luistert intern op 8191, net als FlareSolverr"
|
||||
},
|
||||
{
|
||||
"name": "appdata_dir",
|
||||
"type": "str",
|
||||
"title": "Appdata-map",
|
||||
"default": "/opt/serverup/appdata",
|
||||
"required": true,
|
||||
"description": "Basismap voor de instellingen van deze app"
|
||||
},
|
||||
{
|
||||
"name": "timezone",
|
||||
"type": "str",
|
||||
"title": "Tijdzone",
|
||||
"default": "Europe/Amsterdam",
|
||||
"required": true
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
@ -1,20 +0,0 @@
|
|||
services:
|
||||
<< service_name >>:
|
||||
image: caddy:2
|
||||
container_name: << service_name >>
|
||||
ports:
|
||||
- "<< port >>:80"
|
||||
- "<< https_port >>:443"
|
||||
- "<< https_port >>:443/udp"
|
||||
environment:
|
||||
- TZ=<< timezone >>
|
||||
volumes:
|
||||
# Zet hier je Caddyfile neer; Caddy regelt de certificaten daarna zelf.
|
||||
- << appdata_dir >>/<< service_name >>/Caddyfile:/etc/caddy/Caddyfile
|
||||
- << service_name >>_data:/data
|
||||
- << service_name >>_config:/config
|
||||
restart: unless-stopped
|
||||
|
||||
volumes:
|
||||
<< service_name >>_data:
|
||||
<< service_name >>_config:
|
||||
|
|
@ -1,66 +0,0 @@
|
|||
{
|
||||
"kind": "compose",
|
||||
"metadata": {
|
||||
"name": "Caddy",
|
||||
"description": "Reverse proxy die HTTPS-certificaten volledig zelf regelt. Eenvoudiger in te stellen dan Traefik of Nginx.",
|
||||
"tags": [
|
||||
"proxy",
|
||||
"netwerk",
|
||||
"https"
|
||||
],
|
||||
"icon": {
|
||||
"provider": "selfhst",
|
||||
"id": "caddy"
|
||||
},
|
||||
"version": {
|
||||
"name": "2"
|
||||
},
|
||||
"categories": [
|
||||
"netwerk",
|
||||
"beheer"
|
||||
]
|
||||
},
|
||||
"variables": [
|
||||
{
|
||||
"title": "Algemeen",
|
||||
"items": [
|
||||
{
|
||||
"name": "service_name",
|
||||
"type": "str",
|
||||
"title": "Servicenaam",
|
||||
"default": "caddy",
|
||||
"required": true
|
||||
},
|
||||
{
|
||||
"name": "port",
|
||||
"type": "int",
|
||||
"title": "HTTP poort",
|
||||
"default": 80,
|
||||
"required": true,
|
||||
"help": "Caddy vraagt zelf certificaten aan bij Let's Encrypt en heeft daarvoor poort 80 nodig, ook als je alles via HTTPS aanbiedt."
|
||||
},
|
||||
{
|
||||
"name": "appdata_dir",
|
||||
"type": "str",
|
||||
"title": "Appdata-map",
|
||||
"default": "/opt/serverup/appdata",
|
||||
"required": true
|
||||
},
|
||||
{
|
||||
"name": "timezone",
|
||||
"type": "str",
|
||||
"title": "Tijdzone",
|
||||
"default": "Europe/Amsterdam",
|
||||
"required": true
|
||||
},
|
||||
{
|
||||
"name": "https_port",
|
||||
"type": "int",
|
||||
"title": "HTTPS poort",
|
||||
"default": 443,
|
||||
"required": true
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
@ -1,18 +0,0 @@
|
|||
services:
|
||||
<< service_name >>:
|
||||
image: gcr.io/cadvisor/cadvisor:latest
|
||||
container_name: << service_name >>
|
||||
environment:
|
||||
- TZ=<< timezone >>
|
||||
volumes:
|
||||
- /:/rootfs:ro
|
||||
- /var/run:/var/run:ro
|
||||
- /sys:/sys:ro
|
||||
- /var/lib/docker/:/var/lib/docker:ro
|
||||
- /dev/disk/:/dev/disk:ro
|
||||
ports:
|
||||
- "<< port >>:8080"
|
||||
devices:
|
||||
- /dev/kmsg
|
||||
privileged: true
|
||||
restart: unless-stopped
|
||||
|
|
@ -1,59 +0,0 @@
|
|||
{
|
||||
"kind": "compose",
|
||||
"metadata": {
|
||||
"name": "cAdvisor",
|
||||
"description": "Meet per container hoeveel processor, geheugen en netwerk er verbruikt wordt. Vult node-exporter aan, dat alleen de host als geheel ziet. Let op: Draait met verhoogde rechten omdat het bij de cgroups van elke container moet kunnen.",
|
||||
"tags": [
|
||||
"monitoring",
|
||||
"metrics",
|
||||
"containers",
|
||||
"prometheus"
|
||||
],
|
||||
"icon": {
|
||||
"provider": "selfhst",
|
||||
"id": "cadvisor"
|
||||
},
|
||||
"version": {
|
||||
"name": "latest"
|
||||
},
|
||||
"categories": [
|
||||
"monitoring",
|
||||
"beheer"
|
||||
],
|
||||
"depends_on": [
|
||||
{
|
||||
"app": "prometheus",
|
||||
"reason": "Levert meetwaarden per container waar Prometheus ze komt ophalen."
|
||||
}
|
||||
]
|
||||
},
|
||||
"variables": [
|
||||
{
|
||||
"title": "Algemeen",
|
||||
"items": [
|
||||
{
|
||||
"name": "service_name",
|
||||
"type": "str",
|
||||
"title": "Servicenaam",
|
||||
"default": "cadvisor",
|
||||
"required": true
|
||||
},
|
||||
{
|
||||
"name": "port",
|
||||
"type": "int",
|
||||
"title": "Webinterface",
|
||||
"default": 8202,
|
||||
"required": true,
|
||||
"description": "Standaard 8080; hier verplaatst omdat die poort al bezet is"
|
||||
},
|
||||
{
|
||||
"name": "timezone",
|
||||
"type": "str",
|
||||
"title": "Tijdzone",
|
||||
"default": "Europe/Amsterdam",
|
||||
"required": true
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
@ -1,26 +0,0 @@
|
|||
services:
|
||||
<< service_name >>:
|
||||
image: calcom/cal.com:latest
|
||||
container_name: << service_name >>
|
||||
environment:
|
||||
- TZ=<< timezone >>
|
||||
- DATABASE_URL=postgresql://calcom:<< db_password >>@<< service_name >>-db:5432/calcom
|
||||
- NEXTAUTH_SECRET=<< nextauth_secret >>
|
||||
- CALENDSO_ENCRYPTION_KEY=<< encryption_key >>
|
||||
- NEXT_PUBLIC_WEBAPP_URL=<< app_url >>
|
||||
- NEXTAUTH_URL=<< app_url >>/api/auth
|
||||
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=calcom
|
||||
- POSTGRES_USER=calcom
|
||||
- POSTGRES_PASSWORD=<< db_password >>
|
||||
volumes:
|
||||
- << appdata_dir >>/<< service_name >>-db:/var/lib/postgresql/data
|
||||
restart: unless-stopped
|
||||
|
|
@ -1,111 +0,0 @@
|
|||
{
|
||||
"kind": "compose",
|
||||
"metadata": {
|
||||
"name": "Cal.com",
|
||||
"description": "Laat anderen een afspraak in je agenda prikken, zonder heen-en-weer mailen over wanneer het uitkomt. Vervangt Calendly.",
|
||||
"tags": [
|
||||
"agenda",
|
||||
"afspraken",
|
||||
"planning"
|
||||
],
|
||||
"icon": {
|
||||
"provider": "selfhst",
|
||||
"id": "cal-com"
|
||||
},
|
||||
"version": {
|
||||
"name": "latest"
|
||||
},
|
||||
"categories": [
|
||||
"productiviteit",
|
||||
"zakelijk"
|
||||
],
|
||||
"architectures": [
|
||||
"amd64"
|
||||
],
|
||||
"architecture_note": "Een of meer containerimages van deze app worden alleen voor AMD64 gepubliceerd. Deze app werkt daardoor niet op een Raspberry Pi."
|
||||
},
|
||||
"variables": [
|
||||
{
|
||||
"title": "Algemeen",
|
||||
"items": [
|
||||
{
|
||||
"name": "service_name",
|
||||
"type": "str",
|
||||
"title": "Servicenaam",
|
||||
"default": "calcom",
|
||||
"required": true
|
||||
},
|
||||
{
|
||||
"name": "port",
|
||||
"type": "int",
|
||||
"title": "Webinterface",
|
||||
"default": 8194,
|
||||
"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:8194",
|
||||
"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": "nextauth_secret",
|
||||
"type": "str",
|
||||
"title": "Sleutel voor de inlogsessies",
|
||||
"default": "",
|
||||
"required": true,
|
||||
"secret": true,
|
||||
"generate": "auto"
|
||||
},
|
||||
{
|
||||
"name": "encryption_key",
|
||||
"type": "str",
|
||||
"title": "Sleutel voor gekoppelde agenda's",
|
||||
"default": "",
|
||||
"required": true,
|
||||
"secret": true,
|
||||
"generate": "auto",
|
||||
"secret_format": "hex",
|
||||
"secret_bytes": 16
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
@ -1,14 +0,0 @@
|
|||
services:
|
||||
<< service_name >>:
|
||||
image: lscr.io/linuxserver/calibre-web:latest
|
||||
container_name: << service_name >>
|
||||
ports:
|
||||
- "<< port >>:8083"
|
||||
environment:
|
||||
- TZ=<< timezone >>
|
||||
- PUID=<< puid >>
|
||||
- PGID=<< pgid >>
|
||||
volumes:
|
||||
- << appdata_dir >>/<< service_name >>/config:/config
|
||||
- << books_dir >>:/books
|
||||
restart: unless-stopped
|
||||
|
|
@ -1,83 +0,0 @@
|
|||
{
|
||||
"kind": "compose",
|
||||
"metadata": {
|
||||
"name": "Calibre-Web",
|
||||
"description": "Webinterface voor je Calibre-bibliotheek: bladeren, lezen en naar je e-reader sturen.",
|
||||
"tags": [
|
||||
"media",
|
||||
"boeken",
|
||||
"ebooks"
|
||||
],
|
||||
"icon": {
|
||||
"provider": "selfhst",
|
||||
"id": "calibre-web"
|
||||
},
|
||||
"version": {
|
||||
"name": "latest"
|
||||
},
|
||||
"categories": [
|
||||
"media",
|
||||
"documenten"
|
||||
]
|
||||
},
|
||||
"variables": [
|
||||
{
|
||||
"title": "Algemeen",
|
||||
"items": [
|
||||
{
|
||||
"name": "service_name",
|
||||
"type": "str",
|
||||
"title": "Servicenaam",
|
||||
"default": "calibre-web",
|
||||
"required": true
|
||||
},
|
||||
{
|
||||
"name": "port",
|
||||
"type": "int",
|
||||
"title": "Web poort",
|
||||
"default": 8083,
|
||||
"required": true
|
||||
},
|
||||
{
|
||||
"name": "appdata_dir",
|
||||
"type": "str",
|
||||
"title": "Appdata-map",
|
||||
"default": "/opt/serverup/appdata",
|
||||
"required": true
|
||||
},
|
||||
{
|
||||
"name": "timezone",
|
||||
"type": "str",
|
||||
"title": "Tijdzone",
|
||||
"default": "Europe/Amsterdam",
|
||||
"required": true
|
||||
},
|
||||
{
|
||||
"name": "puid",
|
||||
"type": "int",
|
||||
"title": "Gebruikers-ID (PUID)",
|
||||
"default": 1000,
|
||||
"required": true,
|
||||
"description": "Bepaalt de eigenaar van de bestanden; `id -u` op je host",
|
||||
"advanced": true
|
||||
},
|
||||
{
|
||||
"name": "pgid",
|
||||
"type": "int",
|
||||
"title": "Groeps-ID (PGID)",
|
||||
"default": 1000,
|
||||
"required": true,
|
||||
"advanced": true
|
||||
},
|
||||
{
|
||||
"name": "books_dir",
|
||||
"type": "str",
|
||||
"title": "Calibre-bibliotheek",
|
||||
"default": "/opt/serverup/media/books",
|
||||
"required": true,
|
||||
"description": "Map met je bestaande metadata.db van Calibre"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
@ -9,5 +9,5 @@ services:
|
|||
- CHANGEDETECTION_PASSWORD=<< password >>
|
||||
<% endif %>
|
||||
volumes:
|
||||
- << appdata_dir >>/<< service_name >>/data:/datastore
|
||||
- << data_dir >>/<< service_name >>/data:/datastore
|
||||
restart: unless-stopped
|
||||
|
|
|
|||
|
|
@ -3,22 +3,9 @@
|
|||
"metadata": {
|
||||
"name": "Changedetection.io",
|
||||
"description": "Monitor websites op wijzigingen en ontvang meldingen zodra er iets verandert.",
|
||||
"tags": [
|
||||
"monitoring",
|
||||
"websites",
|
||||
"alerting",
|
||||
"automatisering"
|
||||
],
|
||||
"icon": {
|
||||
"provider": "selfhst",
|
||||
"id": "changedetection-io"
|
||||
},
|
||||
"version": {
|
||||
"name": "latest"
|
||||
},
|
||||
"categories": [
|
||||
"monitoring"
|
||||
]
|
||||
"tags": ["monitoring", "websites", "alerting", "automatisering"],
|
||||
"icon": {"provider": "selfhst", "id": "changedetection-io"},
|
||||
"version": {"name": "latest"}
|
||||
},
|
||||
"variables": [
|
||||
{
|
||||
|
|
@ -39,9 +26,9 @@
|
|||
"required": true
|
||||
},
|
||||
{
|
||||
"name": "appdata_dir",
|
||||
"name": "data_dir",
|
||||
"type": "str",
|
||||
"title": "Appdata-map",
|
||||
"title": "Data directory",
|
||||
"default": "/opt/serverup/appdata",
|
||||
"required": true
|
||||
}
|
||||
|
|
@ -57,11 +44,7 @@
|
|||
"default": "",
|
||||
"required": false,
|
||||
"description": "Optioneel wachtwoord om de webinterface te beveiligen. Laat leeg voor geen beveiliging.",
|
||||
"config": {
|
||||
"placeholder": "sterk-wachtwoord"
|
||||
},
|
||||
"generate": true,
|
||||
"secret": true
|
||||
"config": {"placeholder": "sterk-wachtwoord"}
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,12 +0,0 @@
|
|||
services:
|
||||
<< service_name >>:
|
||||
image: ghcr.io/cleanuparr/cleanuparr:latest
|
||||
container_name: << service_name >>
|
||||
environment:
|
||||
- TZ=<< timezone >>
|
||||
volumes:
|
||||
- << appdata_dir >>/<< service_name >>:/config
|
||||
- << data_root >>:/data
|
||||
ports:
|
||||
- "<< port >>:11011"
|
||||
restart: unless-stopped
|
||||
|
|
@ -1,67 +0,0 @@
|
|||
{
|
||||
"kind": "compose",
|
||||
"metadata": {
|
||||
"name": "Cleanuparr",
|
||||
"description": "Ruimt dode en kwaadaardige torrents op, en downloads waar niemand meer naar verwijst.",
|
||||
"tags": [
|
||||
"downloaden",
|
||||
"onderhoud"
|
||||
],
|
||||
"icon": {
|
||||
"provider": "selfhst",
|
||||
"id": "cleanuparr"
|
||||
},
|
||||
"version": {
|
||||
"name": "latest"
|
||||
},
|
||||
"categories": [
|
||||
"downloaden",
|
||||
"beheer"
|
||||
]
|
||||
},
|
||||
"variables": [
|
||||
{
|
||||
"title": "Algemeen",
|
||||
"items": [
|
||||
{
|
||||
"name": "service_name",
|
||||
"type": "str",
|
||||
"title": "Servicenaam",
|
||||
"default": "cleanuparr",
|
||||
"required": true
|
||||
},
|
||||
{
|
||||
"name": "port",
|
||||
"type": "int",
|
||||
"title": "Webinterface",
|
||||
"default": 11011,
|
||||
"required": true
|
||||
},
|
||||
{
|
||||
"name": "appdata_dir",
|
||||
"type": "str",
|
||||
"title": "Appdata-map",
|
||||
"default": "/opt/serverup/appdata",
|
||||
"required": true,
|
||||
"description": "Basismap voor de instellingen van deze app"
|
||||
},
|
||||
{
|
||||
"name": "data_root",
|
||||
"type": "str",
|
||||
"title": "Gedeelde datamap",
|
||||
"default": "/mnt/data",
|
||||
"required": true,
|
||||
"description": "Eén map met je media én je downloads, 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
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
@ -1,12 +0,0 @@
|
|||
# De tunnel belt zelf naar buiten naar Cloudflare, dus er hoeft geen poort open
|
||||
# in je router en je publieke IP blijft onzichtbaar. Wat er door de tunnel
|
||||
# bereikbaar is, bepaal je in het Cloudflare-dashboard bij de tunnel zelf.
|
||||
services:
|
||||
<< service_name >>:
|
||||
image: cloudflare/cloudflared:latest
|
||||
container_name: << service_name >>
|
||||
command: tunnel --no-autoupdate run --token << tunnel_token >>
|
||||
environment:
|
||||
- TZ=<< timezone >>
|
||||
- TUNNEL_METRICS=0.0.0.0:2000
|
||||
restart: unless-stopped
|
||||
|
|
@ -1,31 +0,0 @@
|
|||
{
|
||||
"kind": "compose",
|
||||
"metadata": {
|
||||
"name": "Cloudflare Tunnel",
|
||||
"description": "Maak een app van buitenaf bereikbaar zonder een poort open te zetten. De tunnel belt zelf naar Cloudflare; je publieke IP blijft onzichtbaar en er komt niets ongevraagd binnen.",
|
||||
"tags": ["tunnel", "proxy", "op afstand", "netwerk", "cloudflare"],
|
||||
"icon": {"provider": "selfhst", "id": "cloudflare"},
|
||||
"version": {"name": "latest"},
|
||||
"categories": ["netwerk", "beveiliging"],
|
||||
"architectures": ["amd64", "arm64"]
|
||||
},
|
||||
"variables": [
|
||||
{
|
||||
"title": "Algemeen",
|
||||
"items": [
|
||||
{"name": "service_name", "type": "str", "title": "Servicenaam",
|
||||
"default": "cloudflared", "required": true},
|
||||
{"name": "timezone", "type": "str", "title": "Tijdzone",
|
||||
"default": "Europe/Amsterdam", "required": true}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Toegang",
|
||||
"items": [
|
||||
{"name": "tunnel_token", "type": "str", "title": "Tunneltoken",
|
||||
"default": "", "required": true, "secret": true, "eigen_invoer": true,
|
||||
"help": "Maak in het Zero Trust-dashboard van Cloudflare een tunnel aan; bij 'Docker' staat het token in het voorbeeldcommando. Koppel daar ook welke app op welk adres uitkomt."}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
@ -1,16 +0,0 @@
|
|||
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
|
||||
|
|
@ -1,93 +0,0 @@
|
|||
{
|
||||
"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
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
@ -1,15 +0,0 @@
|
|||
services:
|
||||
<< service_name >>:
|
||||
image: collabora/code:latest
|
||||
container_name: << service_name >>
|
||||
environment:
|
||||
- TZ=<< timezone >>
|
||||
- aliasgroup1=<< nextcloud_url >>
|
||||
- extra_params=--o:ssl.enable=false --o:ssl.termination=true
|
||||
- username=<< admin_user >>
|
||||
- password=<< admin_password >>
|
||||
ports:
|
||||
- "<< port >>:9980"
|
||||
cap_add:
|
||||
- MKNOD
|
||||
restart: unless-stopped
|
||||
|
|
@ -1,97 +0,0 @@
|
|||
{
|
||||
"kind": "compose",
|
||||
"metadata": {
|
||||
"name": "Collabora Online",
|
||||
"description": "Documenten, spreadsheets en presentaties bewerken in je browser, samen met anderen. Koppelt aan Nextcloud. Vervangt Google Docs en Microsoft Office.",
|
||||
"tags": [
|
||||
"documenten",
|
||||
"kantoor",
|
||||
"samenwerken"
|
||||
],
|
||||
"icon": {
|
||||
"provider": "selfhst",
|
||||
"id": "collabora"
|
||||
},
|
||||
"version": {
|
||||
"name": "latest"
|
||||
},
|
||||
"categories": [
|
||||
"documenten",
|
||||
"productiviteit"
|
||||
],
|
||||
"depends_on": [
|
||||
{
|
||||
"app": "nextcloud-aio",
|
||||
"reason": "Collabora is de bewerker; de bestanden en de gebruikers komen uit Nextcloud. Los draaiend heb je niets om te openen."
|
||||
}
|
||||
]
|
||||
},
|
||||
"variables": [
|
||||
{
|
||||
"title": "Algemeen",
|
||||
"items": [
|
||||
{
|
||||
"name": "service_name",
|
||||
"type": "str",
|
||||
"title": "Servicenaam",
|
||||
"default": "collabora",
|
||||
"required": true
|
||||
},
|
||||
{
|
||||
"name": "port",
|
||||
"type": "int",
|
||||
"title": "Webinterface",
|
||||
"default": 8201,
|
||||
"required": true,
|
||||
"description": "Standaard 9980; hier verplaatst omdat die poort al bezet is"
|
||||
},
|
||||
{
|
||||
"name": "timezone",
|
||||
"type": "str",
|
||||
"title": "Tijdzone",
|
||||
"default": "Europe/Amsterdam",
|
||||
"required": true
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Instellingen",
|
||||
"items": [
|
||||
{
|
||||
"name": "nextcloud_url",
|
||||
"type": "str",
|
||||
"title": "Adres van Nextcloud",
|
||||
"default": "https://cloud.example.com",
|
||||
"required": true,
|
||||
"connect": {
|
||||
"app": "nextcloud-aio",
|
||||
"scheme": "https",
|
||||
"port": 443
|
||||
},
|
||||
"help": "Collabora accepteert alleen verzoeken van dit adres. Klopt het niet, dan blijft de bewerker leeg."
|
||||
},
|
||||
{
|
||||
"name": "admin_user",
|
||||
"type": "str",
|
||||
"title": "Beheerdersnaam",
|
||||
"default": "admin",
|
||||
"required": true
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Toegang",
|
||||
"items": [
|
||||
{
|
||||
"name": "admin_password",
|
||||
"type": "str",
|
||||
"title": "Beheerderswachtwoord",
|
||||
"default": "",
|
||||
"required": true,
|
||||
"secret": true,
|
||||
"eigen_invoer": true
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
@ -1,12 +0,0 @@
|
|||
services:
|
||||
<< service_name >>:
|
||||
image: ghcr.io/ai-dock/comfyui:latest
|
||||
container_name: << service_name >>
|
||||
environment:
|
||||
- TZ=<< timezone >>
|
||||
volumes:
|
||||
- << appdata_dir >>/<< service_name >>:/opt/ComfyUI/models
|
||||
- << appdata_dir >>/<< service_name >>-output:/opt/ComfyUI/output
|
||||
ports:
|
||||
- "<< port >>:8188"
|
||||
restart: unless-stopped
|
||||
|
|
@ -1,63 +0,0 @@
|
|||
{
|
||||
"kind": "compose",
|
||||
"metadata": {
|
||||
"name": "ComfyUI",
|
||||
"description": "Beeldgeneratie met modellen die op je eigen machine draaien, opgebouwd als een schema dat je zelf aan elkaar klikt. Let op: Zonder videokaart die doorgegeven wordt aan de container draait dit op de processor, en dan duurt één afbeelding minuten in plaats van seconden.",
|
||||
"tags": [
|
||||
"ai",
|
||||
"beeld",
|
||||
"generatie"
|
||||
],
|
||||
"icon": {
|
||||
"provider": "selfhst",
|
||||
"id": "comfyui"
|
||||
},
|
||||
"version": {
|
||||
"name": "latest"
|
||||
},
|
||||
"categories": [
|
||||
"ai"
|
||||
],
|
||||
"architectures": [
|
||||
"amd64"
|
||||
],
|
||||
"architecture_note": "Een of meer containerimages van deze app worden alleen voor AMD64 gepubliceerd. Deze app werkt daardoor niet op een Raspberry Pi."
|
||||
},
|
||||
"variables": [
|
||||
{
|
||||
"title": "Algemeen",
|
||||
"items": [
|
||||
{
|
||||
"name": "service_name",
|
||||
"type": "str",
|
||||
"title": "Servicenaam",
|
||||
"default": "comfyui",
|
||||
"required": true
|
||||
},
|
||||
{
|
||||
"name": "port",
|
||||
"type": "int",
|
||||
"title": "Webinterface",
|
||||
"default": 8210,
|
||||
"required": true,
|
||||
"description": "Standaard 8188; 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
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
@ -1,9 +0,0 @@
|
|||
services:
|
||||
<< service_name >>:
|
||||
image: ghcr.io/raydak-labs/configarr:latest
|
||||
container_name: << service_name >>
|
||||
environment:
|
||||
- TZ=<< timezone >>
|
||||
volumes:
|
||||
- << appdata_dir >>/<< service_name >>:/app/config
|
||||
restart: unless-stopped
|
||||
|
|
@ -1,51 +0,0 @@
|
|||
{
|
||||
"kind": "compose",
|
||||
"metadata": {
|
||||
"name": "Configarr",
|
||||
"description": "Zelfde idee als Recyclarr, maar met eigen aanpassingen bovenop de TRaSH-gidsen.",
|
||||
"tags": [
|
||||
"media",
|
||||
"configuratie"
|
||||
],
|
||||
"icon": {
|
||||
"provider": "selfhst",
|
||||
"id": "configarr"
|
||||
},
|
||||
"version": {
|
||||
"name": "latest"
|
||||
},
|
||||
"categories": [
|
||||
"media",
|
||||
"beheer"
|
||||
]
|
||||
},
|
||||
"variables": [
|
||||
{
|
||||
"title": "Algemeen",
|
||||
"items": [
|
||||
{
|
||||
"name": "service_name",
|
||||
"type": "str",
|
||||
"title": "Servicenaam",
|
||||
"default": "configarr",
|
||||
"required": true
|
||||
},
|
||||
{
|
||||
"name": "appdata_dir",
|
||||
"type": "str",
|
||||
"title": "Appdata-map",
|
||||
"default": "/opt/serverup/appdata",
|
||||
"required": true,
|
||||
"description": "Basismap voor de instellingen van deze app"
|
||||
},
|
||||
{
|
||||
"name": "timezone",
|
||||
"type": "str",
|
||||
"title": "Tijdzone",
|
||||
"default": "Europe/Amsterdam",
|
||||
"required": true
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
@ -1,33 +0,0 @@
|
|||
services:
|
||||
<< service_name >>:
|
||||
image: hashicorp/consul:latest
|
||||
container_name: << service_name >>
|
||||
command:
|
||||
- agent
|
||||
- -server
|
||||
- -bootstrap-expect=1
|
||||
- -ui
|
||||
- -client=0.0.0.0
|
||||
- -advertise=<< advertise_ip >>
|
||||
- -http-port=<< port_http >>
|
||||
- -server-port=<< port_server >>
|
||||
- -serf-lan-port=<< port_lan >>
|
||||
- -serf-wan-port=<< port_wan >>
|
||||
- -dns-port=<< port_dns >>
|
||||
- -node=<< service_name >>
|
||||
environment:
|
||||
- CONSUL_BIND_INTERFACE=eth0
|
||||
ports:
|
||||
- "<< port_http >>:<< port_http >>"
|
||||
- "<< port_server >>:<< port_server >>"
|
||||
- "<< port_lan >>:<< port_lan >>/tcp"
|
||||
- "<< port_lan >>:<< port_lan >>/udp"
|
||||
- "<< port_wan >>:<< port_wan >>/tcp"
|
||||
- "<< port_wan >>:<< port_wan >>/udp"
|
||||
- "<< port_dns >>:<< port_dns >>/tcp"
|
||||
- "<< port_dns >>:<< port_dns >>/udp"
|
||||
volumes:
|
||||
- << appdata_dir >>/<< service_name >>:/consul/data
|
||||
cap_add:
|
||||
- IPC_LOCK
|
||||
restart: unless-stopped
|
||||
|
|
@ -1,33 +0,0 @@
|
|||
{
|
||||
"kind": "compose",
|
||||
"metadata": {
|
||||
"name": "Consul",
|
||||
"description": "Service discovery, DNS en healthchecks met een webinterface. Deze eenvoudige single-serveropzet is geschikt voor een thuislab; gebruik voor productie een oneven cluster van meerdere servers.",
|
||||
"tags": ["service discovery", "dns", "healthchecks", "hashicorp"],
|
||||
"icon": {"provider": "selfhst", "id": "consul"},
|
||||
"version": {"name": "latest"},
|
||||
"categories": ["netwerk", "beheer", "ontwikkeling"],
|
||||
"architectures": ["amd64", "arm64"],
|
||||
"architecture_note": "HashiCorp publiceert officiële Consul-images voor AMD64 en ARM64."
|
||||
},
|
||||
"variables": [
|
||||
{
|
||||
"title": "Algemeen",
|
||||
"items": [
|
||||
{"name": "service_name", "type": "str", "title": "Servicenaam", "default": "consul", "required": true},
|
||||
{"name": "appdata_dir", "type": "str", "title": "Appdata-map", "default": "/opt/serverup/appdata", "required": true},
|
||||
{"name": "advertise_ip", "type": "str", "title": "LAN-IP van deze server", "default": "", "required": true, "description": "Het bereikbare hostadres dat Consul aan agents doorgeeft, bijvoorbeeld 192.168.1.10."}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Poorten",
|
||||
"items": [
|
||||
{"name": "port_http", "type": "int", "title": "HTTP API en webinterface", "default": 8500, "required": true},
|
||||
{"name": "port_server", "type": "int", "title": "Server-RPC", "default": 8300, "required": true},
|
||||
{"name": "port_lan", "type": "int", "title": "LAN-gossip", "default": 8301, "required": true},
|
||||
{"name": "port_wan", "type": "int", "title": "WAN-gossip", "default": 8302, "required": true},
|
||||
{"name": "port_dns", "type": "int", "title": "DNS", "default": 8600, "required": true}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
@ -1,13 +0,0 @@
|
|||
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
|
||||
|
|
@ -1,73 +0,0 @@
|
|||
{
|
||||
"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"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
@ -1,14 +0,0 @@
|
|||
services:
|
||||
<< service_name >>:
|
||||
image: registry.gitlab.com/crafty-controller/crafty-4:latest
|
||||
container_name: << service_name >>
|
||||
environment:
|
||||
- TZ=<< timezone >>
|
||||
volumes:
|
||||
- << appdata_dir >>/<< service_name >>:/crafty/app/config
|
||||
- << appdata_dir >>/<< service_name >>-servers:/crafty/servers
|
||||
- << appdata_dir >>/<< service_name >>-backups:/crafty/backups
|
||||
ports:
|
||||
- "<< port >>:8443"
|
||||
- "<< port_spel >>:25565"
|
||||
restart: unless-stopped
|
||||
|
|
@ -1,68 +0,0 @@
|
|||
{
|
||||
"kind": "compose",
|
||||
"metadata": {
|
||||
"name": "Crafty Controller",
|
||||
"description": "Beheerpaneel voor gameservers: meerdere Minecraft-werelden naast elkaar, met back-ups, planning en rechten per gebruiker.",
|
||||
"tags": [
|
||||
"spellen",
|
||||
"minecraft",
|
||||
"gameserver"
|
||||
],
|
||||
"icon": {
|
||||
"provider": "selfhst",
|
||||
"id": "crafty"
|
||||
},
|
||||
"version": {
|
||||
"name": "latest"
|
||||
},
|
||||
"categories": [
|
||||
"spellen",
|
||||
"beheer"
|
||||
]
|
||||
},
|
||||
"variables": [
|
||||
{
|
||||
"title": "Algemeen",
|
||||
"items": [
|
||||
{
|
||||
"name": "service_name",
|
||||
"type": "str",
|
||||
"title": "Servicenaam",
|
||||
"default": "crafty",
|
||||
"required": true
|
||||
},
|
||||
{
|
||||
"name": "port",
|
||||
"type": "int",
|
||||
"title": "Webinterface",
|
||||
"default": 8206,
|
||||
"required": true,
|
||||
"description": "Standaard 8443; hier verplaatst omdat die poort al bezet is"
|
||||
},
|
||||
{
|
||||
"name": "port_spel",
|
||||
"type": "int",
|
||||
"title": "Speelpoort",
|
||||
"default": 25566,
|
||||
"required": true,
|
||||
"description": "Voor de eerste server; volgende krijgen 25566 en verder"
|
||||
},
|
||||
{
|
||||
"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
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
@ -1,13 +0,0 @@
|
|||
services:
|
||||
<< service_name >>:
|
||||
image: ghcr.io/cross-seed/cross-seed:latest
|
||||
container_name: << service_name >>
|
||||
environment:
|
||||
- TZ=<< timezone >>
|
||||
volumes:
|
||||
- << appdata_dir >>/<< service_name >>:/config
|
||||
- << data_root >>:/data
|
||||
command: daemon
|
||||
ports:
|
||||
- "<< port >>:2468"
|
||||
restart: unless-stopped
|
||||
|
|
@ -1,66 +0,0 @@
|
|||
{
|
||||
"kind": "compose",
|
||||
"metadata": {
|
||||
"name": "cross-seed",
|
||||
"description": "Zoekt dezelfde bestanden bij andere trackers, zodat je één download op meerdere plekken kunt seeden.",
|
||||
"tags": [
|
||||
"torrents",
|
||||
"downloaden"
|
||||
],
|
||||
"icon": {
|
||||
"provider": "selfhst",
|
||||
"id": "cross-seed"
|
||||
},
|
||||
"version": {
|
||||
"name": "latest"
|
||||
},
|
||||
"categories": [
|
||||
"downloaden"
|
||||
]
|
||||
},
|
||||
"variables": [
|
||||
{
|
||||
"title": "Algemeen",
|
||||
"items": [
|
||||
{
|
||||
"name": "service_name",
|
||||
"type": "str",
|
||||
"title": "Servicenaam",
|
||||
"default": "crossseed",
|
||||
"required": true
|
||||
},
|
||||
{
|
||||
"name": "port",
|
||||
"type": "int",
|
||||
"title": "Poort",
|
||||
"default": 2468,
|
||||
"required": true
|
||||
},
|
||||
{
|
||||
"name": "appdata_dir",
|
||||
"type": "str",
|
||||
"title": "Appdata-map",
|
||||
"default": "/opt/serverup/appdata",
|
||||
"required": true,
|
||||
"description": "Basismap voor de instellingen van deze app"
|
||||
},
|
||||
{
|
||||
"name": "data_root",
|
||||
"type": "str",
|
||||
"title": "Gedeelde datamap",
|
||||
"default": "/mnt/data",
|
||||
"required": true,
|
||||
"description": "Eén map met je media én je downloads, 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
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
@ -1,14 +0,0 @@
|
|||
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
|
||||
|
|
@ -1,72 +0,0 @@
|
|||
{
|
||||
"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"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
@ -1,15 +0,0 @@
|
|||
services:
|
||||
<< service_name >>:
|
||||
image: cryptpad/cryptpad:latest
|
||||
container_name: << service_name >>
|
||||
environment:
|
||||
- TZ=<< timezone >>
|
||||
- CPAD_MAIN_DOMAIN=<< hoofddomein >>
|
||||
- CPAD_SANDBOX_DOMAIN=<< sandbox_domein >>
|
||||
volumes:
|
||||
- << appdata_dir >>/<< service_name >>:/cryptpad/data
|
||||
- << appdata_dir >>/<< service_name >>-blob:/cryptpad/blob
|
||||
- << appdata_dir >>/<< service_name >>-block:/cryptpad/block
|
||||
ports:
|
||||
- "<< port >>:3000"
|
||||
restart: unless-stopped
|
||||
|
|
@ -1,82 +0,0 @@
|
|||
{
|
||||
"kind": "compose",
|
||||
"metadata": {
|
||||
"name": "CryptPad",
|
||||
"description": "Documenten, spreadsheets en presentaties die in je browser versleuteld worden. De server ziet alleen onleesbare blokken. Vervangt Google Docs.",
|
||||
"tags": [
|
||||
"documenten",
|
||||
"samenwerken",
|
||||
"privacy",
|
||||
"versleuteling"
|
||||
],
|
||||
"icon": {
|
||||
"provider": "selfhst",
|
||||
"id": "cryptpad"
|
||||
},
|
||||
"version": {
|
||||
"name": "latest"
|
||||
},
|
||||
"categories": [
|
||||
"documenten",
|
||||
"productiviteit"
|
||||
]
|
||||
},
|
||||
"variables": [
|
||||
{
|
||||
"title": "Algemeen",
|
||||
"items": [
|
||||
{
|
||||
"name": "service_name",
|
||||
"type": "str",
|
||||
"title": "Servicenaam",
|
||||
"default": "cryptpad",
|
||||
"required": true
|
||||
},
|
||||
{
|
||||
"name": "port",
|
||||
"type": "int",
|
||||
"title": "Webinterface",
|
||||
"default": 8190,
|
||||
"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": "hoofddomein",
|
||||
"type": "str",
|
||||
"title": "Hoofddomein",
|
||||
"default": "https://pad.example.com",
|
||||
"required": true
|
||||
},
|
||||
{
|
||||
"name": "sandbox_domein",
|
||||
"type": "str",
|
||||
"title": "Sandbox-domein",
|
||||
"default": "https://pad-sandbox.example.com",
|
||||
"required": true,
|
||||
"description": "Moet een ánder domein zijn dan het hoofddomein",
|
||||
"help": "CryptPad zet de documentbewerker in een aparte oorsprong, zodat een lek in de bewerker niet bij je sleutels kan. Twee keer hetzelfde domein invullen haalt die scheiding weg."
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
@ -1,9 +0,0 @@
|
|||
services:
|
||||
<< service_name >>:
|
||||
image: mpepping/cyberchef:latest
|
||||
container_name: << service_name >>
|
||||
ports:
|
||||
- "<< port >>:8000"
|
||||
environment:
|
||||
- TZ=<< timezone >>
|
||||
restart: unless-stopped
|
||||
|
|
@ -1,51 +0,0 @@
|
|||
{
|
||||
"kind": "compose",
|
||||
"metadata": {
|
||||
"name": "CyberChef",
|
||||
"description": "Zwitsers zakmes voor coderen, decoderen, hashen en data omzetten. Draait volledig lokaal.",
|
||||
"tags": [
|
||||
"hulpmiddel",
|
||||
"encoding",
|
||||
"ontwikkelaar"
|
||||
],
|
||||
"icon": {
|
||||
"provider": "selfhst",
|
||||
"id": "cyberchef"
|
||||
},
|
||||
"version": {
|
||||
"name": "latest"
|
||||
},
|
||||
"categories": [
|
||||
"ontwikkeling",
|
||||
"beveiliging"
|
||||
]
|
||||
},
|
||||
"variables": [
|
||||
{
|
||||
"title": "Algemeen",
|
||||
"items": [
|
||||
{
|
||||
"name": "service_name",
|
||||
"type": "str",
|
||||
"title": "Servicenaam",
|
||||
"default": "cyberchef",
|
||||
"required": true
|
||||
},
|
||||
{
|
||||
"name": "port",
|
||||
"type": "int",
|
||||
"title": "Web poort",
|
||||
"default": 8106,
|
||||
"required": true
|
||||
},
|
||||
{
|
||||
"name": "timezone",
|
||||
"type": "str",
|
||||
"title": "Tijdzone",
|
||||
"default": "Europe/Amsterdam",
|
||||
"required": true
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
@ -1,11 +0,0 @@
|
|||
services:
|
||||
<< service_name >>:
|
||||
image: lissy93/dashy:latest
|
||||
container_name: << service_name >>
|
||||
environment:
|
||||
- TZ=<< timezone >>
|
||||
volumes:
|
||||
- << appdata_dir >>/<< service_name >>:/app/user-data
|
||||
ports:
|
||||
- "<< port >>:8080"
|
||||
restart: unless-stopped
|
||||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue