diff --git a/Docker-Compose/ArrsStack/.env b/Docker-Compose/ArrsStack/.env index 79b70cc..c97b412 100644 --- a/Docker-Compose/ArrsStack/.env +++ b/Docker-Compose/ArrsStack/.env @@ -1,69 +1,23 @@ -# ============================================================ -# Tom Spark's ARR Stack — Environment Configuration -# https://github.com/loponai/arrstack -# -# INSTRUCTIONS: -# 1. Copy this file: cp .env.example .env -# 2. Fill in your VPN credentials below -# 3. Adjust timezone and user IDs if needed -# 4. Run: docker compose up -d -# ============================================================ - # ============================================================ # SYSTEM SETTINGS # ============================================================ - -# Your timezone (list: https://en.wikipedia.org/wiki/List_of_tz_database_time_zones) TZ=America/New_York - -# Your Linux user/group ID. Find yours with: id -# Most systems default to 1000. If yours is different, change these. PUID=1000 PGID=1000 # ============================================================ -# VPN SETTINGS — Pick your provider and fill in credentials -# Full provider list: https://github.com/qdm12/gluetun-wiki/tree/main/setup/providers -# -# IMPORTANT: VPN credentials are NOT your login email/password! -# You need service credentials from your VPN provider's manual -# setup or API section. See the provider examples at the bottom of this file. +# VPN SETTINGS (AirVPN WireGuard) # ============================================================ - -# Your VPN provider (surfshark, nordvpn, protonvpn, airvpn, mullvad, private internet access, windscribe, etc.) VPN_SERVICE_PROVIDER=airvpn - -# Protocol: wireguard (recommended, faster) or openvpn VPN_TYPE=wireguard - -# --- WIREGUARD CREDENTIALS --- -# For Surfshark: go to https://my.surfshark.com/vpn/manual-setup/main → WireGuard -# For other providers: see the examples at the bottom of this file WIREGUARD_PRIVATE_KEY=eDgf3GPFy2ltgx2RkD/Vx5wKZ4dVi28YbQmSJOrbWmk= WIREGUARD_ADDRESSES=10.175.23.30 -# Only needed for some providers (AirVPN). Leave blank if not required. -# WIREGUARD_PUBLIC_KEY= WIREGUARD_PRESHARED_KEY=+0+hrSdzRUxKDNk1Q37PNmNJ2jsj2EzF45JtbZad4lI= -# --- OPENVPN CREDENTIALS --- -# Only needed if VPN_TYPE=openvpn. Leave blank if using WireGuard. -# OPENVPN_USER= -# OPENVPN_PASSWORD= - -# --- SERVER SELECTION --- -# Pick a country close to you for best speeds SERVER_COUNTRIES=Canada - -# --- PORT FORWARDING --- -# Supported by: ProtonVPN, AirVPN, PIA. Can help with upload speeds and seeding. -# Not required for downloading. Most users don't need this. -# Set to "on" if your provider supports it, leave blank otherwise (Surfshark, NordVPN, etc.). -#VPN_PORT_FORWARDING= -# If your provider requires manually specifying a port (e.g. AirVPN): FIREWALL_VPN_INPUT_PORTS=29261 # ============================================================ -# NETWORK — Static IPs for each service -# You shouldn't need to change these unless you have a conflict. +# STATIC IP ALLOCATIONS # ============================================================ IP_GLUETUN=172.39.0.2 IP_RADARR=172.39.0.3 @@ -76,69 +30,17 @@ IP_AUDIO=172.39.0.9 IP_NAVI=172.39.0.10 IP_LIST=172.39.0.11 IP_WATCH=172.39.0.12 + # ============================================================ -# PROVIDER-SPECIFIC EXAMPLES -# Uncomment and fill in the section for your VPN provider. +# WATCHTOWER CONFIGURATION # ============================================================ - -# --- NORDVPN --- -# 1. Go to: https://my.nordaccount.com/dashboard/nordvpn/manual-configuration/ -# 2. Generate a WireGuard private key (NordLynx) -# 3. Paste the private key below -# VPN_SERVICE_PROVIDER=nordvpn -# VPN_TYPE=wireguard -# WIREGUARD_PRIVATE_KEY=your_nordvpn_private_key_here -# WIREGUARD_ADDRESSES=10.5.0.2/16 -# SERVER_COUNTRIES=United States -# --- PROTONVPN --- -# 1. Go to: https://account.protonvpn.com/ → Downloads → WireGuard configuration -# 2. Generate a config, open the file, copy the PrivateKey and Address -# 3. Port forwarding is supported on paid plans -# VPN_SERVICE_PROVIDER=protonvpn -# VPN_TYPE=wireguard -# WIREGUARD_PRIVATE_KEY=your_proton_private_key_here -# WIREGUARD_ADDRESSES=10.2.0.2/32 -# SERVER_COUNTRIES=United States -# VPN_PORT_FORWARDING=on - -# --- SURFSHARK --- -# 1. Go to: https://my.surfshark.com/vpn/manual-setup/main -# 2. Get WireGuard credentials -# VPN_SERVICE_PROVIDER=surfshark -# VPN_TYPE=wireguard -# WIREGUARD_PRIVATE_KEY=your_surfshark_private_key_here -# WIREGUARD_ADDRESSES=10.14.0.2/16 -# SERVER_COUNTRIES=United States - -# --- AIRVPN --- -# 1. Go to: https://airvpn.org/ → Client Area → Config Generator -# 2. Select Linux → WireGuard → pick a server → Generate -# 3. Copy all keys and the assigned IP -# VPN_SERVICE_PROVIDER=airvpn -# VPN_TYPE=wireguard -# WIREGUARD_PRIVATE_KEY=your_airvpn_private_key_here -# WIREGUARD_PUBLIC_KEY=your_airvpn_public_key_here -# WIREGUARD_PRESHARED_KEY=your_airvpn_preshared_key_here -# WIREGUARD_ADDRESSES=your_assigned_ip/32 -# FIREWALL_VPN_INPUT_PORTS=your_forwarded_port -# VPN_PORT_FORWARDING=on - -# --- MULLVAD --- -# 1. Go to: https://mullvad.net/en/account → WireGuard configuration -# VPN_SERVICE_PROVIDER=mullvad -# VPN_TYPE=wireguard -# WIREGUARD_PRIVATE_KEY=your_mullvad_private_key_here -# WIREGUARD_ADDRESSES=your_assigned_ip/32 -# SERVER_COUNTRIES=United States - -# --- Watchtower --- WATCHTOWER_CLEANUP=true WATCHTOWER_INCLUDE_RESTARTING=true WATCHTOWER_ROLLING_RESTARTING=true -WATCHTOWER_SCHEDULE=0 0 4 * * * +WATCHTOWER_SCHEDULE="0 0 4 * * *" WATCHTOWER_INCLUDE_STOPPED=true WATCHTOWER_NOTIFICATIONS=email -WATCHTOWER_NOTIFICATIONS_HOSTNAME=Docker-Deply # Add Server Name or IP Address +WATCHTOWER_NOTIFICATIONS_HOSTNAME=Docker-ArrStack WATCHTOWER_NOTIFICATION_EMAIL_FROM=miker@mmcfetridge.net WATCHTOWER_NOTIFICATION_EMAIL_TO=miker@mmcfetridge.net WATCHTOWER_NOTIFICATION_EMAIL_SERVER=mail.mmcfetridge.net @@ -146,5 +48,3 @@ WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PORT=465 WATCHTOWER_NOTIFICATION_EMAIL_SERVER_USER=miker@mmcfetridge.net WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PASSWORD=!Sucyetat123 WATCHTOWER_NOTIFICATION_EMAIL_DELAY=2 -PUID=1000 -PGID=1000 \ No newline at end of file diff --git a/Docker-Compose/ArrsStack/compose.yml b/Docker-Compose/ArrsStack/compose.yml index abc3848..996855b 100644 --- a/Docker-Compose/ArrsStack/compose.yml +++ b/Docker-Compose/ArrsStack/compose.yml @@ -1,16 +1,5 @@ -# Tom Spark's ARR Stack — Automated Media Server +# ARR Stack — Automated Media Server # https://github.com/loponai/arrstack -# -# Usage: -# 1. Copy .env.example to .env and fill in your VPN credentials -# 2. Run: bash setup-folders.sh -# 3. Run: docker compose up -d -# -# All VPN-protected services (qBittorrent, Prowlarr, FlareSolverr) run -# through Gluetun. If the VPN drops, traffic stops. Zero leaks. -# -# Radarr, Sonarr, Lidarr, Bazarr, Jellyfin, and Seerr do NOT run through -# the VPN — they need direct network access for speed and local connectivity. networks: arrnetwork: @@ -22,10 +11,7 @@ networks: services: # ============================================================ - # GLUETUN — VPN Container (kill switch + tunnel) - # All VPN-protected services route through this container. - # Ports for those services are mapped HERE, not on the services themselves. - # Docs: https://github.com/qdm12/gluetun-wiki + # GLUETUN — VPN Container # ============================================================ gluetun: image: qmcgaw/gluetun:latest @@ -49,21 +35,12 @@ services: environment: - VPN_SERVICE_PROVIDER=${VPN_SERVICE_PROVIDER} - VPN_TYPE=${VPN_TYPE} - # --- WireGuard credentials (most providers) --- - WIREGUARD_PRIVATE_KEY=${WIREGUARD_PRIVATE_KEY} - WIREGUARD_ADDRESSES=${WIREGUARD_ADDRESSES} -# - WIREGUARD_PUBLIC_KEY=${WIREGUARD_PUBLIC_KEY} - WIREGUARD_PRESHARED_KEY=${WIREGUARD_PRESHARED_KEY} - # --- OpenVPN credentials (if using OpenVPN instead) --- -# - OPENVPN_USER=${OPENVPN_USER} -# - OPENVPN_PASSWORD=${OPENVPN_PASSWORD} - # --- Server selection --- - SERVER_COUNTRIES=${SERVER_COUNTRIES} - # --- Port forwarding (ProtonVPN, AirVPN, PIA) --- -# - VPN_PORT_FORWARDING=${VPN_PORT_FORWARDING} - FIREWALL_VPN_INPUT_PORTS=${FIREWALL_VPN_INPUT_PORTS} - FIREWALL_OUTBOUND_SUBNETS=192.168.0.0/22 - # --- General --- - PUID=${PUID} - PGID=${PGID} - UMASK=002 @@ -80,8 +57,7 @@ services: restart: unless-stopped # ============================================================ - # QBITTORRENT — Torrent Client (runs through Gluetun VPN) - # ALL traffic goes through the VPN tunnel. No direct internet. + # QBITTORRENT — Torrent Client # ============================================================ qbittorrent: image: lscr.io/linuxserver/qbittorrent:latest @@ -92,7 +68,7 @@ services: condition: service_healthy restart: true labels: - - deunhealth.restart.on.unhealthy=true + - deunhealth.restart.on.unhealthy=true environment: - PUID=${PUID} - PGID=${PGID} @@ -113,7 +89,6 @@ services: # ============================================================ # DEUNHEALTH — Auto-restarts unhealthy containers - # If qBittorrent loses VPN connection, this restarts it automatically. # ============================================================ deunhealth: image: qmcgaw/deunhealth @@ -129,8 +104,7 @@ services: restart: always # ============================================================ - # PROWLARR — Indexer Manager (runs through Gluetun VPN) - # Manages torrent/usenet indexers. Syncs to Radarr/Sonarr/Lidarr. + # PROWLARR — Indexer Manager # ============================================================ prowlarr: image: lscr.io/linuxserver/prowlarr:latest @@ -150,8 +124,7 @@ services: restart: unless-stopped # ============================================================ - # FLARESOLVERR — Cloudflare Bypass (runs through Gluetun VPN) - # Some indexers use Cloudflare protection. This gets around it. + # FLARESOLVERR — Cloudflare Bypass # ============================================================ flaresolverr: image: ghcr.io/flaresolverr/flaresolverr:latest @@ -169,9 +142,7 @@ services: restart: unless-stopped # ============================================================ - # RADARR — Movie Manager (NOT behind VPN) - # Searches via Prowlarr, sends downloads to qBittorrent, - # renames and hard-links completed files to media folder. + # RADARR — Movie Manager # ============================================================ radarr: image: lscr.io/linuxserver/radarr:latest @@ -192,8 +163,7 @@ services: restart: unless-stopped # ============================================================ - # SONARR — TV Show Manager (NOT behind VPN) - # Same pattern as Radarr but for TV series. + # SONARR — TV Show Manager # ============================================================ sonarr: image: lscr.io/linuxserver/sonarr:latest @@ -214,8 +184,7 @@ services: restart: unless-stopped # ============================================================ - # LIDARR — Music Manager (NOT behind VPN) - # Optional. Comment out if you don't need music automation. + # LIDARR — Music Manager # ============================================================ lidarr: image: lscr.io/linuxserver/lidarr:latest @@ -236,8 +205,7 @@ services: restart: unless-stopped # ============================================================ - # BAZARR — Subtitle Manager (NOT behind VPN) - # Automatically downloads subtitles for movies and TV shows. + # BAZARR — Subtitle Manager # ============================================================ bazarr: image: lscr.io/linuxserver/bazarr:latest @@ -258,9 +226,7 @@ services: restart: unless-stopped # ============================================================ - # JELLYFIN — Media Server (NOT behind VPN) - # Your personal streaming service. Plays movies, TV, music. - # Needs full bandwidth — never put this behind the VPN. + # JELLYFIN — Media Server # ============================================================ jellyfin: image: lscr.io/linuxserver/jellyfin:latest @@ -275,36 +241,16 @@ services: - /data/media:/data/media ports: - 8096:8096 - # Uncomment the lines below to enable hardware transcoding (Intel Quick Sync / VAAPI). - # Only works if your system has Intel/AMD integrated graphics (/dev/dri must exist). - # If you get an error about /dev/dri not found, leave these commented out. - # devices: - # - /dev/dri:/dev/dri networks: arrnetwork: ipv4_address: ${IP_JELLYFIN} restart: unless-stopped # ============================================================ - # SEERR — Request System (NOT behind VPN) - # Netflix-like UI for requesting movies and TV shows. - # Share this with family — they never need to touch Radarr. - # - # Seerr is the unified successor to Overseerr and Jellyseerr - # (merged under seerr-team). Supports Plex, Jellyfin, and Emby. - # - # Config uses a NAMED Docker volume (not a bind mount). This is - # required: Seerr runs as the `node` user (UID 1000) and a - # bind-mounted host folder is created root-owned, causing a - # permission-denied crash loop. On Windows/WSL, bind mounts also - # corrupt the SQLite DB over SMB. Named volumes fix both cases - # (matches upstream Seerr docs). - # - # Migrating from ./jellyseerr or ./seerr bind mount? See README - # troubleshooting "Migrating Seerr config to a named volume". + # SEERR — Request System # ============================================================ seerr: - image: ghcr.io/seerr-team/seerr:v3.0.1 + image: ghcr.io/seerr-team/seerr:latest init: true container_name: seerr environment: @@ -315,7 +261,7 @@ services: - TZ=${TZ} - PORT=5055 volumes: - - seerr_volume:/app/config # <--- Needed or will cause a permissions issue. + - seerr_volume:/app/config ports: - 5055:5055 healthcheck: @@ -329,6 +275,9 @@ services: ipv4_address: ${IP_SEERR} restart: unless-stopped + # ============================================================ + # LISTENARR — Audiobooks & Podcasts + # ============================================================ listenarr: image: ghcr.io/listenarrs/listenarr:canary container_name: listenarr @@ -348,6 +297,9 @@ services: arrnetwork: ipv4_address: ${IP_LIST} + # ============================================================ + # AUDIOBOOKSHELF — Audiobook / Podcast Server + # ============================================================ audiobookshelf: image: ghcr.io/advplyr/audiobookshelf:latest container_name: audiobookshelf @@ -367,6 +319,10 @@ services: networks: arrnetwork: ipv4_address: ${IP_AUDIO} + + # ============================================================ + # NAVIDROME — Music Streaming + # ============================================================ navidrome: image: deluan/navidrome:latest container_name: navidrome @@ -387,17 +343,19 @@ services: networks: arrnetwork: ipv4_address: ${IP_NAVI} - + + # ============================================================ + # WATCHTOWER — Automatic Image Updates + # ============================================================ watchtower: - image: containrrr/watchtower + image: nickfedor/watchtower:latest container_name: watchtower restart: unless-stopped - env_file: .env environment: - DOCKER_API_VERSION=1.44 - TZ=${TZ} - - PUID:=${PUID} # Reference PUID from .env - - PGID=${PGID} # Reference PGID from .env + - PUID=${PUID} + - PGID=${PGID} - WATCHTOWER_CLEANUP=${WATCHTOWER_CLEANUP} - WATCHTOWER_INCLUDE_RESTARTING=${WATCHTOWER_INCLUDE_RESTARTING} - WATCHTOWER_ROLLING_RESTARTING=${WATCHTOWER_ROLLING_RESTARTING} @@ -411,6 +369,7 @@ services: - WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PORT=${WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PORT} - WATCHTOWER_NOTIFICATION_EMAIL_SERVER_USER=${WATCHTOWER_NOTIFICATION_EMAIL_SERVER_USER} - WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PASSWORD=${WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PASSWORD} + - WATCHTOWER_NOTIFICATION_EMAIL_DELAY=${WATCHTOWER_NOTIFICATION_EMAIL_DELAY} security_opt: - no-new-privileges:true volumes: @@ -421,7 +380,22 @@ services: networks: arrnetwork: ipv4_address: ${IP_WATCH} -# Go to the VERY BOTTOM of your file (outside of services) and add this: + + sencho: + image: saelix/sencho:latest + container_name: sencho + restart: unless-stopped + ports: + - "1852:1852" + volumes: + - /var/run/docker.sock:/var/run/docker.sock + - /opt/Docker-Deployments/Sencho/data:/app/data + # Change this line so the container path matches the host path. + - /opt/Docker-Deployments:/opt/Docker-Deployments + environment: + - COMPOSE_DIR=/opt/Docker-Deployments + - DATA_DIR=/app/data + volumes: gluetun_volume: qbittorrent_volume: @@ -437,4 +411,4 @@ volumes: listenarr_volume: audiobookshelf_volume: navidrome_volume: - watchtower_volume: \ No newline at end of file + watchtower_volume: diff --git a/Docker-Compose/Authentik/.env b/Docker-Compose/Authentik/.env index 3fea7a5..4488bc7 100644 --- a/Docker-Compose/Authentik/.env +++ b/Docker-Compose/Authentik/.env @@ -1,20 +1,28 @@ -#For a fresh authentik installation, you need to generate a password and a secret key. -PG_PASS=vXqYGFaTTldI8+DydREqaf3RRvHVRDXAlyKfaEXQ92Nw570A -AUTHENTIK_SECRET_KEY=voCiuozip37G/UISer4WV8FBLrMD8diHINmALHvWQ0A7PkzMoYH9xf3MnTDWEylN1TS1dp7JJ2f3nv1V +# ============================================================ +# SYSTEM SETTINGS +# ============================================================ +TZ=America/New_York +PUID=1000 +PGID=1000 +DATA_PATH=/home/miker/docker/authentik -#Enable error reporting -AUTHENTIK_ERROR_REPORTING__ENABLED=true - -# SMTP Host Emails are sent to -AUTHENTIK_EMAIL__HOST=mail.mmcfetridge.net -AUTHENTIK_EMAIL__PORT=587 -AUTHENTIK_EMAIL__USERNAME=miker@mmcfetridge.net -AUTHENTIK_EMAIL__PASSWORD=!Sucyetat123 -AUTHENTIK_EMAIL__USE_TLS=true -AUTHENTIK_EMAIL__USE_SSL=false -AUTHENTIK_EMAIL__TIMEOUT=10 -AUTHENTIK_EMAIL__FROM=miker@mmcfetridge.net - -# Authentik listens on port 9000 for HTTP and 9443 for HTTPS. To change the exposed ports change these values +# ============================================================ +# AUTHENTIK VERSION & PORTS +# ============================================================ +AUTHENTIK_IMAGE=ghcr.io/goauthentik/server +AUTHENTIK_TAG=2026.5.6 COMPOSE_PORT_HTTP=9500 COMPOSE_PORT_HTTPS=9543 + +# ============================================================ +# DATABASE CREDENTIALS +# ============================================================ +PG_DB=authentik +PG_USER=authentik +PG_PASS=vXqYGFaTTldI8+DydREqaf3RRvHVRDXAlyKfaEXQ92Nw570A + +# ============================================================ +# SECURITY KEYS +# ============================================================ +# Generate with: openssl rand -base64 36 +AUTHENTIK_SECRET_KEY=voCiuozip37G/UISer4WV8FBLrMD8diHINmALHvWQ0A7PkzMoYH9xf3MnTDWEylN1TS1dp7JJ2f3nv1V diff --git a/Docker-Compose/Authentik/docker-compose.yml b/Docker-Compose/Authentik/docker-compose.yml index 7735b72..8cef833 100644 --- a/Docker-Compose/Authentik/docker-compose.yml +++ b/Docker-Compose/Authentik/docker-compose.yml @@ -1,100 +1,79 @@ ---- - +# Authentik Identity & SSO Stack services: postgresql: image: docker.io/library/postgres:16-alpine - restart: unless-stopped container_name: authentik-db + restart: unless-stopped + environment: + - POSTGRES_DB=${PG_DB:-authentik} + - POSTGRES_USER=${PG_USER:-authentik} + - POSTGRES_PASSWORD=${PG_PASS} + - TZ=${TZ} + volumes: + - ${DATA_PATH}/database:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -d $${POSTGRES_DB} -U $${POSTGRES_USER}"] - start_period: 20s interval: 30s - retries: 5 timeout: 5s - volumes: - - ./database:/var/lib/postgresql/data - environment: - POSTGRES_PASSWORD: ${PG_PASS:?database password required} - POSTGRES_USER: ${PG_USER:-authentik} - POSTGRES_DB: ${PG_DB:-authentik} - env_file: - - .env - networks: - - authentik - - redis: - image: docker.io/library/redis:alpine - command: --save 60 1 --loglevel warning - restart: unless-stopped - container_name: authentik-redis - healthcheck: - test: ["CMD-SHELL", "redis-cli ping | grep PONG"] - start_period: 20s - interval: 30s retries: 5 - timeout: 3s - volumes: - - ./redis:/data + start_period: 20s networks: - authentik server: - image: ${AUTHENTIK_IMAGE:-ghcr.io/goauthentik/server}:${AUTHENTIK_TAG:-2025.8.1} - restart: unless-stopped + image: ${AUTHENTIK_IMAGE:-ghcr.io/goauthentik/server}:${AUTHENTIK_TAG:-2026.5.6} container_name: authentik-server + restart: unless-stopped command: server environment: - AUTHENTIK_REDIS__HOST: redis - AUTHENTIK_POSTGRESQL__HOST: postgresql - AUTHENTIK_POSTGRESQL__USER: ${PG_USER:-authentik} - AUTHENTIK_POSTGRESQL__NAME: ${PG_DB:-authentik} - AUTHENTIK_POSTGRESQL__PASSWORD: ${PG_PASS} + - AUTHENTIK_POSTGRESQL__HOST=postgresql + - AUTHENTIK_POSTGRESQL__NAME=${PG_DB:-authentik} + - AUTHENTIK_POSTGRESQL__USER=${PG_USER:-authentik} + - AUTHENTIK_POSTGRESQL__PASSWORD=${PG_PASS} + - AUTHENTIK_SECRET_KEY=${AUTHENTIK_SECRET_KEY} + - TZ=${TZ} volumes: - - ./media:/media - - ./custom-templates:/templates - env_file: - - .env + - ${DATA_PATH}/data:/data + - ${DATA_PATH}/custom-templates:/templates ports: - - "${COMPOSE_PORT_HTTP:-9000}:9000" - - "${COMPOSE_PORT_HTTPS:-9443}:9443" + - "${COMPOSE_PORT_HTTP}:9000" + - "${COMPOSE_PORT_HTTPS}:9443" + shm_size: 512mb depends_on: - - postgresql - - redis + postgresql: + condition: service_healthy networks: - authentik + - main worker: - image: ${AUTHENTIK_IMAGE:-ghcr.io/goauthentik/server}:${AUTHENTIK_TAG:-2025.8.1} - restart: unless-stopped + image: ${AUTHENTIK_IMAGE:-ghcr.io/goauthentik/server}:${AUTHENTIK_TAG:-2026.5.6} container_name: authentik-worker + restart: unless-stopped command: worker - environment: - AUTHENTIK_REDIS__HOST: redis - AUTHENTIK_POSTGRESQL__HOST: postgresql - AUTHENTIK_POSTGRESQL__USER: ${PG_USER:-authentik} - AUTHENTIK_POSTGRESQL__NAME: ${PG_DB:-authentik} - AUTHENTIK_POSTGRESQL__PASSWORD: ${PG_PASS} - # `user: root` and the docker socket volume are optional. - # See more for the docker socket integration here: - # https://goauthentik.io/docs/outposts/integrations/docker - # Removing `user: root` also prevents the worker from fixing the permissions - # on the mounted folders, so when removing this make sure the folders have the correct UID/GID - # (1000:1000 by default) user: root + environment: + - AUTHENTIK_POSTGRESQL__HOST=postgresql + - AUTHENTIK_POSTGRESQL__NAME=${PG_DB:-authentik} + - AUTHENTIK_POSTGRESQL__USER=${PG_USER:-authentik} + - AUTHENTIK_POSTGRESQL__PASSWORD=${PG_PASS} + - AUTHENTIK_SECRET_KEY=${AUTHENTIK_SECRET_KEY} + - TZ=${TZ} volumes: - /var/run/docker.sock:/var/run/docker.sock - - ./media:/media - - ./certs:/certs - - ./custom-templates:/templates - env_file: - - .env + - ${DATA_PATH}/data:/data + - ${DATA_PATH}/certs:/certs + - ${DATA_PATH}/custom-templates:/templates + shm_size: 512mb depends_on: - - postgresql - - redis + postgresql: + condition: service_healthy networks: - authentik + - main networks: + main: + external: true authentik: external: true - diff --git a/Docker-Compose/Bookstack/.env b/Docker-Compose/Bookstack/.env new file mode 100644 index 0000000..2d55730 --- /dev/null +++ b/Docker-Compose/Bookstack/.env @@ -0,0 +1,18 @@ +# Application Settings +APP_URL=https://book.mikemcfetridge.com +APP_KEY=base64:k1BQQ5IB+TDD4XOmDtOdxupfvBECi+Z1Ay9C12/5YgA= +BOOKSTACK_PORT=6875 + +# System Settings +TZ=America/New_York +PUID=1000 +PGID=1000 +DATA_DIR=/opt/Docker-Deployments/Bookstack + +# Database Credentials +DB_HOST=db +DB_PORT=3306 +DB_DATABASE=bookstack +DB_USERNAME=bookstack +DB_PASSWORD=3OSyIgZjyV4Tze +MYSQL_ROOT_PASSWORD=3OSyIgZjyV4Tze diff --git a/Docker-Compose/Bookstack/docker-compose.yml b/Docker-Compose/Bookstack/docker-compose.yml new file mode 100644 index 0000000..c63ce22 --- /dev/null +++ b/Docker-Compose/Bookstack/docker-compose.yml @@ -0,0 +1,53 @@ +services: + db: + image: mariadb:11 + container_name: bookstack-db + restart: unless-stopped + environment: + MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD} + MYSQL_DATABASE: ${DB_DATABASE} + MYSQL_USER: ${DB_USERNAME} + MYSQL_PASSWORD: ${DB_PASSWORD} + volumes: + # Persist database files + - ${DATA_DIR}/db:/var/lib/mysql + networks: + - internal + + bookstack: + image: lscr.io/linuxserver/bookstack:latest + container_name: bookstack + restart: unless-stopped + depends_on: + - db + ports: + # Web interface + - "${BOOKSTACK_PORT}:80" + environment: + # Application URL + - APP_URL=${APP_URL} + # Session encryption key + - APP_KEY=${APP_KEY} + # Database connection + - DB_HOST=${DB_HOST} + - DB_PORT=${DB_PORT} + - DB_DATABASE=${DB_DATABASE} + - DB_USERNAME=${DB_USERNAME} + - DB_PASSWORD=${DB_PASSWORD} + # Timezone + - TZ=${TZ} + # User/group IDs for file permissions + - PUID=${PUID} + - PGID=${PGID} + volumes: + # Application configuration + - ${DATA_DIR}/config:/config + networks: + - external + - internal + +networks: + internal: + external: true + external: + external: true diff --git a/Docker-Compose/Homepage/config/custom.css b/Docker-Compose/Homepage/config/custom.css index 70ba238..0ad749f 100644 --- a/Docker-Compose/Homepage/config/custom.css +++ b/Docker-Compose/Homepage/config/custom.css @@ -1,516 +1,385 @@ -@import url('https://fonts.googleapis.com/css2?family=DM+Sans:opsz@9..40&family=Fira+Code&family=Poppins&family=Source+Code+Pro&family=Work+Sans&display=swap'); +@import url('https://fonts.googleapis.com/css2?family=Fira+Code&family=Orbitron:wght@500;700;900&family=Poppins:wght@300;400;500;600&family=Rajdhani:wght@500;600;700&display=swap'); -.theme-gray { - font-family: 'DM Sans', sans-serif; +/* APPLY STYLING AND THEME VARIABLES GLOBALLY & ON ACTIVE THEMES */ +:root, .dark, .theme-gray, .theme-slate, .theme-zinc { + font-family: 'Poppins', sans-serif; - /* DRACULA COLORS */ - --dracula-background: #282a36; - --dracula-background-dark: #15161d; - --dracula-foreground: #44475a; + /* DRACULA & CYBERPUNK COLOR SYSTEM */ + --dracula-background: #181923; + --dracula-background-dark: #0f1015; + --dracula-foreground: #2d3142; --dracula-text: #f8f8f2; --dracula-slate: #6272a4; --dracula-cyan: #8be9fd; - --dracula-green: #50fa7ae8; + --dracula-green: #50fa7b; --dracula-orange: #ffb86c; --dracula-pink: #ff79c6; --dracula-purple: #bd93f9; --dracula-red: #ff5555; --dracula-yellow: #f1fa8c; - /* Theme preset colors */ + /* Theme preset colors (RGB values for Tailwind transparency support) */ --color-50: 249 250 251; --color-100: 243 244 246; - --color-200: 248 248 242; /* Text Color - use Dracula text color */ + --color-200: 248 248 242; /* Text Color */ --color-300: 209 213 219; --color-400: 156 163 175; --color-500: 107 114 128; --color-600: 75 85 99; - --color-700: 55 65 81; - --color-800: 40 42 54; /* Background color - use Dracula theme color */ - --color-900: 21 22 29; /* Dracula specific */ - --color-logo-start: 156 163 175; - --color-logo-stop: 55 65 81; + --color-700: 45 49 66; + --color-800: 24 25 35; /* Main container background */ + --color-900: 15 16 21; /* Core background */ + --color-logo-start: 189 147 249; + --color-logo-stop: 139 233 253; - --standard-bg: #44475a8e; + --standard-bg: rgba(45, 49, 66, 0.45); /* INFO WIDGET COLORS */ - --info-widgets: var(--dracula-purple); - --resource-bar-bg: var(--standard-bg); - --resource-bar-fg: var(--dracula-green); + --info-widgets: var(--dracula-cyan); + --resource-bar-bg: rgba(98, 114, 164, 0.2); + --resource-bar-fg: var(--dracula-cyan); - --widget-border: var(--dracula-foreground); + --widget-border: rgba(139, 233, 253, 0.2); /* SERVICES COLORS */ --service-group: var(--dracula-purple); - --service-name: var(--dracula-text); - --service-description: var(--dracula-purple); + --service-description: #a9b1d6; - --service-block-bg: #232530; + --service-block-bg: rgba(15, 16, 21, 0.7); --service-block-text: var(--dracula-pink); /* BOOKMARKS COLORS */ --bookmark-group: var(--dracula-purple); - - --bookmark-icon-bg: #44475a60; + --bookmark-icon-bg: rgba(189, 147, 249, 0.15); --bookmark-icon: var(--dracula-purple); --bookmark-name: var(--dracula-text); - /* ALL CARD COLORS */ - --card-color: #44475a46; - --card-color-hover: #44475a91; - - /* FOOTER COLORS */ - --footer-items: var(--dracula-pink); + /* ALL CARD COLORS (GLASSMORPHISM DEFAULT) */ + --card-color: rgba(30, 32, 48, 0.55); + --card-color-hover: rgba(40, 44, 68, 0.8); /* FOOTER COLORS */ + --footer-items: var(--dracula-purple); --scrollbar-fg: var(--dracula-purple); - --scrollbar-bg: var(--standard-bg); - - /*Class color values */ - .service-tags .dark\:bg-theme-900\/50 { - background-color: rgb(var(--color-900) / 0.3) !important; - } - - /******************************* - * INFORMATION WIDGETS STYLES * - *******************************/ - #information-widgets { - border-color: var(--widget-border); - } - - #information-widgets * { - color: var(--info-widgets); - } - - .resource-usage { - background-color: var(--resource-bar-bg); - } - - .resource-usage > div { - background-color: var(--resource-bar-fg); - } - - /******************************* - * SERVICES STYLES * - *******************************/ - .service-group-icon > div { - background: var(--service-group) !important; /* group label ICON color */ - } - - .service-group-name { - color: var(--service-group); /* group label NAME color */ - } - - .services-group > button > svg { - color: var(--service-group); /* group label EXPAND/COLLAPSE ICON color */ - } - - .service-card { - background-color: var(--card-color); - } - - .service-card:hover { - background-color: var(--card-color-hover); - } - - .service-name.text-sm { - font-size: 0.95rem; - color: var(--service-name); - } - - .service-description.text-xs { - font-size: 0.75rem; - color: var(--service-description); - } - - .service img { - border-radius: 25%; - } - - .service-block { - background: var(--service-block-bg); - } - - .service-block .uppercase { - color: var(--service-block-text); - } - - .service-block .font-thin { - color: var(--dracula-text); - } - - /******************************* - * BOOKMARK STYLES * - *******************************/ - - .bookmark-group-name { - color: var(--bookmark-group); - } - - .bookmark-icon { - background-color: var(--bookmark-icon-bg) !important; - } - - .bookmark-icon > div > div { - background: var( - --bookmark-icon - ) !important; /* If using si or md icons, make default purple */ - } - - .bookmark-name.text-xs { - font-size: 0.85rem; - color: var(--bookmark-name); - } - - li.bookmark > a { - background-color: var(--card-color); - } - - li.bookmark > a:hover { - background-color: var(--card-color-hover); - } - - /******************************* - * CALENDAR STYLES * - *******************************/ - - #dracula-calendar .flex.justify-between.flex-wrap span { - color: var(--dracula-purple); - } - - /******************************* - * FOOTER STYLES * - *******************************/ - - #footer svg { - color: var(--footer-items); - } - - /******************************* - * SCROLLBAR STYLES * - *******************************/ - - * { - --scrollbar-thumb: var(--scrollbar-fg); - --scrollbar-track: var(--scrollbar-bg); - } - - /******************************* - * GLANCES STYLES * - *******************************/ - - li[id^='glances-'] .recharts-surface > g:nth-of-type(1) path:nth-child(1) { - fill: var(--dracula-green); - fill-opacity: 0.15; - } - - li[id^='glances-'] .recharts-surface g:nth-of-type(1) path:nth-child(2) { - stroke: var(--dracula-green); - stroke-opacity: 0.5; - } - - li[id^='glances-'] .recharts-surface g:nth-of-type(2) path:nth-child(1) { - fill: var(--dracula-purple); - fill-opacity: 0.15; - } - - li[id^='glances-'] .recharts-surface g:nth-of-type(2) path:nth-child(2) { - stroke: var(--dracula-purple); - stroke-opacity: 0.5; - } - - li[id^='glances-'] .bottom-3.left-3 { - color: var(--dracula-pink); - } - - li[id^='glances-'] .bottom-3.right-3 .opacity-75 { - color: var(--dracula-cyan); - opacity: 1; - font-size: 0.8rem; - } - - li[id^='glances-'] .top-3.right-3 .opacity-50 { - color: var(--dracula-cyan); - opacity: 1; - font-size: 0.8rem; - } - - li[id^='glances-'] .opacity-50 { - opacity: 0.8; - } - - li[id^='glances-'] .flex.items-center.text-xs .text-right { - color: var(--dracula-cyan); - } - - li[id^='glances-'] .flex.items-center .opacity-25.w-14.text-right { - color: var(--dracula-purple); - opacity: 0.85; - } - - li[id^='glances-'] - .bottom-4.right-3.left-3.z-20 - .w-3.h-3.mr-1\.5.opacity-50 - > div { - background: var(--dracula-green) !important; - opacity: 1; - } - - li[id^='glances-'] .bottom-4.right-3.left-3.z-20 .opacity-75.grow { - color: var(--dracula-pink) !important; - opacity: 0.75; - } - - /******************************* - * HOMEPAGE PRESETS * - *******************************/ - .bg-amber-500 { - background-color: var(--dracula-orange); - } - - .bg-black { - background-color: rgb(0 0 0); - } - - .bg-blue-500 { - background-color: var(--dracula-cyan); - } - - .bg-cyan-500 { - background-color: var(--dracula-cyan); - } - - .bg-emerald-500 { - background-color: var(--dracula-green); - } - - .bg-fuchsia-500 { - background-color: var(--dracula-pink); - } - - .bg-gray-500 { - background-color: var(--dracula-foreground); - } - - .bg-green-500 { - background-color: var(--dracula-green); - } - - .bg-indigo-500 { - background-color: var(--dracula-purple); - } - - .bg-lime-500 { - background-color: var(--dracula-green); - } - - .bg-neutral-500 { - background-color: rgb(115 115 115); - } - - .bg-orange-400 { - background-color: var(--dracula-orange); - } - - .bg-orange-500 { - background-color: var(--dracula-orange); - } - - .bg-pink-500 { - background-color: var(--dracula-pink); - } - - .bg-purple-500 { - background-color: var(--dracula-purple); - } - - .bg-red-500 { - background-color: var(--dracula-red); - } - - .bg-rose-100 { - background-color: rgb(255, 205, 205); - } - - .bg-rose-500 { - background-color: var(--dracula-red); - } - - .bg-rose-900\/80 { - background-color: var(--dracula-red); - } - - .bg-sky-500 { - background-color: var(--dracula-cyan); - } - - .bg-slate-500 { - background-color: var(--dracula-slate); - } - - .bg-stone-500 { - background-color: rgb(120 113 108); - } - - .bg-teal-500 { - background-color: rgb(20 184 166); - } - - .bg-violet-500 { - background-color: var(--dracula-purple); - } - - .bg-white { - background-color: var(--dracula-text); - } - - .bg-white\/50 { - background-color: hsla(0, 0%, 100%, 0.5); - } - - .bg-yellow-500 { - background-color: var(--dracula-yellow); - } - - .bg-zinc-500 { - background-color: rgb(113 113 122); - } - - .text-amber-800 { - color: var(--dracula-orange); - } - - .text-black { - color: rgb(0 0 0); - } - - .text-black\/20 { - color: rgba(0, 0, 0, 0.2); - } - - .text-blue-500\/80 { - color: rgba(139, 233, 253, 0.8); - } - - .text-emerald-300 { - color: var(--dracula-green); - } - - .text-emerald-500\/80 { - color: rgba(80, 250, 123, 0.8); - } - - .text-gray-500 { - color: rgb(107 114 128); - } - - .text-green-500 { - color: var(--dracula-green); - } - - .text-orange-400\/50 { - color: rgba(255, 184, 108, 0.5); - } - - .text-red-400 { - color: var(--dracula-red); - } - - .text-red-500 { - color: var(--dracula-red); - } - - .text-red-500\/40 { - color: rgba(255, 85, 85, 0.4); - } - - .text-rose-300 { - color: var(--dracula-red); - } - - .text-rose-500 { - color: var(--dracula-red); - } - - .text-rose-500\/80 { - color: rgba(255, 85, 85, 0.8); - } - - .text-rose-900 { - color: var(--dracula-red); - } - - .text-white { - color: var(--dracula-text); - } + --scrollbar-bg: var(--dracula-background-dark); } -/* ********************************************************************************************* */ -/* CARD COLOURING - DONE VIA "ID:" TAGS IN SERVICES.YAML */ -.service-card::before { - content: ""; - opacity: 0.40; - position: absolute; top: 0px; left: 0px; right: 0px; bottom: 0px; z-index: 0; + +/* ========================================== + * FUTURISTIC SCIFI HUD OVERLAY + * ========================================== */ +body { + background-color: #0c0d12 !important; + position: relative; + overflow-x: hidden; } -/* DARK */ -#red .dark\:hover\:bg-white\/10:is(.dark *).service-card::before { background-color: #812020; } -#yellow .dark\:hover\:bg-white\/10:is(.dark *).service-card::before { background-color: #818120; } -#green .dark\:hover\:bg-white\/10:is(.dark *).service-card::before { background-color: #208120; } -#cyan .dark\:hover\:bg-white\/10:is(.dark *).service-card::before { background-color: #208181; } -#blue .dark\:hover\:bg-white\/10:is(.dark *).service-card::before { background-color: #202081; } -#purple .dark\:hover\:bg-white\/10:is(.dark *).service-card::before { background-color: #812081; } -#black .dark\:hover\:bg-white\/10:is(.dark *).service-card::before { background-color: #000000; } -#white .dark\:hover\:bg-white\/10:is(.dark *).service-card::before { background-color: #ffffff; } -/* LIGHT */ -#red .hover\:bg-theme-300\/20.service-card::before { background-color: #ff0000; } -#yellow .hover\:bg-theme-300\/20.service-card::before { background-color: #ffff00; } -#green .hover\:bg-theme-300\/20.service-card::before { background-color: #00ff00; } -#cyan .hover\:bg-theme-300\/20.service-card::before { background-color: #00ffff; } -#blue .hover\:bg-theme-300\/20.service-card::before { background-color: #0000ff; } -#purple .hover\:bg-theme-300\/20.service-card::before { background-color: #ff00ff; } -#black .hover\:bg-theme-300\/20.service-card::before { background-color: #ffffff; } -#white .hover\:bg-theme-300\/20.service-card::before { background-color: #000000; } -#orange .hover\:bg-theme-300\/20.service-card::before { background-color: #ffa500; } -#pink .hover\:bg-theme-300\/20.service-card::before { background-color: #ffc0cb; } -#teal .hover\:bg-theme-300\/20.service-card::before { background-color: #008080; } -#magenta .hover\:bg-theme-300\/20.service-card::before { background-color: #ff00ff; } -#lime .hover\:bg-theme-300\/20.service-card::before { background-color: #00ff00; } -#navy .hover\:bg-theme-300\/20.service-card::before { background-color: #000080; } -#maroon .hover\:bg-theme-300\/20.service-card::before { background-color: #800000; } -#olive .hover\:bg-theme-300\/20.service-card::before { background-color: #808000; } -#silver .hover\:bg-theme-300\/20.service-card::before { background-color: #c0c0c0; } -#gray .hover\:bg-theme-300\/20.service-card::before { background-color: #808080; } -#gold .hover\:bg-theme-300\/20.service-card::before { background-color: #ffd700; } -#coral .hover\:bg-theme-300\/20.service-card::before { background-color: #ff7f50; } -#salmon .hover\:bg-theme-300\/20.service-card::before { background-color: #fa8072; } -#indigo .hover\:bg-theme-300\/20.service-card::before { background-color: #4b0082; } -#violet .hover\:bg-theme-300\/20.service-card::before { background-color: #ee82ee; } -#turquoise .hover\:bg-theme-300\/20.service-card::before { background-color: #40e0d0; } -#plum .hover\:bg-theme-300\/20.service-card::before { background-color: #dda0dd; } -#orchid .hover\:bg-theme-300\/20.service-card::before { background-color: #da70d6; } -#tan .hover\:bg-theme-300\/20.service-card::before { background-color: #d2b48c; } -#beige .hover\:bg-theme-300\/20.service-card::before { background-color: #f5f5dc; } -#mint .hover\:bg-theme-300\/20.service-card::before { background-color: #98ff98; } -#lavender .hover\:bg-theme-300\/20.service-card::before { background-color: #e6e6fa; } -#chocolate .hover\:bg-theme-300\/20.service-card::before { background-color: #d2691e; } -#crimson .hover\:bg-theme-300\/20.service-card::before { background-color: #dc143c; } -#khaki .hover\:bg-theme-300\/20.service-card::before { background-color: #f0e68c; } -#aqua .hover\:bg-theme-300\/20.service-card::before { background-color: #00ffff; } -#azure .hover\:bg-theme-300\/20.service-card::before { background-color: #f0ffff; } -#bisque .hover\:bg-theme-300\/20.service-card::before { background-color: #ffe4c4; } -#bronze .hover\:bg-theme-300\/20.service-card::before { background-color: #cd7f32; } -#charcoal .hover\:bg-theme-300\/20.service-card::before { background-color: #36454f; } -#emerald .hover\:bg-theme-300\/20.service-card::before { background-color: #50c878; } -#ivory .hover\:bg-theme-300\/20.service-card::before { background-color: #fffff0; } -#jade .hover\:bg-theme-300\/20.service-card::before { background-color: #00a86b; } -#peach .hover\:bg-theme-300\/20.service-card::before { background-color: #ffe5b4; } -#rose .hover\:bg-theme-300\/20.service-card::before { background-color: #ff007f; } -#ruby .hover\:bg-theme-300\/20.service-card::before { background-color: #e0115f; } -#sapphire .hover\:bg-theme-300\/20.service-card::before { background-color: #0f52ba; } -#sepia .hover\:bg-theme-300\/20.service-card::before { background-color: #704214; } -#steel .hover\:bg-theme-300\/20.service-card::before { background-color: #4682b4; } -#amber .hover\:bg-theme-300\/20.service-card::before { background-color: #ffbf00; } -#cerulean .hover\:bg-theme-300\/20.service-card::before { background-color: #007ba7; } -#periwinkle .hover\:bg-theme-300\/20.service-card::before { background-color: #ccccff; } -#scarlet .hover\:bg-theme-300\/20.service-card::before { background-color: #ff2400; } -#slate .hover\:bg-theme-300\/20.service-card::before { background-color: #708090; } \ No newline at end of file + +body::before { + content: ""; + position: fixed; + top: 0; left: 0; right: 0; bottom: 0; + background: + linear-gradient(rgba(12, 13, 18, 0.75), rgba(12, 13, 18, 0.85)), + linear-gradient(90deg, rgba(139, 233, 253, 0.02) 1px, transparent 1px), + linear-gradient(rgba(139, 233, 253, 0.02) 1px, transparent 1px); + background-size: 100% 100%, 50px 50px, 50px 50px; + pointer-events: none; + z-index: -1; + animation: gridPan 120s linear infinite; +} + +/* Add a neon scanline effect */ +body::after { + content: ""; + position: fixed; + top: 0; left: 0; width: 100%; height: 100%; + background: linear-gradient(rgba(18, 16, 16, 0) 50%, rgba(0, 0, 0, 0.25) 50%), linear-gradient(90deg, rgba(255, 0, 0, 0.06), rgba(0, 255, 0, 0.02), rgba(0, 0, 255, 0.06)); + background-size: 100% 4px, 6px 100%; + pointer-events: none; + z-index: 9999; + opacity: 0.15; +} + +@keyframes gridPan { + from { background-position: 0 0, 0 0, 0 0; } + to { background-position: 0 0, 1000px 1000px, 1000px 1000px; } +} + +/* ========================================== + * TYPOGRAPHY & TITLE STYLES + * ========================================== */ +.service-group-name, .bookmark-group-name, #widgets-title { + font-family: 'Orbitron', sans-serif !important; + font-weight: 700 !important; + letter-spacing: 0.15em !important; + text-transform: uppercase !important; + text-shadow: 0 0 10px rgba(189, 147, 249, 0.6) !important; + color: var(--dracula-purple) !important; +} + +.service-name { + font-family: 'Rajdhani', sans-serif !important; + font-weight: 700 !important; + font-size: 1.15rem !important; + letter-spacing: 0.03em !important; + color: var(--dracula-text) !important; +} + +.service-description { + font-family: 'Poppins', sans-serif !important; + font-size: 0.8rem !important; + color: #a9b1d6 !important; +} + +/* ========================================== + * GLASSMORPHISM CARDS & ANIMATIONS + * ========================================== */ +.service-card, li.bookmark > a, #information-widgets, #dracula-calendar { + background: var(--card-color) !important; + backdrop-filter: blur(14px) !important; + -webkit-backdrop-filter: blur(14px) !important; + border: 1px solid rgba(255, 255, 255, 0.06) !important; + box-shadow: 0 8px 32px 0 rgba(0, 0, 0, 0.4) !important; + transition: all 0.4s cubic-bezier(0.165, 0.84, 0.44, 1) !important; + position: relative; + overflow: hidden; +} + +/* Hover base styling */ +.service-card:hover, li.bookmark > a:hover { + transform: translateY(-4px) scale(1.02); + background: var(--card-color-hover) !important; + border-color: rgba(139, 233, 253, 0.4) !important; + box-shadow: 0 12px 40px 0 rgba(0, 0, 0, 0.6), 0 0 15px rgba(139, 233, 253, 0.2) !important; +} + +/* Subtle corner tech border lines for hover */ +.service-card::after { + content: ""; + position: absolute; + top: 0; left: 0; width: 4px; height: 4px; + border-top: 2px solid transparent; + border-left: 2px solid transparent; + transition: all 0.3s; +} + +.service-card:hover::after { + border-top-color: var(--dracula-cyan); + border-left-color: var(--dracula-cyan); + width: 15px; height: 15px; +} + +/* Service Images */ +.service img { + border-radius: 20%; + border: 1px solid rgba(255, 255, 255, 0.1); + padding: 2px; + background: rgba(0, 0, 0, 0.2); + transition: all 0.4s; +} + +.service-card:hover img { + transform: rotate(5deg) scale(1.05); + border-color: rgba(139, 233, 253, 0.4); +} + +/* ========================================== + * PULSING STATUS / ONLINE DOTS + * ========================================== */ +.bg-green-500, .bg-emerald-500, .text-green-500, .text-emerald-500 { + position: relative; + background-color: var(--dracula-green) !important; + box-shadow: 0 0 10px var(--dracula-green) !important; +} + +/* Create glowing animation rings */ +.bg-green-500::after, .bg-emerald-500::after { + content: ""; + position: absolute; + top: -2px; left: -2px; right: -2px; bottom: -2px; + border-radius: 50%; + border: 1.5px solid var(--dracula-green); + animation: statusPulse 2s infinite ease-out; + opacity: 0; + pointer-events: none; +} + +@keyframes statusPulse { + 0% { transform: scale(1); opacity: 0.8; } + 100% { transform: scale(2.4); opacity: 0; } +} + +.bg-red-500, .text-red-500 { + position: relative; + background-color: var(--dracula-red) !important; + box-shadow: 0 0 10px var(--dracula-red) !important; +} + +.bg-red-500::after { + content: ""; + position: absolute; + top: -2px; left: -2px; right: -2px; bottom: -2px; + border-radius: 50%; + border: 1.5px solid var(--dracula-red); + animation: statusPulse 2s infinite ease-out; + opacity: 0; + pointer-events: none; +} + +/* ========================================== + * WIDGET & SCROLLBAR CUSTOMS + * ========================================== */ +#information-widgets { + border-color: var(--widget-border) !important; + margin-bottom: 2rem; +} + +#information-widgets * { + font-family: 'Rajdhani', sans-serif !important; + font-weight: 600; + color: var(--info-widgets) !important; +} + +.resource-usage { + background-color: var(--resource-bar-bg) !important; + border: 1px solid rgba(255, 255, 255, 0.05); + border-radius: 4px; + height: 8px !important; + overflow: hidden; +} + +.resource-usage > div { + background: linear-gradient(90deg, var(--dracula-cyan), var(--dracula-purple)) !important; + box-shadow: 0 0 8px rgba(139, 233, 253, 0.6); + height: 100%; +} + +.service-block { + background: var(--service-block-bg) !important; + border-radius: 6px; + border: 1px solid rgba(255, 255, 255, 0.05) !important; +} + +.service-block .uppercase { + color: var(--service-block-text) !important; + font-family: 'Orbitron', sans-serif; + font-size: 0.7rem; + letter-spacing: 0.08em; +} + +.service-block .font-thin { + color: var(--dracula-text) !important; + font-family: 'Fira Code', monospace; +} + +/* Bookmarks styling */ +.bookmark-icon { + background-color: var(--bookmark-icon-bg) !important; + border: 1px solid rgba(189, 147, 249, 0.2); +} + +.bookmark-icon > div > div { + background: var(--bookmark-icon) !important; +} + +.bookmark-name { + font-family: 'Poppins', sans-serif !important; + font-weight: 500; +} + +/* Calendar widget tweaks */ +#dracula-calendar .flex.justify-between.flex-wrap span { + color: var(--dracula-purple) !important; + font-family: 'Rajdhani', sans-serif; + font-weight: 700; +} + +#footer svg { + color: var(--footer-items) !important; + filter: drop-shadow(0 0 5px rgba(189, 147, 249, 0.5)); +} + +* { + --scrollbar-thumb: var(--scrollbar-fg); + --scrollbar-track: var(--scrollbar-bg); +} + +/* Custom styling for the search input widget */ +#search-input, .search-container input { + background: rgba(15, 23, 42, 0.6) !important; + border: 1px solid rgba(56, 189, 248, 0.3) !important; + color: #e2e8f0 !important; + font-family: 'Courier New', Courier, monospace !important; + border-radius: 8px !important; + backdrop-filter: blur(8px) !important; +} + +#search-input:focus, .search-container input:focus { + border-color: rgba(56, 189, 248, 0.8) !important; + box-shadow: 0 0 15px rgba(56, 189, 248, 0.4) !important; + outline: none !important; +} + +/* ========================================== + * CUSTOM COLOR INTEGRATION BY ID + * ========================================== */ +/* Setup distinct neon glow values on hover for individual service IDs */ + +#blue:hover .service-card { border-color: #6272a4 !important; box-shadow: 0 8px 32px 0 rgba(0, 0, 0, 0.4), 0 0 20px rgba(98, 114, 164, 0.45) !important; } +#yellow:hover .service-card { border-color: #f1fa8c !important; box-shadow: 0 8px 32px 0 rgba(0, 0, 0, 0.4), 0 0 20px rgba(241, 250, 140, 0.45) !important; } +#red:hover .service-card { border-color: #ff5555 !important; box-shadow: 0 8px 32px 0 rgba(0, 0, 0, 0.4), 0 0 20px rgba(255, 85, 85, 0.45) !important; } +#cyan:hover .service-card { border-color: #8be9fd !important; box-shadow: 0 8px 32px 0 rgba(0, 0, 0, 0.4), 0 0 20px rgba(139, 233, 253, 0.45) !important; } +#purple:hover .service-card { border-color: #bd93f9 !important; box-shadow: 0 8px 32px 0 rgba(0, 0, 0, 0.4), 0 0 20px rgba(189, 147, 249, 0.45) !important; } +#white:hover .service-card { border-color: #f8f8f2 !important; box-shadow: 0 8px 32px 0 rgba(0, 0, 0, 0.4), 0 0 20px rgba(248, 248, 242, 0.45) !important; } +#gold:hover .service-card { border-color: #ffd700 !important; box-shadow: 0 8px 32px 0 rgba(0, 0, 0, 0.4), 0 0 20px rgba(255, 215, 0, 0.45) !important; } +#green:hover .service-card { border-color: #50fa7b !important; box-shadow: 0 8px 32px 0 rgba(0, 0, 0, 0.4), 0 0 20px rgba(80, 250, 123, 0.45) !important; } +#lime:hover .service-card { border-color: #a3e635 !important; box-shadow: 0 8px 32px 0 rgba(0, 0, 0, 0.4), 0 0 20px rgba(163, 230, 53, 0.45) !important; } +#cobalt:hover .service-card { border-color: #3b82f6 !important; box-shadow: 0 8px 32px 0 rgba(0, 0, 0, 0.4), 0 0 20px rgba(59, 130, 246, 0.45) !important; } +#gray:hover .service-card { border-color: #9ca3af !important; box-shadow: 0 8px 32px 0 rgba(0, 0, 0, 0.4), 0 0 20px rgba(156, 163, 175, 0.45) !important; } +#crimson:hover .service-card { border-color: #dc143c !important; box-shadow: 0 8px 32px 0 rgba(0, 0, 0, 0.4), 0 0 20px rgba(220, 20, 60, 0.45) !important; } +#lavender:hover .service-card { border-color: #e6e6fa !important; box-shadow: 0 8px 32px 0 rgba(0, 0, 0, 0.4), 0 0 20px rgba(230, 230, 250, 0.45) !important; } +#teal:hover .service-card { border-color: #008080 !important; box-shadow: 0 8px 32px 0 rgba(0, 0, 0, 0.4), 0 0 20px rgba(0, 128, 128, 0.45) !important; } +#violet:hover .service-card { border-color: #7c3aed !important; box-shadow: 0 8px 32px 0 rgba(0, 0, 0, 0.4), 0 0 20px rgba(124, 58, 237, 0.45) !important; } +#aqua:hover .service-card { border-color: #00ffff !important; box-shadow: 0 8px 32px 0 rgba(0, 0, 0, 0.4), 0 0 20px rgba(0, 255, 255, 0.45) !important; } +#navy:hover .service-card { border-color: #000080 !important; box-shadow: 0 8px 32px 0 rgba(0, 0, 0, 0.4), 0 0 20px rgba(0, 0, 128, 0.45) !important; } +#beige:hover .service-card { border-color: #f5f5dc !important; box-shadow: 0 8px 32px 0 rgba(0, 0, 0, 0.4), 0 0 20px rgba(245, 245, 220, 0.45) !important; } +#slate:hover .service-card { border-color: #708090 !important; box-shadow: 0 8px 32px 0 rgba(0, 0, 0, 0.4), 0 0 20px rgba(112, 128, 144, 0.45) !important; } +#burgundy:hover .service-card { border-color: #800020 !important; box-shadow: 0 8px 32px 0 rgba(0, 0, 0, 0.4), 0 0 20px rgba(128, 0, 32, 0.45) !important; } +#emerald:hover .service-card { border-color: #50c878 !important; box-shadow: 0 8px 32px 0 rgba(0, 0, 0, 0.4), 0 0 20px rgba(80, 200, 120, 0.45) !important; } +#salmon:hover .service-card { border-color: #fa8072 !important; box-shadow: 0 8px 32px 0 rgba(0, 0, 0, 0.4), 0 0 20px rgba(250, 128, 114, 0.45) !important; } +#jade:hover .service-card { border-color: #00a86b !important; box-shadow: 0 8px 32px 0 rgba(0, 0, 0, 0.4), 0 0 20px rgba(0, 168, 107, 0.45) !important; } +#indigo:hover .service-card { border-color: #4b0082 !important; box-shadow: 0 8px 32px 0 rgba(0, 0, 0, 0.4), 0 0 20px rgba(75, 0, 130, 0.45) !important; } +#charcoal:hover .service-card { border-color: #36454f !important; box-shadow: 0 8px 32px 0 rgba(0, 0, 0, 0.4), 0 0 20px rgba(54, 69, 79, 0.45) !important; } +#cerulean:hover .service-card { border-color: #007ba7 !important; box-shadow: 0 8px 32px 0 rgba(0, 0, 0, 0.4), 0 0 20px rgba(0, 123, 167, 0.45) !important; } +#rose:hover .service-card { border-color: #ff007f !important; box-shadow: 0 8px 32px 0 rgba(0, 0, 0, 0.4), 0 0 20px rgba(255, 0, 127, 0.45) !important; } +#coral:hover .service-card { border-color: #ff7f50 !important; box-shadow: 0 8px 32px 0 rgba(0, 0, 0, 0.4), 0 0 20px rgba(255, 127, 80, 0.45) !important; } + +/* Keep active indicators styled cleanly inside the cards */ +#blue:hover .service-card::after { border-top-color: #6272a4; border-left-color: #6272a4; } +#yellow:hover .service-card::after { border-top-color: #f1fa8c; border-left-color: #f1fa8c; } +#red:hover .service-card::after { border-top-color: #ff5555; border-left-color: #ff5555; } +#cyan:hover .service-card::after { border-top-color: #8be9fd; border-left-color: #8be9fd; } +#purple:hover .service-card::after { border-top-color: #bd93f9; border-left-color: #bd93f9; } +#white:hover .service-card::after { border-top-color: #f8f8f2; border-left-color: #f8f8f2; } +#gold:hover .service-card::after { border-top-color: #ffd700; border-left-color: #ffd700; } +#green:hover .service-card::after { border-top-color: #50fa7b; border-left-color: #50fa7b; } +#lime:hover .service-card::after { border-top-color: #a3e635; border-left-color: #a3e635; } +#cobalt:hover .service-card::after { border-top-color: #3b82f6; border-left-color: #3b82f6; } +#gray:hover .service-card::after { border-top-color: #9ca3af; border-left-color: #9ca3af; } +#crimson:hover .service-card::after { border-top-color: #dc143c; border-left-color: #dc143c; } +#lavender:hover .service-card::after { border-top-color: #e6e6fa; border-left-color: #e6e6fa; } +#teal:hover .service-card::after { border-top-color: #008080; border-left-color: #008080; } +#violet:hover .service-card::after { border-top-color: #7c3aed; border-left-color: #7c3aed; } +#aqua:hover .service-card::after { border-top-color: #00ffff; border-left-color: #00ffff; } +#navy:hover .service-card::after { border-top-color: #000080; border-left-color: #000080; } +#beige:hover .service-card::after { border-top-color: #f5f5dc; border-left-color: #f5f5dc; } +#slate:hover .service-card::after { border-top-color: #708090; border-left-color: #708090; } +#burgundy:hover .service-card::after { border-top-color: #800020; border-left-color: #800020; } +#emerald:hover .service-card::after { border-top-color: #50c878; border-left-color: #50c878; } +#salmon:hover .service-card::after { border-top-color: #fa8072; border-left-color: #fa8072; } +#jade:hover .service-card::after { border-top-color: #00a86b; border-left-color: #00a86b; } +#indigo:hover .service-card::after { border-top-color: #4b0082; border-left-color: #4b0082; } +#charcoal:hover .service-card::after { border-top-color: #36454f; border-left-color: #36454f; } +#cerulean:hover .service-card::after { border-top-color: #007ba7; border-left-color: #007ba7; } +#rose:hover .service-card::after { border-top-color: #ff007f; border-left-color: #ff007f; } +#coral:hover .service-card::after { border-top-color: #ff7f50; border-left-color: #ff7f50; } \ No newline at end of file diff --git a/Docker-Compose/Homepage/config/custom.js b/Docker-Compose/Homepage/config/custom.js index e69de29..06d7405 100644 Binary files a/Docker-Compose/Homepage/config/custom.js and b/Docker-Compose/Homepage/config/custom.js differ diff --git a/Docker-Compose/Homepage/config/custom.css.old b/Docker-Compose/Homepage/config/logs/test.txt similarity index 100% rename from Docker-Compose/Homepage/config/custom.css.old rename to Docker-Compose/Homepage/config/logs/test.txt diff --git a/Docker-Compose/Homepage/config/services.yaml b/Docker-Compose/Homepage/config/services.yaml index ae439c6..8601243 100644 --- a/Docker-Compose/Homepage/config/services.yaml +++ b/Docker-Compose/Homepage/config/services.yaml @@ -1,7 +1,7 @@ --- ######################################### HOME TAB SERVICES ###################################################################### - Infrastructure: - - Proxmox 1: + - Proxmox 1: # Main Virt Server id: blue tab: Home href: https://192.168.2.1:8006 @@ -37,30 +37,36 @@ description: Authentik SSO widget: type: authentik - url: https://192.168.2.3:9543 + url: https://192.168.2.6:9543 key: NW5ldUK8qDRY91ny67dE6ckWCMXThF9nwj6EZw7pKbS5FzXx5wouAo4sC19n version: 2 - Dockhand: id: cyan tab: Home - href: http://192.168.2.3:3200 + href: http://192.168.2.6:3200 icon: dockhand.png description: Dockhand widget: type: dockhand - url: http://192.168.2.3:3200 + url: http://192.168.2.6:3200 username: mmcfetridge password: "!Sucyetat123" + fields: ["running", "total", "pending_updates", "paused"] -- Applications: - - OwnCloud: - id: purple + - Mailcow: + id: cyan tab: Home - icon: owncloud.png - href: https://owncloud.mcfetridge.us - description: File Sync & Share + href: https://216.144.227.142/admin + icon: mailcow.png + description: mailcow + widget: + type: mailcow + url: https://mail.mmcfetridge.net + key: 2C3DAF-9DA97F-22FF12-851295-2A7E37 +############################################## APPS TAB Services ########################################################### +- Applications: - Immich: id: white tab: Home @@ -69,49 +75,61 @@ description: Photos Server widget: type: immich - url: http://192.168.2.3:2283 + url: http://192.168.2.6:2283 key: "MLbcal27A67J6FZV1PIb3AdMsRf8xZC1uruOLB7js" fields: ["users", "photos", "storage"] version: 2 - - Trilium: - id: gold - tab: Home - href: http://192.168.2.3:8180 - icon: trilium.png - description: Trilium Server - widget: - type: trilium - url: http://192.168.2.3:8180 - key: "Z0qLO33tMHgy_c0nq/pZAJMR/8Em5xrwOEJ6EfiyNEWkMurMSnRdVdtM=" - - - Forgejo: - id: green - tab: Home - href: https://forgejo.mikemcfetridge.com - icon: forgejo.png - description: Forgejo Git & CICD - - MySpeed: id: lime tab: Home icon: myspeed.png - href: http://192.168.2.3:5216 + href: http://192.168.2.13:5216 widget: type: myspeed - url: http://192.168.2.3:5216 + url: http://192.168.2.13:5216 password: "!Sucyetat123" # only required if password is set - mealie: id: cobalt tab: Home icon: mealie.png - href: http://192.168.2.7:9000/ + href: http://192.168.2.13:9200/ widget: type: mealie - url: http://192.168.2.7:9000 - key: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJsb25nX3Rva2VuIjp0cnVlLCJpZCI6IjVlYzIwNTk2LTEyY2QtNDFkMS05MTc5LWUzOWFkYjk3OWE2MyIsIm5hbWUiOiJob21lcGFnZSIsImludGVncmF0aW9uX2lkIjoiZ2VuZXJpYyIsImV4cCI6MTkzNjU0MzE3N30.C1PWK51JOpmzHwR9zmlvVShWC7sasKv0aO6PS47LQqo + url: http://192.168.2.13:9200 + key: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJsb25nX3Rva2VuIjp0cnVlLCJpZCI6IjMxNWM4ZmNjLWI1Y2ItNDMyMy1hNDNmLTIyNjAwYjU2ZTJlOSIsIm5hbWUiOiJob21lcGFnZSIsImludGVncmF0aW9uX2lkIjoiZ2VuZXJpYyIsImV4cCI6MTk0MjI2NjU4NH0.iPE6newlQ3PVqdbgDCDdsAqZrwZ6glROWI1kvq5zb_I version: 2 # only required if version > 1, defaults to 1 + + - Nextcloud: + id: gold + tab: Home + href: https://next.mcfetridge.us + icon: nextcloud.png + description: Nextcloud Server + widget: + type: nextcloud + url: https://next.mcfetridge.us + username: mmcfetridge + password: "!Sucyetat123" + + - MyGitea: + id: navy + tab: Home + icon: gitea.png + href: https://gitea.mikemcfetridge.com/ + widget: + type: gitea + url: https://gitea.mikemcfetridge.com/ + key: 6cac00dd2f58fcc1bcdeae858f896b1995a19fd9 + + - BookStack: + id: slate + tab: Home + icon: bookstack.png + href: https://book.mikemcfetridge.com/ + + ############################################## MEDIA TAB Services ########################################################### - Media downloader: - Calendar: @@ -131,39 +149,51 @@ service_group: Media downloader service_name: Radarr + - Gluetun: + id: jade + tab: System + href: http://192.168.2.8:8000 + icon: gluetun.png + description: Media VPN Server + widget: + type: gluetun + url: http://192.168.2.8:8000 + fields: ["public_ip", "region", "country"] + version: 2 # optional, default is 1 + - Sonarr: id: crimson tab: Media - href: http://192.168.2.16:8989 + href: http://192.168.2.8:8989 icon: sonarr.png description: TV Show Service widget: type: sonarr - url: http://192.168.2.16:8989 - key: 8746f486831545e3b6c9014657ac9c11 + url: http://192.168.2.8:8989 + key: b4227fd07fd046f094d620b88d92e494 fields: ["wanted", "queued", "series"] - Radarr: id: lavender tab: Media - href: http://192.168.2.16:7878 + href: http://192.168.2.8:7878 icon: radarr.png description: Movie Service widget: type: radarr - url: http://192.168.2.16:7878 - key: ee95503f6fca4cf7b9c8c3f3fc45df39 + url: http://192.168.2.8:7878 + key: 9b0e1202f7b94907ba92a1ea23304fa4 fields: ["wanted", "missing", "queued", "movies"] - Qbittorrent: id: teal tab: Media - href: http://192.168.2.16:8118 + href: http://192.168.2.8:8080 icon: qbittorrent.png description: Download Client widget: type: qbittorrent - url: http://192.168.2.16:8118 + url: http://192.168.2.8:8080 username: admin password: "!Sucyetat123" @@ -171,36 +201,36 @@ - Jellyfin: id: violet tab: Media - href: http://192.168.2.16:8096 + href: http://192.168.2.8:8096 icon: jellyfin.png description: Movies & TV Shows widget: type: jellyfin - url: http://192.168.2.16:8096 - key: 617cc65c15da4b3eaac10568c25a8c36 + url: http://192.168.2.8:8096 + key: ffe8e2b31fd24464ac779121e920ac25 enableBlocks: true enableNowPlaying: true - Jellyseerr: id: aqua tab: Media - href: http://192.168.2.16:5055 + href: http://192.168.2.8:5055 icon: jellyseerr.png description: Movie/show Database widget: type: jellyseerr - url: http://192.168.2.16:5055 - key: MTc1NDI2NTczOTQyMDA2ODRjOWY0LWJmZmEtNGE1OC05MzM2LTAwMDM4OWRmYmQ3Yg== + url: http://192.168.2.8:5055 + key: MTc4MzM0NDc0OTI1OWY1YzJkYWJkLTA0OWEtNDY0NS05ZTMwLTI3NjFkZjYxNjdhZQ== fields: ["pending", "approved", "available"] - Navidrome: id: navy tab: Media icon: navidrome.png - href: http://192.168.2.16:4533 + href: http://192.168.2.8:4533 widget: type: navidrome - url: http://192.168.2.16:4533 + url: http://192.168.2.8:4533 user: mmcfetridge token: 05dee16046666bb05d98291b9c6e39d3 salt: 50c05a @@ -208,51 +238,26 @@ - AudioBookShelf: id: beige tab: Media - href: http://192.168.2.16:13378 + href: http://192.168.2.8:13378 icon: audiobookshelf.png description: Index Server widget: type: audiobookshelf - url: http://192.168.2.16:13378 - key: "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiI4MDQ5Y2U4Mi0xZjlmLTRiYTEtOWY3Zi03N2U4YmRiYjg0OGEiLCJ1c2VybmFtZSI6Im1tY2ZldHJpZGdlIiwiaWF0IjoxNzQ4MTk4NzUyfQ.Tey3wxo61euuJEwc2ziE_PukdOUz7pNZKG8SmOdWB-c" + url: http://192.168.2.8:13378 + key: "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJrZXlJZCI6IjU1MzViZDFiLTI3NGUtNGNjOC1iMWZkLTNiZWFiNjg0NDQ1YiIsIm5hbWUiOiJob21lcGFnZSIsInR5cGUiOiJhcGkiLCJpYXQiOjE3ODM0NjE1NjJ9.BYvicD24tA3lEx_ktwmf6Igme6dpLj1SUrc0Y9ISBMs" fields: ["podcasts", "books"] ##################################### Network & System TAB Services ############################################################## - Network: - - Pi-hole: - id: slate - tab: Network - href: http://192.168.2.8/admin/login - icon: pi-hole.png - widget: - type: pihole - url: http://192.168.2.8 - version: 6 - key: "!Sucyetat123" - fields: ["queries", "blocked", "blocked_percent", "gravity"] - - - Technitium: - id: burgundy - tab: Network - href: http://192.168.2.9:5380 - icon: technitium.png - description: Technitium DNS Server - widget: - type: technitium - url: http://192.168.2.9:5380 - key: 03348d06cd472fbd091d8232b1c13321ff70a8628dad7b0c23dd4512a18fb34b - range: LastDay - fields: ["totalQueries", "totalAuthoritative", "totalCached", "totalServerFailure"] - - - Proxy Manager: + - Nginx Proxy Manager: id: emerald tab: Network - href: http://192.168.2.3:81 + href: http://192.168.2.12:81 icon: nginx-proxy-manager.png description: Nginx Proxy Manager widget: type: npm - url: http://192.168.2.3:81 + url: http://192.168.2.12:81 username: mmcfetridg@aol.com password: "!Sucyetat123" fields: ["enabled", "disabled", "total"] @@ -261,25 +266,17 @@ id: salmon tab: Network icon: pangolin.png - href: https://pangolin.mmcfetridge.net + href: https://app.pangolin.net description: External network widget: type: pangolin - url: https://api.mmcfetridge.net/v1 - key: "2o4g9gak61mig2i.5s5yxu4o2ek7haepzumar2ldl4mmzqpbrcfnpqdf" - org: homelab + url: https://api.pangolin.net + key: "w3f8ong2hz7a3da.dappsg2veyo36my5ibsmrmnzd2c2626lyrok7inn" + org: org_lsxd0ocafwikxgs + fields: ["sites", "resources", "targets"] +######################################## System TAB Services ###################################################################### - Systems: - - Gluetun: - id: jade - tab: System - href: http://192.168.2.16:8000 - icon: gluetun.png - description: Media VPN Server - widget: - type: gluetun - url: http://192.168.2.16:8000 - fields: ["public_ip", "region", "country"] - Public IP: icon: mdi-web @@ -294,6 +291,37 @@ label: WAN IP format: text + - Technitium: + id: burgundy + tab: Network + href: http://192.168.2.3:5380 + icon: technitium.png + description: Technitium DNS Server + widget: + type: technitium + url: http://192.168.2.3:5380 + key: 03348d06cd472fbd091d8232b1c13321ff70a8628dad7b0c23dd4512a18fb34b + range: LastDay + fields: ["totalQueries", "totalAuthoritative", "totalCached", "totalServerFailure"] + + - PatchMon: + id: cyan + tab: Network + href: https://patch.mikemcfetridge.com + description: PatchMon Statistics + icon: https://patch.mikemcfetridge.com/assets/logo_square_default.svg + widget: + type: customapi + url: https://patch.mikemcfetridge.com/api/v1/gethomepage/stats + headers: + Authorization: Basic cGF0Y2htb25fYWVfNTIxMmM5ZDg4M2E1NzA0NGIzZmJhZDdhMzQyYjVlODg6MTI0YzlhYzQ3ZTBlM2EzYWZiMTdjOTE5MWExYzU5M2YxOGJhNDdkYWQ0NjBjZmU2MDJmZDQ5MzE2ZDM0MTQ1Ng== + mappings: + - field: total_hosts + label: Total Hosts + - field: hosts_needing_updates + label: Needs Updates + - field: security_updates + label: Security Updates ############################################## Bookmark TAB Services ############################################################# - Bookmarks: @@ -313,7 +341,7 @@ description: Web Bookmarker widget: type: linkwarden - url: http://192.168.2.12:3000 + url: http://192.168.2.10:3000 key: "eyJhbGciOiJkaXIiLCJlbmMiOiJBMjU2R0NNIn0..ZLJgig_ol-n3i1tv.vhWCnMSHVd81bdidL85-imXKpxGC0U3mHlvmkQyIJqJvcFRRJVBAasw9C0cmfSXVPq08HT-B-3zUAmftnPRymPHMJCkfo8pv_XBbEPneIFH-n59_dg26.qcXSK2REP3M_Vdgp0aOqcA" fields: ["links", "collections"] @@ -321,14 +349,14 @@ id: cerulean tab: Bookmarks icon: semaphore.png - href: http://192.168.2.11:3000 + href: http://192.168.2.13:3020 description: CI/CD Automation - Wg-Easy: id: rose tab: Bookmarks icon: wireguard.png - href: http://192.168.2.3:10086 + href: http://192.168.2.13:10086 description: Wireguard VPN - YouTube: @@ -338,4 +366,4 @@ href: https://youtube.com/ description: Video Platform - +# diff --git a/Docker-Compose/Homepage/config/widgets.yaml b/Docker-Compose/Homepage/config/widgets.yaml index 8a17e8d..deefcfc 100644 --- a/Docker-Compose/Homepage/config/widgets.yaml +++ b/Docker-Compose/Homepage/config/widgets.yaml @@ -34,9 +34,9 @@ hour12: true timeZone: 'America/New_York' +# /config/widgets.yaml - search: - provider: custom - url: http://localhost:8080/search?q= - focus: true - target: _blank - showSearchSuggestions: true \ No newline at end of file + provider: google # google, duckduckgo, bing, baidu, brave or custom + focus: true # Optional, will set focus to the search bar on page load + showSearchSuggestions: true # Optional, will show search suggestions. Defaults to false + target: _blank # One of _self, _blank, _parent or _top \ No newline at end of file diff --git a/Docker-Compose/Homepage/docker-compose.yml b/Docker-Compose/Homepage/docker-compose.yml index 592295a..d902f4c 100644 --- a/Docker-Compose/Homepage/docker-compose.yml +++ b/Docker-Compose/Homepage/docker-compose.yml @@ -1,44 +1,30 @@ services: + homepage: image: ghcr.io/gethomepage/homepage:latest container_name: homepage environment: - HOMEPAGE_ALLOWED_HOSTS: "*" # required, may need port. See gethomepage.dev/installation/#homepage_allowed_hosts - PUID: ${PUID} # Reference PUID from .env - PGID: ${PGID} # Reference PGID from .env + HOMEPAGE_ALLOWED_HOSTS: "*" # required, may need port. + PUID: 1000 + PGID: 1000 DOCKER_HOST: tcp://socket-proxy:2375 ports: - - 3000:3000 - env_file: - - .env # Link to the .env file + - 3100:3000 volumes: - - ./config:/app/config # Make sure your local config directory exists - - ./images:/app/public/images + - /opt/Docker-Deployments/Homepage/config:/app/config # Make sure your local config directory exists + - /opt/Docker-Deployments/Homepage/images:/app/public/images - /var/run/docker.sock:/var/run/docker.sock:ro # optional, for docker integrations + networks: + - external restart: unless-stopped + healthcheck: test: ["CMD", "curl", "-f", "http://localhost:3000"] interval: 10s retries: 3 timeout: 10s start_period: 30s - - dockerproxy: - image: ghcr.io/tecnativa/docker-socket-proxy:latest - container_name: dockerproxy - environment: - - CONTAINERS=1 # Allow access to viewing containers - - SERVICES=1 # Allow access to viewing services (necessary when using Docker Swarm) - - TASKS=1 # Allow access to viewing tasks (necessary when using Docker Swarm) - - POST=0 # Disallow any POST operations (effectively read-only) - ports: - - 127.0.0.1:2375:2375 - volumes: - - /var/run/docker.sock:/var/run/docker.sock:ro # Mounted as read-only - restart: unless-stopped - healthcheck: - test: ["CMD", "curl", "-f", "http://localhost:2375"] - interval: 10s - retries: 3 - timeout: 10s - start_period: 30s + +networks: + external: + external: true # Tells Compose not to create this network \ No newline at end of file diff --git a/Docker-Compose/Immich/.env b/Docker-Compose/Immich/.env index 1ddef71..a0ffe9d 100644 --- a/Docker-Compose/Immich/.env +++ b/Docker-Compose/Immich/.env @@ -1,29 +1,18 @@ -# You can find documentation for all the supported env variables at https://immich.app/docs/install/environment-variables +# ============================================================ +# SYSTEM SETTINGS +# ============================================================ +TZ=America/New_York +IMMICH_VERSION=v3 -# The location where your uploaded files are stored -UPLOAD_LOCATION=/home/ubuntu/docker/immich/upload - -# The location where your database files are stored +# ============================================================ +# PATH LOCATIONS +# ============================================================ +UPLOAD_LOCATION=/home/miker/docker/immich/library DB_DATA_LOCATION=/home/miker/docker/immich/postgres -# To set a timezone, uncomment the next line and change Etc/UTC to a TZ identifier from this list: https://en.wikipedia.org/wiki/Lis> -TZ=America/New_York - -# The Immich version to use. You can pin this to a specific version like "v1.71.0" -IMMICH_VERSION=release - - -# Connection secrets for postgres and typesense. You should change these to random passwords -TYPESENSE_API_KEY=hOEZ7Tei3iIp -DB_PASSWORD=ee438M3pcXo6 - -# The values below this line do not need to be changed -################################################################################### -DB_HOSTNAME=immich_postgres -DB_USERNAME=postgres +# ============================================================ +# DATABASE CREDENTIALS +# ============================================================ +DB_USERNAME=postgresadmin +DB_PASSWORD=mM3PXXUjK0QMz7 DB_DATABASE_NAME=immich - -REDIS_HOSTNAME=immich_redis - -IMMICH_SERVER_URL=https://immich.mikemcfetridge.com -IMMICH_WEB_URL=https://immich.mikemcfetridge.com diff --git a/Docker-Compose/Immich/docker-compose.yaml b/Docker-Compose/Immich/docker-compose.yaml index 731fb96..aeae41a 100644 --- a/Docker-Compose/Immich/docker-compose.yaml +++ b/Docker-Compose/Immich/docker-compose.yaml @@ -1,60 +1,86 @@ +# Immich — Self-Hosted Photo & Video Management +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:-v3} + # extends: + # file: hwaccel.transcoding.yml + # service: cpu + environment: + - DB_USERNAME=${DB_USERNAME} + - DB_PASSWORD=${DB_PASSWORD} + - DB_DATABASE_NAME=${DB_DATABASE_NAME} + - TZ=${TZ} volumes: - - /home/miker/dockerapps/immich/upload:/usr/src/app/upload + - ${UPLOAD_LOCATION}:/data - /etc/localtime:/etc/localtime:ro - - /home/miker/docker/immich/upload/import:/import - env_file: - - .env ports: - - 2283:3001 + - "2283:2283" depends_on: - - redis - - database - restart: always - - immich-microservices: - container_name: immich_microservices - image: ghcr.io/immich-app/immich-server:${IMMICH_VERSION} - extends: - file: hwaccel.yml - service: hwaccel - command: [ "start.sh", "microservices" ] - volumes: - - /home/miker/dockerapps/immich/upload:/usr/src/app/upload - env_file: - - .env - depends_on: - - redis - - database - restart: always + database: + condition: service_healthy + redis: + condition: service_healthy + restart: unless-stopped + networks: + - immich + - main 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:-v3} + # extends: + # file: hwaccel.ml.yml + # service: cpu + environment: + - TZ=${TZ} volumes: - - /home/miker/dockerapps/immich/model-cache:/cache - env_file: - - .env - restart: always + - model-cache:/cache + restart: unless-stopped + networks: + - immich redis: container_name: immich_redis - image: redis:6.2-alpine@sha256:70a7a5b641117670beae0d80658430853896b5ef269ccf00d1827427e3263fa3 - restart: always + image: docker.io/valkey/valkey:9@sha256:3b55fbaa0cd93cf0d9d961f405e4dfcc70efe325e2d84da207a0a8e6d8fde4f9 + restart: unless-stopped + healthcheck: + test: ["CMD-SHELL", "valkey-cli ping || exit 1"] + interval: 10s + timeout: 5s + retries: 5 + networks: + - immich database: container_name: immich_postgres - image: ghcr.io/immich-app/postgres:14-vectorchord0.3.0-pgvectors0.2.0@sha256:fa4f6e0971f454cd95fec5a9aaed2ed93d8f46725cc6bc61e0698e97dba96da1 - env_file: - - .env + 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_INITDB_ARGS: '--data-checksums' + - POSTGRES_USER=${DB_USERNAME} + - POSTGRES_PASSWORD=${DB_PASSWORD} + - POSTGRES_DB=${DB_DATABASE_NAME} + - POSTGRES_INITDB_ARGS=--data-checksums + - TZ=${TZ} volumes: - - /home/miker/dockerapps/immich/pgdata:/var/lib/postgresql/data - restart: always + - ${DB_DATA_LOCATION}:/var/lib/postgresql/data + shm_size: 512mb + restart: unless-stopped + healthcheck: + test: ["CMD-SHELL", "pg_isready -U ${DB_USERNAME} -d ${DB_DATABASE_NAME}"] + interval: 10s + timeout: 5s + retries: 5 + start_period: 15s + networks: + - immich + +volumes: + model-cache: + +networks: + main: + external: true + immich: + driver: bridge diff --git a/Docker-Compose/Mealie/.env b/Docker-Compose/Mealie/.env index 3483d16..1b3b18a 100644 --- a/Docker-Compose/Mealie/.env +++ b/Docker-Compose/Mealie/.env @@ -1,11 +1,22 @@ +# General Settings +TZ=America/New_York PUID=1000 PGID=1000 -# TZ for container timezone -TZ=America/New_York -SMTP_HOST=smtp.zoho.com -SMTP_FROM_NAME=miker@mcfetridge.us -SMTP_AUTH_STRATEGY=TLS -SMTP_FROM_EMAIL=miker@mcfetridge.us -SMTP_USER=miker@mcfetridge.us -SMTP_PASSWORD="!Sucyetat123" -SMTP_PORT=465 \ No newline at end of file +DATA_DIR=/opt/Docker-Deployments/Mealie +MEALIE_PORT=9200 +MEMORY_LIMIT=1000M + +# Mealie Application Settings +ALLOW_SIGNUP=false +MAX_WORKERS=1 +WEB_CONCURRENCY=1 +BASE_URL=https://mealie.mikemcfetridge.com + +# SMTP Email Configuration +SMTP_HOST=mail.mmcfetridge.net +SMTP_PORT=465 +SMTP_FROM_NAME=miker@mmcfetridge.net +SMTP_FROM_EMAIL=miker@mmcfetridge.net +SMTP_USER=miker@mmcfetridge.net +SMTP_PASSWORD=!Sucyetat123 +SMTP_AUTH_STRATEGY=SSL \ No newline at end of file diff --git a/Docker-Compose/Mealie/docker-compose.yml b/Docker-Compose/Mealie/docker-compose.yml index cf01a91..f8c6d09 100644 --- a/Docker-Compose/Mealie/docker-compose.yml +++ b/Docker-Compose/Mealie/docker-compose.yml @@ -1,37 +1,42 @@ services: mealie: - image: ghcr.io/mealie-recipes/mealie:latest # Specifies the Mealie Docker i> - container_name: mealie # Names the container for easier> - restart: always - networks: - - proxy # Ensures the container restart> -# ports: -# - "9925:9000" # Maps port 9925 on the host to > + image: ghcr.io/mealie-recipes/mealie:latest + container_name: mealie + restart: unless-stopped + ports: + - "${MEALIE_PORT}:9000" deploy: resources: limits: - memory: 1000M # Limits the container to use a > + memory: ${MEMORY_LIMIT} volumes: - - /home/miker/docker/mealie/data:/app/data/ # Persists data in> - - ./config/addons_config/mealie/config.yaml:/config/config.yanl + - ${DATA_DIR}/data:/app/data/ + - ${DATA_DIR}/config/addons_config/mealie/config.yaml:/config/config.yaml environment: - - ALLOW_SIGNUP=false # Allows new user signups on the> - - PUID=${PUID} # Sets the user ID for the conta> - - PGID=${PGID} # Sets the group ID for the cont> - - TZ=${TZ} # Sets the timezone for the cont> - - MAX_WORKERS=1 # Limits the number of workers t> - - WEB_CONCURRENCY=1 # Sets the concurrency level for> - - BASE_URL=mealie.mikemcfetridge.com # The base URL where Mealie is a> + - ALLOW_SIGNUP=${ALLOW_SIGNUP} + - PUID=${PUID} + - PGID=${PGID} + - TZ=${TZ} + - MAX_WORKERS=${MAX_WORKERS} + - WEB_CONCURRENCY=${WEB_CONCURRENCY} + - BASE_URL=${BASE_URL} # Email Settings - SMTP_HOST=${SMTP_HOST} - SMTP_PORT=${SMTP_PORT} - SMTP_FROM_NAME=${SMTP_FROM_NAME} - SMTP_AUTH_STRATEGY=${SMTP_AUTH_STRATEGY} - - SMTP_FROM_EMAIL=${SMTP_FROM_EMAI} + - SMTP_FROM_EMAIL=${SMTP_FROM_EMAIL} - SMTP_USER=${SMTP_USER} - SMTP_PASSWORD=${SMTP_PASSWORD} - env_file: - - .env + networks: + - external + healthcheck: + test: ["CMD", "curl", "-f", "http://localhost:9000"] + interval: 10s + retries: 3 + timeout: 10s + start_period: 30s + networks: - proxy: + external: external: true diff --git a/Docker-Compose/MySpeed/docker-compose.yml b/Docker-Compose/MySpeed/docker-compose.yml index 4a5a367..f5d8221 100644 --- a/Docker-Compose/MySpeed/docker-compose.yml +++ b/Docker-Compose/MySpeed/docker-compose.yml @@ -1,9 +1,14 @@ services: myspeed: container_name: MySpeed - image: germannewsmaker/myspeed + image: germannewsmaker/myspeed:latest ports: - '5216:5216' volumes: - - ./myspeed:/myspeed/data + - /opt/Docker-Deployments/MySpeed/data:/myspeed/data restart: unless-stopped + networks: + - external +networks: + external: + external: true # Tells Compose not to create this network diff --git a/Docker-Compose/Nginx Proxy Manager/.env b/Docker-Compose/Nginx Proxy Manager/.env index 01cb1b1..ab8253f 100644 --- a/Docker-Compose/Nginx Proxy Manager/.env +++ b/Docker-Compose/Nginx Proxy Manager/.env @@ -1,7 +1,13 @@ +# ============================================================ +# SYSTEM SETTINGS +# ============================================================ +TZ=America/New_York +DATA_PATH=/opt/Docker-Deployments/NginxProxyManager/data + +# ============================================================ +# DATABASE CREDENTIALS +# ============================================================ MYSQL_ROOT_PASSWORD=rhDGjilZm6XEMJ MYSQL_DATABASE=npm MYSQL_USER=npm MYSQL_PASSWORD=rhDGjilZm6XEMJ - -# TZ for container timezone -TZ=America/New_York diff --git a/Docker-Compose/Nginx Proxy Manager/docker-compose.yml b/Docker-Compose/Nginx Proxy Manager/docker-compose.yml index b3c066b..0038f06 100644 --- a/Docker-Compose/Nginx Proxy Manager/docker-compose.yml +++ b/Docker-Compose/Nginx Proxy Manager/docker-compose.yml @@ -1,33 +1,31 @@ ---- +# Nginx Proxy Manager & MariaDB Stack services: db: - image: 'jc21/mariadb-aria:latest' + image: jc21/mariadb-aria:latest container_name: npm-db restart: unless-stopped - env_file: .env environment: - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD} - MYSQL_DATABASE=${MYSQL_DATABASE} - MYSQL_USER=${MYSQL_USER} - MYSQL_PASSWORD=${MYSQL_PASSWORD} - MARIADB_AUTO_UPGRADE=1 + - TZ=${TZ} volumes: - - ./data/mysql:/var/lib/mysql + - ${DATA_PATH}/mysql:/var/lib/mysql networks: - - proxy - - proxydb + - internal healthcheck: - test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u${MYSQL_USER}", "-p${MYSQL_PASSWORD}"] + test: ["CMD-SHELL", "mariadb-admin ping -h 127.0.0.1 -u root -p$$MYSQL_ROOT_PASSWORD || exit 1"] interval: 20s timeout: 5s retries: 5 start_period: 30s - app: - image: 'jc21/nginx-proxy-manager:latest' + nginx-proxy-manager: + image: jc21/nginx-proxy-manager:latest container_name: nginx-proxy-manager restart: unless-stopped - env_file: .env environment: - TZ=${TZ} - DB_MYSQL_HOST=db @@ -40,22 +38,24 @@ services: - '81:81' - '443:443' volumes: - - ./data/npm:/data - - ./data/letsencrypt:/etc/letsencrypt + - ${DATA_PATH}/npm:/data + - ${DATA_PATH}/letsencrypt:/etc/letsencrypt depends_on: - - db + db: + condition: service_healthy + restart: true networks: - - proxy - - proxydb + - internal + - external healthcheck: - test: ["CMD", "curl", "-f", "http://localhost:81/api/status"] + test: ["CMD", "curl", "-f", "http://localhost:81/"] interval: 20s timeout: 5s retries: 5 start_period: 40s networks: - proxy: + internal: + external: true + external: external: true - proxydb: - external: true \ No newline at end of file diff --git a/Docker-Compose/Obsidian/.env b/Docker-Compose/Obsidian/.env new file mode 100644 index 0000000..f9eedc8 --- /dev/null +++ b/Docker-Compose/Obsidian/.env @@ -0,0 +1,15 @@ +# ============================================================ +# SYSTEM SETTINGS +# ============================================================ +TZ=America/New_York +PUID=1000 +PGID=1000 +DATA_PATH=/home/miker/docker/obsidian + +# ============================================================ +# OBSIDIAN LIVESYNC / COUCHDB CONFIGURATION +# ============================================================ +COUCHDB_USER=miker +COUCHDB_PASSWORD=tw9222dvO91ZHb +COUCHDB_DATABASE=obsidian +SERVER_DOMAIN=https://obsidian.mikemcfetridge.com \ No newline at end of file diff --git a/Docker-Compose/Obsidian/docker-compose.yml b/Docker-Compose/Obsidian/docker-compose.yml index 3964a0c..d44c754 100644 --- a/Docker-Compose/Obsidian/docker-compose.yml +++ b/Docker-Compose/Obsidian/docker-compose.yml @@ -1,26 +1,32 @@ --- services: - obsidian: - image: lscr.io/linuxserver/obsidian:latest - container_name: obsidian - security_opt: - - seccomp:unconfined #optional + couchdb-obsidian-livesync: + image: docker.io/oleduc/docker-obsidian-livesync-couchdb:master + container_name: obsidian-livesync + restart: unless-stopped environment: - - PUID=1000 - - PGID=1000 - - TZ=America/New_York + - COUCHDB_USER=${COUCHDB_USER} + - COUCHDB_PASSWORD=${COUCHDB_PASSWORD} + - COUCHDB_DATABASE=${COUCHDB_DATABASE} + - SERVER_DOMAIN=${SERVER_DOMAIN} + - PUID=${PUID} + - PGID=${PGID} + - UMASK=002 + - TZ=${TZ} volumes: - - ./config:/config + - ${DATA_PATH}/data:/opt/couchdb/data + - ${DATA_PATH}/config:/opt/couchdb/etc/local.d ports: - - 3000:3000 - - 3001:3001 - devices: - - /dev/dri:/dev/dri #optional - shm_size: "1gb" - restart: always - # used to place in the NPM / traefik network so they can talk with each other. + - "5984:5984" + healthcheck: + test: ["CMD", "curl", "-f", "http://localhost:5984/_up"] + interval: 30s + timeout: 10s + retries: 5 + start_period: 20s networks: - - proxy + - main + networks: - proxy: + main: external: true \ No newline at end of file diff --git a/Docker-Compose/Patchmon/.env b/Docker-Compose/Patchmon/.env new file mode 100644 index 0000000..9acd765 --- /dev/null +++ b/Docker-Compose/Patchmon/.env @@ -0,0 +1,169 @@ +# Documentation: https://patchmon.net/docs/patchmon-operator-guide#patchmon-environment-variables-reference + +# ============================================================================== +# Run the script ./setup-env.sh for easy first time filling of variables +# Or Manually perform the tasks below +# ============================================================================== +# [ ] Enter in your frontend URLs you will use to access PatchMon in CORS_ORIGIN +# [ ] Run "openssl rand -hex 64" and put that value in the JWT_SECRET= +# [ ] Run "openssl rand -hex 64" and put that value in the AI_ENCRYPTION_KEY= +# [ ] Run "openssl rand -hex 64" and put that value in the SESSION_SECRET== +# [ ] Run "openssl rand -hex 32" and put that password in where it says POSTGRES_PASSWORD= for the postgresql database +# [ ] Run "openssl rand -hex 32" and put that password in where it says REDIS_PASSWORD= for the redis db + +# ============================================================================== +# SERVER +# ============================================================================== +# CORS_ORIGIN must match your frontend URL. Comma-separated for multiple origins. +# Example: +#CORS_ORIGIN=https://patchmon.domain.tld,http://patchmon.local:3000 + +CORS_ORIGIN=https://patch.mikemcfetridge.com,http://192.168.2.14:3000,http://localhost:3000 +JWT_SECRET=b552dcd09a958144ee3e436acd09767574fba73d2f4237496c97e6d2d59d2b6d4575d0148a3869276130d505492e73c023d40c090c42780fb611d0be9c29f4dc + +# ============================================================================== +# DATABASE (Postgresql) +# ============================================================================== +# It's optional to change the patchmon_user and patchmon_db +# POSTGRES_HOST is "database" because that's the name of the docker container. +# If you are using an external DB or localhost then you may change this accordingly + +POSTGRES_HOST=database +POSTGRES_PASSWORD=0200334338be290e45a13737783fc4e3c873bf63fd4817bf6f254e23f4db38c6 +POSTGRES_USER=patchmon_user +POSTGRES_DB=patchmon_db +DATABASE_URL=postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@${POSTGRES_HOST}:5432/${POSTGRES_DB} + +# ============================================================================== +# REDIS +# ============================================================================== +## REDIS_HOST is "redis" because that's the name of the docker container. +# If you are using an external redis server then you may change this accordingly + +REDIS_HOST=redis +REDIS_PORT=6379 +REDIS_PASSWORD=0200334338be290e45a13737783fc4e3c873bf63fd4817bf6f254e23f4db38c6 +REDIS_DB=0 + +# ============================================================================== +# SESSION ENCRYPTION SECRETS +# ============================================================================== +# Used in various encryptions (keep these safe) + +SESSION_SECRET=b552dcd09a958144ee3e436acd09767574fba73d2f4237496c97e6d2d59d2b6d4575d0148a3869276130d505492e73c023d40c090c42780fb611d0be9c29f4dc +AI_ENCRYPTION_KEY=b552dcd09a958144ee3e436acd09767574fba73d2f4237496c97e6d2d59d2b6d4575d0148a3869276130d505492e73c023d40c090c42780fb611d0be9c29f4dc + +# ============================================================================== +# GUACAMOLE (Windows RDP - Beta) +# ============================================================================== +# RDP: connect to guacd sidecar (server image has no guacd binary) + +GUACD_ADDRESS=guacd:4822 + + +# ============================================================================== +# OPTIONAL - CAN BE CONFIGURED VIA APP SETTINGS UI +# ============================================================================== +### Setting them here overrides the configured settings from the app or defaults coded in + +## Server +## TRUST_PROXY is to be set to true if you are using another proxy in front of the app like nginx / caddy etc +# ENABLE_HSTS=false +TRUST_PROXY=true + +## Timezone (TZ or TIMEZONE) Set in full as an example : TZ=Europe/London +# TZ=UTC + +## Logging +## LOG_LEVEL can be info/warn/debug/error +# ENABLE_LOGGING=true +# LOG_LEVEL=info + +## Authentication / Lockout +# MAX_LOGIN_ATTEMPTS=5 +# LOCKOUT_DURATION_MINUTES=15 +# SESSION_INACTIVITY_TIMEOUT_MINUTES=30 +# TFA_MAX_REMEMBER_SESSIONS=5 + +## Auth / JWT / TFA +# When true, auth cookies are browser session cookies (cleared when the browser session ends; not persisted across browser restarts). +# AUTH_BROWSER_SESSION_COOKIES=true +# JWT_EXPIRES_IN=1h +# MAX_TFA_ATTEMPTS=5 +# TFA_LOCKOUT_DURATION_MINUTES=30 +# TFA_REMEMBER_ME_EXPIRES_IN=30d + +## Password policy +# PASSWORD_MIN_LENGTH=8 +# PASSWORD_REQUIRE_UPPERCASE=true +# PASSWORD_REQUIRE_LOWERCASE=true +# PASSWORD_REQUIRE_NUMBER=true +# PASSWORD_REQUIRE_SPECIAL=true + +## Body limits (e.g. 5mb, 10mb, 2mb) +# JSON_BODY_LIMIT=5mb +# AGENT_UPDATE_BODY_LIMIT=2mb + +## Env file path (default: .env) +# ENV_FILE=.env + +## Database connection / pool (startup only) +# PM_DB_CONN_MAX_ATTEMPTS=30 +# PM_DB_CONN_WAIT_INTERVAL=2 +# DB_CONNECTION_LIMIT=30 +# DB_CONNECT_TIMEOUT=10 +# DB_TRANSACTION_LONG_TIMEOUT=60000 + +## Server - Port 3000 is the frontend port, which is proxying backend queries to the backend. This is handled by the server itself. If you change this port, you change the port that is used to access PatchMon and therefore will also need to ammend the "ports" values in your docker-compose.yml +# PORT=3000 +# APP_ENV=production + +## Rate limits (env-only) +# RATE_LIMIT_WINDOW_MS=900000 +# RATE_LIMIT_MAX=5000 +# AUTH_RATE_LIMIT_WINDOW_MS=600000 +# AUTH_RATE_LIMIT_MAX=500 +# AGENT_RATE_LIMIT_WINDOW_MS=60000 +# AGENT_RATE_LIMIT_MAX=1000 +# PASSWORD_RATE_LIMIT_WINDOW_MS=900000 +# PASSWORD_RATE_LIMIT_MAX=5 + +## User default - Can be changed in settings +# DEFAULT_USER_ROLE=user + +## Redis +# REDIS_TLS=false +# REDIS_TLS_VERIFY=false +# REDIS_TLS_CA=/path/to/ca.pem +# REDIS_CONNECT_TIMEOUT_MS=60000 +# REDIS_COMMAND_TIMEOUT_MS=60000 + +## OIDC / SSO (when OIDC_ENABLED=true, issuer/client/secret/redirect required) +# OIDC_ENABLED=false +# OIDC_ISSUER_URL= +# OIDC_CLIENT_ID= +# OIDC_CLIENT_SECRET= +# OIDC_REDIRECT_URI= +# OIDC_SCOPES=openid email profile groups +# OIDC_AUTO_CREATE_USERS=false +# OIDC_DEFAULT_ROLE=user +# OIDC_DISABLE_LOCAL_AUTH=false +# OIDC_BUTTON_TEXT=Login with SSO +# OIDC_SESSION_TTL=600 +# OIDC_POST_LOGOUT_URI= +# OIDC_SYNC_ROLES=false +# OIDC_ADMIN_GROUP= +# OIDC_SUPERADMIN_GROUP= +# OIDC_HOST_MANAGER_GROUP= +# OIDC_READONLY_GROUP= +# OIDC_USER_GROUP= +# OIDC_ENFORCE_HTTPS=true +# FRONTEND_URL= # Fallback for OIDC_POST_LOGOUT_URI + +## Agent binaries +# AGENTS_DIR=agents +# AGENT_BINARIES_DIR # + +## RDP (in-browser RDP for Windows hosts via guacd) +# GUACD_PATH= # Path to guacd binary, or empty to use PATH +# GUACD_ADDRESS=127.0.0.1:4822 diff --git a/Docker-Compose/Patchmon/docker-compose.yml b/Docker-Compose/Patchmon/docker-compose.yml new file mode 100644 index 0000000..2d2203c --- /dev/null +++ b/Docker-Compose/Patchmon/docker-compose.yml @@ -0,0 +1,118 @@ +# ============================================================================= +# PatchMon Docker Compose - Production +# ============================================================================= +# To set up your environment, run the setup script: +# +# bash -c "$(curl -fsSL https://raw.githubusercontent.com/PatchMon/PatchMon/refs/heads/main/docker/setup-env.sh)" +# +# This will download env.example, generate secrets, and create your .env file. +# Alternatively, copy env.example to .env and fill in the values manually. +# +# Then start PatchMon: +# +# docker compose up -d +# +# See the PatchMon documentation for full configuration details. +# ============================================================================= + +name: patchmon + +services: + + server: + image: ghcr.io/patchmon/patchmon-server:latest + restart: unless-stopped + env_file: .env + ports: + - "3000:3000" + networks: + - internal + - external + depends_on: + database: + condition: service_healthy + redis: + condition: service_healthy + guacd: + condition: service_healthy + logging: + driver: "json-file" + options: + max-size: "10m" + max-file: "3" + + database: + image: postgres:17-alpine + restart: unless-stopped + env_file: .env + volumes: + - postgres_data:/var/lib/postgresql/data + networks: + - internal + healthcheck: + test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"] + interval: 3s + timeout: 5s + retries: 7 + logging: + driver: "json-file" + options: + max-size: "10m" + max-file: "3" + + redis: + image: redis:7-alpine + restart: unless-stopped + env_file: .env + command: redis-server --requirepass ${REDIS_PASSWORD} + volumes: + - redis_data:/data + networks: + - internal + healthcheck: + test: ["CMD", "redis-cli", "--no-auth-warning", "-a", "${REDIS_PASSWORD}", "ping"] + interval: 3s + timeout: 5s + retries: 7 + logging: + driver: "json-file" + options: + max-size: "10m" + max-file: "3" + + guacd: + image: guacamole/guacd:latest + restart: unless-stopped + read_only: true + tmpfs: + - /tmp:size=64m + security_opt: + - no-new-privileges:true + cap_drop: + - ALL + mem_limit: 512m + cpus: '1.0' + networks: + - internal + - external + healthcheck: + test: ["CMD-SHELL", "nc -z localhost 4822 || exit 1"] + interval: 10s + timeout: 5s + retries: 3 + start_period: 10s + logging: + driver: "json-file" + options: + max-size: "10m" + max-file: "3" + +volumes: + postgres_data: + redis_data: + +networks: + internal: + external: true # Tells Compose not to create this network + external: + external: true # Tells Compose not to create this network diff --git a/Docker-Compose/Semaphore/.env b/Docker-Compose/Semaphore/.env new file mode 100644 index 0000000..d1ea34d --- /dev/null +++ b/Docker-Compose/Semaphore/.env @@ -0,0 +1,26 @@ +# General System Settings +PUID=1000 +PGID=1000 +SEMAPHORE_PORT=3020 +ANSIBLE_HOST_KEY_CHECKING=False +DOCKER_HOST=tcp://docker_proxy:2375 + +# Semaphore Admin User +SEMAPHORE_ADMIN=mmcfetridge +SEMAPHORE_ADMIN_NAME=Mike McFetridge +SEMAPHORE_ADMIN_EMAIL=mmcfetridg@aol.com +SEMAPHORE_ADMIN_PASSWORD=Dy7zxAyDqdYN443g4pI3 + +# Security & Storage +SEMAPHORE_DB_DIALECT=sqlite +SEMAPHORE_ACCESS_KEY_ENCRYPTION=mrmKv7EztqRCnlGo34IvlvoilXqvDKYnFIWX2lg+hZc= + +# Email Settings +SEMAPHORE_EMAIL_ALERT=true +SEMAPHORE_EMAIL_HOST=mail.mmcfetridge.net +SEMAPHORE_EMAIL_PORT=465 +SEMAPHORE_EMAIL_SENDER=miker@mmcfetridge.net +SEMAPHORE_EMAIL_USERNAME=miker@mmcfetridge.net +SEMAPHORE_EMAIL_PASSWORD=!Sucyetat123 +SEMAPHORE_EMAIL_SECURE=true +SEMAPHORE_EMAIL_TLS=false diff --git a/Docker-Compose/Semaphore/compose.yml b/Docker-Compose/Semaphore/compose.yml deleted file mode 100644 index 00e34ca..0000000 --- a/Docker-Compose/Semaphore/compose.yml +++ /dev/null @@ -1,31 +0,0 @@ - -services: - semaphore: - ports: - - 3300:3300 - image: semaphoreui/semaphore:latest - container_name: semaphore - environment: - SEMAPHORE_DB_DIALECT: sqlite - SEMAPHORE_ADMIN: mmcfetridge - SEMAPHORE_ADMIN_PASSWORD: Dy7zxAyDqdYN443g4pI3 - SEMAPHORE_ADMIN_NAME: Mike McFetridge - SEMAPHORE_ADMIN_EMAIL: mmcfetridg@aol.com - SEMAPHORE_PORT: "3300" - ANSIBLE_HOST_KEY_CHECKING: "False" - SEMAPHORE_ACCESS_KEY_ENCRYPTION: "mrmKv7EztqRCnlGo34IvlvoilXqvDKYnFIWX2lg+hZc=" - volumes: - - semaphore_data:/var/lib/semaphore - - semaphore_config:/etc/semaphore - - semaphore_tmp:/tmp/semaphore - networks: - - semaphore-net - -volumes: - semaphore_data: - semaphore_config: - semaphore_tmp: - -networks: - semaphore-net: - driver: bridge \ No newline at end of file diff --git a/Docker-Compose/Semaphore/docker-compose.yml b/Docker-Compose/Semaphore/docker-compose.yml new file mode 100644 index 0000000..414cd51 --- /dev/null +++ b/Docker-Compose/Semaphore/docker-compose.yml @@ -0,0 +1,50 @@ +volumes: + semaphore_data: + semaphore_config: + semaphore_tmp: + +services: + semaphore: + image: semaphoreui/semaphore:latest + container_name: semaphore + restart: unless-stopped + ports: + - "${SEMAPHORE_PORT}:${SEMAPHORE_PORT}" + environment: + - PUID=${PUID} + - PGID=${PGID} + - SEMAPHORE_DB_DIALECT=${SEMAPHORE_DB_DIALECT} + - SEMAPHORE_ADMIN_PASSWORD=${SEMAPHORE_ADMIN_PASSWORD} + - SEMAPHORE_ADMIN_NAME=${SEMAPHORE_ADMIN_NAME} + - SEMAPHORE_ADMIN_EMAIL=${SEMAPHORE_ADMIN_EMAIL} + - SEMAPHORE_ADMIN=${SEMAPHORE_ADMIN} + # Docker Proxy endpoint + - DOCKER_HOST=${DOCKER_HOST} + - SEMAPHORE_PORT=${SEMAPHORE_PORT} + - ANSIBLE_HOST_KEY_CHECKING=${ANSIBLE_HOST_KEY_CHECKING} + - SEMAPHORE_ACCESS_KEY_ENCRYPTION=${SEMAPHORE_ACCESS_KEY_ENCRYPTION} + # Email Configuration + - SEMAPHORE_EMAIL_ALERT=${SEMAPHORE_EMAIL_ALERT} + - SEMAPHORE_EMAIL_HOST=${SEMAPHORE_EMAIL_HOST} + - SEMAPHORE_EMAIL_PORT=${SEMAPHORE_EMAIL_PORT} + - SEMAPHORE_EMAIL_SENDER=${SEMAPHORE_EMAIL_SENDER} + - SEMAPHORE_EMAIL_USERNAME=${SEMAPHORE_EMAIL_USERNAME} + - SEMAPHORE_EMAIL_PASSWORD=${SEMAPHORE_EMAIL_PASSWORD} + - SEMAPHORE_EMAIL_SECURE=${SEMAPHORE_EMAIL_SECURE} + - SEMAPHORE_EMAIL_TLS=${SEMAPHORE_EMAIL_TLS} + volumes: + - semaphore_data:/var/lib/semaphore + - semaphore_config:/etc/semaphore + - semaphore_tmp:/tmp/semaphore + networks: + - external + healthcheck: + test: ["CMD", "curl", "-f", "http://localhost:3020"] + interval: 10s + retries: 3 + timeout: 10s + start_period: 30s + +networks: + external: + external: true diff --git a/Docker-Compose/Semaphore/semaphore-notes b/Docker-Compose/Semaphore/semaphore-notes deleted file mode 100644 index f718815..0000000 --- a/Docker-Compose/Semaphore/semaphore-notes +++ /dev/null @@ -1,22 +0,0 @@ -URL for the task template - -ansible/update/update-apt-packages.yaml - - - - - -Need to create two files: - -In order to ensure Semaphore can run commands properly, we’ll need a line similar to the one below added to /etc/sudoers.d/semaphore on the target (the instance that our Semaphore server will be configuring). Be sure to replace semaphore in both the file name and inside the file to match the username of the user you intend to use with Semaphore. - -semaphore file -semaphore ALL=(ALL) NOPASSWD: ALL - -miker file -miker ALL=(ALL) NOPASSWD: ALL - -Need to be logged into Ubuntu03, go to the .ssh directory and run the following command to copy over the rsa.pub file. -scp id_rsa.pub miker@192.168.0.181:/home/miker/.ssh -or -ssh-copy-id miker@192.168.0.185 diff --git a/Docker-Compose/Sencho/docker-compose.yml b/Docker-Compose/Sencho/docker-compose.yml new file mode 100644 index 0000000..435d2cb --- /dev/null +++ b/Docker-Compose/Sencho/docker-compose.yml @@ -0,0 +1,15 @@ +services: + sencho: + image: saelix/sencho:latest + container_name: sencho + restart: unless-stopped + ports: + - "1852:1852" + volumes: + - /var/run/docker.sock:/var/run/docker.sock + - /home/miker/docker/Sencho/data:/app/data + # Change this line so the container path matches the host path: + - /opt/Docker-Deployments:/opt/Docker-Deployments + environment: + - COMPOSE_DIR=/home/miker/docker + - DATA_DIR=/app/data diff --git a/Docker-Compose/WatchTower/.env b/Docker-Compose/WatchTower/.env index 8e7bfea..86bbee8 100644 --- a/Docker-Compose/WatchTower/.env +++ b/Docker-Compose/WatchTower/.env @@ -1,17 +1,17 @@ TZ=America/New_York +PUID=1000 +PGID=1000 WATCHTOWER_CLEANUP=true WATCHTOWER_INCLUDE_RESTARTING=true WATCHTOWER_ROLLING_RESTARTING=true -WATCHTOWER_SCHEDULE=0 0 4 * * * +WATCHTOWER_SCHEDULE="0 0 4 * * *" WATCHTOWER_INCLUDE_STOPPED=true WATCHTOWER_NOTIFICATIONS=email -WATCHTOWER_NOTIFICATIONS_HOSTNAME=Docker-Deply # Add Server Name or IP Address +WATCHTOWER_NOTIFICATIONS_HOSTNAME=Docker-03 WATCHTOWER_NOTIFICATION_EMAIL_FROM=miker@mmcfetridge.net WATCHTOWER_NOTIFICATION_EMAIL_TO=miker@mmcfetridge.net WATCHTOWER_NOTIFICATION_EMAIL_SERVER=mail.mmcfetridge.net WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PORT=465 WATCHTOWER_NOTIFICATION_EMAIL_SERVER_USER=miker@mmcfetridge.net WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PASSWORD=!Sucyetat123 -WATCHTOWER_NOTIFICATION_EMAIL_DELAY=2 -PUID=1000 -PGID=1000 \ No newline at end of file +WATCHTOWER_NOTIFICATION_EMAIL_DELAY=2 \ No newline at end of file diff --git a/Docker-Compose/WatchTower/watchtower-docker-compose.yml b/Docker-Compose/WatchTower/watchtower-docker-compose.yml index 13e3b54..f340a9d 100644 --- a/Docker-Compose/WatchTower/watchtower-docker-compose.yml +++ b/Docker-Compose/WatchTower/watchtower-docker-compose.yml @@ -1,31 +1,39 @@ services: watchtower: - image: containrrr/watchtower + image: nickfedor/watchtower:latest container_name: watchtower restart: unless-stopped - env_file: .env + env_file: + - .env environment: - DOCKER_API_VERSION=1.44 - TZ=${TZ} - - PUID:=${PUID} # Reference PUID from .env - - PGID=${PGID} # Reference PGID from .env + - PUID=${PUID} + - PGID=${PGID} - WATCHTOWER_CLEANUP=${WATCHTOWER_CLEANUP} - WATCHTOWER_INCLUDE_RESTARTING=${WATCHTOWER_INCLUDE_RESTARTING} - WATCHTOWER_ROLLING_RESTARTING=${WATCHTOWER_ROLLING_RESTARTING} - WATCHTOWER_SCHEDULE=${WATCHTOWER_SCHEDULE} - WATCHTOWER_INCLUDE_STOPPED=${WATCHTOWER_INCLUDE_STOPPED} -# - WATCHTOWER_NOTIFICATIONS=${WATCHTOWER_NOTIFICATIONS} -# - WATCHTOWER_NOTIFICATIONS_HOSTNAME=${WATCHTOWER_NOTIFICATIONS_HOSTNAME} -# - WATCHTOWER_NOTIFICATION_EMAIL_FROM=${WATCHTOWER_NOTIFICATION_EMAIL_FROM} -# - WATCHTOWER_NOTIFICATION_EMAIL_TO=${WATCHTOWER_NOTIFICATION_EMAIL_TO} -# - WATCHTOWER_NOTIFICATION_EMAIL_SERVER=${WATCHTOWER_NOTIFICATION_EMAIL_SERVER} -# - WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PORT=${WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PORT} -# - WATCHTOWER_NOTIFICATION_EMAIL_SERVER_USER=${WATCHTOWER_NOTIFICATION_EMAIL_SERVER_USER} -# - WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PASSWORD=${WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PASSWORD} + - WATCHTOWER_NOTIFICATIONS=${WATCHTOWER_NOTIFICATIONS} + - WATCHTOWER_NOTIFICATIONS_HOSTNAME=${WATCHTOWER_NOTIFICATIONS_HOSTNAME} + - WATCHTOWER_NOTIFICATION_EMAIL_FROM=${WATCHTOWER_NOTIFICATION_EMAIL_FROM} + - WATCHTOWER_NOTIFICATION_EMAIL_TO=${WATCHTOWER_NOTIFICATION_EMAIL_TO} + - WATCHTOWER_NOTIFICATION_EMAIL_SERVER=${WATCHTOWER_NOTIFICATION_EMAIL_SERVER} + - WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PORT=${WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PORT} + - WATCHTOWER_NOTIFICATION_EMAIL_SERVER_USER=${WATCHTOWER_NOTIFICATION_EMAIL_SERVER_USER} + - WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PASSWORD=${WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PASSWORD} + - WATCHTOWER_NOTIFICATION_EMAIL_DELAY=${WATCHTOWER_NOTIFICATION_EMAIL_DELAY} security_opt: - no-new-privileges:true volumes: - /etc/timezone:/etc/timezone:ro - /etc/localtime:/etc/localtime:ro - /var/run/docker.sock:/var/run/docker.sock + networks: + - external + +networks: + external: + external: true diff --git a/Docker-Compose/duplicati/.env b/Docker-Compose/duplicati/.env new file mode 100644 index 0000000..4a29a0a --- /dev/null +++ b/Docker-Compose/duplicati/.env @@ -0,0 +1,19 @@ +# ============================================================ +# SYSTEM SETTINGS +# ============================================================ +TZ=America/New_York +PUID=1000 +PGID=1000 +PORT=8250 + +# ============================================================ +# PATH LOCATIONS +# ============================================================ +DATA_PATH=/home/miker/docker/duplicati +DOCKER_ROOT=/home/miker/docker +IMMICH_LIBRARY=/home/miker/docker/immich/library + +# ============================================================ +# SECURITY KEYS +# ============================================================ +SETTINGS_ENCRYPTION_KEY=84Jo17Ecw5muzGgqVjpeZQYnWBH7XFM7R01CdR646jSIfNbxgp diff --git a/Docker-Compose/duplicati/docker-compose.yaml b/Docker-Compose/duplicati/docker-compose.yaml deleted file mode 100644 index cf64edb..0000000 --- a/Docker-Compose/duplicati/docker-compose.yaml +++ /dev/null @@ -1,18 +0,0 @@ ---- -services: - duplicati: - image: lscr.io/linuxserver/duplicati:latest - container_name: duplicati - environment: - - PUID=1000 # Your host user ID - - PGID=1000 # Your host group ID - - TZ=America/New_York - - SETTINGS_ENCRYPTION_KEY=84Jo17Ecw5muzGgqVjpeZQYnWBH7XFM7R01CdR646jSIfNbxgp # <-- Add this line - volumes: - - /home/miker/docker/duplicati/config:/config - - /home/miker/docker/immich/library:/source/photos:ro # Mounts your photo directory as read-only - - /home/miker/docker:/source/apps:ro # Mounts your application data files - - /home/miker/docker/duplicati/backups:/backups # Optional local backup location - ports: - - 8250:8200 - restart: unless-stopped diff --git a/Docker-Compose/duplicati/docker-compose.yml b/Docker-Compose/duplicati/docker-compose.yml new file mode 100644 index 0000000..c406a56 --- /dev/null +++ b/Docker-Compose/duplicati/docker-compose.yml @@ -0,0 +1,30 @@ +# Duplicati — Encrypted Offsite/Local Backup Client +services: + duplicati: + image: lscr.io/linuxserver/duplicati:latest + container_name: duplicati + restart: unless-stopped + environment: + - PUID=${PUID} + - PGID=${PGID} + - TZ=${TZ} + - SETTINGS_ENCRYPTION_KEY=${SETTINGS_ENCRYPTION_KEY} + volumes: + - ${DATA_PATH}/config:/config + - ${DATA_PATH}/backups:/backups + - ${IMMICH_LIBRARY}:/source/photos:ro + - ${DOCKER_ROOT}:/source/apps:ro + ports: + - "${PORT}:8200" + healthcheck: + test: ["CMD-SHELL", "curl -f http://localhost:8200/ || exit 1"] + interval: 30s + timeout: 10s + retries: 3 + start_period: 20s + networks: + - main + +networks: + main: + external: true diff --git a/Docker-Compose/searxng/config/settings.yml b/Docker-Compose/searxng/config/settings.yml new file mode 100644 index 0000000..0e74014 --- /dev/null +++ b/Docker-Compose/searxng/config/settings.yml @@ -0,0 +1,54 @@ +##### My SearXNG personal settings. +use_default_settings: true + +general: + debug: false + instance_name: "McFetridge Private Search" # Changes the name on the homepage and browser tabs + +brand: + docs_url: "" # Use empty strings instead of false + issue_url: "" # Hides the links without crashing the parser + custom: + links: + "Dockhand": "http://192.168.0.8:3200" + "My Dashboard": "http://192.168.0.9:3100" + +server: + port: 8080 + bind_address: "0.0.0.0" + secret_key: "ee072bb45348da92be54b5224bee58b982a4279d3531f056b727c4dd3397bc3e" + image_proxy: true # Proxies images through your server to protect your IP + +search: + default_lang: "en-US" # Force results to a specific region + safe_search: 1 # 0 = None, 1 = Moderate, 2 = Strict + autocomplete: "duckduckgo" # Upstream source for search suggestions + formats: + - html + - json # Adds API capabilities for external script ingestion + +ui: + theme: simple + results_on_new_tab: true # Keeps your engine open when browsing links + default_locale: "en" + default_interface: "general" # The default tab ("general", "images", "videos", "news", "it") + +# This is the standard way to cleanly enable/disable specific engines in SearXNG +engines: + - name: google + disabled: false + + - name: duckduckgo + disabled: false + + - name: wikipedia + disabled: false + + - name: wikidata + disabled: true + + - name: bing + disabled: false + + - name: brave + disabled: false \ No newline at end of file diff --git a/Docker-Compose/searxng/searxng.yml b/Docker-Compose/searxng/docker-compose.yml similarity index 84% rename from Docker-Compose/searxng/searxng.yml rename to Docker-Compose/searxng/docker-compose.yml index c9386e5..3ccc89b 100644 --- a/Docker-Compose/searxng/searxng.yml +++ b/Docker-Compose/searxng/docker-compose.yml @@ -7,7 +7,7 @@ services: - "8080:8080" volumes: - /opt/Docker-Deployments/searxng:/etc/searxng:rw - - /opt/Docker-Deployments/searxng/data:/var/cache/searxng:rw + - /opt/Docker-Deployments/searxng_cache:/var/cache/searxng:rw environment: - SEARXNG_BASE_URL=https://search.mikemcfetridge.com - UWSGI_WORKERS=${SEARXNG_UWSGI_WORKERS:-4} @@ -17,4 +17,5 @@ services: interval: 10s retries: 3 timeout: 10s - start_period: 30s \ No newline at end of file + start_period: 30s + # \ No newline at end of file diff --git a/Docker-Compose/searxng/settings.yml b/Docker-Compose/searxng/settings.yml index 4599b70..b41682d 100644 --- a/Docker-Compose/searxng/settings.yml +++ b/Docker-Compose/searxng/settings.yml @@ -1,4 +1,4 @@ -##### My SearXNG personal settings. # +##### My SearXNG personal settings. use_default_settings: true general: @@ -10,8 +10,8 @@ brand: issue_url: "" # Hides the links without crashing the parser custom: links: - "Dockhand": "http://192.168.2.3:3200" - "My Dashboard": "http://192.168.2.15:3100" + "Dockhand": "http://192.168.0.8:3200" + "My Dashboard": "http://192.168.0.9:3100" server: port: 8080 @@ -35,20 +35,5 @@ ui: # This is the standard way to cleanly enable/disable specific engines in SearXNG engines: - - name: google - disabled: true - - - name: duckduckgo - disabled: false - - - name: wikipedia - disabled: false - - name: wikidata - disabled: false - - - name: bing - disabled: false - - - name: brave - disabled: false \ No newline at end of file + disabled: true diff --git a/Docker-Compose/wsdashboard/docker-compose.yml b/Docker-Compose/wsdashboard/docker-compose.yml new file mode 100644 index 0000000..f3180e5 --- /dev/null +++ b/Docker-Compose/wsdashboard/docker-compose.yml @@ -0,0 +1,22 @@ +services: + wgdashboard: + image: ghcr.io/wgdashboard/wgdashboard:latest + container_name: wgdashboard + restart: unless-stopped + ports: + - "10086:10086/tcp" + - "51820:51820/udp" + volumes: + - /opt/Docker-Deployments/wireguard/conf:/etc/wireguard + - /opt/Docker-Deployments/wireguard/data:/data + cap_add: + - NET_ADMIN + networks: + - external + environment: + - GUNICORN_WORKERS=1 # Keeps RAM usage low by only running 1 worker process + - GUNICORN_TIMEOUT=120 # Raises timeout to 2 minutes so long tasks don't trigger a restart + - GUNICORN_WORKER_CLASS=sync # Prevents threading conflicts during background updates +networks: + external: + external: true # Tells Compose not to create this network.. \ No newline at end of file