Initial upload

This commit is contained in:
2025-11-11 11:47:15 +01:00
commit 7c24dab288
48 changed files with 2761 additions and 0 deletions

View File

@@ -0,0 +1,96 @@
#!/usr/bin/env bash
set -euo pipefail
ensure_root
detect_pkg_manager
pkg_install curl
BASE="/srv/docker/services/frigate"
$SUDO mkdir -p "$BASE/config"
$SUDO mkdir -p "$BASE/media"
cd "$BASE"
echo ""
echo "Möchtest du Coral TPU verwenden?"
echo " y = USB / PCIe TPU einbinden"
echo " n = ohne TPU (CPU Only)"
read -p "Auswahl (y/n): " TPU
TPU_CONFIG=""
if [[ "$TPU" == "y" || "$TPU" == "Y" ]]; then
TPU_CONFIG=" devices:
- /dev/apex_0:/dev/apex_0
- /dev/bus/usb:/dev/bus/usb"
echo "Coral TPU-Unterstützung aktiviert."
else
echo "Installiere ohne TPU."
fi
echo ""
read -p "Soll direkt eine Kamera eingetragen werden? (y/n): " ADD_CAM
CAMERA_CONFIG=""
if [[ "$ADD_CAM" == "y" || "$ADD_CAM" == "Y" ]]; then
read -p "Name der Kamera (z.B. wohnzimmer): " CAM_NAME
read -p "RTSP URL (z.B. rtsp://user:pass@192.168.x.x/stream): " CAM_URL
CAMERA_CONFIG="cameras:
$CAM_NAME:
ffmpeg:
inputs:
- path: \"$CAM_URL\"
input_args: preset-rtsp-restream"
else
CAMERA_CONFIG="cameras: {}"
fi
$SUDO tee "$BASE/config/config.yml" >/dev/null <<EOF
mqtt:
enabled: false
${CAMERA_CONFIG}
EOF
$SUDO tee "$BASE/docker-compose.yml" >/dev/null <<EOF
services:
frigate:
image: ghcr.io/blakeblackshear/frigate:stable
container_name: frigate
privileged: true
restart: unless-stopped
shm_size: "64m"
volumes:
- ./config:/config
- ./media:/media/frigate
- /dev/bus/usb:/dev/bus/usb
- /etc/localtime:/etc/localtime:ro
${TPU_CONFIG}
ports:
- "5000:5000"
- "8554:8554"
- "8555:8555/tcp"
- "8555:8555/udp"
EOF
$SUDO docker compose up -d
log "Frigate wurde installiert."
log "Web UI: http://<server-ip>:5000"
log "Konfiguration: $BASE/config/config.yml"
echo ""
read -p "Soll NGINX Proxy für Frigate eingerichtet werden? (y/n): " PROXY
if [[ "$PROXY" == "y" || "$PROXY" == "Y" ]]; then
PROXY_SCRIPT="/srv/docker/system/nginx-proxy-path/install.sh"
if [ ! -f "$PROXY_SCRIPT" ]; then
log "Fehler: nginx-proxy-path nicht installiert."
log "Bitte erst das Rezept 'nginx-proxy-path' installieren."
exit 0
fi
echo ""
echo "Starte Proxy-Konfiguration:"
bash "$PROXY_SCRIPT"
fi

View File

@@ -0,0 +1,65 @@
#!/usr/bin/env bash
set -euo pipefail
ensure_root
detect_pkg_manager
pkg_install curl
BASE="/srv/docker/services/grafana"
$SUDO mkdir -p "$BASE/data"
cd "$BASE"
echo "Starte Installation von Grafana..."
# Funktion: finde den nächsten freien Port ab 3000
find_free_port() {
PORT=3000
while ss -lnt | awk '{print $4}' | grep -q ":$PORT$"; do
PORT=$((PORT + 1))
done
echo "$PORT"
}
FREE_PORT=$(find_free_port)
echo "✅ Freier Port für Grafana: $FREE_PORT"
$SUDO tee docker-compose.yml >/dev/null <<EOF
services:
grafana:
image: grafana/grafana:latest
container_name: grafana-$FREE_PORT
restart: unless-stopped
ports:
- "$FREE_PORT:3000"
volumes:
- ./data:/var/lib/grafana
environment:
GF_SECURITY_ADMIN_USER=admin
GF_SECURITY_ADMIN_PASSWORD=admin
TZ=Europe/Berlin
EOF
$SUDO docker compose up -d
log "Grafana wurde installiert."
log "Web UI: http://<server-ip>:$FREE_PORT"
log "Standard Login: admin / admin (bitte ändern!)"
log "Daten liegen in: $BASE/data"
echo ""
read -p "Soll ein NGINX Proxy-Pfad eingerichtet werden? (y/n): " PROXY
if [[ "$PROXY" == "y" || "$PROXY" == "Y" ]]; then
PROXY_SCRIPT="/srv/docker/system/nginx-proxy-path/install.sh"
if [ ! -f "$PROXY_SCRIPT" ]; then
log "Fehler: nginx-proxy-path nicht installiert."
log "Bitte zuerst das Rezept 'nginx-proxy-path' installieren."
exit 0
fi
echo ""
echo "Bitte Proxy-Pfad einrichten:"
bash "$PROXY_SCRIPT"
fi

