Compare commits

..

No commits in common. "5c174cecbcc1200dacdd1ec466c2092269669c33" and "9fb96fe1bcf2d7b35a3d529422d902494d54e5ab" have entirely different histories.

18 changed files with 18 additions and 760 deletions

View file

@ -1,94 +0,0 @@
name: Deploy server-up (prod)
on:
push:
branches: [main]
tags: ['v*']
workflow_dispatch:
concurrency:
group: server-up-deploy-prod
cancel-in-progress: false
jobs:
deploy:
runs-on: [self-hosted, prod]
timeout-minutes: 20
env:
DEPLOY_DIR: /opt/server-up
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 1
- name: Bepaal versie
id: version
run: |
set -euo pipefail
if [[ "${GITHUB_REF}" == refs/tags/* ]]; then
VERSION="${GITHUB_REF_NAME}"
CHANNEL="release"
else
VERSION="main-${GITHUB_SHA:0:8}"
CHANNEL="main"
fi
echo "VERSION=${VERSION}" >> "$GITHUB_ENV"
echo "CHANNEL=${CHANNEL}" >> "$GITHUB_ENV"
echo "SU_VERSION=${VERSION}" >> "$GITHUB_ENV"
echo "Deploying version: ${VERSION} (${CHANNEL})"
- name: Sync code naar deploy-directory
run: |
set -euo pipefail
rsync -a --delete \
--exclude='.git/' \
--exclude='.forgejo/' \
./ "$DEPLOY_DIR/"
- name: Schrijf VERSION-bestand
working-directory: ${{ env.DEPLOY_DIR }}
run: echo "${VERSION}" > VERSION
- name: Build image
working-directory: ${{ env.DEPLOY_DIR }}
run: |
docker compose build --pull
# docker compose bouwt als server-up:latest; voeg versie- en channel-tags toe
docker tag server-up:latest "server-up:${VERSION}"
docker tag server-up:latest "server-up:${CHANNEL}"
- name: Deploy
working-directory: ${{ env.DEPLOY_DIR }}
run: |
set -euo pipefail
docker compose up -d --remove-orphans
docker compose ps
- name: Wachten op healthcheck
run: |
set -euo pipefail
for i in {1..40}; do
status=$(docker inspect --format '{{.State.Health.Status}}' server-up 2>/dev/null || echo "starting")
echo "poll $i: $status"
if [ "$status" = "healthy" ]; then
echo "server-up is healthy als versie ${VERSION}"
exit 0
fi
sleep 3
done
echo "server-up werd niet healthy in tijd — logs:"
cd "$DEPLOY_DIR" && docker compose logs --tail=200
exit 1
- name: Oude images opruimen (behoud laatste 5)
if: success()
run: |
docker images server-up --format '{{.Tag}} {{.ID}}' \
| grep -vE '^(latest|release|main) ' \
| tail -n +6 \
| awk '{print $2}' \
| xargs -r docker rmi -f || true
docker image prune -f

View file

@ -1,21 +1,22 @@
name: Deploy server-up (dev)
name: Deploy server-up
on:
push:
branches: [dev]
branches: [main]
tags: ['v*']
workflow_dispatch:
concurrency:
group: server-up-deploy-dev
group: server-up-deploy
cancel-in-progress: false
jobs:
deploy:
runs-on: [self-hosted, dev]
runs-on: self-hosted
timeout-minutes: 20
env:
DEPLOY_DIR: /opt/docker/server-up
DEPLOY_DIR: /opt/server-up
steps:
- name: Checkout
@ -36,14 +37,12 @@ jobs:
fi
echo "VERSION=${VERSION}" >> "$GITHUB_ENV"
echo "CHANNEL=${CHANNEL}" >> "$GITHUB_ENV"
# SU_VERSION wordt door docker compose gebruikt als build-arg
echo "SU_VERSION=${VERSION}" >> "$GITHUB_ENV"
echo "Deploying version: ${VERSION} (${CHANNEL})"
- name: Sync code naar deploy-directory
run: |
set -euo pipefail
rsync -a --no-group --delete \
rsync -a --delete \
--exclude='.git/' \
--exclude='.forgejo/' \
./ "$DEPLOY_DIR/"
@ -56,9 +55,9 @@ jobs:
working-directory: ${{ env.DEPLOY_DIR }}
run: |
docker compose build --pull
# docker compose bouwt als server-up:latest; voeg versie- en channel-tags toe
docker tag server-up:latest "server-up:${VERSION}"
docker tag server-up:latest "server-up:${CHANNEL}"
# Extra tags zodat 'latest' altijd op de laatste deploy wijst
docker tag "server-up:${VERSION}" server-up:latest
docker tag "server-up:${VERSION}" "server-up:${CHANNEL}"
- name: Deploy
working-directory: ${{ env.DEPLOY_DIR }}

View file

@ -1,99 +0,0 @@
services:
<< service_name >>-radarr:
image: lscr.io/linuxserver/radarr:latest
container_name: << service_name >>-radarr
environment:
- PUID=<< puid >>
- PGID=<< pgid >>
- TZ=<< timezone >>
volumes:
- << data_dir >>/<< service_name >>/radarr:/config
- << media_dir >>/films:/movies
- << downloads_dir >>:/downloads
ports:
- "<< port_radarr >>:7878"
restart: unless-stopped
<< service_name >>-sonarr:
image: lscr.io/linuxserver/sonarr:latest
container_name: << service_name >>-sonarr
environment:
- PUID=<< puid >>
- PGID=<< pgid >>
- TZ=<< timezone >>
volumes:
- << data_dir >>/<< service_name >>/sonarr:/config
- << media_dir >>/series:/tv
- << downloads_dir >>:/downloads
ports:
- "<< port_sonarr >>:8989"
restart: unless-stopped
<< 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
<< service_name >>-readarr:
image: lscr.io/linuxserver/readarr:develop
container_name: << service_name >>-readarr
environment:
- PUID=<< puid >>
- PGID=<< pgid >>
- TZ=<< timezone >>
volumes:
- << data_dir >>/<< service_name >>/readarr:/config
- << media_dir >>/boeken:/books
- << downloads_dir >>:/downloads
ports:
- "<< port_readarr >>:8787"
restart: unless-stopped
<< service_name >>-prowlarr:
image: lscr.io/linuxserver/prowlarr:latest
container_name: << service_name >>-prowlarr
environment:
- PUID=<< puid >>
- PGID=<< pgid >>
- TZ=<< timezone >>
volumes:
- << data_dir >>/<< service_name >>/prowlarr:/config
ports:
- "<< port_prowlarr >>:9696"
restart: unless-stopped
<< service_name >>-bazarr:
image: lscr.io/linuxserver/bazarr:latest
container_name: << service_name >>-bazarr
environment:
- PUID=<< puid >>
- PGID=<< pgid >>
- TZ=<< timezone >>
volumes:
- << data_dir >>/<< service_name >>/bazarr:/config
- << media_dir >>/films:/movies
- << media_dir >>/series:/tv
ports:
- "<< port_bazarr >>:6767"
restart: unless-stopped
<< service_name >>-jellyseerr:
image: fallenbagel/jellyseerr:latest
container_name: << service_name >>-jellyseerr
environment:
- TZ=<< timezone >>
volumes:
- << data_dir >>/<< service_name >>/jellyseerr:/app/config
ports:
- "<< port_jellyseerr >>:5055"
restart: unless-stopped

View file

@ -1,132 +0,0 @@
{
"kind": "compose",
"metadata": {
"name": "ARR-stack",
"description": "Complete media-automatiseringsstack: Radarr (films), Sonarr (series), Lidarr (muziek), Readarr (boeken), Prowlarr (indexers), Bazarr (ondertitels) en Jellyseerr (verzoeken).",
"tags": ["media", "automatisering", "radarr", "sonarr", "prowlarr", "bazarr", "jellyseerr"],
"icon": {"provider": "selfhst", "id": "radarr"},
"version": {"name": "latest"}
},
"variables": [
{
"title": "Algemeen",
"items": [
{
"name": "service_name",
"type": "str",
"title": "Servicenaam (prefix)",
"default": "arr",
"required": true,
"description": "Prefix voor alle containers in de stack, bijv. 'arr' geeft arr-radarr, arr-sonarr, etc."
},
{
"name": "data_dir",
"type": "str",
"title": "Config directory",
"default": "/opt/serverup/appdata",
"required": true,
"description": "Basismap voor configuratiebestanden van alle ARR-apps"
},
{
"name": "media_dir",
"type": "str",
"title": "Media directory",
"default": "/mnt/media",
"required": true,
"description": "Map voor films, series en muziek. Moet ook zichtbaar zijn voor de download-client."
},
{
"name": "downloads_dir",
"type": "str",
"title": "Downloads directory",
"default": "/mnt/downloads",
"required": true,
"description": "Map waar de download-client bestanden neerzet (qBittorrent of SABnzbd). Moet overeenkomen met het pad in de download-client."
},
{
"name": "timezone",
"type": "str",
"title": "Tijdzone",
"default": "Europe/Amsterdam",
"required": true
}
]
},
{
"title": "Gebruiker",
"items": [
{
"name": "puid",
"type": "int",
"title": "PUID",
"default": 1000,
"required": true,
"description": "User ID van de systeemgebruiker (id -u)"
},
{
"name": "pgid",
"type": "int",
"title": "PGID",
"default": 1000,
"required": true,
"description": "Group ID van de systeemgebruiker (id -g)"
}
]
},
{
"title": "Poorten",
"items": [
{
"name": "port_radarr",
"type": "int",
"title": "Radarr poort",
"default": 7878,
"required": true
},
{
"name": "port_sonarr",
"type": "int",
"title": "Sonarr poort",
"default": 8989,
"required": true
},
{
"name": "port_lidarr",
"type": "int",
"title": "Lidarr poort",
"default": 8686,
"required": true
},
{
"name": "port_readarr",
"type": "int",
"title": "Readarr poort",
"default": 8787,
"required": true
},
{
"name": "port_prowlarr",
"type": "int",
"title": "Prowlarr poort",
"default": 9696,
"required": true
},
{
"name": "port_bazarr",
"type": "int",
"title": "Bazarr poort",
"default": 6767,
"required": true
},
{
"name": "port_jellyseerr",
"type": "int",
"title": "Jellyseerr poort",
"default": 5055,
"required": true,
"description": "Webinterface voor gebruikers om films en series aan te vragen"
}
]
}
]
}

View file

@ -6,8 +6,8 @@ services:
- "<< port_web >>:3000"
- "<< port_ssh >>:22"
environment:
- USER_UID=<< puid >>
- USER_GID=<< pgid >>
- USER_UID=1000
- USER_GID=1000
- FORGEJO__server__SSH_PORT=<< port_ssh >>
- TZ=<< timezone >>
volumes:

View file

@ -34,27 +34,6 @@
}
]
},
{
"title": "Gebruiker",
"items": [
{
"name": "puid",
"type": "int",
"title": "PUID",
"default": 1000,
"required": true,
"description": "User ID van de systeemgebruiker (id -u)"
},
{
"name": "pgid",
"type": "int",
"title": "PGID",
"default": 1000,
"required": true,
"description": "Group ID van de systeemgebruiker (id -g)"
}
]
},
{
"title": "Poorten",
"items": [

View file

@ -6,8 +6,8 @@ services:
- "<< port >>:32400"
environment:
- TZ=<< timezone >>
- PUID=<< puid >>
- PGID=<< pgid >>
- PUID=1000
- PGID=1000
<% if plex_claim %>
- PLEX_CLAIM=<< plex_claim >>
<% endif %>

View file

@ -42,27 +42,6 @@
}
]
},
{
"title": "Gebruiker",
"items": [
{
"name": "puid",
"type": "int",
"title": "PUID",
"default": 1000,
"required": true,
"description": "User ID van de systeemgebruiker (id -u)"
},
{
"name": "pgid",
"type": "int",
"title": "PGID",
"default": 1000,
"required": true,
"description": "Group ID van de systeemgebruiker (id -g)"
}
]
},
{
"title": "Media",
"items": [

View file

@ -1,17 +0,0 @@
services:
<< service_name >>:
image: lscr.io/linuxserver/qbittorrent:latest
container_name: << service_name >>
environment:
- PUID=<< puid >>
- PGID=<< pgid >>
- TZ=<< timezone >>
- WEBUI_PORT=<< port_ui >>
volumes:
- << data_dir >>/<< service_name >>/config:/config
- << downloads_dir >>:/downloads
ports:
- "<< port_ui >>:<< port_ui >>"
- "<< port_torrent >>:6881"
- "<< port_torrent >>:6881/udp"
restart: unless-stopped

View file

@ -1,83 +0,0 @@
{
"kind": "compose",
"metadata": {
"name": "qBittorrent",
"description": "Open-source torrent-client met webinterface. Werkt goed samen met de ARR-stack.",
"tags": ["downloaden", "torrents", "media"],
"icon": {"provider": "selfhst", "id": "qbittorrent"},
"version": {"name": "latest"}
},
"variables": [
{
"title": "Algemeen",
"items": [
{
"name": "service_name",
"type": "str",
"title": "Servicenaam",
"default": "qbittorrent",
"required": true
},
{
"name": "port_ui",
"type": "int",
"title": "Web UI poort",
"default": 8080,
"required": true,
"description": "Poort voor de webinterface"
},
{
"name": "port_torrent",
"type": "int",
"title": "Torrent poort",
"default": 6881,
"required": true,
"description": "Poort voor torrent-verbindingen (TCP en UDP). Zet deze poort open in je firewall/router voor betere download-snelheid."
},
{
"name": "data_dir",
"type": "str",
"title": "Config directory",
"default": "/opt/serverup/appdata",
"required": true
},
{
"name": "downloads_dir",
"type": "str",
"title": "Downloads directory",
"default": "/mnt/downloads",
"required": true,
"description": "Map waar downloads worden opgeslagen. Gebruik hetzelfde pad als in Radarr/Sonarr."
},
{
"name": "timezone",
"type": "str",
"title": "Tijdzone",
"default": "Europe/Amsterdam",
"required": true
}
]
},
{
"title": "Gebruiker",
"items": [
{
"name": "puid",
"type": "int",
"title": "PUID",
"default": 1000,
"required": true,
"description": "User ID van de systeemgebruiker (id -u)"
},
{
"name": "pgid",
"type": "int",
"title": "PGID",
"default": 1000,
"required": true,
"description": "Group ID van de systeemgebruiker (id -g)"
}
]
}
]
}

View file

@ -1,14 +0,0 @@
services:
<< service_name >>:
image: lscr.io/linuxserver/sabnzbd:latest
container_name: << service_name >>
environment:
- PUID=<< puid >>
- PGID=<< pgid >>
- TZ=<< timezone >>
volumes:
- << data_dir >>/<< service_name >>/config:/config
- << downloads_dir >>:/downloads
ports:
- "<< port >>:8080"
restart: unless-stopped

View file

@ -1,75 +0,0 @@
{
"kind": "compose",
"metadata": {
"name": "SABnzbd",
"description": "Usenet download-client met webinterface. Werkt samen met de ARR-stack voor automatisch downloaden via Usenet.",
"tags": ["downloaden", "usenet", "nzb", "media"],
"icon": {"provider": "selfhst", "id": "sabnzbd"},
"version": {"name": "latest"}
},
"variables": [
{
"title": "Algemeen",
"items": [
{
"name": "service_name",
"type": "str",
"title": "Servicenaam",
"default": "sabnzbd",
"required": true
},
{
"name": "port",
"type": "int",
"title": "Web UI poort",
"default": 8081,
"required": true,
"description": "Poort voor de webinterface"
},
{
"name": "data_dir",
"type": "str",
"title": "Config directory",
"default": "/opt/serverup/appdata",
"required": true
},
{
"name": "downloads_dir",
"type": "str",
"title": "Downloads directory",
"default": "/mnt/downloads",
"required": true,
"description": "Map waar downloads worden opgeslagen. Gebruik hetzelfde pad als in Radarr/Sonarr."
},
{
"name": "timezone",
"type": "str",
"title": "Tijdzone",
"default": "Europe/Amsterdam",
"required": true
}
]
},
{
"title": "Gebruiker",
"items": [
{
"name": "puid",
"type": "int",
"title": "PUID",
"default": 1000,
"required": true,
"description": "User ID van de systeemgebruiker (id -u)"
},
{
"name": "pgid",
"type": "int",
"title": "PGID",
"default": 1000,
"required": true,
"description": "Group ID van de systeemgebruiker (id -g)"
}
]
}
]
}

View file

@ -6,8 +6,8 @@ services:
- "<< port >>:80"
environment:
- TZ=<< timezone >>
- PUID=<< puid >>
- PGID=<< pgid >>
- PUID=1000
- PGID=1000
- APP_KEY=<< app_key >>
- DB_CONNECTION=sqlite
volumes:

View file

@ -41,27 +41,6 @@
}
]
},
{
"title": "Gebruiker",
"items": [
{
"name": "puid",
"type": "int",
"title": "PUID",
"default": 1000,
"required": true,
"description": "User ID van de systeemgebruiker (id -u)"
},
{
"name": "pgid",
"type": "int",
"title": "PGID",
"default": 1000,
"required": true,
"description": "Group ID van de systeemgebruiker (id -g)"
}
]
},
{
"title": "Beveiliging",
"items": [

View file

@ -8,8 +8,8 @@ services:
- "<< sync_port >>:22000/udp"
environment:
- TZ=<< timezone >>
- PUID=<< puid >>
- PGID=<< pgid >>
- PUID=1000
- PGID=1000
volumes:
- << data_dir >>/<< service_name >>/config:/config
- << sync_dir >>:/data

View file

@ -57,27 +57,6 @@
"required": true
}
]
},
{
"title": "Gebruiker",
"items": [
{
"name": "puid",
"type": "int",
"title": "PUID",
"default": 1000,
"required": true,
"description": "User ID van de systeemgebruiker (id -u)"
},
{
"name": "pgid",
"type": "int",
"title": "PGID",
"default": 1000,
"required": true,
"description": "Group ID van de systeemgebruiker (id -g)"
}
]
}
]
}

View file

@ -1,37 +0,0 @@
services:
<< service_name >>:
image: lscr.io/linuxserver/unifi-network-application:latest
container_name: << service_name >>
environment:
- PUID=<< puid >>
- PGID=<< pgid >>
- TZ=<< timezone >>
- MONGO_USER=unifi
- MONGO_PASS=<< mongo_password >>
- MONGO_HOST=<< service_name >>-mongo
- MONGO_PORT=27017
- MONGO_DBNAME=unifi
volumes:
- << data_dir >>/<< service_name >>/config:/config
ports:
- "<< port_ui >>:8443"
- "<< port_inform >>:8080"
- "<< port_stun >>:3478/udp"
- "<< port_discovery >>:10001/udp"
depends_on:
- << service_name >>-mongo
restart: unless-stopped
<< service_name >>-mongo:
image: mongo:4.4
container_name: << service_name >>-mongo
environment:
- MONGO_INITDB_ROOT_USERNAME=unifi
- MONGO_INITDB_ROOT_PASSWORD=<< mongo_password >>
- MONGO_INITDB_DATABASE=unifi
volumes:
- << service_name >>_mongodata:/data/db
restart: unless-stopped
volumes:
<< service_name >>_mongodata:

View file

@ -1,106 +0,0 @@
{
"kind": "compose",
"metadata": {
"name": "Unifi Network Application",
"description": "Unifi netwerkconfiguratie en -beheer. Beheert access points, switches en gateways van Ubiquiti.",
"tags": ["netwerk", "unifi", "ubiquiti", "wifi"],
"icon": {"provider": "selfhst", "id": "unifi"},
"version": {"name": "latest"}
},
"variables": [
{
"title": "Algemeen",
"items": [
{
"name": "service_name",
"type": "str",
"title": "Servicenaam",
"default": "unifi",
"required": true
},
{
"name": "port_ui",
"type": "int",
"title": "Web UI poort (HTTPS)",
"default": 8443,
"required": true,
"description": "Poort voor de Unifi-webinterface"
},
{
"name": "port_inform",
"type": "int",
"title": "Inform poort",
"default": 8080,
"required": true,
"description": "Poort waarop Unifi-apparaten inchecken. Moet bereikbaar zijn voor alle access points en switches."
},
{
"name": "port_stun",
"type": "int",
"title": "STUN poort (UDP)",
"default": 3478,
"required": true,
"description": "Gebruikt voor NAT traversal. Vereist voor correct functioneren van Unifi-apparaten."
},
{
"name": "port_discovery",
"type": "int",
"title": "Discovery poort (UDP)",
"default": 10001,
"required": true,
"description": "Gebruikt om Unifi-apparaten op het lokale netwerk automatisch te ontdekken."
},
{
"name": "data_dir",
"type": "str",
"title": "Data directory",
"default": "/opt/serverup/appdata",
"required": true,
"description": "Basismap voor configuratie en database"
},
{
"name": "timezone",
"type": "str",
"title": "Tijdzone",
"default": "Europe/Amsterdam",
"required": true
}
]
},
{
"title": "Gebruiker",
"items": [
{
"name": "puid",
"type": "int",
"title": "PUID",
"default": 1000,
"required": true,
"description": "User ID van de systeemgebruiker die de container beheert (whoami → id -u)"
},
{
"name": "pgid",
"type": "int",
"title": "PGID",
"default": 1000,
"required": true,
"description": "Group ID van de systeemgebruiker (id -g)"
}
]
},
{
"title": "Database",
"items": [
{
"name": "mongo_password",
"type": "str",
"title": "MongoDB wachtwoord",
"default": "unifi_mongo_pass",
"required": true,
"description": "Wachtwoord voor de interne MongoDB database",
"config": {"placeholder": "sterk-wachtwoord"}
}
]
}
]
}