From 78f4f39789a8df3e69bab363434afe9f84ece8c2 Mon Sep 17 00:00:00 2001 From: theoleuthardt Date: Tue, 19 Aug 2025 16:52:22 +0000 Subject: [PATCH] feat: docker compose files for new homelab services --- beszel-agent/docker-compose.yaml | 21 ++ beszel/docker-compose.yaml | 14 + calibre/docker-compose.yaml | 20 ++ dashy/config.yml | 294 ++++++++++++++++++ dashy/docker-compose.yaml | 22 ++ dockploy/install-chatgpt.sh | 107 +++++++ dockploy/install.sh | 201 ++++++++++++ filebrowser/docker-compose.yaml | 21 ++ glance/assets/filebrowser.png | Bin 0 -> 27365 bytes glance/assets/forgejo.svg | 40 +++ glance/assets/immich.png | Bin 0 -> 10148 bytes glance/assets/jellyfin.svg | 24 ++ glance/assets/jellyseerr.svg | 118 +++++++ glance/assets/mealie.png | Bin 0 -> 20383 bytes glance/assets/portainer.png | Bin 0 -> 2518 bytes glance/assets/user.css | 1 + glance/config/glance.yml | 20 ++ glance/config/home.yml | 244 +++++++++++++++ glance/docker-compose.yml | 20 ++ kavita/docker-compose.yaml | 19 ++ n8n-automation/.env | 14 + n8n-automation/docker-compose.yaml | 25 ++ pocketbase/Dockerfile | 22 ++ pocketbase/docker-compose.yml | 16 + privatebin/docker-compose.yaml | 14 + .../docker-compose.yaml | 24 +- stirling-pdf/docker-compose.yaml | 22 ++ tailscale/docker-compose.yaml | 17 - webdav/.env | 2 + webdav/docker-compose.yaml | 16 + 30 files changed, 1337 insertions(+), 21 deletions(-) create mode 100644 beszel-agent/docker-compose.yaml create mode 100644 beszel/docker-compose.yaml create mode 100644 calibre/docker-compose.yaml create mode 100644 dashy/config.yml create mode 100644 dashy/docker-compose.yaml create mode 100644 dockploy/install-chatgpt.sh create mode 100644 dockploy/install.sh create mode 100644 filebrowser/docker-compose.yaml create mode 100644 glance/assets/filebrowser.png create mode 100644 glance/assets/forgejo.svg create mode 100644 glance/assets/immich.png create mode 100644 glance/assets/jellyfin.svg create mode 100644 glance/assets/jellyseerr.svg create mode 100644 glance/assets/mealie.png create mode 100644 glance/assets/portainer.png create mode 100644 glance/assets/user.css create mode 100644 glance/config/glance.yml create mode 100644 glance/config/home.yml create mode 100644 glance/docker-compose.yml create mode 100644 kavita/docker-compose.yaml create mode 100644 n8n-automation/.env create mode 100644 n8n-automation/docker-compose.yaml create mode 100644 pocketbase/Dockerfile create mode 100644 pocketbase/docker-compose.yml create mode 100644 privatebin/docker-compose.yaml rename {satisfactory => satisfactory-tailscaled}/docker-compose.yaml (52%) create mode 100644 stirling-pdf/docker-compose.yaml delete mode 100644 tailscale/docker-compose.yaml create mode 100644 webdav/.env create mode 100644 webdav/docker-compose.yaml diff --git a/beszel-agent/docker-compose.yaml b/beszel-agent/docker-compose.yaml new file mode 100644 index 0000000..e2dc65e --- /dev/null +++ b/beszel-agent/docker-compose.yaml @@ -0,0 +1,21 @@ +services: + beszel-agent: + image: henrygd/beszel-agent:latest + container_name: beszel-agent + restart: unless-stopped + network_mode: host + volumes: + - beszel_agent_data:/var/lib/beszel-agent + - beszel_socket:/beszel_socket + - /var/run/docker.sock:/var/run/docker.sock:ro + environment: + LISTEN: /beszel_socket/beszel.sock + HUB_URL: http://192.168.12.151:8091 + TOKEN: EvrIZdupNHXJyEFdMpAa + KEY: "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIHK3ckn/gTe88kj1KLkRyYr4rX765k0d8nFDrVvJnXUF" + +volumes: + beszel_agent_data: + beszel_socket: + external: True + name: beszel_beszel_socket diff --git a/beszel/docker-compose.yaml b/beszel/docker-compose.yaml new file mode 100644 index 0000000..76d54e9 --- /dev/null +++ b/beszel/docker-compose.yaml @@ -0,0 +1,14 @@ +services: + beszel: + image: henrygd/beszel:latest + container_name: beszel + restart: unless-stopped + ports: + - 8091:8090 + volumes: + - beszel_data:/beszel_data + - beszel_socket:/beszel_socket + +volumes: + beszel_data: + beszel_socket: diff --git a/calibre/docker-compose.yaml b/calibre/docker-compose.yaml new file mode 100644 index 0000000..e8fba90 --- /dev/null +++ b/calibre/docker-compose.yaml @@ -0,0 +1,20 @@ +services: + calibre-web: + image: lscr.io/linuxserver/calibre-web:latest + container_name: calibre-web + environment: + - PUID=1000 + - PGID=1000 + - TZ=Etc/UTC + - OAUTHLIB_RELAX_TOKEN_SCOPE=1 #optional + volumes: + - calibre_web_config:/config + - ebooks_library:/books + ports: + - 8083:8083 + restart: unless-stopped + +volumes: + calibre_web_config: + ebooks_library: + external: True diff --git a/dashy/config.yml b/dashy/config.yml new file mode 100644 index 0000000..4635559 --- /dev/null +++ b/dashy/config.yml @@ -0,0 +1,294 @@ +pageInfo: + title: TheoCloud Services + description: Embrace privacy & live like a duck! + navLinks: + - title: Personal Github + path: https://github.com/ + target: newtab + - title: Dashy Documentation + path: https://dashy.to/docs + target: newtab + footerText: Ducks also live a dangerous life! +appConfig: + theme: dashy-docs + layout: auto + iconSize: large + startingView: default + defaultOpeningMethod: newtab + statusCheck: false + statusCheckInterval: 0 + faviconApi: duckduckgo + routingMode: history + enableMultiTasking: false + widgetsAlwaysUseProxy: false + webSearch: + disableWebSearch: false + searchEngine: duckduckgo + openingMethod: newtab + searchBangs: {} + enableFontAwesome: true + enableMaterialDesignIcons: false + hideComponents: + hideHeading: false + hideNav: false + hideSearch: false + hideSettings: false + hideFooter: false + auth: + enableGuestAccess: false + users: + - user: theo + hash: 0475924e1769394a501610b4070face6ad35f760c53f093569825054693adf05 + type: admin + enableOidc: false + oidc: + adminRole: 'false' + adminGroup: 'false' + enableHeaderAuth: false + headerAuth: + userHeader: REMOTE_USER + proxyWhitelist: [] + enableKeycloak: false + showSplashScreen: true + preventWriteToDisk: false + preventLocalSave: false + disableConfiguration: false + disableConfigurationForNonAdmin: false + allowConfigEdit: true + enableServiceWorker: false + disableContextMenu: false + disableUpdateChecks: false + disableSmartSort: false + enableErrorReporting: false +sections: + - name: Server Management + icon: si-docker + items: + - title: Portainer + description: Docker Management Tool for Containerization and Deployment + icon: >- + https://res.cloudinary.com/canonical/image/fetch/f_auto,q_auto,fl_sanitize,c_fill,w_100/https%3A%2F%2Fapi.charmhub.io%2Fapi%2Fv1%2Fmedia%2Fdownload%2Fcharm_cMu7M9K6a65FsKZvrLZOZwyQradwbs7E_icon_5cef79c2d18f67464f39c8f2cf2d7ebb815b0071f04d3ffbb94f49fddd3ab666.png + url: https://192.168.12.151:9443 + target: newtab + id: 0_1684_portainer + - title: BESZEL Monitoring + description: System Usage Monitor + icon: >- + https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/beszel-light.svg + url: https://monitoring.theocloud.dev/ + target: newtab + id: 1_1684_beszelmonitoring + - title: Cloudflare Tunnel DNS + description: DNS Management for Domain + icon: >- + https://img.icons8.com/external-tal-revivo-color-tal-revivo/96/external-cloudflare-provides-content-delivery-network-services-ddos-mitigation-logo-color-tal-revivo.png + url: >- + https://one.dash.cloudflare.com/c2b08d3c0457044067683295a304bd0c/networks/tunnels/cfd_tunnel/ab494eb6-8d03-4fb2-b127-9b48bfe95487/edit?tab=publicHostname + target: newtab + id: 2_1684_cloudflaretunneldns + - title: Uptime Kuma + description: Uptime Monitoring of services + icon: >- + https://raw.githubusercontent.com/louislam/uptime-kuma/refs/heads/master/public/icon.svg + url: https://uptime.theocloud.dev/dashboard + target: newtab + id: 3_1684_uptimekuma + - title: Adguard DNS + description: DNS Server with Adblock + icon: >- + https://user-images.githubusercontent.com/4099637/55673103-35487300-5871-11e9-837d-8e8b1e785bed.png + url: http://192.168.12.151/ + target: newtab + id: 4_1684_adguarddns + - title: Git + description: Private Forgejo Git instance + icon: >- + https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/forgejo.svg + url: https://git.theocloud.dev/ + target: newtab + id: 5_1684_git + - title: Duplicati + description: Backup Management + icon: >- + https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/duplicati.svg + url: https://duplicati.theocloud.dev/ + target: newtab + id: 6_1684_duplicati + displayData: + sortBy: default + rows: 2 + cols: 1 + collapsed: false + hideForGuests: false + - name: File Storage & Management + icon: si-thunderstore + displayData: + sortBy: default + rows: 1 + cols: 1 + collapsed: false + hideForGuests: false + items: + - title: Filebrowser + description: File Management Server + icon: https://filebrowser.org/static/logo.png + url: https://drive.theocloud.dev/ + target: newtab + id: 0_2264_filebrowser + - title: Immich + description: Backup your photos and videos! + icon: >- + data:image/svg+xml,%3c?xml%20version='1.0'%20encoding='utf-8'?%3e%3c!--%20Generator:%20Adobe%20Illustrator%2028.3.0,%20SVG%20Export%20Plug-In%20.%20SVG%20Version:%206.00%20Build%200)%20--%3e%3csvg%20version='1.1'%20id='Flower'%20xmlns='http://www.w3.org/2000/svg'%20xmlns:xlink='http://www.w3.org/1999/xlink'%20x='0px'%20y='0px'%20viewBox='0%200%20792%20792'%20style='enable-background:new%200%200%20792%20792;'%20xml:space='preserve'%3e%3cstyle%20type='text/css'%3e%20.st0{fill:%23FA2921;}%20.st1{fill:%23ED79B5;}%20.st2{fill:%23FFB400;}%20.st3{fill:%231E83F7;}%20.st4{fill:%2318C249;}%20%3c/style%3e%3cg%20id='Flower_00000077325900055813483940000000694823054982625702_'%3e%3cpath%20class='st0'%20d='M375.48,267.63c38.64,34.21,69.78,70.87,89.82,105.42c34.42-61.56,57.42-134.71,57.71-181.3%20c0-0.33,0-0.63,0-0.91c0-68.94-68.77-95.77-128.01-95.77s-128.01,26.83-128.01,95.77c0,0.94,0,2.2,0,3.72%20C300.01,209.24,339.15,235.47,375.48,267.63z'/%3e%3cpath%20class='st1'%20d='M164.7,455.63c24.15-26.87,61.2-55.99,103.01-80.61c44.48-26.18,88.97-44.47,128.02-52.84%20c-47.91-51.76-110.37-96.24-154.6-110.91c-0.31-0.1-0.6-0.19-0.86-0.28c-65.57-21.3-112.34,35.81-130.64,92.15%20c-18.3,56.34-14.04,130.04,51.53,151.34C162.05,454.77,163.25,455.16,164.7,455.63z'/%3e%3cpath%20class='st2'%20d='M681.07,302.19c-18.3-56.34-65.07-113.45-130.64-92.15c-0.9,0.29-2.1,0.68-3.54,1.15%20c-3.75,35.93-16.6,81.27-35.96,125.76c-20.59,47.32-45.84,88.27-72.51,118c69.18,13.72,145.86,12.98,190.26-1.14%20c0.31-0.1,0.6-0.2,0.86-0.28C695.11,432.22,699.37,358.52,681.07,302.19z'/%3e%3cpath%20class='st3'%20d='M336.54,510.71c-11.15-50.39-14.8-98.36-10.7-138.08c-64.03,29.57-125.63,75.23-153.26,112.76%20c-0.19,0.26-0.37,0.51-0.53,0.73c-40.52,55.78-0.66,117.91,47.27,152.72c47.92,34.82,119.33,53.54,159.86-2.24%20c0.56-0.76,1.3-1.78,2.19-3.01C363.28,602.32,347.02,558.08,336.54,510.71z'/%3e%3cpath%20class='st4'%20d='M617.57,482.52c-35.33,7.54-82.42,9.33-130.72,4.66c-51.37-4.96-98.11-16.32-134.63-32.5%20c8.33,70.03,32.73,142.73,59.88,180.6c0.19,0.26,0.37,0.51,0.53,0.73c40.52,55.78,111.93,37.06,159.86,2.24%20c47.92-34.82,87.79-96.95,47.27-152.72C619.2,484.77,618.46,483.75,617.57,482.52z'/%3e%3c/g%3e%3c/svg%3e + url: https://immich.theocloud.dev/ + target: newtab + id: 1_2264_immich + - title: StirlingPDF + description: Private PDF tools + icon: >- + https://raw.githubusercontent.com/Stirling-Tools/Stirling-PDF/main/docs/stirling.png + url: https://pdf.theocloud.dev/?lang=en_US + target: newtab + id: 2_2264_stirlingpdf + - title: PrivateBin + description: Pastebin tool + icon: https://avatars.githubusercontent.com/u/20367028?s=200&v=4 + url: https://privatebin.theocloud.dev/ + target: newtab + id: 3_2264_privatebin + - name: Media Automation + icon: si-jellyfin + displayData: + sortBy: last-used + rows: 1 + cols: 1 + collapsed: false + hideForGuests: false + items: + - title: Jellyseerr + description: Media Requests + icon: >- + https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/jellyseerr.svg + url: https://jellyseerr.theocloud.dev/ + target: newtab + id: 0_1569_jellyseerr + - title: Jellyfin + description: Media Library + icon: >- + https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/jellyfin.svg + url: https://jellyfin.theocloud.dev/ + target: newtab + id: 1_1569_jellyfin + - title: Sonarr + description: TV Show Management + icon: https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/sonarr.svg + url: http://192.168.12.151:8989/ + target: newtab + id: 2_1569_sonarr + - title: Radarr + description: Movie Management + icon: https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/radarr.svg + url: http://192.168.12.151:7878/ + target: newtab + id: 3_1569_radarr + - title: Prowlarr + description: Indexer Management + icon: >- + https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/prowlarr.svg + url: http://192.168.12.151:9696/ + target: newtab + id: 4_1569_prowlarr + - title: Bazarr + description: Subtitle Management + icon: https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/bazarr.svg + url: http://192.168.12.151:6767/ + target: newtab + id: 5_1569_bazarr + - title: NZBGet + description: Usenet Download Client + icon: https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/nzbget.svg + url: http://192.168.12.151:6789/ + target: newtab + id: 6_1569_nzbget + - title: qBittorrent + description: Torrent Download Client + icon: >- + https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/qbittorrent.svg + url: http://192.168.12.151:8181/ + target: newtab + id: 7_1569_qbittorrent + - title: SceneNZB + description: Usenet Indexer + icon: >- + https://img.house-of-usenet.com/fd4bd542330506d41778e81860f29435c7f8795a7bbefbd9d297b7d79d5a067b.webp + url: https://scenenzbs.com/ + target: newtab + id: 8_1569_scenenzb + - name: Useful Tools + icon: si-framework + displayData: + sortBy: default + rows: 1 + cols: 1 + collapsed: false + hideForGuests: false + items: + - title: Overleaf + description: Latex Editor + icon: >- + https://images.ctfassets.net/nrgyaltdicpt/3nesOc6iRhdzatUCC5OKWo/ea0fc03647a5f6a903a9aacc357481b2/overleaf-o-logo-primary.jpg + url: https://overleaf.theocloud.dev/ + target: newtab + id: 0_1189_overleaf + - title: OpenChat + description: Ollama Chat UI + icon: >- + https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/open-webui-light.svg + url: https://chat.theocloud.dev/ + target: newtab + id: 1_1189_openchat + - title: Mealie + description: Cooking recipes management + icon: https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/mealie.svg + url: https://mealie.theocloud.dev/ + target: newtab + id: 2_1189_mealie + - title: n8n + description: Workflow Management for Automation + icon: https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/n8n.svg + url: https://n8n.theocloud.dev/ + target: newtab + id: 3_1189_nn + - title: Glance + description: Dashboard for News and Media + icon: https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/glance.svg + url: https://home.theocloud.dev/ + target: newtab + id: 4_1189_glance + - title: Toolbox + description: Tool collection + icon: >- + https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/tooljet-dark.svg + url: https://toolbox.theocloud.dev/ + target: newtab + id: 5_1189_toolbox + - name: Online Media + icon: si-pcgamingwiki + displayData: + sortBy: default + rows: 1 + cols: 1 + collapsed: false + hideForGuests: false + items: + - title: Kavita + description: Read ebooks online + icon: https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/kavita.svg + url: https://read.theocloud.dev + target: newtab + id: 0_1125_kavita + - title: Retro Emulator + description: Retro Games Emulator with games! + icon: https://icon-library.com/images/arcade-icon/arcade-icon-2.jpg + url: https://retro.theocloud.dev/ + target: newtab + id: 1_1125_retroemulator diff --git a/dashy/docker-compose.yaml b/dashy/docker-compose.yaml new file mode 100644 index 0000000..c82e364 --- /dev/null +++ b/dashy/docker-compose.yaml @@ -0,0 +1,22 @@ +services: + dashy: + image: lissy93/dashy:latest + container_name: dashy + volumes: + - ./config.yml:/app/user-data/conf.yml + ports: + - 9999:8080 + environment: + - NODE_ENV=production + # Specify your user ID and group ID. You can find this by running `id -u` and `id -g` + - UID=1000 + - GID=1000 + # Specify restart policy + restart: unless-stopped + # Configure healthchecks + healthcheck: + test: ['CMD', 'node', '/app/services/healthcheck'] + interval: 1m30s + timeout: 10s + retries: 3 + start_period: 40s diff --git a/dockploy/install-chatgpt.sh b/dockploy/install-chatgpt.sh new file mode 100644 index 0000000..8997c86 --- /dev/null +++ b/dockploy/install-chatgpt.sh @@ -0,0 +1,107 @@ +#!/bin/bash + +install_dokploy() { + if [ "$(id -u)" != "0" ]; then + echo "This script must be run as root" >&2 + exit 1 + fi + + if [ "$(uname)" = "Darwin" ]; then + echo "This script must be run on Linux" >&2 + exit 1 + fi + + if [ -f /.dockerenv ]; then + echo "This script must be run on Linux" >&2 + exit 1 + fi + + command_exists() { + command -v "$@" > /dev/null 2>&1 + } + + if command_exists docker; then + echo "Docker already installed" + else + curl -sSL https://get.docker.com | sh + fi + + if command_exists docker compose; then + echo "Docker Compose already installed" + else + echo "Installing Docker Compose..." + curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose + chmod +x /usr/local/bin/docker-compose + fi + + mkdir -p /etc/dokploy + chmod 777 /etc/dokploy + + cat < /etc/dokploy/docker-compose.yml +services: + postgres: + image: postgres:16 + container_name: dokploy-postgres + environment: + POSTGRES_USER: dokploy + POSTGRES_DB: dokploy + POSTGRES_PASSWORD: amukds4wi9001583845717ad2 + volumes: + - dokploy-postgres-database:/var/lib/postgresql/data + restart: unless-stopped + + redis: + image: redis:7 + container_name: dokploy-redis + volumes: + - redis-data-volume:/data + restart: unless-stopped + + dokploy: + image: dokploy/dokploy:latest + container_name: dokploy + ports: + - "3000:3000" + volumes: + - /var/run/docker.sock:/var/run/docker.sock + - /etc/dokploy:/etc/dokploy + - dokploy-docker-config:/root/.docker + environment: + - ADVERTISE_ADDR=\${ADVERTISE_ADDR} + restart: unless-stopped + +volumes: + dokploy-postgres-database: + redis-data-volume: + dokploy-docker-config: +EOF + + export ADVERTISE_ADDR=$(hostname -I | awk '{print $1}') + echo "Using advertise address: $ADVERTISE_ADDR" + + cd /etc/dokploy + docker compose up -d + + GREEN="\033[0;32m" + YELLOW="\033[1;33m" + BLUE="\033[0;34m" + NC="\033[0m" + + echo "" + printf "${GREEN}Congratulations, Dokploy is installed using Docker Compose!${NC}\n" + printf "${YELLOW}Please go to http://localhost:3000 or http://:3000${NC}\n\n" +} + +update_dokploy() { + echo "Updating Dokploy..." + cd /etc/dokploy + docker compose pull dokploy + docker compose up -d + echo "Dokploy has been updated to the latest version." +} + +if [ "$1" = "update" ]; then + update_dokploy +else + install_dokploy +fi diff --git a/dockploy/install.sh b/dockploy/install.sh new file mode 100644 index 0000000..331df8b --- /dev/null +++ b/dockploy/install.sh @@ -0,0 +1,201 @@ +#!/bin/bash +install_dokploy() { + if [ "$(id -u)" != "0" ]; then + echo "This script must be run as root" >&2 + exit 1 + fi + + # check if is Mac OS + if [ "$(uname)" = "Darwin" ]; then + echo "This script must be run on Linux" >&2 + exit 1 + fi + + # check if is running inside a container + if [ -f /.dockerenv ]; then + echo "This script must be run on Linux" >&2 + exit 1 + fi + + # check if something is running on port 80 +# if ss -tulnp | grep ':80 ' >/dev/null; then +# echo "Error: something is already running on port 80" >&2 +# exit 1 +# fi + + command_exists() { + command -v "$@" > /dev/null 2>&1 + } + + if command_exists docker; then + echo "Docker already installed" + else + curl -sSL https://get.docker.com | sh + fi + + docker swarm leave --force 2>/dev/null + + get_ip() { + local ip="" + + # Try IPv4 first + # First attempt: ifconfig.io + ip=$(curl -4s --connect-timeout 5 https://ifconfig.io 2>/dev/null) + + # Second attempt: icanhazip.com + if [ -z "$ip" ]; then + ip=$(curl -4s --connect-timeout 5 https://icanhazip.com 2>/dev/null) + fi + + # Third attempt: ipecho.net + if [ -z "$ip" ]; then + ip=$(curl -4s --connect-timeout 5 https://ipecho.net/plain 2>/dev/null) + fi + + # If no IPv4, try IPv6 + if [ -z "$ip" ]; then + # Try IPv6 with ifconfig.io + ip=$(curl -6s --connect-timeout 5 https://ifconfig.io 2>/dev/null) + + # Try IPv6 with icanhazip.com + if [ -z "$ip" ]; then + ip=$(curl -6s --connect-timeout 5 https://icanhazip.com 2>/dev/null) + fi + + # Try IPv6 with ipecho.net + if [ -z "$ip" ]; then + ip=$(curl -6s --connect-timeout 5 https://ipecho.net/plain 2>/dev/null) + fi + fi + + if [ -z "$ip" ]; then + echo "Error: Could not determine server IP address automatically (neither IPv4 nor IPv6)." >&2 + echo "Please set the ADVERTISE_ADDR environment variable manually." >&2 + echo "Example: export ADVERTISE_ADDR=" >&2 + exit 1 + fi + + echo "$ip" + } + + get_private_ip() { + ip addr show | grep -E "inet (192\.168\.|10\.|172\.1[6-9]\.|172\.2[0-9]\.|172\.3[0-1]\.)" | head -n1 | awk '{print $2}' | cut -d/ -f1 + } + + advertise_addr="${ADVERTISE_ADDR:-$(get_private_ip)}" + + if [ -z "$advertise_addr" ]; then + echo "ERROR: We couldn't find a private IP address." + echo "Please set the ADVERTISE_ADDR environment variable manually." + echo "Example: export ADVERTISE_ADDR=192.168.1.100" + exit 1 + fi + echo "Using advertise address: $advertise_addr" + + docker swarm init --advertise-addr $advertise_addr + + if [ $? -ne 0 ]; then + echo "Error: Failed to initialize Docker Swarm" >&2 + exit 1 + fi + + echo "Swarm initialized" + + docker network rm -f dokploy-network 2>/dev/null + docker network create --driver overlay --attachable dokploy-network + + echo "Network created" + + mkdir -p /etc/dokploy + + chmod 777 /etc/dokploy + + docker service create \ + --name dokploy-postgres \ + --constraint 'node.role==manager' \ + --network dokploy-network \ + --env POSTGRES_USER=dokploy \ + --env POSTGRES_DB=dokploy \ + --env POSTGRES_PASSWORD=amukds4wi9001583845717ad2 \ + --mount type=volume,source=dokploy-postgres-database,target=/var/lib/postgresql/data \ + postgres:16 + + docker service create \ + --name dokploy-redis \ + --constraint 'node.role==manager' \ + --network dokploy-network \ + --mount type=volume,source=redis-data-volume,target=/data \ + redis:7 + + # Installation + docker service create \ + --name dokploy \ + --replicas 1 \ + --network dokploy-network \ + --mount type=bind,source=/var/run/docker.sock,target=/var/run/docker.sock \ + --mount type=bind,source=/etc/dokploy,target=/etc/dokploy \ + --mount type=volume,source=dokploy-docker-config,target=/root/.docker \ + --publish published=3000,target=3000,mode=host \ + --update-parallelism 1 \ + --update-order stop-first \ + --constraint 'node.role == manager' \ + -e ADVERTISE_ADDR=$advertise_addr \ + dokploy/dokploy:latest + + sleep 4 + + # Optional: Use docker service create instead of docker run + # docker service create \ + # --name dokploy-traefik \ + # --constraint 'node.role==manager' \ + # --network dokploy-network \ + # --mount type=bind,source=/etc/dokploy/traefik/traefik.yml,target=/etc/traefik/traefik.yml \ + # --mount type=bind,source=/etc/dokploy/traefik/dynamic,target=/etc/dokploy/traefik/dynamic \ + # --mount type=bind,source=/var/run/docker.sock,target=/var/run/docker.sock \ + # --publish mode=host,published=443,target=443 \ + # --publish mode=host,published=80,target=80 \ + # --publish mode=host,published=443,target=443,protocol=udp \ + # traefik:v3.1.2 + + GREEN="\033[0;32m" + YELLOW="\033[1;33m" + BLUE="\033[0;34m" + NC="\033[0m" # No Color + + format_ip_for_url() { + local ip="$1" + if echo "$ip" | grep -q ':'; then + # IPv6 + echo "[${ip}]" + else + # IPv4 + echo "${ip}" + fi + } + + public_ip="${ADVERTISE_ADDR:-$(get_ip)}" + formatted_addr=$(format_ip_for_url "$public_ip") + echo "" + printf "${GREEN}Congratulations, Dokploy is installed!${NC}\n" + printf "${BLUE}Wait 15 seconds for the server to start${NC}\n" + printf "${YELLOW}Please go to http://${formatted_addr}:3000${NC}\n\n" +} + +update_dokploy() { + echo "Updating Dokploy..." + + # Pull the latest image + docker pull dokploy/dokploy:latest + + # Update the service + docker service update --image dokploy/dokploy:latest dokploy + + echo "Dokploy has been updated to the latest version." +} + +# Main script execution +if [ "$1" = "update" ]; then + update_dokploy +else + install_dokploy +fi diff --git a/filebrowser/docker-compose.yaml b/filebrowser/docker-compose.yaml new file mode 100644 index 0000000..82e1e7f --- /dev/null +++ b/filebrowser/docker-compose.yaml @@ -0,0 +1,21 @@ +services: + filebrowser: + image: filebrowser/filebrowser + container_name: filebrowser + user: "1000:1000" + ports: + - 8080:80 + command: ["--port", "80", "--database", "/database/filebrowser.db", "--address", "0.0.0.0"] + volumes: + - samba_data:/samba + - filebrowser_db:/database + - filebrowser_settings:/config/settings.json + restart: unless-stopped + +volumes: + samba_data: + external: True + filebrowser_db: + filebrowser_settings: + external: True + name: filebrowser_filebrowser_settings diff --git a/glance/assets/filebrowser.png b/glance/assets/filebrowser.png new file mode 100644 index 0000000000000000000000000000000000000000..22225604cd4335095c33dd0523bc79df2fbdb80a GIT binary patch literal 27365 zcmYIv1yqyo`!|hr!;n%^5OB1NGDs-}lrBNKVRTJNDFLNJq(otK*XRZTVRZM1(GBl| z-~aEtoU;S$iTk>*_*{91zgANqA-qqBfq_Ayq$sO_fq@0S``p6=zDe4D;|To1aebkr zbr1OQy=NW<{7>MdsOyS>LE3)z!Tk1^lmYmX-c3%&P1DiB&BN5?1BQo(2fww0t*e=- z(+7S>7t7RL$@>@>4=|KupKE!hZO?k7rM=C%-5*MxOej-QeBsSD`E>wK5i=)3u{2PT zfbjE2)`{0GL_vt5`nktS2)F?etsNarJBo(rff12v&P&m#FV7x4oXnWDOP)<$zq&~Z zB(Sb8AL{oS6q-Lpb@Y9mwQSNAJM?uO^coZhQyl(PQ2C*;k8 zoIrsmuhVyr@~auWLsmP&>3ctdoakj>nV5k)=!giDt=n+_{aTPq_%gut1AFZrEW@CM0X@E~2iyr$sRi+|FMH$kg zlc$qpPC`Wz*#Rbf3hH~h@Bpcc|C7E=^gCwXJEG~x59KgzupJ@q6RyV-KYp-L%J6_$ zGk(=hMVE8*6B7#&Yndivs^D{CFaMd}L+Y43E+Lq>S6CfF7e_x%RnoK@Vexy~lQoX0 zu_at~;zysIwGGZ&Q6*KAg3i}wrqM8-vQaTXCkfsL6BCkzx**fap4ZxQy%$^#B8~92 z@b0++M3}7Xv4#Y59~Smuk*Rb-ErR#^UuYHU7*SzcNv}>uC;Dq}zV;KL;yO}JR)93M zzXrDXUltzO>VV9Z`>;$3Q3fMi`h1e>XhiAy3~G7WR~pbD8fj^41f(;ZUQoj zW%v467jR5cmUSrMMTq52w5*Be58<{?Lq%Xd_{;G2WZ>rRHNHx-Pk~g}Z3K98#D7cH z%{nL@>4_f0nz}-v+T~ifap?17a1fj} zw4~e*pL3HV?M|6QmOqMJ+ySZKM$4g&e}nCxm?VeE}h*$oSE_yi_u-k7sbCn5n2`kslf_&`Er zvTUFOZ-4+=KXoCXk}OIwfiRM~GR1c1>w}(2oxunCdaoE2C?_*9JbOX@mQ+`#TThbK z4e=?R<#6Rcs|`@E261Xg_H#Tq}H^LAKC7pKjWb#pHim@o}bh%#sgjo z?GP3BfLP)XNZTw3KUjpsDMsSZ?keN>T8`oQ=T{0YVbg%ZD}L!o6jp>Pm-yl(tpOBK zOuQ$a7y96v4IdY-CuJ*p!ULvM5>d8$+vyYxBg1@YxK6?SLLzd}-R#_Z)}_1`AX-cV z7OPlbWTVcp@QT>+<$NaV8*+?Olk=@Dnl*o?fC>#S)kuNT|xH3jxD6P+QS+3*jU66-lpgb ztn@L}FRDnGK-!u(6R)#wkd0M*+G5dGv@M{hak2uSxC4+pVP4)iDM{TqPKa$_Ec`G` z(JCcsG4;a--!%& z=mz_zOS-%)Ywv+1`u1J%0x5VL%DA6O7)h*ne0*X>h2|jYsvTryo%2i!9D+CXT+Kqs z_Y(;tS8^`!B;o@ZO4CA{Vr1FHnw53nh5DxB^`xvf!%+$sxq0K!#NIU)>zjX80X~GC zdPgl*G53+65>xSzrtK^|;1RJ((KoYgm#`;h^gEE~uy!?~kfCD#4E>r>bA!;>4NX`q z_OGV#3@a+%HpC*lJWO$0%6>ufcS0(@0e-9%aM|ydkxiFbErF-Zg%L$;>xCif0u@v& zSrz_CQFt?t-ABhQnQw=2z_P@b6to4238OA@$G#QFODn#v9M3TfjkS6Mi=FM)eNRW< z<^hufRtVcZDh!T+>pCzyGs*sVi7SthWNfS8mVed&Q^!yO1R*+Cw$ut z)p6yMTpOk010Cs;Rv-~!-I#VAPCHv4*0|uG!t{B-a)sUnOk}0wVS zZWwOZhJ3Dxbz*uplT_c%-&v-yDks}u?&-t1P%Eyy{lVloW}h|Zb~K_tjl(@fV1_Vl z3lbr#Ac)BpYJMwGLm5IA(n|;uy~p#|?xag1AVUT5#pTfx*ntK}1COJ=Fy;PLNG5iU z(4Wcj%OMHx2V+D9!frVasGjN5RX|_*h*fwnOx2aiIP3&f(a$%AsRKU%%($Q=TiZQJrkh*WE)%(h1kX(SWra_BTNK++u)c^?a(1arBk z9#;8h1XGo%q==--KD20haqL~&xah|^ zYASd$A@YXrADfyiJqP)?1}9x#fX$|sVV;(mj)oA`@^s%m}A zH%ZA}3N_|z2_2uc5(TvE{H?j8ZHMJ9W&OncCXz^(bh*|yy0LtmLY;^if`k+Tu;mN) zEqT&HG3+NIFJ@_VDm&0GqzY#V2P6!*;>qpt;W~{oSAU`8JuEayNkGKG_KA8PYi=15 zvEs1xC`p3CBC4{VnXJ6C^^5|p*)jUNXp*(u;c?-#g-#{C(TD?E)1_DVD%C%a_(}0h z%jEq}?*b{BzL-D)c)8;IH_j{z*8WT^qI|tIb=Vudq7|)CQqL_8Pn-C~g2b|HQS0>h z?bHDsext_LnLS8YkTNc(yxOlyj$^4A6TVwADOMJ*m%WQ6JtZceKP+nLfN6MM8Ro}b zD_NFh3#;$)irmh8F?`J%Ysu#;q&qkUt;}0Tu<%R2hJ}agDsLa2*Yl>j3o_gN(?=Fr_2vn+IpVWn4Wj}}`ijlm3t3bC-!X-ne2 z29`ra3qFDG6lD8XV$o~jP9t`GKddJeQaG9fF(u0hZmRh8E#BD=Q>jz@wcuqju57)k zMm-P&^MIN4wQTV{a%wsd8~`WA|F}HOBaBY97B_u&LSeyeq+i{Jjaq0~FAvURTZP1K zFX8XZ8tnIKt0tlz#4*r-)CXz@2L;iO7hWTEKhNfTTBz`HYAxK>OAyrTvz#s@ zpZXcOQ#h2`_dE%v(ed<2XwY~-X$ra}k@bs-?*>HvGYvTEo7`OoCJU}=GP#qZ#GKNJtBPrrvPmF zX~M#P-tBap+E^6LjnrK#EX0}9Ac=_Sj;^vYjF2^)wKyAF4w;w6oo$4Vwx^DF$fnN0 z*?z9sNDL;RAKy6xN^QW#ycBc>_3pLd*Q&9N1QeyCr}N7`tOa``t>5>fO(+NTYx}LX zAHUZ!VYN8X@X={?5d(KX6Ka$=%ZOZ_JcZO7M<^Odo>N|3v4r?&TObD&H;l?KE#b92 zlIxJLs|Z4spufDOjzq-GI3d7-T%Yn@uV#m~wLg#On!R~ygU#&>|N zy~67|{;i#qYJg8c16secy=e_!lCvNbud{#;W5cQHy{|rt8o3Ogf|j7Sj(^97BRg`S>j)yM(X-n5;N-K(y=&-SM@^g$6A%rG8<(w z#d>)*qJ;NN7Uon!I&2+9ci`pJk7+;(7RF{=>~UAjNqdlpy*WXA>HT-g$2dqO*&mK$ zv^A^#ZS&)GYLrCkoFfh8cbNm~L5Cu4C(H{uv856xgXK+YfkCSlte$BjzC;c@b#=Ji zhn{V|e^b{9rQB;wf>jsmI~;xE1=A#9{cf6Lj#_o#%{H{$A8Rc@_h|AurtCt(!)`OC zaONB4(HlhYc+a8^gzkU-m79|XjH}hyo)NX^{=F4S%QBFOrJWWxE1)ggdW^o<{yQS{ zq+V^Qh<~AVtZ%^40H2!{ctFE1z46}J!|&_wFRaI(o^2>4jILS#4v6*jF_-e)k#6f9 z02blKHfZv$J%<6ic~<=iE2;di|F}+5Skv6KpclIVv~Kn9eHyyh7iF|JTKL9IUFcU4 zDB-zMkaWFw^7${+1Lyqd7a4D#lp^2jEJ8xn@xHZibm{Z^m7h3MI2VXvH+u?8R8|1U z5@ks&R%B$6P!mmI$piK>Q$2?I;+{pK*qgw3YN`0hhFL*}8k8{WK}v}G+4wEJ|1k(> z9D2Xl*9R(|nKQl-^h@$JtmiJ0&Hv28;F*bf)T9H(O-M6M78{0AQcNbU8^LIr#UvYh zpp?Z|ZpYsIi)!)COzaL?CaqNyoWCv6Y{YvWOda@Up)L99jvkp1#M`vG&~4Ikuvo;z-{*^aO4{dMgxTUd!W<=3Amv6eD4E!@SF^#9Jd-bB|Sy$x5ecBRl%+;42^3H_*@e2BGLE zd6Ns%LFkD*wzA=RSjw_RYt*_PDcmhxR`v(H7F+t%w#|6FMvd}$$gM$RzwaQF*!U;n zXm}>~gwXap1jYD9!w5?|!@=uTU6@G|o!E>G;>`nljw=>{)fX z^iLxjnZQ+r4b*YnuTrPO^MuJ|11<^*WBZ?>w!6ZGb4w7V9GwNW--)R#HKdf#x`!;! zjwyXaLnL51DBd?;!049cMa_Jj-imQKS-hWIB*wS#i(O>aus!|}#L|Bj9WF?dbp5k- zoSB9FjOz6wM43ABKA{+26{F@VApQ1%Hq_#j1j$`E6&}f-y6{y*EG5(sKb(gq$uG$x zs%VhiiyX8GJoQ&4sMydd8Qcn3P55tnd#AA>5_LzHbaufML8q&_Re9x%(-*iFPktp% z?dvdO=G6^S;;yrN^TR3Ainn5ovrNWla&BI{3~&XWFjC18&-)Jw-(+JQ;*}SdehX(0 zz^1JkT+;I*FbK$7onZqQ5&PctboBKl!%L516niY%fM+3yM2tS2zmkY1$&k0MKfyhE z=@d}_FRu~Z|Gxcoc!mHTAEsFPYnnK-cD5vU3`%)QJR^~pCgiq)Xtv^-GjxkyWBA$N z^w;gILjjO~dr?Zb(>fP#*MM7kyA)Brqw+ozQv8Q38(0DeUyMF1^ub+g%!z%^+PB$8 zl-}x7gx|AW#19yfb}&5R(r1t^2e7OT1$y%x3%kE|FvD~~jC$Yb$){eE4zC1Fn>$HP z*2|2wK%03kW_^S}gL;kqS94Hu&a^u5mhDk0UlmNd?>^a*%OY$Dm*lM%EAQGTc@18VXJ z|6m|+^H^3E$I32L*-=Q+*jK-?(sJP^v~S=(^7#SxxTaz}yy8>06TaL#qhFn^WHN;Z ztgIdOZX8$WmkHt>V!=kqK@zlMQ!VgME1HEw{eK8=h#vh44IxVqMnu@N86CLADp(w`S3ak6RDC~r+)w>jz`WN_oNM2@{)2ZJN}>e}|og$}bzVzSgO+vQnzfHlhn|MJ10K zQ0%ysQi^3JJ9Pc>$mgxJ_1rl?e5y2p7W(|Nfj0@uxcN1Z9h(R6yehx_BVkhq+%Ga? zezpn}Pq%l;OCN)$HD>NHE(2U;6s2$SDgE$z*v^ohHLm`%#@V=BLhvZSRYq(D_o%f) zxN8vKJ59wg<(&eZ-G?C^c8(S?L%Sssc3w`gcOIOg$-O z!UT2Fd8NB7Pe=K)H-#dZ5JLY0iaskTdtj0HHPV{1%MiLPLoV*5fp8bn-@io$;GcpX zin7rZP|s&6_V%4ops&g9%!jzW`{5*sOoUbSLHP4KcX3adm#{xA_vFQb6rks=6Q<~F zWj-qT8h}4b&82N+m+jQUK3li|xju%W_dcC!D&Cb*<1vS@O85S-g(6~}RI0En->F?cB@fqACS-SS`R5ewsDx%Z*W#WOnl$2hy~PH@hmU;qrQxe zFqvHBJ*+1Dany6-Vj`7eN@+Zx&Y;lr?VI^2f0EQ70N1f+DN@q)`R}YppmA5_PToKW z^%oiqLs$8|HFnIWL^G13atk{VWv+aCdJA`iIG?qZI}I@5*&1^7)JI3ImOvl(;~}5B zENi;F|vhsHBGC-cw@flZ3NsIupg#Gl_32A7II@Oo>?ewS%#amQOy$ zG<84;DPorn_v070gW;MhnXveE{zXcpxXYp;D#b4<{fnXoe)~mMb#`7`5glEZL1CC8 zb*>P4I1|LIy9ZI4v)>y4J6;d0(IB5+wAE82$;Rzb93E(hh}K(a11i;?9>?x`jHNuL zgH$?j@U)I|tS22dHlj&NXBcm6gGT$_Hzb(93Cu0Kb6gY!g@Jqie+1o=Q0!hFoq)&o zMLxV}OXbelL{2TP61>BtGO+AP{5-N9{Uwy919p#<_2%a^G0RocKkwZzrDvpeJX)DI z2K~~6w!q1g>>+$_U=#^UrTq=4hU}XGSsnk34$s4(o3u#f+_R4;a=%qMSV8R^bMUGl zQv6`EEPmnZeI&Q6thupT5lmU#EuD2wT67)a6A9c(agODxQN%}p)f9oR>k2(0K5Orh zD_su^3qwjnf32SB0_=O+itxA#F%9v>zjP;lw3jj<==VrxGv;K*G4?O!pg+Im0wCBF z@Ia+9jTa@+ZwwY8?J!wy(PAL=<9}qzN8Wclzsi9g?c)`pG6XzS?2XPLPs3h)$gUB< zz&xpLu;tExMFi@>CFN$oDL#j9a8d$YAj6=R7X`)saN0h4&$7dNt64DCq!vYfNi~V3 z=~^Vk>{*OrJa=gsb{YiAEMZ}a@VQEiL786YXGuW=Ex)3u?Xp!X+N2KAWF;peip-_n zvBmhslb0A9Js1DJ%%T|RlM1OKi7ct{5L_r#eSBz^B8t;|> z)eIxnQWCt(@OR1u1Xyn3K$BQUS}GRHu$bhU&h%ly>#on!ngE`}z8_QI0yrbt)}ud% zPUkTsq8Xo1svHT)|5bXnc|I>=+^P`+dW;{FzX4Rs105YpBqs@(tRqU>{VbJZ8}4hp zuQ81_9e<5f`aJC{wD`kpk&CQWEsic*FoYp+sE)Mkx8f{hZPvunT(A(U*T9lsy1x|N z7o*>stwT?=qCU+#KWU;QyH(FGvwN|4`m%W~GtrRwLL|4OsZu&V5rv2NND+dvV2G1L zpFaNOJ%XOw1C2LrL6nS+zL?Mb*M;y>%^63S3;KqG5)uz6YtFBh_@A6Ql>2&^Ie!Im zD`kwK3O#<`{sR*;$#t;r>vvejlJgoA=TdgA8Wuvlu1xQ>V{3DFeYH@taMzW#F~{ou z`|FTki2@9VSu115zD8O-Zz?yOKei;WImcYZ!p;7nHpXvCeG?;rl)T3JWX*F}nVGgf zBl{(M_mc$h;E>s}ZIAs+WD4xi242~PoHb{5OUGpu!ZM3eMROpz4;IgK(Q{(8YK!C5 zqF28gD)LAe>f(g+NeZ5=%CQsg(6@!`vJW)kVK>ZJ*PiVM8aMoCHsLq$6mIwsjiNrM zU_TR_P^>6dq)yt(ZRkS80zeOVJYE^GldfWxKbl38xAr?Cb~{SntF>a$xX=6?KSs?G z)M35EszK58;j>iRZMmhxYe3ky&Q%|@BE7={MkqfU}boYdgG1)TOoBy6a8 zT2L@!9&tSqTXm#2F^;;LR%JiYfSGFYv{Yr_z=8)WR(mb6nyTg~Ye=lN_XD}p?K z4!bO7Cv>q@#w#>1$p}fLQ%i&-PuJB>K#B8lEr52`mjP*g=EtLCgZxWzyk_5D-X2kL z*Hi@aNf8(+acoq6DNUfU#fBSNZw?Mo%^u)sr#pz7SD>i9OwML1^z;`6KaOH)>bB54 zD;zXa1O4>#aF!8l6l)yTIpomz>TX^ZvCiOA9zZ6xUD9wX(8p4>#iDoq?oCP~SGyCB z^}%;$={3Q?ax9^1JqgB|&N0+_-?>7|4{NxlY)pnIrE?!vR3m|?JJ)76h&W-|sKVgp zYp%d5#IS+M`5tfdtQijmZ_%&HHiO2RaxBf*1s;>HzmY?srELqZRGGpRgN|{~E<7#2 zr3gl7Q#2F$GJE+CzFpOBx%Gi8t1l!=Bl&mMM&U+tO0Z=AA|{7LO@1SZOt{RbV8zUx z!@!=-5VhM@8%Y_IcDa6S=B{V`HWg*QuceE5>;H~e`N!ffz?la{B)V&u@WdGqJUz!= z@0%tKt{#M@zmUz@6Qr#=VW0S${+%mOtMlM?3(MhWc}^u-+Kp=fHo8`;Mo~vm;2^!Y z6ij4f^2=riY`ZLSA?QoaE5#NvpeOtJh2<&iJbC!?r!_dw>mv-zm1o^b?)SNkNRCS9E?zMMllbTj%kXc zHoO>xg&jN+n#!MPPW?$x5`;?vPWB+3u56uW_9+tRSmRUE&TPCo+ulqFxK%A=R=#gd z=}W0&)J?~?pEWdEXEyc~%sirF&u!c5Y^%uF^tZxcv3 zRpD`pPyACjKhnK^b2*2ZNEdhlr_Q|G^U-b26$moFvF!sHZM+(Z69o}9&lS3UYkg1b zyK9*6*)z%}>J|H$=R@NX6I=_RVglwgvNZ;3G9L~Uk=&n$aN`#e74)JBO<7%Jxo5zA z2Rm(i_#LQ$oJUt1LoxBB&Xv{>CUmxp4D-~nFCE6TH>KSx4xnJ+10N~Jd_2BokPAx@ zB;*%wfqwo%4^MN;<(rVSYa#6aPMwIcOnB^lF6#c&_mRWAFGV8QX_mKdL^t8!OS5YX z1Fnp&IsKlSncZfwrC8Jb3z1A8fh*e!_+zl$_8>Dk0a{ksJ$5g9Ao`Qn?g$m%ve~gD zzgcL4>zgd2LNKmHsVbH>%}OQV%KV%Kz1A8;&bihhZ?#qFy#A)5#R=sb)qa+fUC(u7 zySqVno8mlN=DL@}ME{br#MjvnAu@#PwrP-?2Jk&!Jqo#uL(oSwKpI1igehlc~qgxYUub_ez+VoRRBQ;7T= zM53H5NlyZ=>~MM#1HDZ>>oTMT(hvn4nx{=>Aycudu}ear&z-s0uw=dEaOc-3->M$fo7Y`2?#(ZEho^qN zX6Je?KlJWYTbIC>Q$FUcevPLkU3WwSO_CNF3+8+0_Qe?jCz~h~b%$jO_%tAP{cYXQ zgQe_{5IiJBgWHtk&x{3#oK?t4PK~fJ-HuKdWtSmJ&BJ7{pOv6+e=&B^LpJRV&ngA?kZGcmC z%)$U8W^I~k@{>qUhg_F7tEFIvs=KGN3TxW_^0buZPfNt2Vn4HzhND`)nCXU+GcJ5X3ebYyxO1qtzxrpSJiguy@51$`OdlTq2O7SoqKN|fI+EM$;RPO+~| zjw388OpXI-u9JyQB~V~q0=6_KdWpwyk;!?46)$X%5re8j7icbx2KxQYa8Ji@-*`?K zi;3FY%&INuffDbvZ!mvV#Pel8iU{#4P0`c0SX=@ZZ}#r*+cX(%B4pSyYRjTcQXyNX2T`qw7>18tWfyNv8E^%zd(@~s zpk(127|5xsH|#?9TB=12K>9x^hoX1EPe3*>0nw|6taL!5fHY!=(8*D1X6eRp$E;{q zD6BoWG69g1;M59yXifDa)$##*Awe};&^r?gzS2>cSSVCVJ92nKSxa&ThlJasc%A`) zol-?d@Rl<^D=Q1r_E>saTcD1s@xvgc1Yco9@H>+@0{+hH!98qugSUn5&yVz`TGLZ! z8*luM|NP3Ak$aIi!s&6XAw&@!)uoq&gKhyo5p}8*g{@*|8T6HsF|(xRF%ZdkP5znD zJVTQ3`rdNvUDha?S5{UI4-YRwLd2F_90fxn3M#YQVqWuW%ntOlo2<|3E-!#~E-AU0 z=ygtf7bDt-jA6&#jx;^L*YY^+U62Z0LqX!phWYn8Dkh~CdBq5F5ui2>Q-iKb<>;6J zn?0Rc4~CgHh=LqCiN%Dd3wiRM>Ie6%eikD+J^b8;OZP#+N)t|ywm_nOV6w)E$TF0o zGZzRtc0y~_9$uC$d1-#ZtsIbY>L?FkqL`3X&jB5soQ(XP*nou4&3QeIqzAzA(I61G zVBf?O*C4b&gSZVc<)?mKIX|;zZtXb4m_RL}$Itde#KxOpBD2W>+h=2a8>|r|6Tirv_vJiZufom!n z&)yIk90e`LuEBuWh5Jnh9~VEV-!~fb$q&;cIX<3R*~JJ+XcJecQ4?^YRZFh^8_m=$ zf~RHjk#dg6Q))j>#XLWz{mJjC#j^bJj^)L*ZL^{4(n^W?*QYx%AO{};!3$b)Xa0Lw zTPV~WK?ZJx9GkbXJw0xSC78i?^FYjoOlj}wEU;-1iaPE$m;T~GK8acHV$hosrZ)vpCv|KXZA9a>LMLHE9f(9u^Z(+%c`sM$SJ!Du_;8kFmaRt)yC2F7M2WX zy19u;)ytVU)cU%C$$xnhV=`)8p#yhchy3l)mZlSuw#GJsIe>QG(8ot&b#;}P9`YCZ zwYzS?s*fe(`09GlsehYc`=M>KiRjwFra0LPT>80B>k9Z66W@BUXBfqOf zbS6XRDUAg%)bt*q!Ww@mtTBk&*;-rc@1T|D5hQO66!N?EQfF7xBD_yGXFO-xTy`nN zfs#SK5`XuxT=w@uoWZAeVJOfaa)YR5i`Gu(m(xBwf2Lhl=V3ljDVksVWk%kFGA&|# zR3U%h)2EOcwTG;%m!o52a<;a=QJ`4i_uvL797T<7@zLBNb!t`1LudDY>OxVr zoorfPe{*Zgg^4Zhz4MduT2;2=`hPlL`V^8#7xB4=Z7~c8!+|{7SVTlLP7U>?OblWJ zQ8~U1KU@Y1?EaaRvwK)nU!C0fGwC?iS#mY=l=;yd092myuH1xYLfp4a6zbIsXUBeKp%cX6n#5lgSL7<)odTqDjd3~CSEvyv zGqR!MfS;)z*jby}97;*w)bXmL? zsWUs96Fj$;bdihc*XL*c)F9iy>Qf>0oQ9p(OHLp2!?uNUe()aIk}^@>h;aBOtAyOS zFacJ!c)DS>`h~AVv2H5`A}H;JT>Iu>1Iv4=Si}Bg>KjvVIoCx1LZx(L zcQ>yxw*wm4?U{OeT03`tuUZ6Lp1 zP5$#>>2NdIR*F!>#w#Q@UZ>vNFfwMx6($g(=^8;rl0Wn*=)|8Q{F~YD{QdFsw^@dJ zMTeFyD#w5Sz`25l|4t}6Iu@fqgB(;&dS~fPf7CWn_$LL3{-(}%@4Ym4y=Hu-v*yT( z!n=(O{C1VHz9v-<7B6kN&NIGX<*oog&(7+>JuKv#w8Lv7%f%W%HYb}otZQK|ak(YILP&Z*6YuZjP>#7CbT=%n@j~Ou8Rk zl#ww1Jx*InN=jHvMBrlKlc9pMO^X&tg1D*@C~cINsSt2soHA};U%HcfESw$3KcyP+vf%@2X4`EKcS60on)qu4M-0WbUb`u9?`Q%T$L)yzVoPn}Mmn!tcj z)R*DQ-QndChYUKhIZ3&nedFt?EYAJ*ghHrDj|A|Iu$P@-^m?R3dH+n5zv6$siwcM( zzPJEFT?w2uYsSq3%44K$h3Et7ae=q5@bj|#NiXs+9@bQ6<3zWja#l!a-^7PrLX7B#xW#F~?!%6I+=W>(I zLWW%A6ck8rA0KNQJ2$56g}LpW!#3TJYmYD2F^D5mQl4KH(ZT!vGV+|PtPeN0x6Ln4 zcHm~ze`^-OZF_BFr#@9((nS5+wssr~JEgC=2Hn%20U(xBnH#*zI=!-s&Y*BeP;VJo^m`V34G?lsYG$TOZ4JoPqiE=6K#`ZcB#GNK>k z{)8NmBME>a&rF)^jVk(Nz7XW?w@s1M1Ha8z2a4kJIiuG1@837*>i!)BJ7>-$ zN`m3~Tps%s!6s4omnJvV#p@TcvN?#l`g&`7dnglIF|DVsqcAwYvAGF}Wp=vXBCV6t z1)yn8W>t07$k^B_M1GDJeK|K#O_2oT`~--JhOVAZBkcX@8<60zu(O{9r2{E{dWgVVB zq{9wv-bbE@VlA%{{O#PhVxyoSP;hk>Do9E<*g2PS*<}bYt;QX@IePkKs3+U+OzIQ_sL%&9yD~?J*Y= zZr@(ndU@Tbo#3ciI$iqJG3~{aSy(6CTeGD@5