View File

@@ -0,0 +1,49 @@
#!/usr/bin/env bash
set -euo pipefail
ensure_root
detect_pkg_manager
pkg_install curl
BASE="/srv/docker/services/homeassistant"
$SUDO mkdir -p "$BASE/config"
cd "$BASE"
echo ""
echo "Starte Installation von Home Assistant (Container-Modus)."
# docker-compose schreiben
$SUDO tee docker-compose.yml >/dev/null <<'EOF'
services:
homeassistant:
image: ghcr.io/home-assistant/home-assistant:stable
container_name: homeassistant
restart: unless-stopped
network_mode: host
volumes:
- ./config:/config
- /etc/localtime:/etc/localtime:ro
EOF
$SUDO docker compose up -d
log "Home Assistant wurde installiert."
log "Web UI (wenn kein Proxy): http://<server-ip>:8123"
log "Konfiguration: $BASE/config/"
echo ""
read -p "Soll ein NGINX Proxy-Pfad eingerichtet werden? (y/n): " PROXY
if [[ "$PROXY" == "y" || "$PROXY" == "Y" ]]; then
PROXY_SCRIPT="/srv/docker/system/nginx-proxy-path/install.sh"
if [ ! -f "$PROXY_SCRIPT" ]; then
log "Fehler: nginx-proxy-path nicht installiert."
log "Bitte zuerst das Rezept 'nginx-proxy-path' installieren."
exit 0
fi
echo ""
echo "Bitte Proxy-Pfad einrichten:"
bash "$PROXY_SCRIPT"
fi

View File

@@ -0,0 +1,49 @@
#!/usr/bin/env bash
set -euo pipefail
ensure_root
detect_pkg_manager
pkg_install curl
BASE="/srv/docker/services/myspeed"
$SUDO mkdir -p "$BASE/data"
cd "$BASE"
echo "Starte Installation von MySpeed (germannewsmaker/myspeed)..."
$SUDO tee docker-compose.yml >/dev/null <<'EOF'
services:
myspeed:
image: germannewsmaker/myspeed:latest
container_name: myspeed
restart: unless-stopped
ports:
- "52100:52100"
volumes:
- ./data:/myspeed/data
environment:
TZ=Europe/Berlin
EOF
$SUDO docker compose up -d
log "MySpeed wurde installiert."
log "Web UI: http://<server-ip>:52100"
log "Daten liegen in: $BASE/data"
echo ""
read -p "Soll ein NGINX Proxy-Pfad eingerichtet werden? (y/n): " PROXY
if [[ "$PROXY" == "y" || "$PROXY" == "Y" ]]; then
PROXY_SCRIPT="/srv/docker/system/nginx-proxy-path/install.sh"
if [ ! -f "$PROXY_SCRIPT" ]; then
log "Fehler: nginx-proxy-path nicht installiert."
log "Bitte zuerst das Rezept 'nginx-proxy-path' installieren."
exit 0
fi
echo ""
echo "Bitte Proxy-Pfad einrichten:"
bash "$PROXY_SCRIPT"
fi

View File

