Compare commits
No commits in common. "main" and "v0.8.12" have entirely different histories.
690 changed files with 1579 additions and 44859 deletions
24
.env.example
24
.env.example
|
|
@ -23,10 +23,6 @@ PORT=5000
|
|||
# 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.
|
||||
|
|
@ -35,26 +31,10 @@ PORT=5000
|
|||
|
||||
# ── 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.
|
||||
# Waar de stacks, appdata en backups komen te staan. Dit pad wordt in de
|
||||
# container op hetzelfde pad gemount, zodat compose-bestanden kloppen.
|
||||
#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
|
||||
|
|
|
|||
|
|
@ -40,7 +40,6 @@ jobs:
|
|||
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"
|
||||
|
|
@ -70,54 +69,6 @@ jobs:
|
|||
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
|
||||
|
|
@ -132,7 +83,6 @@ jobs:
|
|||
--pull \
|
||||
--build-arg "SU_VERSION=${VERSION}" \
|
||||
-t "${IMAGE}:${VERSION}" \
|
||||
-t "${IMAGE}:v${VERSION}" \
|
||||
-t "${IMAGE}:${EXTRA_TAG}" \
|
||||
.
|
||||
|
||||
|
|
@ -140,11 +90,8 @@ jobs:
|
|||
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}"
|
||||
echo "Gepusht: ${IMAGE}:${VERSION} en ${IMAGE}:${EXTRA_TAG}"
|
||||
|
||||
- name: Uitloggen
|
||||
if: always()
|
||||
|
|
|
|||
|
|
@ -57,54 +57,6 @@ jobs:
|
|||
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
|
||||
|
|
@ -146,8 +98,8 @@ jobs:
|
|||
|
||||
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
|
||||
sed -i '/^SU_TAG=/d' .env
|
||||
echo "SU_TAG=${VERSION}" >> .env
|
||||
echo "Inhoud van $(pwd)/.env:"
|
||||
grep -vE '^\s*(#|$)' .env | sed 's/^/ /'
|
||||
else
|
||||
|
|
@ -172,11 +124,6 @@ jobs:
|
|||
| 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"
|
||||
|
|
|
|||
|
|
@ -57,61 +57,6 @@ jobs:
|
|||
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
|
||||
|
|
@ -149,8 +94,8 @@ jobs:
|
|||
|
||||
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
|
||||
sed -i '/^SU_TAG=/d' .env
|
||||
echo "SU_TAG=${VERSION}" >> .env
|
||||
echo "Inhoud van $(pwd)/.env:"
|
||||
grep -vE '^\s*(#|$)' .env | sed 's/^/ /'
|
||||
else
|
||||
|
|
@ -169,49 +114,6 @@ jobs:
|
|||
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
|
||||
|
||||
- name: Deploy
|
||||
run: |
|
||||
set -euo pipefail
|
||||
|
|
@ -243,62 +145,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: |
|
||||
|
|
|
|||
3
.gitignore
vendored
3
.gitignore
vendored
|
|
@ -4,6 +4,3 @@ __pycache__/
|
|||
.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
|
||||
1642
CHANGELOG.md
1642
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
|
||||
62
Dockerfile
62
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,11 +35,9 @@ 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/
|
||||
COPY VERSION ./VERSION
|
||||
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 \
|
||||
|
|
@ -75,34 +65,10 @@ RUN mkdir -p /data/stacks /data/appdata /data/backups /data/git modules /root \
|
|||
# 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 \
|
||||
SU_SECRET=/data/secret.key \
|
||||
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
|
||||
|
||||
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"]
|
||||
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"
|
||||
|
|
|
|||
|
|
@ -16,7 +16,7 @@ IP-adres in je netwerk geven.
|
|||
|
||||
| | |
|
||||
|---|---|
|
||||
| **App-catalogus** | 286 kant-en-klare apps, ingedeeld in categorieën met kleur. Zoeken, filteren en installeren met een formulier in plaats van YAML. |
|
||||
| **App-catalogus** | 96 kant-en-klare apps, ingedeeld in categorieën met kleur. Zoeken, filteren en installeren met een formulier in plaats van YAML. |
|
||||
| **Stacks beheren** | Starten, stoppen, bijwerken en herstarten — per stack of per losse container, met logs en live CPU-/geheugengebruik. |
|
||||
| **Apps koppelen** | Stacks komen op een gedeeld netwerk, zodat ze elkaar op naam bereiken. Een veld dat naar een andere app verwijst toont een keuzelijst met wat je al draait. |
|
||||
| **Eigen IP per stack** | Met macvlan of ipvlan krijgt een app een eigen adres in je LAN in plaats van poorten op de host. |
|
||||
|
|
|
|||
2
VERSION
2
VERSION
|
|
@ -1 +1 @@
|
|||
0.8.31
|
||||
0.7.40-beta
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -39,9 +39,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
|
||||
|
|
|
|||
|
|
@ -33,9 +33,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,63 +1,26 @@
|
|||
# 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.
|
||||
# Aandachtspunten:
|
||||
# * Zet de download- en mediamap op hetzelfde bestandssysteem, anders kopieert
|
||||
# elke voltooide download in plaats van te verplaatsen (traag, dubbele opslag).
|
||||
# * 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
|
||||
<%- 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 >>/lidarr:/config
|
||||
- << data_root >>:/data
|
||||
- << data_dir >>/<< service_name >>/sonarr:/config
|
||||
- << media_dir >>/series:/tv
|
||||
- << downloads_dir >>:/downloads
|
||||
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"
|
||||
- "<< port_sonarr >>:8989"
|
||||
restart: unless-stopped
|
||||
<%- endif %>
|
||||
|
||||
|
|
@ -69,15 +32,32 @@ services:
|
|||
- PUID=<< puid >>
|
||||
- PGID=<< pgid >>
|
||||
- TZ=<< timezone >>
|
||||
- UMASK=002
|
||||
volumes:
|
||||
- << appdata_dir >>/<< service_name >>/radarr:/config
|
||||
- << data_root >>:/data
|
||||
- << data_dir >>/<< service_name >>/radarr:/config
|
||||
- << media_dir >>/films:/movies
|
||||
- << downloads_dir >>:/downloads
|
||||
ports:
|
||||
- "<< port_radarr >>:7878"
|
||||
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 >>
|
||||
volumes:
|
||||
- << data_dir >>/<< service_name >>/lidarr:/config
|
||||
- << media_dir >>/muziek:/music
|
||||
- << downloads_dir >>:/downloads
|
||||
ports:
|
||||
- "<< port_lidarr >>:8686"
|
||||
restart: unless-stopped
|
||||
<%- endif %>
|
||||
|
||||
<%- if enable_readarr %>
|
||||
<< service_name >>-readarr:
|
||||
image: lscr.io/linuxserver/readarr:develop
|
||||
|
|
@ -86,32 +66,15 @@ services:
|
|||
- PUID=<< puid >>
|
||||
- PGID=<< pgid >>
|
||||
- TZ=<< timezone >>
|
||||
- UMASK=002
|
||||
volumes:
|
||||
- << appdata_dir >>/<< service_name >>/readarr:/config
|
||||
- << data_root >>:/data
|
||||
- << data_dir >>/<< service_name >>/readarr:/config
|
||||
- << media_dir >>/boeken:/books
|
||||
- << downloads_dir >>:/downloads
|
||||
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
|
||||
|
|
@ -120,74 +83,15 @@ services:
|
|||
- PUID=<< puid >>
|
||||
- PGID=<< pgid >>
|
||||
- TZ=<< timezone >>
|
||||
- UMASK=002
|
||||
volumes:
|
||||
- << appdata_dir >>/<< service_name >>/whisparr:/config
|
||||
- << data_root >>:/data
|
||||
- << data_dir >>/<< service_name >>/whisparr:/config
|
||||
- << media_dir >>/volwassen:/adult
|
||||
- << downloads_dir >>:/downloads
|
||||
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
|
||||
|
|
@ -196,61 +100,88 @@ services:
|
|||
- PUID=<< puid >>
|
||||
- PGID=<< pgid >>
|
||||
- TZ=<< timezone >>
|
||||
- UMASK=002
|
||||
volumes:
|
||||
- << appdata_dir >>/<< service_name >>/prowlarr:/config
|
||||
- << data_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
|
||||
<%- 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 >>/deluge:/config
|
||||
- << data_root >>:/data
|
||||
<%- if enable_gluetun %>
|
||||
network_mode: "service:<< service_name >>-gluetun"
|
||||
depends_on:
|
||||
- << service_name >>-gluetun
|
||||
<%- endif %>
|
||||
<%- if not enable_gluetun %>
|
||||
- << data_dir >>/<< service_name >>/jackett:/config
|
||||
ports:
|
||||
- "<< port_deluge >>:8112"
|
||||
- "<< port_deluge_torrent >>:6881"
|
||||
- "<< port_deluge_torrent >>:6881/udp"
|
||||
<%- endif %>
|
||||
- "<< port_jackett >>:9117"
|
||||
restart: unless-stopped
|
||||
<%- endif %>
|
||||
|
||||
<%- if enable_nzbget %>
|
||||
<< service_name >>-nzbget:
|
||||
image: lscr.io/linuxserver/nzbget:latest
|
||||
container_name: << service_name >>-nzbget
|
||||
<%- 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 >>/nzbget:/config
|
||||
- << data_root >>:/data
|
||||
<%- if enable_gluetun %>
|
||||
network_mode: "service:<< service_name >>-gluetun"
|
||||
depends_on:
|
||||
- << service_name >>-gluetun
|
||||
<%- endif %>
|
||||
<%- if not enable_gluetun %>
|
||||
- << data_dir >>/<< service_name >>/bazarr:/config
|
||||
- << media_dir >>/films:/movies
|
||||
- << media_dir >>/series:/tv
|
||||
ports:
|
||||
- "<< port_bazarr >>:6767"
|
||||
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
|
||||
ports:
|
||||
- "<< port_flaresolverr >>:8191"
|
||||
restart: unless-stopped
|
||||
<%- endif %>
|
||||
|
||||
<%- if enable_gluetun %>
|
||||
<< service_name >>-gluetun:
|
||||
image: qmcgaw/gluetun:latest
|
||||
container_name: << service_name >>-gluetun
|
||||
cap_add:
|
||||
- NET_ADMIN
|
||||
devices:
|
||||
- /dev/net/tun:/dev/net/tun
|
||||
environment:
|
||||
- TZ=<< timezone >>
|
||||
- VPN_SERVICE_PROVIDER=<< vpn_provider >>
|
||||
- VPN_TYPE=<< vpn_type >>
|
||||
- WIREGUARD_PRIVATE_KEY=<< wireguard_private_key >>
|
||||
- WIREGUARD_ADDRESSES=<< wireguard_addresses >>
|
||||
- OPENVPN_USER=<< openvpn_user >>
|
||||
- OPENVPN_PASSWORD=<< openvpn_password >>
|
||||
ports:
|
||||
# De downloadclients delen dit netwerk, dus hun poorten staan hier.
|
||||
<%- if enable_qbittorrent %>
|
||||
- "<< port_qbittorrent >>:8090"
|
||||
- "<< port_qbittorrent_tcp >>:6881"
|
||||
- "<< port_qbittorrent_tcp >>:6881/udp"
|
||||
<%- endif %>
|
||||
<%- if enable_sabnzbd %>
|
||||
- "<< port_sabnzbd >>:8080"
|
||||
<%- endif %>
|
||||
<%- if enable_nzbget %>
|
||||
- "<< port_nzbget >>:6789"
|
||||
<%- endif %>
|
||||
volumes:
|
||||
- << data_dir >>/<< service_name >>/gluetun:/gluetun
|
||||
restart: unless-stopped
|
||||
<%- endif %>
|
||||
|
||||
|
|
@ -262,11 +193,10 @@ services:
|
|||
- PUID=<< puid >>
|
||||
- PGID=<< pgid >>
|
||||
- TZ=<< timezone >>
|
||||
- UMASK=002
|
||||
- WEBUI_PORT=8090
|
||||
volumes:
|
||||
- << appdata_dir >>/<< service_name >>/qbittorrent:/config
|
||||
- << data_root >>:/data
|
||||
- << data_dir >>/<< service_name >>/qbittorrent:/config
|
||||
- << downloads_dir >>:/downloads
|
||||
<%- if enable_gluetun %>
|
||||
network_mode: "service:<< service_name >>-gluetun"
|
||||
depends_on:
|
||||
|
|
@ -275,8 +205,8 @@ services:
|
|||
<%- if not enable_gluetun %>
|
||||
ports:
|
||||
- "<< port_qbittorrent >>:8090"
|
||||
- "<< port_qbittorrent_torrent >>:6881"
|
||||
- "<< port_qbittorrent_torrent >>:6881/udp"
|
||||
- "<< port_qbittorrent_tcp >>:6881"
|
||||
- "<< port_qbittorrent_tcp >>:6881/udp"
|
||||
<%- endif %>
|
||||
restart: unless-stopped
|
||||
<%- endif %>
|
||||
|
|
@ -289,10 +219,9 @@ services:
|
|||
- PUID=<< puid >>
|
||||
- PGID=<< pgid >>
|
||||
- TZ=<< timezone >>
|
||||
- UMASK=002
|
||||
volumes:
|
||||
- << appdata_dir >>/<< service_name >>/sabnzbd:/config
|
||||
- << data_root >>:/data
|
||||
- << data_dir >>/<< service_name >>/sabnzbd:/config
|
||||
- << downloads_dir >>:/downloads
|
||||
<%- if enable_gluetun %>
|
||||
network_mode: "service:<< service_name >>-gluetun"
|
||||
depends_on:
|
||||
|
|
@ -305,16 +234,17 @@ services:
|
|||
restart: unless-stopped
|
||||
<%- endif %>
|
||||
|
||||
<%- if enable_slskd %>
|
||||
<< service_name >>-slskd:
|
||||
image: slskd/slskd:latest
|
||||
container_name: << service_name >>-slskd
|
||||
<%- if enable_nzbget %>
|
||||
<< service_name >>-nzbget:
|
||||
image: lscr.io/linuxserver/nzbget:latest
|
||||
container_name: << service_name >>-nzbget
|
||||
environment:
|
||||
- PUID=<< puid >>
|
||||
- PGID=<< pgid >>
|
||||
- TZ=<< timezone >>
|
||||
- SLSKD_REMOTE_CONFIGURATION=true
|
||||
volumes:
|
||||
- << appdata_dir >>/<< service_name >>/slskd:/app
|
||||
- << data_root >>:/data
|
||||
- << data_dir >>/<< service_name >>/nzbget:/config
|
||||
- << downloads_dir >>:/downloads
|
||||
<%- if enable_gluetun %>
|
||||
network_mode: "service:<< service_name >>-gluetun"
|
||||
depends_on:
|
||||
|
|
@ -322,110 +252,11 @@ services:
|
|||
<%- endif %>
|
||||
<%- if not enable_gluetun %>
|
||||
ports:
|
||||
- "<< port_slskd >>:5030"
|
||||
- "<< port_slskd_listen >>:50300"
|
||||
- "<< port_nzbget >>:6789"
|
||||
<%- 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
|
||||
|
|
@ -434,412 +265,98 @@ services:
|
|||
- TZ=<< timezone >>
|
||||
- LOG_LEVEL=info
|
||||
volumes:
|
||||
- << appdata_dir >>/<< service_name >>/jellyseerr:/app/config
|
||||
- << data_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
|
||||
user: << puid >>:<< pgid >>
|
||||
environment:
|
||||
- TZ=<< timezone >>
|
||||
volumes:
|
||||
- << data_dir >>/<< service_name >>/recyclarr:/config
|
||||
restart: unless-stopped
|
||||
<%- endif %>
|
||||
|
||||
<%- if enable_unpackerr %>
|
||||
<< service_name >>-unpackerr:
|
||||
image: ghcr.io/unpackerr/unpackerr:latest
|
||||
container_name: << service_name >>-unpackerr
|
||||
user: << puid >>:<< pgid >>
|
||||
environment:
|
||||
- TZ=<< timezone >>
|
||||
- UN_SONARR_0_URL=http://<< service_name >>-sonarr:8989
|
||||
- UN_RADARR_0_URL=http://<< service_name >>-radarr:7878
|
||||
volumes:
|
||||
- << data_dir >>/<< service_name >>/unpackerr:/config
|
||||
- << downloads_dir >>:/downloads
|
||||
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 >>
|
||||
- serverIP=0.0.0.0
|
||||
- serverPort=8266
|
||||
- webUIPort=8265
|
||||
- internalNode=true
|
||||
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
|
||||
- << data_dir >>/<< service_name >>/tdarr/server:/app/server
|
||||
- << data_dir >>/<< service_name >>/tdarr/configs:/app/configs
|
||||
- << media_dir >>:/media
|
||||
- << downloads_dir >>/tdarr-cache:/temp
|
||||
ports:
|
||||
- "<< port_trailarr >>:7889"
|
||||
- "<< port_tdarr >>:8265"
|
||||
- "<< port_tdarr_server >>:8266"
|
||||
restart: unless-stopped
|
||||
<%- endif %>
|
||||
|
||||
<%- if enable_autopulse %>
|
||||
<< service_name >>-autopulse:
|
||||
image: ghcr.io/dan-online/autopulse:latest
|
||||
container_name: << service_name >>-autopulse
|
||||
<%- if enable_autobrr %>
|
||||
<< service_name >>-autobrr:
|
||||
image: ghcr.io/autobrr/autobrr:latest
|
||||
container_name: << service_name >>-autobrr
|
||||
environment:
|
||||
- TZ=<< timezone >>
|
||||
volumes:
|
||||
- << appdata_dir >>/<< service_name >>/autopulse:/app/config
|
||||
- << data_dir >>/<< service_name >>/autobrr:/config
|
||||
ports:
|
||||
- "<< port_autopulse >>:2875"
|
||||
- "<< port_autobrr >>:7474"
|
||||
restart: unless-stopped
|
||||
<%- endif %>
|
||||
|
||||
<%- if enable_exportarr %>
|
||||
<< service_name >>-exportarr:
|
||||
image: ghcr.io/onedr0p/exportarr:latest
|
||||
container_name: << service_name >>-exportarr
|
||||
<%- if enable_maintainerr %>
|
||||
<< service_name >>-maintainerr:
|
||||
image: ghcr.io/jorenn92/maintainerr:latest
|
||||
container_name: << service_name >>-maintainerr
|
||||
user: << puid >>:<< pgid >>
|
||||
environment:
|
||||
- TZ=<< timezone >>
|
||||
- URL=<< arr_url >>
|
||||
- APIKEY=<< arr_apikey >>
|
||||
- PORT=<< port_exportarr >>
|
||||
volumes:
|
||||
- << appdata_dir >>/<< service_name >>/exportarr:/config
|
||||
command: << arr_soort >>
|
||||
- << data_dir >>/<< service_name >>/maintainerr:/opt/data
|
||||
ports:
|
||||
- "<< port_exportarr >>:9707"
|
||||
- "<< port_maintainerr >>:6246"
|
||||
restart: unless-stopped
|
||||
<%- endif %>
|
||||
|
||||
<%- if enable_homarr %>
|
||||
<< service_name >>-homarr:
|
||||
image: ghcr.io/homarr-labs/homarr:latest
|
||||
container_name: << service_name >>-homarr
|
||||
<%- if enable_huntarr %>
|
||||
<< service_name >>-huntarr:
|
||||
image: ghcr.io/plexguide/huntarr:latest
|
||||
container_name: << service_name >>-huntarr
|
||||
environment:
|
||||
- TZ=<< timezone >>
|
||||
- SECRET_ENCRYPTION_KEY=<< homarr_encryption_key >>
|
||||
volumes:
|
||||
- << appdata_dir >>/<< service_name >>/homarr:/appdata
|
||||
- << data_dir >>/<< service_name >>/huntarr:/config
|
||||
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 %>
|
||||
- "<< port_huntarr >>:9705"
|
||||
restart: unless-stopped
|
||||
<%- endif %>
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
|
|
@ -8,6 +8,6 @@ services:
|
|||
- TZ=<< timezone >>
|
||||
volumes:
|
||||
- << media_dir >>:/audiobooks
|
||||
- << appdata_dir >>/<< service_name >>/config:/config
|
||||
- << appdata_dir >>/<< service_name >>/metadata:/metadata
|
||||
- << data_dir >>/<< service_name >>/config:/config
|
||||
- << data_dir >>/<< service_name >>/metadata:/metadata
|
||||
restart: unless-stopped
|
||||
|
|
|
|||
|
|
@ -38,9 +38,9 @@
|
|||
"required": true
|
||||
},
|
||||
{
|
||||
"name": "appdata_dir",
|
||||
"name": "data_dir",
|
||||
"type": "str",
|
||||
"title": "Appdata-map",
|
||||
"title": "Data directory",
|
||||
"default": "/opt/serverup/appdata",
|
||||
"required": true
|
||||
},
|
||||
|
|
|
|||
|
|
@ -11,5 +11,5 @@ services:
|
|||
- 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
|
||||
- << data_dir >>/<< service_name >>/config:/config
|
||||
restart: unless-stopped
|
||||
|
|
|
|||
|
|
@ -38,9 +38,9 @@
|
|||
"required": true
|
||||
},
|
||||
{
|
||||
"name": "appdata_dir",
|
||||
"name": "data_dir",
|
||||
"type": "str",
|
||||
"title": "Appdata-map",
|
||||
"title": "Data directory",
|
||||
"default": "/opt/serverup/appdata",
|
||||
"required": true
|
||||
},
|
||||
|
|
@ -61,9 +61,7 @@
|
|||
"config": {
|
||||
"placeholder": "sterk-wachtwoord"
|
||||
},
|
||||
"advanced": true,
|
||||
"generate": "auto",
|
||||
"secret": true
|
||||
"advanced": true
|
||||
},
|
||||
{
|
||||
"name": "session_secret",
|
||||
|
|
@ -75,9 +73,7 @@
|
|||
"config": {
|
||||
"placeholder": "sterk-wachtwoord"
|
||||
},
|
||||
"advanced": true,
|
||||
"generate": "auto",
|
||||
"secret": true
|
||||
"advanced": true
|
||||
},
|
||||
{
|
||||
"name": "storage_key",
|
||||
|
|
@ -89,9 +85,7 @@
|
|||
"config": {
|
||||
"placeholder": "sterk-wachtwoord"
|
||||
},
|
||||
"advanced": true,
|
||||
"generate": "auto",
|
||||
"secret": true
|
||||
"advanced": 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,6 +1,6 @@
|
|||
services:
|
||||
<< service_name >>:
|
||||
image: lscr.io/linuxserver/babybuddy:latest
|
||||
image: ghcr.io/babybuddy/babybuddy:latest
|
||||
container_name: << service_name >>
|
||||
ports:
|
||||
- "<< port >>:8000"
|
||||
|
|
@ -12,5 +12,5 @@ services:
|
|||
- ALLOWED_HOSTS=<< allowed_hosts >>
|
||||
- CSRF_TRUSTED_ORIGINS=http://<< allowed_hosts >>
|
||||
volumes:
|
||||
- << appdata_dir >>/<< service_name >>:/config
|
||||
- << data_dir >>/<< service_name >>/config:/app/data
|
||||
restart: unless-stopped
|
||||
|
|
|
|||
|
|
@ -38,9 +38,9 @@
|
|||
"required": true
|
||||
},
|
||||
{
|
||||
"name": "appdata_dir",
|
||||
"name": "data_dir",
|
||||
"type": "str",
|
||||
"title": "Appdata-map",
|
||||
"title": "Data directory",
|
||||
"default": "/opt/serverup/appdata",
|
||||
"required": true
|
||||
},
|
||||
|
|
@ -77,9 +77,7 @@
|
|||
"description": "Willekeurige waarde voor sessieversleuteling; gebruik de dobbelsteenknop",
|
||||
"config": {
|
||||
"placeholder": "willekeurige-lange-string"
|
||||
},
|
||||
"generate": "auto",
|
||||
"secret": true
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "allowed_hosts",
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
@ -10,8 +10,8 @@ services:
|
|||
- PGID=<< pgid >>
|
||||
- PORT=8000
|
||||
volumes:
|
||||
- << appdata_dir >>/<< service_name >>/data:/app/data
|
||||
- << appdata_dir >>/<< service_name >>/logs:/app/logs
|
||||
- << data_dir >>/<< service_name >>/data:/app/data
|
||||
- << data_dir >>/<< service_name >>/logs:/app/logs
|
||||
cap_add:
|
||||
- NET_BIND_SERVICE
|
||||
stop_grace_period: 30s
|
||||
|
|
|
|||
|
|
@ -38,9 +38,9 @@
|
|||
"required": true
|
||||
},
|
||||
{
|
||||
"name": "appdata_dir",
|
||||
"name": "data_dir",
|
||||
"type": "str",
|
||||
"title": "Appdata-map",
|
||||
"title": "Data directory",
|
||||
"default": "/opt/serverup/appdata",
|
||||
"required": true
|
||||
},
|
||||
|
|
|
|||
|
|
@ -8,5 +8,5 @@ services:
|
|||
- TZ=<< timezone >>
|
||||
- BASEROW_PUBLIC_URL=<< public_url >>
|
||||
volumes:
|
||||
- << appdata_dir >>/<< service_name >>:/baserow/data
|
||||
- << data_dir >>/<< service_name >>:/baserow/data
|
||||
restart: unless-stopped
|
||||
|
|
|
|||
|
|
@ -39,9 +39,9 @@
|
|||
"required": true
|
||||
},
|
||||
{
|
||||
"name": "appdata_dir",
|
||||
"name": "data_dir",
|
||||
"type": "str",
|
||||
"title": "Appdata-map",
|
||||
"title": "Data directory",
|
||||
"default": "/opt/serverup/appdata",
|
||||
"required": true
|
||||
},
|
||||
|
|
@ -56,10 +56,9 @@
|
|||
"name": "public_url",
|
||||
"type": "str",
|
||||
"title": "Publieke URL",
|
||||
"default": "http://localhost:8099",
|
||||
"default": "http://localhost:8098",
|
||||
"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"
|
||||
"description": "Zonder dit kloppen links en uploads niet"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
@ -7,7 +7,7 @@ services:
|
|||
environment:
|
||||
- TZ=<< timezone >>
|
||||
volumes:
|
||||
- << appdata_dir >>/<< service_name >>/data:/beszel_data
|
||||
- << data_dir >>/<< service_name >>/data:/beszel_data
|
||||
restart: unless-stopped
|
||||
|
||||
<< service_name >>-agent:
|
||||
|
|
|
|||
|
|
@ -38,9 +38,9 @@
|
|||
"required": true
|
||||
},
|
||||
{
|
||||
"name": "appdata_dir",
|
||||
"name": "data_dir",
|
||||
"type": "str",
|
||||
"title": "Appdata-map",
|
||||
"title": "Data directory",
|
||||
"default": "/opt/serverup/appdata",
|
||||
"required": true
|
||||
},
|
||||
|
|
|
|||
|
|
@ -15,7 +15,7 @@ services:
|
|||
- DB_PASSWORD=<< db_password >>
|
||||
- DB_DATABASE=bookstack
|
||||
volumes:
|
||||
- << appdata_dir >>/<< service_name >>/config:/config
|
||||
- << data_dir >>/<< service_name >>/config:/config
|
||||
depends_on:
|
||||
- << service_name >>-db
|
||||
restart: unless-stopped
|
||||
|
|
@ -32,5 +32,5 @@ services:
|
|||
- MYSQL_USER=bookstack
|
||||
- MYSQL_PASSWORD=<< db_password >>
|
||||
volumes:
|
||||
- << appdata_dir >>/<< service_name >>/db:/config
|
||||
- << data_dir >>/<< service_name >>/db:/config
|
||||
restart: unless-stopped
|
||||
|
|
|
|||
|
|
@ -38,9 +38,9 @@
|
|||
"required": true
|
||||
},
|
||||
{
|
||||
"name": "appdata_dir",
|
||||
"name": "data_dir",
|
||||
"type": "str",
|
||||
"title": "Appdata-map",
|
||||
"title": "Data directory",
|
||||
"default": "/opt/serverup/appdata",
|
||||
"required": true
|
||||
},
|
||||
|
|
@ -78,9 +78,7 @@
|
|||
"config": {
|
||||
"placeholder": "sterk-wachtwoord"
|
||||
},
|
||||
"advanced": true,
|
||||
"generate": "auto",
|
||||
"secret": true
|
||||
"advanced": true
|
||||
},
|
||||
{
|
||||
"name": "app_url",
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
@ -10,7 +10,7 @@ services:
|
|||
- TZ=<< timezone >>
|
||||
volumes:
|
||||
# Zet hier je Caddyfile neer; Caddy regelt de certificaten daarna zelf.
|
||||
- << appdata_dir >>/<< service_name >>/Caddyfile:/etc/caddy/Caddyfile
|
||||
- << data_dir >>/<< service_name >>/Caddyfile:/etc/caddy/Caddyfile
|
||||
- << service_name >>_data:/data
|
||||
- << service_name >>_config:/config
|
||||
restart: unless-stopped
|
||||
|
|
|
|||
|
|
@ -40,9 +40,9 @@
|
|||
"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",
|
||||
"name": "data_dir",
|
||||
"type": "str",
|
||||
"title": "Appdata-map",
|
||||
"title": "Data directory",
|
||||
"default": "/opt/serverup/appdata",
|
||||
"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
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
@ -9,6 +9,6 @@ services:
|
|||
- PUID=<< puid >>
|
||||
- PGID=<< pgid >>
|
||||
volumes:
|
||||
- << appdata_dir >>/<< service_name >>/config:/config
|
||||
- << data_dir >>/<< service_name >>/config:/config
|
||||
- << books_dir >>:/books
|
||||
restart: unless-stopped
|
||||
|
|
|
|||
|
|
@ -39,9 +39,9 @@
|
|||
"required": true
|
||||
},
|
||||
{
|
||||
"name": "appdata_dir",
|
||||
"name": "data_dir",
|
||||
"type": "str",
|
||||
"title": "Appdata-map",
|
||||
"title": "Data directory",
|
||||
"default": "/opt/serverup/appdata",
|
||||
"required": true
|
||||
},
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -39,9 +39,9 @@
|
|||
"required": true
|
||||
},
|
||||
{
|
||||
"name": "appdata_dir",
|
||||
"name": "data_dir",
|
||||
"type": "str",
|
||||
"title": "Appdata-map",
|
||||
"title": "Data directory",
|
||||
"default": "/opt/serverup/appdata",
|
||||
"required": true
|
||||
}
|
||||
|
|
@ -59,9 +59,7 @@
|
|||
"description": "Optioneel wachtwoord om de webinterface te beveiligen. Laat leeg voor geen beveiliging.",
|
||||
"config": {
|
||||
"placeholder": "sterk-wachtwoord"
|
||||
},
|
||||
"generate": true,
|
||||
"secret": true
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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,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
|
||||
|
|
@ -1,59 +0,0 @@
|
|||
{
|
||||
"kind": "compose",
|
||||
"metadata": {
|
||||
"name": "Dashy",
|
||||
"description": "Startpagina met statuscontrole per dienst, thema's en widgets. Alles staat in één configuratiebestand dat je ook met de hand kunt bijwerken.",
|
||||
"tags": [
|
||||
"dashboard",
|
||||
"startpagina",
|
||||
"overzicht"
|
||||
],
|
||||
"icon": {
|
||||
"provider": "selfhst",
|
||||
"id": "dashy"
|
||||
},
|
||||
"version": {
|
||||
"name": "latest"
|
||||
},
|
||||
"categories": [
|
||||
"beheer"
|
||||
]
|
||||
},
|
||||
"variables": [
|
||||
{
|
||||
"title": "Algemeen",
|
||||
"items": [
|
||||
{
|
||||
"name": "service_name",
|
||||
"type": "str",
|
||||
"title": "Servicenaam",
|
||||
"default": "dashy",
|
||||
"required": true
|
||||
},
|
||||
{
|
||||
"name": "port",
|
||||
"type": "int",
|
||||
"title": "Webinterface",
|
||||
"default": 8252,
|
||||
"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
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
@ -1,40 +0,0 @@
|
|||
services:
|
||||
<< service_name >>:
|
||||
image: freikin/dawarich:latest
|
||||
container_name: << service_name >>
|
||||
environment:
|
||||
- RAILS_ENV=development
|
||||
- DATABASE_HOST=<< service_name >>-db
|
||||
- DATABASE_USERNAME=dawarich
|
||||
- DATABASE_PASSWORD=<< db_password >>
|
||||
- DATABASE_NAME=dawarich
|
||||
- REDIS_URL=redis://<< service_name >>-redis:6379
|
||||
- APPLICATION_HOSTS=<< app_hosts >>
|
||||
- TIME_ZONE=<< timezone >>
|
||||
- SECRET_KEY_BASE=<< secret_key_base >>
|
||||
volumes:
|
||||
- << appdata_dir >>/<< service_name >>:/var/app/public
|
||||
command: ["web-entrypoint.sh", "bin/rails", "server", "-p", "3000", "-b", "::"]
|
||||
ports:
|
||||
- "<< port >>:3000"
|
||||
depends_on:
|
||||
- << service_name >>-db
|
||||
- << service_name >>-redis
|
||||
restart: unless-stopped
|
||||
<< service_name >>-db:
|
||||
image: postgis/postgis:16-3.4-alpine
|
||||
container_name: << service_name >>-db
|
||||
environment:
|
||||
- POSTGRES_DB=dawarich
|
||||
- POSTGRES_USER=dawarich
|
||||
- POSTGRES_PASSWORD=<< db_password >>
|
||||
volumes:
|
||||
- << appdata_dir >>/<< service_name >>-db:/var/lib/postgresql/data
|
||||
restart: unless-stopped
|
||||
<< service_name >>-redis:
|
||||
image: valkey/valkey:8-alpine
|
||||
container_name: << service_name >>-redis
|
||||
command: valkey-server --save 60 1
|
||||
volumes:
|
||||
- << appdata_dir >>/<< service_name >>-redis:/data
|
||||
restart: unless-stopped
|
||||
|
|
@ -1,101 +0,0 @@
|
|||
{
|
||||
"kind": "compose",
|
||||
"metadata": {
|
||||
"name": "Dawarich",
|
||||
"description": "Je eigen locatiegeschiedenis, als vervanging van Google Maps Timeline. Importeert je oude Google-export.",
|
||||
"tags": [
|
||||
"locatie",
|
||||
"kaart",
|
||||
"privacy"
|
||||
],
|
||||
"icon": {
|
||||
"provider": "selfhst",
|
||||
"id": "dawarich"
|
||||
},
|
||||
"version": {
|
||||
"name": "latest"
|
||||
},
|
||||
"categories": [
|
||||
"gezin",
|
||||
"beveiliging"
|
||||
],
|
||||
"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": "dawarich",
|
||||
"required": true
|
||||
},
|
||||
{
|
||||
"name": "port",
|
||||
"type": "int",
|
||||
"title": "Webinterface",
|
||||
"default": 8152,
|
||||
"required": true,
|
||||
"description": "Standaard 3000; hier verplaatst omdat die poort al bezet is"
|
||||
},
|
||||
{
|
||||
"name": "appdata_dir",
|
||||
"type": "str",
|
||||
"title": "Appdata-map",
|
||||
"default": "/opt/serverup/appdata",
|
||||
"required": true,
|
||||
"description": "Basismap voor de gegevens van deze app"
|
||||
},
|
||||
{
|
||||
"name": "timezone",
|
||||
"type": "str",
|
||||
"title": "Tijdzone",
|
||||
"default": "Europe/Amsterdam",
|
||||
"required": true
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Instellingen",
|
||||
"items": [
|
||||
{
|
||||
"name": "app_hosts",
|
||||
"type": "str",
|
||||
"title": "Toegestane adressen",
|
||||
"default": "localhost",
|
||||
"required": true,
|
||||
"description": "Komma-gescheiden; Rails weigert verzoeken van andere namen"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Toegang",
|
||||
"items": [
|
||||
{
|
||||
"name": "db_password",
|
||||
"type": "str",
|
||||
"title": "Databasewachtwoord",
|
||||
"default": "",
|
||||
"required": true,
|
||||
"secret": true,
|
||||
"generate": "auto",
|
||||
"description": "Wordt automatisch ingevuld en in .env bewaard"
|
||||
},
|
||||
{
|
||||
"name": "secret_key_base",
|
||||
"type": "str",
|
||||
"title": "Rails-sleutel",
|
||||
"default": "",
|
||||
"required": true,
|
||||
"secret": true,
|
||||
"generate": "auto"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
@ -1,14 +0,0 @@
|
|||
services:
|
||||
<< service_name >>:
|
||||
image: ghcr.io/manimatter/decluttarr:latest
|
||||
container_name: << service_name >>
|
||||
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 >>:/config
|
||||
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