x|IE$~oPg|I#4H<{PhTB|aPZgD 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 z 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 literal 0 HcmV?d00001 diff --git a/glance/assets/forgejo.svg b/glance/assets/forgejo.svg new file mode 100644 index 0000000..9c46d82 --- /dev/null +++ b/glance/assets/forgejo.svg @@ -0,0 +1,40 @@ + + + + + Forgejo logo + Caesar Schinas + + + + + + + + + + + + + diff --git a/glance/assets/immich.png b/glance/assets/immich.png new file mode 100644 index 0000000000000000000000000000000000000000..07712f037a5bb3db304330995a52c5baa630201c GIT binary patch literal 10148 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 literal 0 HcmV?d00001 diff --git a/glance/assets/jellyfin.svg b/glance/assets/jellyfin.svg new file mode 100644 index 0000000..d4d7f01 --- /dev/null +++ b/glance/assets/jellyfin.svg @@ -0,0 +1,24 @@ + + + + + + + + + + icon-transparent + + + + + diff --git a/glance/assets/jellyseerr.svg b/glance/assets/jellyseerr.svg new file mode 100644 index 0000000..cda2394 --- /dev/null +++ b/glance/assets/jellyseerr.svg @@ -0,0 +1,118 @@ + +AAAsdGp1bWIAAAAeanVtZGMycGEAEQAQgAAAqgA4m3EDYzJwYQAAACxOanVtYgAAAEdqdW1kYzJtYQARABCAAACqADibcQN1cm46dXVpZDpjOGFmZTAwYS1iN2JiLTRkNTUtYmUwZi1iN2Y2Mzc4NzRlYTUAAAABtGp1bWIAAAApanVtZGMyYXMAEQAQgAAAqgA4m3EDYzJwYS5hc3NlcnRpb25zAAAAANdqdW1iAAAAJmp1bWRjYm9yABEAEIAAAKoAOJtxA2MycGEuYWN0aW9ucwAAAACpY2JvcqFnYWN0aW9uc4GjZmFjdGlvbmtjMnBhLmVkaXRlZG1zb2Z0d2FyZUFnZW50bUFkb2JlIEZpcmVmbHlxZGlnaXRhbFNvdXJjZVR5cGV4U2h0dHA6Ly9jdi5pcHRjLm9yZy9uZXdzY29kZXMvZGlnaXRhbHNvdXJjZXR5cGUvY29tcG9zaXRlV2l0aFRyYWluZWRBbGdvcml0aG1pY01lZGlhAAAArGp1bWIAAAAoanVtZGNib3IAEQAQgAAAqgA4m3EDYzJwYS5oYXNoLmRhdGEAAAAAfGNib3KlamV4Y2x1c2lvbnOBomVzdGFydBjuZmxlbmd0aBk7SGRuYW1lbmp1bWJmIG1hbmlmZXN0Y2FsZ2ZzaGEyNTZkaGFzaFggrnb/Z0LL/KWPpqmjemYRvQg3RH4cxUsaxZtMKj493SpjcGFkSQAAAAAAAAAAAAAAAgtqdW1iAAAAJGp1bWRjMmNsABEAEIAAAKoAOJtxA2MycGEuY2xhaW0AAAAB32Nib3KoaGRjOnRpdGxlb0dlbmVyYXRlZCBJbWFnZWlkYzpmb3JtYXRtaW1hZ2Uvc3ZnK3htbGppbnN0YW5jZUlEeCx4bXA6aWlkOjJmMzZiOTBiLTUyNTctNGIzMi05NjIyLTExOGUyYjY1NTJmZW9jbGFpbV9nZW5lcmF0b3J4NkFkb2JlX0lsbHVzdHJhdG9yLzI4LjQgYWRvYmVfYzJwYS8wLjcuNiBjMnBhLXJzLzAuMjUuMnRjbGFpbV9nZW5lcmF0b3JfaW5mb4G/ZG5hbWVxQWRvYmUgSWxsdXN0cmF0b3JndmVyc2lvbmQyOC40/2lzaWduYXR1cmV4GXNlbGYjanVtYmY9YzJwYS5zaWduYXR1cmVqYXNzZXJ0aW9uc4KiY3VybHg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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2WQEAcNiFxc4R79ozvFI3cymplwVvAWDIKFyiBFAYVnZ4u3HEcPLDTfIt9X7Nd1vyzbJIZpVE6NOicYEaRwt+uauSMcSPsX9PHUJgyWALEQ6RHudtr57nbNIgmioCefdyEtzGbCylEalKZNWNlzjT2rgZFB1shhJ3hhVHDBPaKX2KxL3C8utMK2iBREKaVCatCmw4JVECUjwN7Qn3V347tiBf5wbCt/a+q382311bbBSW57XWiNjoek/xXArl25l6pWZSkTcShpTPT7ynjoFFRwCewR5+xU+2LKETQ4wrV3n5nK6RayHlThKGkqv3GuPOMk8ogRGaHezj/nphLuUsoIjpNA== + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/glance/assets/mealie.png b/glance/assets/mealie.png new file mode 100644 index 0000000000000000000000000000000000000000..458d2ac7fe499e866545b81db535c6454f119649 GIT binary patch literal 20383 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 literal 0 HcmV?d00001 diff --git a/glance/assets/portainer.png b/glance/assets/portainer.png new file mode 100644 index 0000000000000000000000000000000000000000..891a133aaaeb3fb5c66281dc73fde900e7cde4fc GIT binary patch literal 2518 zcmV;{2`To8P)0000EbW%=J z05Thi4{-M7)dZx#OIoQpWt0E_2^UF3K~#9!?VZ=QqaYN9V{Z`)_Lld5%Tc4o6mx(L zs9E#hOjb^re23lGQZ5&va&%o+d-eY~m-ESSRK+(m*Yj-Knq=Fa=W2$psLm;n9QA6r zo`t^1@?7Jp9+<|_6~nbnL?qL84Mjg9Mh{^jN?AS3p+-hmG}4iH9~td11JhF=kb0K= zDO3YUF|ioxuI{bS`^C1u?B*`I?;)^mAL4B>Pfb6G@Zl3QP7^3rUrAJ+pTR_Y}oOJILl8z8v2| zyU6mn`n)6GtQKh;NmLK*C{I1Nd+>LZtA%zJpE&HBXm^=DoWnQ(M^9ov!__f31`=5C z(hkBgWO-2f;P*j_tXBadaSq`hVH^ZF+{aJ2`Uf0@nS^iL_3LgK$vR1@Ms7LT*_bCa;BP?M00{@G@ z8=OP#-yr?_^H0&c%4RP@hvf9MuD%-l7RV!Y_CLvKNDK}kx7;dhw?XDmjHwHJ13DmW z_^QVrHQdq&l77|_>*8qoZXz?Ybl`wQ_(hLd)3(OXxheee8#4AGp$J(~AY2){m-y&> zAjpR$^(g)-yq=&hnoJ8nzq=(ukoWZNC^Q)({Hj~fWutDvZFw^rI*olO7y{HS{8OYk z<-OwKG@rU#UUYwv%`a9h(*Y#n_kX#fCb+Ue-X^^UIw#0m1h&r#V!uqN&{;uVCRo~O zL7wNlx_w@dr|izvvLu5%r4o%dNHIzdh$bjz4IptjDwYCbJ3N~}8#Sd2kX76=(3wFV zIni;?4dQZXIvfCGnenm)-^ZMLUyvmLGrCBf%<2kMN3$~dAO>tI5-qKUszAx=vr7k= zoW!xAuCO=Alu1>#EJYQb-VJbDOnK&HmL!5d`VLzDwzfZ7h5ARi?Z#05R2IuOX% z-g2z-gIEKIip~#$bja-RDYJLwq-qxsg|2!1Ma80Y4-g+R87cBbDSEtaQM&$u91sIC zU(X&1Jb&_$eEkJEAR455eI$?}k$ArV;{6baWB&q3U&!k}17iIGh^7Ayi255K>VFV~ z@@!Fon&owP-{3ZX;RGOb5)Q)b>}^D%@c2=SY(YwwN&{g`h;2y(vaB@|o)B3}l$vmv zPb3S3v1m*aLXfIBcJ&)#LJ-`@0&#^}RuI&(CRS`y-5W8;P1aPGt@)4;gCwb><^x+h zs3HcbWPtdr4Z5@>1}SBLD6B2h;$R>;YZIGdL}ZxO*u-XgtU&A|SO&;_)htsY=?)dO zT=qwA#EY@9j67nnKMZX)U80NXEUTki63ff%SN6x#pR4%t*36UJG|lT_Pe~k#2bmsE zvla3mYLt0PVUdSCJ7} zW-M?C2b;IQO-PbqIGS-E{(bLTP}K!`T{(n?y*r{7)v!H9%$|oNY5TwWyhHLaNO$PA zsiQsyG{gR@w!@;9IkEL0(x+5X_U7Ndm&9>BcuH3W_q|Egtr_;miCTEZIJa5{u3=A9 z`yt!opng8Q0uMWQb1^Q${5&*^*Xg_1NcM5?WP`Y@Q$a4mzFfA(s{tX;^$}l^)pA+p zr&h~O?gHg;uoKB@0W;tcbs3aN(nU0r_yETlPY{jEBL6%r##LD@`2=Mc!B#-<<+JS~ zquOQ2Gm|`Ts$}1;kmgy`B}qjE!gEM8E?bk*Y^c^T4rrALu`K3|7kzch05Lvp;AUAI zw(q5N9I&e56@d--hRQU;%pBaDU z95OGmO0(OY1y>*=qU)OcePtcXbF3n7vaHDqz7(J<(vEZa9+2bW{LD3iKXb9;4_&qS zJC~pS&ULiEb3yQ~S2mj(-^-_e;M1&07*qoM6N<$f}}gozyJUM literal 0 HcmV?d00001 diff --git a/glance/assets/user.css b/glance/assets/user.css new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/glance/assets/user.css @@ -0,0 +1 @@ + diff --git a/glance/config/glance.yml b/glance/config/glance.yml new file mode 100644 index 0000000..1426a2a --- /dev/null +++ b/glance/config/glance.yml @@ -0,0 +1,20 @@ +server: + assets-path: /app/assets + +theme: + light: true + background-color: 0 0 95 + primary-color: 0 0 10 + negative-color: 0 90 50 + custom-css-file: /assets/user.css + +pages: + # It's not necessary to create a new file for each page and include it, you can simply + # put its contents here, though multiple pages are easier to manage when separated + - $include: home.yml + +auth: + secret-key: yffGo2FyXMSBqkp/joG30AUCwnP+eF16P3Y0A3+0Jp22P+BjQ0/B+rQzLI+hXqQKPAVYdHdF4TBJ0gWZ6jirRw== # this must be set to a random value generated using the secret:make CLI command + users: + admin: + password: HgU0P9dEvjQ%nXw0ZMFz diff --git a/glance/config/home.yml b/glance/config/home.yml new file mode 100644 index 0000000..b1db666 --- /dev/null +++ b/glance/config/home.yml @@ -0,0 +1,244 @@ +- name: Home + # Optionally, if you only have a single page you can hide the desktop navigation for a cleaner look + # hide-desktop-navigation: true + columns: + - size: small + widgets: + - type: bookmarks + groups: + - links: + - title: Youtube + url: https://www.youtube.com/ + - title: Github + url: https://github.com + - title: Monkeytype + url: https://monkeytype.com/ + - title: Awesome Homelab + url: https://www.awesome-homelab.com/ + - title: Homelab + color: 100 100 50 + links: + - title: Portainer + url: https://192.168.12.151:9443/#!/home + - title: AdGuard DNS + url: http://192.168.12.151/ + - title: Filebrowser + url: https://drive.theocloud.dev/ + - title: Immich + url: https://immich.theocloud.dev/ + - title: Git + url: https://git.theocloud.dev/ + - title: Open WebUI + url: https://chat.theocloud.dev/ + - title: n8n + url: https://n8n.theocloud.dev/ + - title: Mealie + url: https://mealie.theocloud.dev/ + - title: Uptime Kuma + url: https://uptime.theocloud.dev/ + - title: Overleaf + url: https://overleaf.theocloud.dev/project/ + - title: Media Automation + color: 200 50 50 + links: + - title: Jellyfin + url: https://jellyfin.theocloud.dev/ + - title: Jellyseerr + url: https://jellyseerr.theocloud.dev/ + - title: HWR + color: 10 70 50 + links: + - title: WebMail + url: https://webmail.stud.hwr-berlin.de/appsuite/ + - title: SAM + url: https://sam.hwr-berlin.de/de/ + - title: Moodle + url: https://moodle.hwr-berlin.de/ + - title: Studenplan + url: https://moodle.hwr-berlin.de/fb2-stundenplan/stundenplan.php + + - type: to-do + + - size: full + widgets: + - type: split-column + widgets: + - type: weather + location: Berlin, Germany + units: metric # alternatively "imperial" + hour-format: 24h # alternatively "24h" + # Optionally hide the location from being displayed in the widget + # hide-location: true + + - type: dns-stats + collapse-after: 3 + service: adguard + url: http://192.168.12.151/ + username: theo + password: 58201928alsk + + - type: rss + title: News + style: horizontal-cards + feeds: + - url: https://www.tagesschau.de/infoservices/alle-meldungen-100~rss2.xml + title: Tagesschau + - url: https://www.bundesregierung.de/service/rss/breg-de/1151242/feed.xml + title: Bundesregierung + - url: https://www.bmi.bund.de/DE/service/rss-newsfeed/function/rssnewsfeed-neue-inhalte.xml + title: BMI Neue Inhalte + - url: https://www.bmi.bund.de/DE/service/rss-newsfeed/function/rssnewsfeed-pressemitteilungen.xml + title: BMI Pressemitteilungen + - url: https://www.bmi.bund.de/DE/service/rss-newsfeed/function/rssnewsfeed-kurzmeldungen.xml + title: BMI Kurzmeldungen + - url: https://feeds.bbci.co.uk/news/rss.xml + title: BBC + + - type: rss + title: Tech + style: detailed-list + feeds: + - url: https://www.wired.com/feed/rss + title: WIRED + - url: https://thedecisionlab.com/feed/ + title: The Decision Lab + - url: https://nesslabs.com/feed/ + title: Ness Labs + - url: http://www.fastcodesign.com/rss.xml + title: FastCo Design + - url: https://medium.com/feed/medium-eng/ + title: Medium Engineering + - url: https://developer.atlassian.com/blog/feed.xml + title: Atlassian Developer Blog + - url: https://stripe.com/blog/feed.rss + title: Stripe Blog + - url: https://blog.cloudflare.com/rss/ + title: Cloudflare Blog + - url: https://deepmind.com/blog/feed/basic/ + title: DeepMind Blog + - url: http://news.mit.edu/rss/topic/artificial-intelligence2 + title: MIT AI News + - url: https://blog.openai.com/rss/ + title: OpenAI Blog + - url: https://uxplanet.org/feed + title: UX Planet + - url: http://feeds.feedburner.com/uxmovement + title: UX Movement + + - size: small + widgets: + - type: monitor + cache: 1m + title: Services + sites: + - title: Jellyfin + url: https://jellyfin.theocloud.dev + icon: /assets/jellyfin.svg + - title: Jellyseerr + url: https://jellyseerr.theocloud.dev/ + icon: /assets/jellyseerr.svg + - title: Forgejo Git + url: https://git.theocloud.dev + icon: /assets/forgejo.svg + - title: Immich + url: https://immich.theocloud.dev + icon: /assets/immich.png + - title: Filebrowser + url: https://drive.theocloud.dev + icon: /assets/filebrowser.png + - title: Mealie + url: https://mealie.theocloud.dev + icon: /assets/mealie.png + + - type: markets + markets: + - symbol: SPY + name: S&P 500 + - symbol: BTC-USD + name: Bitcoin + - symbol: NVDA + name: NVIDIA + - symbol: AAPL + name: Apple + - symbol: MSFT + name: Microsoft + - symbol: URTH + name: MSCI World (URTH) + - symbol: NFLX + name: Netflix + - symbol: QQQ + name: Nasdaq 100 ETF + - symbol: VTI + name: Vanguard Total Stock Market ETF + - symbol: IEMG + name: Emerging Markets ETF + - symbol: ARKK + name: ARK Innovation ETF + - symbol: META + name: Meta (Facebook) + - symbol: AMZN + name: Amazon + - symbol: TSLA + name: Tesla + + +- name: Entertainment + columns: + - size: small + widgets: + - type: twitch-channels + channels: + - HandOfBlood + - maxim + - sascha + - fritz_meinecke + - RPICloud + - Roffle + - Jodarum + - iii_Initiative + - RealCivilEngineer + + - type: twitch-top-games + exclude: + - just-chatting + - pools-hot-tubs-and-beaches + - music + - art + - asmr + - counter-strike + - league-of-legends + - valorant + - dota-2 + + - size: full + widgets: + - type: videos + style: grid-cards + channels: + - UC5iYuXSliCgk_mtUJa25eoQ # MATTIN + - UCeosQoJubf3KzYRtjBNGoag # Nicky Lyan + - UC6biysICWOJ-C3P4Tyeggzg # LowLevel + - UCcpIdXCr3MjAQEWSEjpGUNg # Joelemz + - UCR-DXc1voovS8nhAvccRZhg # Jeff Geerling + - UCsBjURrPoezykLs9EqgamOA # Fireship + - UCGRb1WmL-v6AxZRLbcdXD_Q # Fritz Meinecke Live + - UCzH549YlZhdhIqhtvz7XHmQ # AlexiBexi + - UC9YTp5M6yYgSd6t0SeL2GQw # HandofBlood + - UCCJ-NJtqLQRxuaxHZA9q6zg # HandofUncut + - UCiHTnZis5R1bmrqQcYd7zWw # Sacha Hellinger + - UCXDi1F7Q-cJQ4mGGavtfYRQ # Inscope21 + - UC-4Tzd5lIRU7lcv7_5OO01Q # UnsymphatischTV + - UC6C1dyHHOMVIBAze8dWfqCw # Gamestar + - UCyQAraT4FYcXgnUTLOj796Q # Survival Mattin + - UCZXW8E1__d5tZb-wLFOt8TQ # Bog + - UCFgBYlz5LwymPSWBX-G6hBA # 2 Bored Guys + - UCOuGATIAbd2DvzJmUgXn2IQ # Network Chuck 2 + - UC9x0AN7BWHpCDHSm9NiJFJQ # Network Chuck + - UCgHGPOxUMfWsiy1ZyR-tLVw # Livakiva + - UCI7kKmUuSQOHUvSWIYFDf1Q # Eliminate + - UCHj7VElFb0_sxhI5KHduM7A # HardwareDealz + - UCREHHX2Lk_BYGS9R0ia7DDQ # Rantoni + - UC8butISFwT-Wl7EV0hUK0BQ # FreeCodeCamp + - UC4JX40jDee_tINbkjycV4Sg # Tech With Tim + - UCOk-gHyjcWZNj3Br4oxwh0A # Techno Tim + - UC_76XFUys5fTO7u_HqrD7aA # RPI Cloud diff --git a/glance/docker-compose.yml b/glance/docker-compose.yml new file mode 100644 index 0000000..e643dbe --- /dev/null +++ b/glance/docker-compose.yml @@ -0,0 +1,20 @@ +services: + glance: + container_name: glance + image: glanceapp/glance + restart: unless-stopped + volumes: + - glance_config:/app/config + - glance_assets:/app/assets + - /etc/timezone:/etc/timezone:ro + - /etc/localtime:/etc/localtime:ro + - /var/run/docker.sock:/var/run/docker.sock:ro + ports: + - 8383:8080 + env_file: .env + +volumes: + glance_config: + external: True + glance_assets: + external: True diff --git a/kavita/docker-compose.yaml b/kavita/docker-compose.yaml new file mode 100644 index 0000000..f197096 --- /dev/null +++ b/kavita/docker-compose.yaml @@ -0,0 +1,19 @@ +services: + kavita: + image: lscr.io/linuxserver/kavita:latest + container_name: kavita + environment: + - PUID=1000 + - PGID=1000 + - TZ=Etc/UTC + volumes: + - kavita_config:/config + - ebooks_library:/data + ports: + - 5000:5000 + restart: unless-stopped + +volumes: + kavita_config: + ebooks_library: + external: True diff --git a/n8n-automation/.env b/n8n-automation/.env new file mode 100644 index 0000000..88f1d61 --- /dev/null +++ b/n8n-automation/.env @@ -0,0 +1,14 @@ +# n8n Settings +DOMAIN_NAME=theocloud.dev +SUBDOMAIN=n8n +GENERIC_TIMEZONE=Europe/Berlin +N8N_HOST=n8n.theocloud.dev +N8N_PROTOCOL=https +WEBHOOK_URL=https://n8n.theocloud.dev/ +N8N_SECURE_COOKIE=false +NODE_ENV=production + +# PostgreSQL +POSTGRES_DB=n8n +POSTGRES_USER=n8n +POSTGRES_PASSWORD=58201928alsk diff --git a/n8n-automation/docker-compose.yaml b/n8n-automation/docker-compose.yaml new file mode 100644 index 0000000..430be8c --- /dev/null +++ b/n8n-automation/docker-compose.yaml @@ -0,0 +1,25 @@ +services: + n8n: + image: n8nio/n8n:latest + restart: always + ports: + - "5678:5678" + env_file: + - .env + volumes: + - n8n_data:/home/node/.n8n + - n8n_files:/files + depends_on: + - postgres + postgres: + image: postgres:15 + restart: always + env_file: + - .env + volumes: + - n8n_postgres_data:/var/lib/postgresql/data + +volumes: + n8n_data: + n8n_files: + n8n_postgres_data: diff --git a/pocketbase/Dockerfile b/pocketbase/Dockerfile new file mode 100644 index 0000000..c8bfa24 --- /dev/null +++ b/pocketbase/Dockerfile @@ -0,0 +1,22 @@ +FROM alpine:latest + +ARG PB_VERSION=0.28.4 + +RUN apk add --no-cache \ + unzip \ + ca-certificates + +# download and unzip PocketBase +ADD https://github.com/pocketbase/pocketbase/releases/download/v${PB_VERSION}/pocketbase_${PB_VERSION}_linux_amd64.zip /tmp/pb.zip +RUN unzip /tmp/pb.zip -d /pb/ + +# uncomment to copy the local pb_migrations dir into the image +# COPY ./pb_migrations /pb/pb_migrations + +# uncomment to copy the local pb_hooks dir into the image +# COPY ./pb_hooks /pb/pb_hooks + +EXPOSE 8080 + +# start PocketBase +CMD ["/pb/pocketbase", "serve", "--http=0.0.0.0:8080"] diff --git a/pocketbase/docker-compose.yml b/pocketbase/docker-compose.yml new file mode 100644 index 0000000..fc4a9a6 --- /dev/null +++ b/pocketbase/docker-compose.yml @@ -0,0 +1,16 @@ +services: + pocketbase: + build: + context: . + dockerfile: Dockerfile + args: + PB_VERSION: 0.28.4 + container_name: pocketbase + volumes: + - pb_data:/pb/pb_data + ports: + - "8090:8080" + restart: unless-stopped + +volumes: + pb_data: diff --git a/privatebin/docker-compose.yaml b/privatebin/docker-compose.yaml new file mode 100644 index 0000000..3b627e5 --- /dev/null +++ b/privatebin/docker-compose.yaml @@ -0,0 +1,14 @@ +services: + privatebin: + image: privatebin/nginx-fpm-alpine + container_name: privatebin + restart: always + read_only: true + user: "1000:1000" # Run the container with the UID:GID of your Docker user + ports: + - "8888:8080" + volumes: + - data:/srv/data + +volumes: + data: diff --git a/satisfactory/docker-compose.yaml b/satisfactory-tailscaled/docker-compose.yaml similarity index 52% rename from satisfactory/docker-compose.yaml rename to satisfactory-tailscaled/docker-compose.yaml index b9fedbd..a04b9d6 100644 --- a/satisfactory/docker-compose.yaml +++ b/satisfactory-tailscaled/docker-compose.yaml @@ -1,11 +1,8 @@ services: satisfactory-server: container_name: 'satisfactory-server' - hostname: 'drachenschanze-reloaded' image: 'wolveix/satisfactory-server:latest' - ports: - - '7777:7777/udp' - - '7777:7777/tcp' + network_mode: 'service:tailscale' volumes: - satisfactory_config:/config environment: @@ -21,6 +18,25 @@ services: reservations: memory: 8G + tailscale: + image: tailscale/tailscale:stable + container_name: satisfactory-tailscaled + ports: + - '7777:7777/udp' + - '7777:7777/tcp' + - '8888:8888/udp' + - '8888:8888/tcp' + volumes: + - tailscale_data:/var/lib + - /dev/net/tun:/dev/net/tun + cap_add: + - NET_ADMIN + - NET_RAW + environment: + - TS_AUTHKEY=tskey-auth-kCkP76DtH121CNTRL-umazeDHVETVzu1JBrFyeSVazWSYBrx476 + - TS_HOSTNAME=Satisfactory-Server + volumes: + tailscale_data: satisfactory_config: external: true diff --git a/stirling-pdf/docker-compose.yaml b/stirling-pdf/docker-compose.yaml new file mode 100644 index 0000000..d099e89 --- /dev/null +++ b/stirling-pdf/docker-compose.yaml @@ -0,0 +1,22 @@ +services: + stirling-pdf: + container_name: stirling-pdf + image: docker.stirlingpdf.com/stirlingtools/stirling-pdf:latest + ports: + - 8184:8080 + volumes: + - stirlingpdf_trainingData:/usr/share/tessdata # Required for extra OCR languages + - stirlingpdf_extraConfigs:/configs + - stirlingpdf_customFiles:/customFiles/ + - stirlingpdf_logs:/logs/ + - stirlingpdf_pipeline:/pipeline/ + environment: + - DISABLE_ADDITIONAL_FEATURES=false + - LANGS=en_GB + +volumes: + stirlingpdf_trainingData: + stirlingpdf_extraConfigs: + stirlingpdf_customFiles: + stirlingpdf_logs: + stirlingpdf_pipeline: diff --git a/tailscale/docker-compose.yaml b/tailscale/docker-compose.yaml deleted file mode 100644 index bcc33e3..0000000 --- a/tailscale/docker-compose.yaml +++ /dev/null @@ -1,17 +0,0 @@ -services: - tailscale: - image: tailscale/tailscale:stable - container_name: tailscaled - volumes: - - tailscale_tailscale_data:/var/lib - - /dev/net/tun:/dev/net/tun - network_mode: host - cap_add: - - NET_ADMIN - - NET_RAW - environment: - - TS_AUTHKEY=tskey-auth-kzcw7n21Rm11CNTRL-xscFvvmtfzFyzLi3QnQF1GJcKDhknoMP - -volumes: - tailscale_tailscale_data: - external: True diff --git a/webdav/.env b/webdav/.env new file mode 100644 index 0000000..dc5d2f0 --- /dev/null +++ b/webdav/.env @@ -0,0 +1,2 @@ +WEBDAV_USER=theo +WEBDAV_PASSWORD=58201928alsk diff --git a/webdav/docker-compose.yaml b/webdav/docker-compose.yaml new file mode 100644 index 0000000..76e4b1a --- /dev/null +++ b/webdav/docker-compose.yaml @@ -0,0 +1,16 @@ +services: + webdav: + image: bytemark/webdav + container_name: webdav + environment: + - AUTH_TYPE=Basic + - USERNAME=${WEBDAV_USER} + - PASSWORD=${WEBDAV_PASSWORD} + volumes: + - samba_data:/var/lib/dav + ports: + - 8081:80 + +volumes: + samba_data: + external: True