@@ -0,0 +1,70 @@
#!/usr/bin/env bash
set -euo pipefail
ensure_root
detect_pkg_manager
pkg_install curl
echo ""
echo "=== NGINX KI-Proxy Konfigurator ==="
echo ""
read -p "Pfad unter dem KI erreichbar sein soll (z.B. /ai): " KI_PATH
read -p "Backend-Adresse (z.B. http://127.0.0.1:11434): " KI_BACKEND
echo ""
echo "Ist Ollama installiert? (y/n)"
read OLLAMA
if [[ "$OLLAMA" =~ ^[Yy]$ ]]; then
echo "Ollama wird geprüft..."
if ! systemctl is-active --quiet ollama && ! pgrep ollama >/dev/null; then
echo "⚠️ Ollama läuft nicht. Bitte vorher installieren/starten."
else
echo "✅ Ollama läuft."
fi
fi
echo ""
echo "Soll zusätzlich der Memory-Server integriert werden? (y/n)"
read MEM
if [[ "$MEM" =~ ^[Yy]$ ]]; then
read -p "Memory Server URL (z.B. http://127.0.0.1:8085): " MEMORY_URL
fi
NGINX_CONF="/etc/nginx/conf.d/ai-proxy.conf"
$SUDO tee $NGINX_CONF >/dev/null <<EOF
location $KI_PATH/ {
proxy_pass $KI_BACKEND/;
proxy_http_version 1.1;
proxy_set_header Upgrade \$http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host \$host;
}
EOF
if [[ "$MEM" =~ ^[Yy]$ ]]; then
$SUDO tee -a $NGINX_CONF >/dev/null <<EOF
location ${KI_PATH}_memory/ {
proxy_pass $MEMORY_URL/;
proxy_http_version 1.1;
proxy_set_header Upgrade \$http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host \$host;
}
EOF
fi
echo ""
echo "Reloading nginx..."
$SUDO systemctl reload nginx
echo ""
echo "✅ Fertig!"
echo "KI UI erreichbar unter: http://<server-ip>$KI_PATH/"
if [[ "$MEM" =~ ^[Yy]$ ]]; then
echo "Memory erreichbar unter: http://<server-ip>${KI_PATH}_memory/"
fi

View File

@@ -0,0 +1,62 @@
#!/usr/bin/env bash
set -euo pipefail
ensure_root
detect_pkg_manager
pkg_install curl
BASE="/srv/docker/services/node-red"
$SUDO mkdir -p "$BASE/data"
cd "$BASE"
echo "Starte Installation von Node-RED..."
# Funktion: finde den nächsten freien Port ab 1880
find_free_port() {
PORT=1880
while ss -lnt | awk '{print $4}' | grep -q ":$PORT$"; do
PORT=$((PORT + 1))
done
echo "$PORT"
}
FREE_PORT=$(find_free_port)
echo "✅ Freier Port für Node-RED gefunden: $FREE_PORT"
$SUDO tee docker-compose.yml >/dev/null <<EOF
services:
node-red:
image: nodered/node-red:latest
container_name: node-red-$FREE_PORT
restart: unless-stopped
ports:
- "$FREE_PORT:1880"
volumes:
- ./data:/data
environment:
TZ=Europe/Berlin
EOF
$SUDO docker compose up -d
log "Node-RED wurde installiert."
log "Web UI: http://<server-ip>:$FREE_PORT"
log "Konfiguration / Flows: $BASE/data/"
echo ""
read -p "Soll ein NGINX Proxy-Pfad eingerichtet werden? (y/n): " PROXY
if [[ "$PROXY" == "y" || "$PROXY" == "Y" ]]; then
PROXY_SCRIPT="/srv/docker/system/nginx-proxy-path/install.sh"
if [ ! -f "$PROXY_SCRIPT" ]; then
log "Fehler: nginx-proxy-path nicht installiert."
log "Bitte zuerst das Rezept 'nginx-proxy-path' installieren."
exit 0
fi
echo ""
echo "Bitte Proxy-Pfad einrichten:"
bash "$PROXY_SCRIPT"
fi

View File

