From 68a4effad5cf0405e93ff08ae3d06fafec51f204 Mon Sep 17 00:00:00 2001 From: Claude Date: Sat, 20 Jun 2026 04:06:51 +0000 Subject: [PATCH 1/2] fix(services): conditional caddy_net for filebrowser, homebox, watchtower Only include the caddy_net network block in docker-compose.yml when ~/docker/caddy exists, preventing "network not found" errors on standalone installs without Caddy. Co-Authored-By: Claude Sonnet 4.6 Claude-Session: https://claude.ai/code/session_01D8ckUJQtj1pH8jtAddBDZs --- services/filebrowser.sh | 25 ++++++++++++++++++------- services/homebox.sh | 25 ++++++++++++++++++------- services/watchtower.sh | 25 ++++++++++++++++++------- 3 files changed, 54 insertions(+), 21 deletions(-) diff --git a/services/filebrowser.sh b/services/filebrowser.sh index 1ad1e28..3a361d9 100644 --- a/services/filebrowser.sh +++ b/services/filebrowser.sh @@ -199,6 +199,23 @@ install_filebrowser() { local FB_PATH="" prompt_text "Primary files directory to browse [default: $ACTUAL_HOME]:" "$ACTUAL_HOME" FB_PATH + local _CADDY_NET_BLOCK="" + if [ -d "$DOCKER_DIR/caddy" ]; then + _CADDY_NET_BLOCK=" networks: + - caddy_net +" + fi + + local _CADDY_NET_SECTION="" + if [ -d "$DOCKER_DIR/caddy" ]; then + _CADDY_NET_SECTION=" +networks: + caddy_net: + external: true + name: ${SITE_CADDY_NET:-caddy_net} +" + fi + cat > docker-compose.yml << FB_COMPOSE name: filebrowser @@ -215,13 +232,7 @@ services: - ${FB_PATH}:/files ports: - "8085:80" - networks: - - caddy_net - -networks: - caddy_net: - external: true - name: \${CADDY_NET:-caddy_net} +${_CADDY_NET_BLOCK}${_CADDY_NET_SECTION} FB_COMPOSE cat > .env << FB_ENV diff --git a/services/homebox.sh b/services/homebox.sh index 9eeed7d..4415e28 100644 --- a/services/homebox.sh +++ b/services/homebox.sh @@ -197,6 +197,23 @@ install_homebox() { ensure_docker_dir_ownership "$HB_DIR" cd "$HB_DIR" || return 1 + local _CADDY_NET_BLOCK="" + if [ -d "$DOCKER_DIR/caddy" ]; then + _CADDY_NET_BLOCK=" networks: + - caddy_net +" + fi + + local _CADDY_NET_SECTION="" + if [ -d "$DOCKER_DIR/caddy" ]; then + _CADDY_NET_SECTION=" +networks: + caddy_net: + external: true + name: ${SITE_CADDY_NET:-caddy_net} +" + fi + cat > docker-compose.yml << HB_COMPOSE name: homebox @@ -213,13 +230,7 @@ services: - ./data:/data ports: - "7745:7745" - networks: - - caddy_net - -networks: - caddy_net: - external: true - name: \${CADDY_NET:-caddy_net} +${_CADDY_NET_BLOCK}${_CADDY_NET_SECTION} HB_COMPOSE cat > .env << HB_ENV diff --git a/services/watchtower.sh b/services/watchtower.sh index 1d05908..4eb51a1 100644 --- a/services/watchtower.sh +++ b/services/watchtower.sh @@ -128,6 +128,23 @@ install_watchtower() { NTFY_URL="http://ntfy/watchtower" fi + local _CADDY_NET_BLOCK="" + if [ -d "$DOCKER_DIR/caddy" ]; then + _CADDY_NET_BLOCK=" networks: + - caddy_net +" + fi + + local _CADDY_NET_SECTION="" + if [ -d "$DOCKER_DIR/caddy" ]; then + _CADDY_NET_SECTION=" +networks: + caddy_net: + external: true + name: ${SITE_CADDY_NET:-caddy_net} +" + fi + cat > docker-compose.yml << WT_COMPOSE name: watchtower @@ -152,13 +169,7 @@ services: - WATCHTOWER_DEBUG=false volumes: - /var/run/docker.sock:/var/run/docker.sock:ro - networks: - - caddy_net - -networks: - caddy_net: - external: true - name: \${CADDY_NET:-caddy_net} +${_CADDY_NET_BLOCK}${_CADDY_NET_SECTION} WT_COMPOSE # Create .env From fa906186c33750d52cc71df9e8b24e328cc4d3f5 Mon Sep 17 00:00:00 2001 From: Claude Date: Sat, 20 Jun 2026 04:16:41 +0000 Subject: [PATCH 2/2] fix(services): conditional caddy_net across all Docker service scripts Only include the caddy_net network block in generated docker-compose.yml files when ~/docker/caddy exists. Prevents "network caddy_net declared as external, but could not be found" on standalone installs without Caddy. Affected: actualbudget, archivebox, arm, audiobookshelf, calibre-web, changedetection, drum-rhythm-game, emby, fmd, frigate, frigate-audio, frigate-notify, gatus, homeassistant, immich, iopaint, jellyfin, joplin, koha, lyrion, magicmirror, mail-archiver, mattermost, mealie, meshcentral, n8n, nextcloud, ntfy, onlyoffice, portainer, stirling-pdf, syncthing, traccar, unifi, uptimekuma, vaultwarden, wg-easy Skipped: authelia (creates caddy_net itself), caddy, crowdsec, wolf, wolf-pair, and services using network_mode: host with no caddy_net. Co-Authored-By: Claude Sonnet 4.6 Claude-Session: https://claude.ai/code/session_01D8ckUJQtj1pH8jtAddBDZs --- services/actualbudget.sh | 27 ++++++++++---- services/archivebox.sh | 27 ++++++++++---- services/arm.sh | 25 +++++++++---- services/audiobookshelf.sh | 25 +++++++++---- services/calibre-web.sh | 25 +++++++++---- services/changedetection.sh | 33 +++++++++++------ services/drum-rhythm-game.sh | 27 ++++++++++---- services/emby.sh | 25 +++++++++---- services/fmd.sh | 29 ++++++++++----- services/frigate-audio.sh | 26 +++++++++---- services/frigate-notify.sh | 27 ++++++++++---- services/frigate.sh | 25 +++++++++---- services/gatus.sh | 27 ++++++++++---- services/homeassistant.sh | 22 ++++++++--- services/immich.sh | 71 +++++++++++++++++++----------------- services/iopaint.sh | 45 +++++++++++++---------- services/jellyfin.sh | 25 +++++++++---- services/joplin.sh | 31 ++++++++++------ services/koha.sh | 26 ++++++++----- services/lyrion.sh | 4 -- services/magicmirror.sh | 25 +++++++++---- services/mail-archiver.sh | 29 ++++++++++----- services/mattermost.sh | 39 ++++++++++++-------- services/mealie.sh | 25 +++++++++---- services/meshcentral.sh | 33 +++++++++++------ services/n8n.sh | 33 +++++++++++------ services/nextcloud.sh | 31 ++++++++++------ services/ntfy.sh | 29 ++++++++++----- services/onlyoffice.sh | 27 ++++++++++---- services/portainer.sh | 27 ++++++++++---- services/stirling-pdf.sh | 27 ++++++++++---- services/syncthing.sh | 25 +++++++++---- services/traccar.sh | 27 ++++++++++---- services/unifi.sh | 34 +++++++++++------ services/uptimekuma.sh | 27 ++++++++++---- services/vaultwarden.sh | 27 ++++++++++---- services/wg-easy.sh | 25 +++++++++---- 37 files changed, 715 insertions(+), 347 deletions(-) diff --git a/services/actualbudget.sh b/services/actualbudget.sh index c72b718..d4c1dce 100644 --- a/services/actualbudget.sh +++ b/services/actualbudget.sh @@ -202,7 +202,24 @@ install_actualbudget() { local TZ_VAL; TZ_VAL="${SITE_TZ:-$(cat /etc/timezone 2>/dev/null || echo UTC)}" - cat > docker-compose.yml << 'AB_COMPOSE' + local _CADDY_NET_BLOCK="" + if [ -d "$DOCKER_DIR/caddy" ]; then + _CADDY_NET_BLOCK=" networks: + - caddy_net +" + fi + + local _CADDY_NET_SECTION="" + if [ -d "$DOCKER_DIR/caddy" ]; then + _CADDY_NET_SECTION=" +networks: + caddy_net: + external: true + name: ${SITE_CADDY_NET:-caddy_net} +" + fi + + cat > docker-compose.yml << AB_COMPOSE name: actualbudget services: @@ -216,13 +233,7 @@ services: - ./data:/data env_file: - .env - networks: - - caddy_net - -networks: - caddy_net: - external: true - name: ${CADDY_NET:-caddy_net} +${_CADDY_NET_BLOCK}${_CADDY_NET_SECTION} AB_COMPOSE cat > .env << AB_ENV diff --git a/services/archivebox.sh b/services/archivebox.sh index f8c2917..4973911 100644 --- a/services/archivebox.sh +++ b/services/archivebox.sh @@ -195,7 +195,24 @@ install_archivebox() { ensure_docker_dir_ownership "$AB_DIR" cd "$AB_DIR" || return 1 - cat > docker-compose.yml << 'ABCOMPOSE' + local _CADDY_NET_BLOCK="" + if [ -d "$DOCKER_DIR/caddy" ]; then + _CADDY_NET_BLOCK=" networks: + - caddy_net +" + fi + + local _CADDY_NET_SECTION="" + if [ -d "$DOCKER_DIR/caddy" ]; then + _CADDY_NET_SECTION=" +networks: + caddy_net: + external: true + name: ${SITE_CADDY_NET:-caddy_net} +" + fi + + cat > docker-compose.yml << ABCOMPOSE name: archivebox services: @@ -214,13 +231,7 @@ services: - ./data:/data ports: - "8000:8000" - networks: - - caddy_net - -networks: - caddy_net: - external: true - name: ${CADDY_NET:-caddy_net} +${_CADDY_NET_BLOCK}${_CADDY_NET_SECTION} ABCOMPOSE cat > .env << ABENV diff --git a/services/arm.sh b/services/arm.sh index b1eff1a..ad77f5b 100644 --- a/services/arm.sh +++ b/services/arm.sh @@ -233,6 +233,23 @@ install_arm() { TZ_VAL="${SITE_TZ:-$(cat /etc/timezone 2>/dev/null || echo UTC)}" UID_VAL=$(id -u "$ACTUAL_USER"); GID_VAL=$(id -g "$ACTUAL_USER") + local _CADDY_NET_BLOCK="" + if [ -d "$DOCKER_DIR/caddy" ]; then + _CADDY_NET_BLOCK=" networks: + - caddy_net +" + fi + + local _CADDY_NET_SECTION="" + if [ -d "$DOCKER_DIR/caddy" ]; then + _CADDY_NET_SECTION=" +networks: + caddy_net: + external: true + name: ${SITE_CADDY_NET:-caddy_net} +" + fi + cat > docker-compose.yml << ARM_COMPOSE name: arm @@ -258,13 +275,7 @@ services: # Add more optical drives as needed: # - /dev/sr1:/dev/sr1 privileged: true - networks: - - caddy_net - -networks: - caddy_net: - external: true - name: \${CADDY_NET:-caddy_net} +${_CADDY_NET_BLOCK}${_CADDY_NET_SECTION} ARM_COMPOSE cat > .env << ARM_ENV diff --git a/services/audiobookshelf.sh b/services/audiobookshelf.sh index f1833df..b8082b6 100644 --- a/services/audiobookshelf.sh +++ b/services/audiobookshelf.sh @@ -208,6 +208,23 @@ install_audiobookshelf() { local TZ_VAL; TZ_VAL="${SITE_TZ:-$(cat /etc/timezone 2>/dev/null || echo UTC)}" + local _CADDY_NET_BLOCK="" + if [ -d "$DOCKER_DIR/caddy" ]; then + _CADDY_NET_BLOCK=" networks: + - caddy_net +" + fi + + local _CADDY_NET_SECTION="" + if [ -d "$DOCKER_DIR/caddy" ]; then + _CADDY_NET_SECTION=" +networks: + caddy_net: + external: true + name: ${SITE_CADDY_NET:-caddy_net} +" + fi + cat > docker-compose.yml << ABS_COMPOSE name: audiobookshelf @@ -226,13 +243,7 @@ services: - \${PODCASTS_PATH:-./podcasts}:/podcasts ports: - "13378:80" - networks: - - caddy_net - -networks: - caddy_net: - external: true - name: \${CADDY_NET:-caddy_net} +${_CADDY_NET_BLOCK}${_CADDY_NET_SECTION} ABS_COMPOSE cat > .env << ABS_ENV diff --git a/services/calibre-web.sh b/services/calibre-web.sh index 5218998..f55bae1 100644 --- a/services/calibre-web.sh +++ b/services/calibre-web.sh @@ -197,6 +197,23 @@ install_calibre_web() { ensure_docker_dir_ownership "$CW_DIR" cd "$CW_DIR" || return 1 + local _CADDY_NET_BLOCK="" + if [ -d "$DOCKER_DIR/caddy" ]; then + _CADDY_NET_BLOCK=" networks: + - caddy_net +" + fi + + local _CADDY_NET_SECTION="" + if [ -d "$DOCKER_DIR/caddy" ]; then + _CADDY_NET_SECTION=" +networks: + caddy_net: + external: true + name: ${SITE_CADDY_NET:-caddy_net} +" + fi + cat > docker-compose.yml << CW_COMPOSE name: calibre-web @@ -216,13 +233,7 @@ services: - ./books:/books ports: - "8083:8083" - networks: - - caddy_net - -networks: - caddy_net: - external: true - name: \${CADDY_NET:-caddy_net} +${_CADDY_NET_BLOCK}${_CADDY_NET_SECTION} CW_COMPOSE cat > .env << CW_ENV diff --git a/services/changedetection.sh b/services/changedetection.sh index 78e553f..7364eed 100644 --- a/services/changedetection.sh +++ b/services/changedetection.sh @@ -197,7 +197,24 @@ install_changedetection() { ensure_docker_dir_ownership "$CD_DIR" cd "$CD_DIR" || return 1 - cat > docker-compose.yml << 'CD_COMPOSE' + local _CADDY_NET_BLOCK="" + if [ -d "$DOCKER_DIR/caddy" ]; then + _CADDY_NET_BLOCK=" networks: + - caddy_net +" + fi + + local _CADDY_NET_SECTION="" + if [ -d "$DOCKER_DIR/caddy" ]; then + _CADDY_NET_SECTION=" +networks: + caddy_net: + external: true + name: ${SITE_CADDY_NET:-caddy_net} +" + fi + + cat > docker-compose.yml << CD_COMPOSE name: changedetection services: @@ -209,13 +226,11 @@ services: ports: - "5000:5000" environment: - - BASE_URL=${BASE_URL} + - BASE_URL=\${BASE_URL} - PLAYWRIGHT_DRIVER_URL=ws://playwright-chrome:3000 volumes: - ./data:/datastore - networks: - - caddy_net - depends_on: +${_CADDY_NET_BLOCK} depends_on: - playwright-chrome playwright-chrome: @@ -225,13 +240,7 @@ services: restart: unless-stopped environment: - DEFAULT_LAUNCH_ARGS=--no-sandbox --disable-dev-shm-usage - networks: - - caddy_net - -networks: - caddy_net: - external: true - name: ${CADDY_NET:-caddy_net} +${_CADDY_NET_BLOCK}${_CADDY_NET_SECTION} CD_COMPOSE cat > .env << CD_ENV diff --git a/services/drum-rhythm-game.sh b/services/drum-rhythm-game.sh index 32023bc..488ae49 100644 --- a/services/drum-rhythm-game.sh +++ b/services/drum-rhythm-game.sh @@ -214,7 +214,24 @@ install_drum-rhythm-game() { chown -R "$ACTUAL_USER:$ACTUAL_USER" "$DRUM_DIR/html" - cat > docker-compose.yml << 'DRUM_COMPOSE' + local _CADDY_NET_BLOCK="" + if [ -d "$DOCKER_DIR/caddy" ]; then + _CADDY_NET_BLOCK=" networks: + - caddy_net +" + fi + + local _CADDY_NET_SECTION="" + if [ -d "$DOCKER_DIR/caddy" ]; then + _CADDY_NET_SECTION=" +networks: + caddy_net: + external: true + name: ${SITE_CADDY_NET:-caddy_net} +" + fi + + cat > docker-compose.yml << DRUM_COMPOSE name: drum-rhythm-game services: @@ -227,13 +244,7 @@ services: - ./html:/usr/share/nginx/html:ro ports: - "8096:80" - networks: - - caddy_net - -networks: - caddy_net: - external: true - name: ${CADDY_NET:-caddy_net} +${_CADDY_NET_BLOCK}${_CADDY_NET_SECTION} DRUM_COMPOSE cat > .env << DRUM_ENV diff --git a/services/emby.sh b/services/emby.sh index 3ed4303..4454630 100644 --- a/services/emby.sh +++ b/services/emby.sh @@ -222,6 +222,23 @@ install_emby() { TZ_VAL="${SITE_TZ:-$(cat /etc/timezone 2>/dev/null || echo UTC)}" UID_VAL=$(id -u "$ACTUAL_USER"); GID_VAL=$(id -g "$ACTUAL_USER") + local _CADDY_NET_BLOCK="" + if [ -d "$DOCKER_DIR/caddy" ]; then + _CADDY_NET_BLOCK=" networks: + - caddy_net +" + fi + + local _CADDY_NET_SECTION="" + if [ -d "$DOCKER_DIR/caddy" ]; then + _CADDY_NET_SECTION=" +networks: + caddy_net: + external: true + name: ${SITE_CADDY_NET:-caddy_net} +" + fi + cat > docker-compose.yml << EMBY_COMPOSE name: emby @@ -244,13 +261,7 @@ services: # Uncomment for hardware transcoding (Intel/AMD): # devices: # - /dev/dri:/dev/dri - networks: - - caddy_net - -networks: - caddy_net: - external: true - name: \${CADDY_NET:-caddy_net} +${_CADDY_NET_BLOCK}${_CADDY_NET_SECTION} EMBY_COMPOSE cat > .env << EMBY_ENV diff --git a/services/fmd.sh b/services/fmd.sh index 5e5bbe7..7a11a4b 100644 --- a/services/fmd.sh +++ b/services/fmd.sh @@ -214,7 +214,24 @@ install_fmd() { local FMD_PASS FMD_PASS=$(openssl rand -base64 16 | tr -dc 'a-zA-Z0-9' | head -c 16) - cat > docker-compose.yml << 'FMD_COMPOSE' + local _CADDY_NET_BLOCK="" + if [ -d "$DOCKER_DIR/caddy" ]; then + _CADDY_NET_BLOCK=" networks: + - caddy_net +" + fi + + local _CADDY_NET_SECTION="" + if [ -d "$DOCKER_DIR/caddy" ]; then + _CADDY_NET_SECTION=" +networks: + caddy_net: + external: true + name: ${SITE_CADDY_NET:-caddy_net} +" + fi + + cat > docker-compose.yml << FMD_COMPOSE name: fmd services: @@ -224,18 +241,12 @@ services: hostname: fmd restart: unless-stopped environment: - - FMD_ADMIN_PASSWORD=${FMD_ADMIN_PASSWORD} + - FMD_ADMIN_PASSWORD=\${FMD_ADMIN_PASSWORD} volumes: - ./data:/fmd/data ports: - "8084:8080" - networks: - - caddy_net - -networks: - caddy_net: - external: true - name: ${CADDY_NET:-caddy_net} +${_CADDY_NET_BLOCK}${_CADDY_NET_SECTION} FMD_COMPOSE cat > .env << FMD_ENV diff --git a/services/frigate-audio.sh b/services/frigate-audio.sh index a1bb8e2..44414fe 100644 --- a/services/frigate-audio.sh +++ b/services/frigate-audio.sh @@ -375,6 +375,23 @@ ENVEOF [ -n "$DRI_LINE" ] && DEVICES_BLOCK="${DEVICES_BLOCK}\n ${DRI_LINE}" fi + local _CADDY_NET_BLOCK="" + if [ -d "$DOCKER_DIR/caddy" ]; then + _CADDY_NET_BLOCK=" networks: + - caddy_net +" + fi + + local _CADDY_NET_SECTION="" + if [ -d "$DOCKER_DIR/caddy" ]; then + _CADDY_NET_SECTION=" +networks: + caddy_net: + external: true + name: ${SITE_CADDY_NET:-caddy_net} +" + fi + cat > "$DIR/docker-compose.yml" << 'COMPOSEEOF' # Frigate NVR + Mosquitto MQTT + frigate-notify # Generated by ubuntu-post-install setup.sh @@ -416,9 +433,7 @@ COMPOSEEOF - "8554:8554" - "8555:8555/tcp" - "8555:8555/udp" - networks: - - caddy_net - healthcheck: +${_CADDY_NET_BLOCK} healthcheck: test: ["CMD", "curl", "-f", "http://127.0.0.1:5000/api/version"] interval: 10s timeout: 5s @@ -451,10 +466,7 @@ COMPOSEEOF volumes: - ./frigate-notify/config.yml:/app/config.yml:ro -networks: - caddy_net: - external: true - name: \${CADDY_NET:-caddy_net} +${_CADDY_NET_SECTION} COMPOSEEOF log_success "docker-compose.yml written" diff --git a/services/frigate-notify.sh b/services/frigate-notify.sh index 072e7b5..8242f2d 100644 --- a/services/frigate-notify.sh +++ b/services/frigate-notify.sh @@ -211,7 +211,24 @@ install_frigate-notify() { ensure_docker_dir_ownership "$FN_DIR" cd "$FN_DIR" || return 1 - cat > docker-compose.yml << 'FN_COMPOSE' + local _CADDY_NET_BLOCK="" + if [ -d "$DOCKER_DIR/caddy" ]; then + _CADDY_NET_BLOCK=" networks: + - caddy_net +" + fi + + local _CADDY_NET_SECTION="" + if [ -d "$DOCKER_DIR/caddy" ]; then + _CADDY_NET_SECTION=" +networks: + caddy_net: + external: true + name: ${SITE_CADDY_NET:-caddy_net} +" + fi + + cat > docker-compose.yml << FN_COMPOSE name: frigate-notify services: @@ -222,13 +239,7 @@ services: restart: unless-stopped volumes: - ./config.yml:/app/config.yml:ro - networks: - - caddy_net - -networks: - caddy_net: - external: true - name: ${CADDY_NET:-caddy_net} +${_CADDY_NET_BLOCK}${_CADDY_NET_SECTION} FN_COMPOSE # Smart defaults based on what's installed diff --git a/services/frigate.sh b/services/frigate.sh index 9c2aaaf..90249f0 100644 --- a/services/frigate.sh +++ b/services/frigate.sh @@ -230,6 +230,23 @@ install_frigate() { log_warning "No /dev/dri/renderD128 — Frigate will use CPU detection." fi + local _CADDY_NET_BLOCK="" + if [ -d "$DOCKER_DIR/caddy" ]; then + _CADDY_NET_BLOCK=" networks: + - caddy_net +" + fi + + local _CADDY_NET_SECTION="" + if [ -d "$DOCKER_DIR/caddy" ]; then + _CADDY_NET_SECTION=" +networks: + caddy_net: + external: true + name: ${SITE_CADDY_NET:-caddy_net} +" + fi + cat > docker-compose.yml << FRIGATE_COMPOSE name: frigate @@ -256,13 +273,7 @@ $DEVICE_BLOCK - "8554:8554" - "8555:8555/tcp" - "8555:8555/udp" - networks: - - caddy_net - -networks: - caddy_net: - external: true - name: \${CADDY_NET:-caddy_net} +${_CADDY_NET_BLOCK}${_CADDY_NET_SECTION} FRIGATE_COMPOSE cat > .env << FRIGATE_ENV diff --git a/services/gatus.sh b/services/gatus.sh index 92b0fc3..20aa6f7 100644 --- a/services/gatus.sh +++ b/services/gatus.sh @@ -210,7 +210,24 @@ install_gatus() { local TZ_VAL="${SITE_TZ:-$(cat /etc/timezone 2>/dev/null || echo UTC)}" - cat > docker-compose.yml << 'GATUS_COMPOSE' + local _CADDY_NET_BLOCK="" + if [ -d "$DOCKER_DIR/caddy" ]; then + _CADDY_NET_BLOCK=" networks: + - caddy_net +" + fi + + local _CADDY_NET_SECTION="" + if [ -d "$DOCKER_DIR/caddy" ]; then + _CADDY_NET_SECTION=" +networks: + caddy_net: + external: true + name: ${SITE_CADDY_NET:-caddy_net} +" + fi + + cat > docker-compose.yml << GATUS_COMPOSE name: gatus services: @@ -225,13 +242,7 @@ services: volumes: - ./gatus_config:/config - ./gatus_data:/data - networks: - - caddy_net - -networks: - caddy_net: - external: true - name: ${CADDY_NET:-caddy_net} +${_CADDY_NET_BLOCK}${_CADDY_NET_SECTION} GATUS_COMPOSE cat > .env << GATUS_ENV diff --git a/services/homeassistant.sh b/services/homeassistant.sh index 9a3bb77..38a8892 100644 --- a/services/homeassistant.sh +++ b/services/homeassistant.sh @@ -218,11 +218,25 @@ install_homeassistant() { else HA_NET_LINES=" ports: - \"8123:8123\"" - HA_CADDY_NET_LINES=" networks: + if [ -d "$DOCKER_DIR/caddy" ]; then + HA_CADDY_NET_LINES=" networks: - caddy_net" + else + HA_CADDY_NET_LINES="" + fi echo " → Bridge networking selected (port 8123 published)." fi + local _CADDY_NET_SECTION="" + if [ "$HA_NETMODE" != "2" ] && [ -d "$DOCKER_DIR/caddy" ]; then + _CADDY_NET_SECTION=" +networks: + caddy_net: + external: true + name: ${SITE_CADDY_NET:-caddy_net} +" + fi + cat > docker-compose.yml << HOMEASSISTANT_COMPOSE name: homeassistant @@ -240,11 +254,7 @@ services: - /run/dbus:/run/dbus:ro ${HA_NET_LINES} ${HA_CADDY_NET_LINES} - -networks: - caddy_net: - external: true - name: \${CADDY_NET:-caddy_net} +${_CADDY_NET_SECTION} HOMEASSISTANT_COMPOSE mkdir -p config diff --git a/services/immich.sh b/services/immich.sh index de84bb1..833d232 100644 --- a/services/immich.sh +++ b/services/immich.sh @@ -291,17 +291,34 @@ install_immich() { TZ_VAL="${SITE_TZ:-$(cat /etc/timezone 2>/dev/null || echo UTC)}" # ── Write docker-compose.yml ──────────────────────────────────────────── + local _CADDY_NET_BLOCK="" + if [ -d "$DOCKER_DIR/caddy" ]; then + _CADDY_NET_BLOCK=" networks: + - caddy_net +" + fi + + local _CADDY_NET_SECTION="" + if [ -d "$DOCKER_DIR/caddy" ]; then + _CADDY_NET_SECTION=" +networks: + caddy_net: + external: true + name: ${SITE_CADDY_NET:-caddy_net} +" + fi + if [ -n "$EXTERNAL_LIBRARY" ]; then - cat > docker-compose.yml << 'IMMICH_COMPOSE' + cat > docker-compose.yml << IMMICH_COMPOSE name: immich services: immich-server: container_name: immich_server - image: ghcr.io/immich-app/immich-server:${IMMICH_VERSION:-release} + image: ghcr.io/immich-app/immich-server:\${IMMICH_VERSION:-release} volumes: - - ${UPLOAD_LOCATION}:/usr/src/app/upload - - ${EXTERNAL_LIBRARY}:/usr/src/app/external:ro + - \${UPLOAD_LOCATION}:/usr/src/app/upload + - \${EXTERNAL_LIBRARY}:/usr/src/app/external:ro - /etc/localtime:/etc/localtime:ro env_file: - .env @@ -313,12 +330,10 @@ services: restart: always healthcheck: disable: false - networks: - - caddy_net - +${_CADDY_NET_BLOCK} immich-machine-learning: container_name: immich_machine_learning - image: ghcr.io/immich-app/immich-machine-learning:${IMMICH_VERSION:-release} + image: ghcr.io/immich-app/immich-machine-learning:\${IMMICH_VERSION:-release} volumes: - model-cache:/cache env_file: @@ -338,32 +353,28 @@ services: container_name: immich_postgres image: ghcr.io/immich-app/postgres:14-vectorchord0.4.3-pgvectors0.2.0 environment: - POSTGRES_PASSWORD: ${DB_PASSWORD} - POSTGRES_USER: ${DB_USERNAME} - POSTGRES_DB: ${DB_DATABASE_NAME} + POSTGRES_PASSWORD: \${DB_PASSWORD} + POSTGRES_USER: \${DB_USERNAME} + POSTGRES_DB: \${DB_DATABASE_NAME} POSTGRES_INITDB_ARGS: '--data-checksums' volumes: - - ${DB_DATA_LOCATION}:/var/lib/postgresql/data + - \${DB_DATA_LOCATION}:/var/lib/postgresql/data restart: always volumes: model-cache: - -networks: - caddy_net: - external: true - name: ${CADDY_NET:-caddy_net} +${_CADDY_NET_SECTION} IMMICH_COMPOSE else - cat > docker-compose.yml << 'IMMICH_COMPOSE' + cat > docker-compose.yml << IMMICH_COMPOSE name: immich services: immich-server: container_name: immich_server - image: ghcr.io/immich-app/immich-server:${IMMICH_VERSION:-release} + image: ghcr.io/immich-app/immich-server:\${IMMICH_VERSION:-release} volumes: - - ${UPLOAD_LOCATION}:/usr/src/app/upload + - \${UPLOAD_LOCATION}:/usr/src/app/upload - /etc/localtime:/etc/localtime:ro env_file: - .env @@ -375,12 +386,10 @@ services: restart: always healthcheck: disable: false - networks: - - caddy_net - +${_CADDY_NET_BLOCK} immich-machine-learning: container_name: immich_machine_learning - image: ghcr.io/immich-app/immich-machine-learning:${IMMICH_VERSION:-release} + image: ghcr.io/immich-app/immich-machine-learning:\${IMMICH_VERSION:-release} volumes: - model-cache:/cache env_file: @@ -400,21 +409,17 @@ services: container_name: immich_postgres image: ghcr.io/immich-app/postgres:14-vectorchord0.4.3-pgvectors0.2.0 environment: - POSTGRES_PASSWORD: ${DB_PASSWORD} - POSTGRES_USER: ${DB_USERNAME} - POSTGRES_DB: ${DB_DATABASE_NAME} + POSTGRES_PASSWORD: \${DB_PASSWORD} + POSTGRES_USER: \${DB_USERNAME} + POSTGRES_DB: \${DB_DATABASE_NAME} POSTGRES_INITDB_ARGS: '--data-checksums' volumes: - - ${DB_DATA_LOCATION}:/var/lib/postgresql/data + - \${DB_DATA_LOCATION}:/var/lib/postgresql/data restart: always volumes: model-cache: - -networks: - caddy_net: - external: true - name: ${CADDY_NET:-caddy_net} +${_CADDY_NET_SECTION} IMMICH_COMPOSE fi diff --git a/services/iopaint.sh b/services/iopaint.sh index b457572..d40798b 100644 --- a/services/iopaint.sh +++ b/services/iopaint.sh @@ -268,8 +268,25 @@ install_iopaint() { # Volume ./models:/root/.cache persists ALL model caches: # /root/.cache/torch/hub/checkpoints/ (LaMa, CV2, ZITS, etc.) # /root/.cache/huggingface/ (SD, PowerPaint, LDM, etc.) + local _CADDY_NET_BLOCK="" + if [ -d "$DOCKER_DIR/caddy" ]; then + _CADDY_NET_BLOCK=" networks: + - caddy_net +" + fi + + local _CADDY_NET_SECTION="" + if [ -d "$DOCKER_DIR/caddy" ]; then + _CADDY_NET_SECTION=" +networks: + caddy_net: + external: true + name: ${SITE_CADDY_NET:-caddy_net} +" + fi + if [[ "$USE_GPU" =~ ^[Yy]$ ]]; then - cat > docker-compose.yml << 'IOPAINT_GPU' + cat > docker-compose.yml << IOPAINT_GPU name: iopaint services: @@ -280,8 +297,8 @@ services: restart: unless-stopped command: >- iopaint start - --model=${MODEL:-lama} - --device=${DEVICE:-cuda} + --model=\${MODEL:-lama} + --device=\${DEVICE:-cuda} --port=8080 --host=0.0.0.0 ports: @@ -298,16 +315,10 @@ services: - driver: nvidia count: 1 capabilities: [gpu] - networks: - - caddy_net - -networks: - caddy_net: - external: true - name: ${CADDY_NET:-caddy_net} +${_CADDY_NET_BLOCK}${_CADDY_NET_SECTION} IOPAINT_GPU else - cat > docker-compose.yml << 'IOPAINT_CPU' + cat > docker-compose.yml << IOPAINT_CPU name: iopaint services: @@ -318,8 +329,8 @@ services: restart: unless-stopped command: >- iopaint start - --model=${MODEL:-lama} - --device=${DEVICE:-cpu} + --model=\${MODEL:-lama} + --device=\${DEVICE:-cpu} --port=8080 --host=0.0.0.0 ports: @@ -329,13 +340,7 @@ services: - ./models:/root/.cache - ./input:/app/input - ./output:/app/output - networks: - - caddy_net - -networks: - caddy_net: - external: true - name: ${CADDY_NET:-caddy_net} +${_CADDY_NET_BLOCK}${_CADDY_NET_SECTION} IOPAINT_CPU fi diff --git a/services/jellyfin.sh b/services/jellyfin.sh index 2be8386..5957abc 100644 --- a/services/jellyfin.sh +++ b/services/jellyfin.sh @@ -225,6 +225,23 @@ install_jellyfin() { log_warning "No /dev/dri/renderD128 — Jellyfin will use CPU transcoding." fi + local _CADDY_NET_BLOCK="" + if [ -d "$DOCKER_DIR/caddy" ]; then + _CADDY_NET_BLOCK=" networks: + - caddy_net +" + fi + + local _CADDY_NET_SECTION="" + if [ -d "$DOCKER_DIR/caddy" ]; then + _CADDY_NET_SECTION=" +networks: + caddy_net: + external: true + name: ${SITE_CADDY_NET:-caddy_net} +" + fi + cat > docker-compose.yml << JELLYFIN_COMPOSE name: jellyfin @@ -245,13 +262,7 @@ $HWACCEL_BLOCK - "8096:8096" - "1900:1900/udp" - "7359:7359/udp" - networks: - - caddy_net - -networks: - caddy_net: - external: true - name: \${CADDY_NET:-caddy_net} +${_CADDY_NET_BLOCK}${_CADDY_NET_SECTION} JELLYFIN_COMPOSE cat > .env << JELLYFIN_ENV diff --git a/services/joplin.sh b/services/joplin.sh index 8f0d9c1..94cc9e4 100644 --- a/services/joplin.sh +++ b/services/joplin.sh @@ -201,7 +201,24 @@ install_joplin() { DB_PASS="$(generate_password 32)" local BASE_URL="https://joplin.${SITE_DOMAIN}" - cat > docker-compose.yml << 'JOPLIN_COMPOSE' + local _CADDY_NET_BLOCK="" + if [ -d "$DOCKER_DIR/caddy" ]; then + _CADDY_NET_BLOCK=" networks: + - caddy_net +" + fi + + local _CADDY_NET_SECTION="" + if [ -d "$DOCKER_DIR/caddy" ]; then + _CADDY_NET_SECTION=" +networks: + caddy_net: + external: true + name: ${SITE_CADDY_NET:-caddy_net} +" + fi + + cat > docker-compose.yml << JOPLIN_COMPOSE name: joplin services: @@ -215,9 +232,7 @@ services: env_file: .env ports: - "22300:22300" - networks: - - caddy_net - +${_CADDY_NET_BLOCK} joplin-db: image: postgres:15-alpine container_name: joplin-db @@ -226,13 +241,7 @@ services: env_file: .env volumes: - ./db-data:/var/lib/postgresql/data - networks: - - caddy_net - -networks: - caddy_net: - external: true - name: ${CADDY_NET:-caddy_net} +${_CADDY_NET_BLOCK}${_CADDY_NET_SECTION} JOPLIN_COMPOSE cat > .env << JOPLIN_ENV diff --git a/services/koha.sh b/services/koha.sh index 33accc4..ba48753 100644 --- a/services/koha.sh +++ b/services/koha.sh @@ -346,8 +346,19 @@ install_koha() { ensure_docker_dir_ownership "$KOHA_DIR" cd "$KOHA_DIR" || return 1 + local _CADDY_NET_ENTRY="" + local _CADDY_NET_SECTION="" + if [ -d "$DOCKER_DIR/caddy" ]; then + _CADDY_NET_ENTRY=" - caddy_net +" + _CADDY_NET_SECTION=" caddy_net: + external: true + name: ${SITE_CADDY_NET:-caddy_net} +" + fi + # ── docker-compose.yml ──────────────────────────────────────────────────── - cat > docker-compose.yml << 'KOHA_COMPOSE' + cat > docker-compose.yml << KOHA_COMPOSE name: koha services: @@ -370,18 +381,17 @@ services: - koha-rabbitmq networks: - koha_internal - - caddy_net - +${_CADDY_NET_ENTRY} koha-db: image: mariadb:11 container_name: koha-db hostname: koha-db restart: unless-stopped environment: - MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASS} + MYSQL_ROOT_PASSWORD: \${DB_ROOT_PASS} MYSQL_DATABASE: koha_default MYSQL_USER: koha_default - MYSQL_PASSWORD: ${DB_PASS} + MYSQL_PASSWORD: \${DB_PASS} volumes: - ./data:/var/lib/mysql networks: @@ -402,16 +412,14 @@ services: restart: unless-stopped environment: RABBITMQ_DEFAULT_USER: koha - RABBITMQ_DEFAULT_PASS: ${RABBIT_PASS} + RABBITMQ_DEFAULT_PASS: \${RABBIT_PASS} networks: - koha_internal networks: koha_internal: internal: true - caddy_net: - external: true - name: ${CADDY_NET:-caddy_net} +${_CADDY_NET_SECTION} KOHA_COMPOSE # ── config-main.env ─────────────────────────────────────────────────────── diff --git a/services/lyrion.sh b/services/lyrion.sh index bd4396f..81b349a 100644 --- a/services/lyrion.sh +++ b/services/lyrion.sh @@ -242,10 +242,6 @@ services: - ./playlists:/playlists:rw - /etc/localtime:/etc/localtime:ro -networks: - caddy_net: - external: true - name: \${CADDY_NET:-caddy_net} LYRION_COMPOSE cat > .env << LYRION_ENV diff --git a/services/magicmirror.sh b/services/magicmirror.sh index ac82200..1b49d1a 100644 --- a/services/magicmirror.sh +++ b/services/magicmirror.sh @@ -231,6 +231,23 @@ install_magicmirror() { ensure_docker_dir_ownership "$MM_DIR" cd "$MM_DIR" || continue + local _CADDY_NET_BLOCK="" + if [ -d "$DOCKER_DIR/caddy" ]; then + _CADDY_NET_BLOCK=" networks: + - caddy_net +" + fi + + local _CADDY_NET_SECTION="" + if [ -d "$DOCKER_DIR/caddy" ]; then + _CADDY_NET_SECTION=" +networks: + caddy_net: + external: true + name: ${SITE_CADDY_NET:-caddy_net} +" + fi + cat > docker-compose.yml << MM_COMPOSE name: mm-$MM_PORT @@ -248,13 +265,7 @@ services: - ./css:/opt/magic_mirror/css ports: - "$MM_PORT:8080" - networks: - - caddy_net - -networks: - caddy_net: - external: true - name: \${CADDY_NET:-caddy_net} +${_CADDY_NET_BLOCK}${_CADDY_NET_SECTION} MM_COMPOSE mkdir -p config modules css diff --git a/services/mail-archiver.sh b/services/mail-archiver.sh index 8e1b4ea..fdcab66 100644 --- a/services/mail-archiver.sh +++ b/services/mail-archiver.sh @@ -212,7 +212,24 @@ install_mail-archiver() { ADMIN_PASS=$(generate_password 24) TZ_VAL="${SITE_TZ:-$(cat /etc/timezone 2>/dev/null || echo UTC)}" - cat > docker-compose.yml << 'MA_COMPOSE' + local _CADDY_NET_BLOCK="" + if [ -d "$DOCKER_DIR/caddy" ]; then + _CADDY_NET_BLOCK=" networks: + - caddy_net +" + fi + + local _CADDY_NET_SECTION="" + if [ -d "$DOCKER_DIR/caddy" ]; then + _CADDY_NET_SECTION=" +networks: + caddy_net: + external: true + name: ${SITE_CADDY_NET:-caddy_net} +" + fi + + cat > docker-compose.yml << MA_COMPOSE name: mail-archiver services: @@ -227,9 +244,7 @@ services: depends_on: mailarchiver-db: condition: service_healthy - networks: - - caddy_net - +${_CADDY_NET_BLOCK} mailarchiver-db: image: postgres:17-alpine container_name: mailarchiver-db @@ -246,11 +261,7 @@ services: timeout: 10s retries: 5 start_period: 30s - -networks: - caddy_net: - external: true - name: ${CADDY_NET:-caddy_net} +${_CADDY_NET_SECTION} MA_COMPOSE cat > .env << MA_ENV diff --git a/services/mattermost.sh b/services/mattermost.sh index 50e744e..00b9b37 100644 --- a/services/mattermost.sh +++ b/services/mattermost.sh @@ -247,7 +247,24 @@ install_mattermost() { prompt_text "Mattermost site URL [$SITE_URL]:" "$SITE_URL" CONFIGURED_SITEURL [[ -n "$CONFIGURED_SITEURL" ]] && SITE_URL="$CONFIGURED_SITEURL" - cat > docker-compose.yml << 'EOF' + local _CADDY_NET_BLOCK="" + if [ -d "$DOCKER_DIR/caddy" ]; then + _CADDY_NET_BLOCK=" networks: + - caddy_net +" + fi + + local _CADDY_NET_SECTION="" + if [ -d "$DOCKER_DIR/caddy" ]; then + _CADDY_NET_SECTION=" +networks: + caddy_net: + external: true + name: ${SITE_CADDY_NET:-caddy_net} +" + fi + + cat > docker-compose.yml << EOF name: mattermost services: @@ -259,10 +276,8 @@ services: env_file: .env volumes: - ./db:/var/lib/postgresql/data - networks: - - caddy_net - healthcheck: - test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"] +${_CADDY_NET_BLOCK} healthcheck: + test: ["CMD-SHELL", "pg_isready -U \${POSTGRES_USER} -d \${POSTGRES_DB}"] interval: 10s timeout: 5s retries: 5 @@ -284,9 +299,7 @@ services: ports: - "8065:8065" - "8443:8443/udp" - networks: - - caddy_net - +${_CADDY_NET_BLOCK} coturn: image: coturn/coturn:latest container_name: mattermost-coturn @@ -298,8 +311,8 @@ services: - --listening-ip=0.0.0.0 - --fingerprint - --use-auth-secret - - --static-auth-secret=${COTURN_SECRET} - - --realm=${MM_REALM:-localhost} + - --static-auth-secret=\${COTURN_SECRET} + - --realm=\${MM_REALM:-localhost} - --min-port=49153 - --max-port=49352 - --no-tls @@ -308,11 +321,7 @@ services: - --no-multicast-peers - --log-file=stdout restart: unless-stopped - -networks: - caddy_net: - external: true - name: ${CADDY_NET:-caddy_net} +${_CADDY_NET_SECTION} EOF cat > .env << EOF diff --git a/services/mealie.sh b/services/mealie.sh index c54fc1d..8e3db6c 100644 --- a/services/mealie.sh +++ b/services/mealie.sh @@ -212,6 +212,23 @@ install_mealie() { MEALIE_BASE_URL="https://recipes.${SITE_DOMAIN}" fi + local _CADDY_NET_BLOCK="" + if [ -d "$DOCKER_DIR/caddy" ]; then + _CADDY_NET_BLOCK=" networks: + - caddy_net +" + fi + + local _CADDY_NET_SECTION="" + if [ -d "$DOCKER_DIR/caddy" ]; then + _CADDY_NET_SECTION=" +networks: + caddy_net: + external: true + name: ${SITE_CADDY_NET:-caddy_net} +" + fi + cat > docker-compose.yml << MEALIE_COMPOSE name: mealie @@ -233,13 +250,7 @@ services: - ./data:/app/data ports: - "9925:9000" - networks: - - caddy_net - -networks: - caddy_net: - external: true - name: \${CADDY_NET:-caddy_net} +${_CADDY_NET_BLOCK}${_CADDY_NET_SECTION} MEALIE_COMPOSE cat > .env << MEALIE_ENV diff --git a/services/meshcentral.sh b/services/meshcentral.sh index 8abd2de..2eaa7b4 100644 --- a/services/meshcentral.sh +++ b/services/meshcentral.sh @@ -215,7 +215,24 @@ install_meshcentral() { ensure_docker_dir_ownership "$MC_DIR" cd "$MC_DIR" || return 1 - cat > docker-compose.yml << 'MC_COMPOSE' + local _CADDY_NET_BLOCK="" + if [ -d "$DOCKER_DIR/caddy" ]; then + _CADDY_NET_BLOCK=" networks: + - caddy_net +" + fi + + local _CADDY_NET_SECTION="" + if [ -d "$DOCKER_DIR/caddy" ]; then + _CADDY_NET_SECTION=" +networks: + caddy_net: + external: true + name: ${SITE_CADDY_NET:-caddy_net} +" + fi + + cat > docker-compose.yml << MC_COMPOSE name: meshcentral services: @@ -226,9 +243,9 @@ services: restart: unless-stopped environment: - NODE_ENV=production - - HOSTNAME=${MC_HOSTNAME:-localhost} - - REVERSE_PROXY=${MC_REVERSE_PROXY:-false} - - REVERSE_PROXY_TLS_PORT=${MC_TLS_PORT:-443} + - HOSTNAME=\${MC_HOSTNAME:-localhost} + - REVERSE_PROXY=\${MC_REVERSE_PROXY:-false} + - REVERSE_PROXY_TLS_PORT=\${MC_TLS_PORT:-443} - IFRAME=false - ALLOW_NEW_ACCOUNTS=true - WEBRTC=true @@ -239,13 +256,7 @@ services: ports: - "4430:443" - "4433:4433" - networks: - - caddy_net - -networks: - caddy_net: - external: true - name: ${CADDY_NET:-caddy_net} +${_CADDY_NET_BLOCK}${_CADDY_NET_SECTION} MC_COMPOSE cat > .env << MC_ENV diff --git a/services/n8n.sh b/services/n8n.sh index a986ea8..65a39d2 100644 --- a/services/n8n.sh +++ b/services/n8n.sh @@ -197,7 +197,24 @@ install_n8n() { ensure_docker_dir_ownership "$N8N_DIR" cd "$N8N_DIR" || return 1 - cat > docker-compose.yml << 'N8N_COMPOSE' + local _CADDY_NET_BLOCK="" + if [ -d "$DOCKER_DIR/caddy" ]; then + _CADDY_NET_BLOCK=" networks: + - caddy_net +" + fi + + local _CADDY_NET_SECTION="" + if [ -d "$DOCKER_DIR/caddy" ]; then + _CADDY_NET_SECTION=" +networks: + caddy_net: + external: true + name: ${SITE_CADDY_NET:-caddy_net} +" + fi + + cat > docker-compose.yml << N8N_COMPOSE name: n8n services: @@ -213,18 +230,12 @@ services: environment: - N8N_PORT=5678 - N8N_PROTOCOL=https - - GENERIC_TIMEZONE=${GENERIC_TIMEZONE:-UTC} - - N8N_HOST=${N8N_HOST:-n8n} - - WEBHOOK_URL=${WEBHOOK_URL} + - GENERIC_TIMEZONE=\${GENERIC_TIMEZONE:-UTC} + - N8N_HOST=\${N8N_HOST:-n8n} + - WEBHOOK_URL=\${WEBHOOK_URL} volumes: - ./data:/home/node/.n8n - networks: - - caddy_net - -networks: - caddy_net: - external: true - name: ${CADDY_NET:-caddy_net} +${_CADDY_NET_BLOCK}${_CADDY_NET_SECTION} N8N_COMPOSE cat > .env << N8N_ENV diff --git a/services/nextcloud.sh b/services/nextcloud.sh index 050bf2e..9c58a19 100644 --- a/services/nextcloud.sh +++ b/services/nextcloud.sh @@ -205,8 +205,25 @@ RUN apt-get update \ && rm -rf /var/lib/apt/lists/* NCDF + local _CADDY_NET_BLOCK="" + if [ -d "$DOCKER_DIR/caddy" ]; then + _CADDY_NET_BLOCK=" networks: + - caddy_net +" + fi + + local _CADDY_NET_SECTION="" + if [ -d "$DOCKER_DIR/caddy" ]; then + _CADDY_NET_SECTION=" +networks: + caddy_net: + external: true + name: ${SITE_CADDY_NET:-caddy_net} +" + fi + # ── docker-compose.yml ────────────────────────────────────────────────── - cat > docker-compose.yml << 'NCCOMPOSE' + cat > docker-compose.yml << NCCOMPOSE name: nextcloud services: nextcloud: @@ -223,9 +240,7 @@ services: - ./custom_apps:/var/www/html/custom_apps ports: - "8080:80" - networks: - - caddy_net - +${_CADDY_NET_BLOCK} db: image: mariadb:10.11 container_name: nextcloud-db @@ -234,13 +249,7 @@ services: env_file: .env volumes: - ./db:/var/lib/mysql - networks: - - caddy_net - -networks: - caddy_net: - external: true - name: ${CADDY_NET:-caddy_net} +${_CADDY_NET_BLOCK}${_CADDY_NET_SECTION} NCCOMPOSE # ── .env ──────────────────────────────────────────────────────────────── diff --git a/services/ntfy.sh b/services/ntfy.sh index 5a0f260..4560c4a 100644 --- a/services/ntfy.sh +++ b/services/ntfy.sh @@ -203,7 +203,24 @@ install_ntfy() { ensure_docker_dir_ownership "$NTFY_DIR" cd "$NTFY_DIR" || return 1 - cat > docker-compose.yml << 'NTFY_COMPOSE' + local _CADDY_NET_BLOCK="" + if [ -d "$DOCKER_DIR/caddy" ]; then + _CADDY_NET_BLOCK=" networks: + - caddy_net +" + fi + + local _CADDY_NET_SECTION="" + if [ -d "$DOCKER_DIR/caddy" ]; then + _CADDY_NET_SECTION=" +networks: + caddy_net: + external: true + name: ${SITE_CADDY_NET:-caddy_net} +" + fi + + cat > docker-compose.yml << NTFY_COMPOSE name: ntfy services: @@ -214,19 +231,13 @@ services: restart: unless-stopped command: serve environment: - - TZ=${TZ} + - TZ=\${TZ} volumes: - ./cache:/var/cache/ntfy - ./config:/etc/ntfy ports: - "8090:80" - networks: - - caddy_net - -networks: - caddy_net: - external: true - name: ${CADDY_NET:-caddy_net} +${_CADDY_NET_BLOCK}${_CADDY_NET_SECTION} NTFY_COMPOSE cat > .env << NTFY_ENV diff --git a/services/onlyoffice.sh b/services/onlyoffice.sh index 7abba63..d6b7e2c 100644 --- a/services/onlyoffice.sh +++ b/services/onlyoffice.sh @@ -243,8 +243,25 @@ install_onlyoffice() { fi [[ -z "$JWT_SECRET" ]] && JWT_SECRET="$(generate_password 32)" + local _CADDY_NET_BLOCK="" + if [ -d "$DOCKER_DIR/caddy" ]; then + _CADDY_NET_BLOCK=" networks: + - caddy_net +" + fi + + local _CADDY_NET_SECTION="" + if [ -d "$DOCKER_DIR/caddy" ]; then + _CADDY_NET_SECTION=" +networks: + caddy_net: + external: true + name: ${SITE_CADDY_NET:-caddy_net} +" + fi + # ── docker-compose.yml ────────────────────────────────────────────────── - cat > docker-compose.yml << 'OOCOMPOSE' + cat > docker-compose.yml << OOCOMPOSE name: onlyoffice services: onlyoffice: @@ -259,13 +276,7 @@ services: - ./fonts:/usr/share/fonts/truetype/custom ports: - "8082:80" - networks: - - caddy_net - -networks: - caddy_net: - external: true - name: ${CADDY_NET:-caddy_net} +${_CADDY_NET_BLOCK}${_CADDY_NET_SECTION} OOCOMPOSE # ── .env ──────────────────────────────────────────────────────────────── diff --git a/services/portainer.sh b/services/portainer.sh index 3c2082a..483122d 100644 --- a/services/portainer.sh +++ b/services/portainer.sh @@ -194,7 +194,24 @@ install_portainer() { ensure_docker_dir_ownership "$PORTAINER_DIR" cd "$PORTAINER_DIR" || return 1 - cat > docker-compose.yml << 'PORTAINER_COMPOSE' + local _CADDY_NET_BLOCK="" + if [ -d "$DOCKER_DIR/caddy" ]; then + _CADDY_NET_BLOCK=" networks: + - caddy_net +" + fi + + local _CADDY_NET_SECTION="" + if [ -d "$DOCKER_DIR/caddy" ]; then + _CADDY_NET_SECTION=" +networks: + caddy_net: + external: true + name: ${SITE_CADDY_NET:-caddy_net} +" + fi + + cat > docker-compose.yml << PORTAINER_COMPOSE name: portainer services: @@ -209,13 +226,7 @@ services: ports: - "9000:9000" - "9443:9443" - networks: - - caddy_net - -networks: - caddy_net: - external: true - name: ${CADDY_NET:-caddy_net} +${_CADDY_NET_BLOCK}${_CADDY_NET_SECTION} PORTAINER_COMPOSE mkdir -p data diff --git a/services/stirling-pdf.sh b/services/stirling-pdf.sh index 3c707e4..0bbeb23 100644 --- a/services/stirling-pdf.sh +++ b/services/stirling-pdf.sh @@ -197,7 +197,24 @@ install_stirling_pdf() { ensure_docker_dir_ownership "$PDF_DIR" cd "$PDF_DIR" || return 1 - cat > docker-compose.yml << 'PDF_COMPOSE' + local _CADDY_NET_BLOCK="" + if [ -d "$DOCKER_DIR/caddy" ]; then + _CADDY_NET_BLOCK=" networks: + - caddy_net +" + fi + + local _CADDY_NET_SECTION="" + if [ -d "$DOCKER_DIR/caddy" ]; then + _CADDY_NET_SECTION=" +networks: + caddy_net: + external: true + name: ${SITE_CADDY_NET:-caddy_net} +" + fi + + cat > docker-compose.yml << PDF_COMPOSE name: stirling-pdf services: @@ -213,13 +230,7 @@ services: - ./training-data:/usr/share/tessdata - ./extraConfigs:/configs - ./logs:/logs - networks: - - caddy_net - -networks: - caddy_net: - external: true - name: ${CADDY_NET:-caddy_net} +${_CADDY_NET_BLOCK}${_CADDY_NET_SECTION} PDF_COMPOSE cat > .env << PDF_ENV diff --git a/services/syncthing.sh b/services/syncthing.sh index 7c5138d..cb6d657 100644 --- a/services/syncthing.sh +++ b/services/syncthing.sh @@ -172,6 +172,23 @@ install_syncthing() { PUID="$(id -u "$ACTUAL_USER")" PGID="$(id -g "$ACTUAL_USER")" + local _CADDY_NET_BLOCK="" + if [ -d "$DOCKER_DIR/caddy" ]; then + _CADDY_NET_BLOCK=" networks: + - caddy_net +" + fi + + local _CADDY_NET_SECTION="" + if [ -d "$DOCKER_DIR/caddy" ]; then + _CADDY_NET_SECTION=" +networks: + caddy_net: + external: true + name: ${SITE_CADDY_NET:-caddy_net} +" + fi + cat > docker-compose.yml << EOF name: syncthing @@ -193,13 +210,7 @@ services: volumes: - ./config:/var/syncthing/config - ./data:/var/syncthing - networks: - - caddy_net - -networks: - caddy_net: - external: true - name: \${CADDY_NET:-caddy_net} +${_CADDY_NET_BLOCK}${_CADDY_NET_SECTION} EOF cat > .env << ENV diff --git a/services/traccar.sh b/services/traccar.sh index c560c49..e33a731 100644 --- a/services/traccar.sh +++ b/services/traccar.sh @@ -203,7 +203,24 @@ install_traccar() { ensure_docker_dir_ownership "$TRACCAR_DIR" cd "$TRACCAR_DIR" || return 1 - cat > docker-compose.yml << 'TRACCAR_COMPOSE' + local _CADDY_NET_BLOCK="" + if [ -d "$DOCKER_DIR/caddy" ]; then + _CADDY_NET_BLOCK=" networks: + - caddy_net +" + fi + + local _CADDY_NET_SECTION="" + if [ -d "$DOCKER_DIR/caddy" ]; then + _CADDY_NET_SECTION=" +networks: + caddy_net: + external: true + name: ${SITE_CADDY_NET:-caddy_net} +" + fi + + cat > docker-compose.yml << TRACCAR_COMPOSE name: traccar services: @@ -220,13 +237,7 @@ services: - "8082:8082" - "5000-5150:5000-5150" - "5000-5150:5000-5150/udp" - networks: - - caddy_net - -networks: - caddy_net: - external: true - name: ${CADDY_NET:-caddy_net} +${_CADDY_NET_BLOCK}${_CADDY_NET_SECTION} TRACCAR_COMPOSE mkdir -p logs data config diff --git a/services/unifi.sh b/services/unifi.sh index cfd9977..1302a6c 100644 --- a/services/unifi.sh +++ b/services/unifi.sh @@ -118,8 +118,25 @@ install_unifi() { UID_VAL=$(id -u "$ACTUAL_USER") GID_VAL=$(id -g "$ACTUAL_USER") - # Single-quoted heredoc: ${...} left literal for Docker Compose to expand from .env - cat > docker-compose.yml << 'UNIFI_COMPOSE' + local _CADDY_NET_BLOCK="" + if [ -d "$DOCKER_DIR/caddy" ]; then + _CADDY_NET_BLOCK=" networks: + - caddy_net +" + fi + + local _CADDY_NET_SECTION="" + if [ -d "$DOCKER_DIR/caddy" ]; then + _CADDY_NET_SECTION=" +networks: + caddy_net: + external: true + name: ${SITE_CADDY_NET:-caddy_net} +" + fi + + # Unquoted heredoc; ${...} used for caddy_net vars; all Docker Compose vars escaped with \$ + cat > docker-compose.yml << UNIFI_COMPOSE name: unifi services: @@ -158,20 +175,13 @@ services: # - "8880:8880" # guest portal HTTP # - "6789:6789" # mobile speed test # - "5514:5514/udp" # remote syslog - networks: - - caddy_net - -networks: - caddy_net: - external: true - name: ${CADDY_NET:-caddy_net} - +${_CADDY_NET_BLOCK}${_CADDY_NET_SECTION} # Inline MongoDB init — Docker Compose interpolates vars from .env at startup. configs: init-mongo.js: content: | - db.getSiblingDB("${MONGO_DBNAME}").createUser({user: "${MONGO_USER}", pwd: "${MONGO_PASS}", roles: [{role: "${MONGO_ROLE}", db: "${MONGO_DBNAME}"}]}); - db.getSiblingDB("${MONGO_DBNAME}_stat").createUser({user: "${MONGO_USER}", pwd: "${MONGO_PASS}", roles: [{role: "${MONGO_ROLE}", db: "${MONGO_DBNAME}_stat"}]}); + db.getSiblingDB("\${MONGO_DBNAME}").createUser({user: "\${MONGO_USER}", pwd: "\${MONGO_PASS}", roles: [{role: "\${MONGO_ROLE}", db: "\${MONGO_DBNAME}"}]}); + db.getSiblingDB("\${MONGO_DBNAME}_stat").createUser({user: "\${MONGO_USER}", pwd: "\${MONGO_PASS}", roles: [{role: "\${MONGO_ROLE}", db: "\${MONGO_DBNAME}_stat"}]}); UNIFI_COMPOSE cat > .env << UNIFI_ENV diff --git a/services/uptimekuma.sh b/services/uptimekuma.sh index 32911e8..bf4c739 100644 --- a/services/uptimekuma.sh +++ b/services/uptimekuma.sh @@ -196,7 +196,24 @@ install_uptimekuma() { ensure_docker_dir_ownership "$UPTIME_DIR" cd "$UPTIME_DIR" || return 1 - cat > docker-compose.yml << 'UPTIME_COMPOSE' + local _CADDY_NET_BLOCK="" + if [ -d "$DOCKER_DIR/caddy" ]; then + _CADDY_NET_BLOCK=" networks: + - caddy_net +" + fi + + local _CADDY_NET_SECTION="" + if [ -d "$DOCKER_DIR/caddy" ]; then + _CADDY_NET_SECTION=" +networks: + caddy_net: + external: true + name: ${SITE_CADDY_NET:-caddy_net} +" + fi + + cat > docker-compose.yml << UPTIME_COMPOSE name: uptime-kuma services: @@ -210,13 +227,7 @@ services: - /var/run/docker.sock:/var/run/docker.sock:ro ports: - "3001:3001" - networks: - - caddy_net - -networks: - caddy_net: - external: true - name: ${CADDY_NET:-caddy_net} +${_CADDY_NET_BLOCK}${_CADDY_NET_SECTION} UPTIME_COMPOSE mkdir -p data diff --git a/services/vaultwarden.sh b/services/vaultwarden.sh index 6a8d9e5..fbe5ea3 100644 --- a/services/vaultwarden.sh +++ b/services/vaultwarden.sh @@ -242,7 +242,24 @@ install_vaultwarden() { prompt_text "SMTP password:" "" SMTP_PASS fi - cat > docker-compose.yml << 'VW_COMPOSE' + local _CADDY_NET_BLOCK="" + if [ -d "$DOCKER_DIR/caddy" ]; then + _CADDY_NET_BLOCK=" networks: + - caddy_net +" + fi + + local _CADDY_NET_SECTION="" + if [ -d "$DOCKER_DIR/caddy" ]; then + _CADDY_NET_SECTION=" +networks: + caddy_net: + external: true + name: ${SITE_CADDY_NET:-caddy_net} +" + fi + + cat > docker-compose.yml << VW_COMPOSE name: vaultwarden services: @@ -256,13 +273,7 @@ services: - ./vaultwarden_data:/data ports: - "8888:80" - networks: - - caddy_net - -networks: - caddy_net: - external: true - name: ${CADDY_NET:-caddy_net} +${_CADDY_NET_BLOCK}${_CADDY_NET_SECTION} VW_COMPOSE cat > .env << VW_ENV diff --git a/services/wg-easy.sh b/services/wg-easy.sh index 177b7f8..e309870 100644 --- a/services/wg-easy.sh +++ b/services/wg-easy.sh @@ -234,6 +234,23 @@ install_wg-easy() { # Escape $ in hash for docker-compose env (bcrypt hashes contain $$) local WG_HASH_ESCAPED="${WG_PASSWORD_HASH//\$/\$\$}" + local _CADDY_NET_BLOCK="" + if [ -d "$DOCKER_DIR/caddy" ]; then + _CADDY_NET_BLOCK=" networks: + - caddy_net +" + fi + + local _CADDY_NET_SECTION="" + if [ -d "$DOCKER_DIR/caddy" ]; then + _CADDY_NET_SECTION=" +networks: + caddy_net: + external: true + name: ${SITE_CADDY_NET:-caddy_net} +" + fi + cat > docker-compose.yml << WGEASY_COMPOSE name: wg-easy @@ -258,13 +275,7 @@ services: ports: - "51820:51820/udp" - "51821:51821/tcp" - networks: - - caddy_net - -networks: - caddy_net: - external: true - name: \${CADDY_NET:-caddy_net} +${_CADDY_NET_BLOCK}${_CADDY_NET_SECTION} WGEASY_COMPOSE cat > .env << WGEASY_ENV