@@ -0,0 +1,57 @@
#!/usr/bin/env bash
set -euo pipefail
ensure_root
detect_pkg_manager
pkg_install curl
BASE="/srv/docker/services/omada"
$SUDO mkdir -p "$BASE/data"
$SUDO mkdir -p "$BASE/logs"
cd "$BASE"
echo "Starte Installation des Omada Controllers..."
# docker-compose
$SUDO tee docker-compose.yml >/dev/null <<'EOF'
services:
omada:
image: mbentley/omada-controller:latest
container_name: omada-controller
restart: unless-stopped
network_mode: host
environment:
TZ: Europe/Berlin
MANAGE_HTTP_PORT: 8088
MANAGE_HTTPS_PORT: 8043
PORTAL_HTTP_PORT: 8086
PORTAL_HTTPS_PORT: 8843
volumes:
- ./data:/opt/tplink/EAPController/data
- ./logs:/opt/tplink/EAPController/logs
EOF
$SUDO docker compose up -d
log "Omada Controller wurde installiert."
log "Web UI (HTTPS): https://<server-ip>:8043"
log "Mobile App Discovery funktioniert automatisch (host network mode)."
echo ""
read -p "Soll ein NGINX Proxy-Pfad eingerichtet werden? (y/n): " PROXY
if [[ "$PROXY" == "y" || "$PROXY" == "Y" ]]; then
PROXY_SCRIPT="/srv/docker/system/nginx-proxy-path/install.sh"
if [ ! -f "$PROXY_SCRIPT" ]; then
log "Fehler: nginx-proxy-path nicht installiert."
log "Bitte zuerst das Rezept 'nginx-proxy-path' installieren."
exit 0
fi
echo ""
echo "Hinweis: Omada UI benötigt HTTPS Proxy!"
echo "Proxy-Ziel: <server-ip>:8043"
echo ""
bash "$PROXY_SCRIPT"
fi

View File

@@ -0,0 +1,87 @@
#!/usr/bin/env bash
set -euo pipefail
ensure_root
detect_pkg_manager
pkg_install curl
echo ""
read -p "Instanz Nummer (z.B. 1, 2, 3...): " INSTANCE
BASE="/srv/docker/services/paperless-$INSTANCE"
$SUDO mkdir -p "$BASE/data" "$BASE/media" "$BASE/consume"
cd "$BASE"
PORT=$((8100 + INSTANCE))
echo "Web-Port wird: $PORT"
echo ""
echo "Paperless Variante:"
echo " 1) Paperless-NGX (ohne KI)"
echo " 2) Paperless-AI (mit KI/RAG)"
read -p "Auswahl (1/2): " MODE
if [[ "$MODE" == "2" ]]; then
read -p "KI Backend URL (z.B. http://127.0.0.1:11434): " AI_URL
read -p "Memory Server URL (z.B. http://127.0.0.1:8085): " MEMORY_URL
fi
echo ""
echo "Instanz $INSTANCE ersetzen ohne Daten zu löschen?"
read -p "(y/n): " REPLACE
if [[ "$REPLACE" =~ ^[Yy]$ ]]; then
$SUDO docker compose down || true
fi
if [[ "$MODE" == "1" ]]; then
cat > docker-compose.yml <<EOF
services:
paperless-$INSTANCE:
image: ghcr.io/paperless-ngx/paperless-ngx:latest
container_name: paperless-$INSTANCE
restart: unless-stopped
ports:
- "$PORT:8000"
volumes:
- ./data:/usr/src/paperless/data
- ./media:/usr/src/paperless/media
- ./consume:/usr/src/paperless/consume
environment:
TZ=Europe/Berlin
EOF
fi
if [[ "$MODE" == "2" ]]; then
cat > docker-compose.yml <<EOF
services:
paperless-$INSTANCE:
image: ghcr.io/paperless-ngx/paperless-ngx:latest
container_name: paperless-$INSTANCE
restart: unless-stopped
ports:
- "$PORT:8000"
volumes:
- ./data:/usr/src/paperless/data
- ./media:/usr/src/paperless/media
- ./consume:/usr/src/paperless/consume
environment:
TZ=Europe/Berlin
paperless-ai-$INSTANCE:
image: clusterzx/paperless-ai:latest
container_name: paperless-ai-$INSTANCE
restart: unless-stopped
environment:
PAPERLESS_AI_OPENAI_API_BASE_URL: "$AI_URL"
PAPERLESS_AI_EMBEDDING_MODEL: "nomic-embed-text"
PAPERLESS_AI_CHAT_MODEL: "qwen2.5:0.5b"
PAPERLESS_AI_MEMORY_SERVER_URL: "$MEMORY_URL"
TZ: Europe/Berlin
EOF
fi
$SUDO docker compose up -d
echo ""
echo "✅ Instanz $INSTANCE installiert!"
echo "Web UI: http://<server-ip>:$PORT"

View File

@@ -0,0 +1,44 @@
#!/usr/bin/env bash
set -euo pipefail
ensure_root
detect_pkg_manager
pkg_install curl
BASE="/srv/docker/system/portainer-watchtower"
$SUDO mkdir -p "$BASE"
cd "$BASE"
echo "Starte Installation von Portainer + Watchtower..."
$SUDO tee docker-compose.yml >/dev/null <<'EOF'
services:
portainer:
image: portainer/portainer-ce:latest
container_name: portainer
restart: unless-stopped
ports:
- "9443:9443"
- "9000:9000"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- ./portainer-data:/data
watchtower:
image: containrrr/watchtower:latest
container_name: watchtower
restart: unless-stopped
volumes:
- /var/run/docker.sock:/var/run/docker.sock
command:
- --schedule=0 0 3 * * *
- --cleanup
- --rolling-restart
- --update-delay=72h
EOF
$SUDO docker compose up -d
log "Portainer + Watchtower installiert."
log "Portainer UI: https://<server-ip>:9443 (oder http://<server-ip>:9000)"
log "Watchtower aktualisiert Container täglich um 03:00 Uhr mit 72h Verzögerung."

View File

@@ -0,0 +1,55 @@
#!/usr/bin/env bash
set -euo pipefail
ensure_root
detect_pkg_manager
pkg_install curl
BASE="/srv/docker/services/unifi"
$SUDO mkdir -p "$BASE/data"
$SUDO mkdir -p "$BASE/logs"
cd "$BASE"
echo "Starte Installation des UniFi Controllers..."
# docker-compose
$SUDO tee docker-compose.yml >/dev/null <<'EOF'
services:
unifi-controller:
image: linuxserver/unifi-controller:latest
container_name: unifi-controller
restart: unless-stopped
network_mode: host
environment:
PUID: 1000
PGID: 1000
TZ: Europe/Berlin
volumes:
- ./data:/config
- ./logs:/config/logs
EOF
$SUDO docker compose up -d
log "UniFi Controller wurde installiert."
log "Web UI (HTTPS): https://<server-ip>:8443"
log "Geräte-Erkennung funktioniert automatisch (host network mode)."
echo ""
read -p "Soll ein NGINX Proxy-Pfad eingerichtet werden? (y/n): " PROXY
if [[ "$PROXY" == "y" || "$PROXY" == "Y" ]]; then
PROXY_SCRIPT="/srv/docker/system/nginx-proxy-path/install.sh"
if [ ! -f "$PROXY_SCRIPT" ]; then
log "Fehler: nginx-proxy-path nicht installiert."
log "Bitte zuerst das Rezept 'nginx-proxy-path' installieren."
exit 0
fi
echo ""
echo "Hinweis: UniFi UI benötigt HTTPS Proxy!"
echo "Proxy-Ziel: <server-ip>:8443"
echo ""
bash "$PROXY_SCRIPT"
fi

View File

@@ -0,0 +1,47 @@
#!/usr/bin/env bash
set -euo pipefail
ensure_root
detect_pkg_manager
pkg_install curl
BASE="/srv/docker/services/uptime-kuma"
$SUDO mkdir -p "$BASE/data"
cd "$BASE"
echo "Starte Installation von Uptime Kuma..."
$SUDO tee docker-compose.yml >/dev/null <<'EOF'
services:
uptime-kuma:
image: louislam/uptime-kuma:latest
container_name: uptime-kuma
restart: unless-stopped
ports:
- "3001:3001"
volumes:
- ./data:/app/data
EOF
$SUDO docker compose up -d
log "Uptime Kuma wurde installiert."
log "Web UI: http://<server-ip>:3001"
log "Daten liegen in: $BASE/data"
echo ""
read -p "Soll ein NGINX Proxy-Pfad eingerichtet werden? (y/n): " PROXY
if [[ "$PROXY" == "y" || "$PROXY" == "Y" ]]; then
PROXY_SCRIPT="/srv/docker/system/nginx-proxy-path/install.sh"
if [ ! -f "$PROXY_SCRIPT" ]; then
log "Fehler: nginx-proxy-path nicht installiert."
log "Bitte zuerst das Rezept 'nginx-proxy-path' installieren."
exit 0
fi
echo ""
echo "Bitte Proxy-Pfad einrichten:"
bash "$PROXY_SCRIPT"
fi