updated files

This commit is contained in:
Mike McFetridge
2026-07-25 08:45:38 -04:00
parent b78378565a
commit dc6edd21da
37 changed files with 1424 additions and 1120 deletions
+6 -106
View File
@@ -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 # SYSTEM SETTINGS
# ============================================================ # ============================================================
# Your timezone (list: https://en.wikipedia.org/wiki/List_of_tz_database_time_zones)
TZ=America/New_York 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 PUID=1000
PGID=1000 PGID=1000
# ============================================================ # ============================================================
# VPN SETTINGS — Pick your provider and fill in credentials # VPN SETTINGS (AirVPN WireGuard)
# 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.
# ============================================================ # ============================================================
# Your VPN provider (surfshark, nordvpn, protonvpn, airvpn, mullvad, private internet access, windscribe, etc.)
VPN_SERVICE_PROVIDER=airvpn VPN_SERVICE_PROVIDER=airvpn
# Protocol: wireguard (recommended, faster) or openvpn
VPN_TYPE=wireguard 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_PRIVATE_KEY=eDgf3GPFy2ltgx2RkD/Vx5wKZ4dVi28YbQmSJOrbWmk=
WIREGUARD_ADDRESSES=10.175.23.30 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= 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 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 FIREWALL_VPN_INPUT_PORTS=29261
# ============================================================ # ============================================================
# NETWORK — Static IPs for each service # STATIC IP ALLOCATIONS
# You shouldn't need to change these unless you have a conflict.
# ============================================================ # ============================================================
IP_GLUETUN=172.39.0.2 IP_GLUETUN=172.39.0.2
IP_RADARR=172.39.0.3 IP_RADARR=172.39.0.3
@@ -76,69 +30,17 @@ IP_AUDIO=172.39.0.9
IP_NAVI=172.39.0.10 IP_NAVI=172.39.0.10
IP_LIST=172.39.0.11 IP_LIST=172.39.0.11
IP_WATCH=172.39.0.12 IP_WATCH=172.39.0.12
# ============================================================ # ============================================================
# PROVIDER-SPECIFIC EXAMPLES # WATCHTOWER CONFIGURATION
# Uncomment and fill in the section for your VPN provider.
# ============================================================ # ============================================================
# --- 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_CLEANUP=true
WATCHTOWER_INCLUDE_RESTARTING=true WATCHTOWER_INCLUDE_RESTARTING=true
WATCHTOWER_ROLLING_RESTARTING=true WATCHTOWER_ROLLING_RESTARTING=true
WATCHTOWER_SCHEDULE=0 0 4 * * * WATCHTOWER_SCHEDULE="0 0 4 * * *"
WATCHTOWER_INCLUDE_STOPPED=true WATCHTOWER_INCLUDE_STOPPED=true
WATCHTOWER_NOTIFICATIONS=email 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_FROM=miker@mmcfetridge.net
WATCHTOWER_NOTIFICATION_EMAIL_TO=miker@mmcfetridge.net WATCHTOWER_NOTIFICATION_EMAIL_TO=miker@mmcfetridge.net
WATCHTOWER_NOTIFICATION_EMAIL_SERVER=mail.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_USER=miker@mmcfetridge.net
WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PASSWORD=!Sucyetat123 WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PASSWORD=!Sucyetat123
WATCHTOWER_NOTIFICATION_EMAIL_DELAY=2 WATCHTOWER_NOTIFICATION_EMAIL_DELAY=2
PUID=1000
PGID=1000
+49 -75
View File
@@ -1,16 +1,5 @@
# Tom Spark's ARR Stack — Automated Media Server # ARR Stack — Automated Media Server
# https://github.com/loponai/arrstack # 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: networks:
arrnetwork: arrnetwork:
@@ -22,10 +11,7 @@ networks:
services: services:
# ============================================================ # ============================================================
# GLUETUN — VPN Container (kill switch + tunnel) # GLUETUN — VPN Container
# 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: gluetun:
image: qmcgaw/gluetun:latest image: qmcgaw/gluetun:latest
@@ -49,21 +35,12 @@ services:
environment: environment:
- VPN_SERVICE_PROVIDER=${VPN_SERVICE_PROVIDER} - VPN_SERVICE_PROVIDER=${VPN_SERVICE_PROVIDER}
- VPN_TYPE=${VPN_TYPE} - VPN_TYPE=${VPN_TYPE}
# --- WireGuard credentials (most providers) ---
- WIREGUARD_PRIVATE_KEY=${WIREGUARD_PRIVATE_KEY} - WIREGUARD_PRIVATE_KEY=${WIREGUARD_PRIVATE_KEY}
- WIREGUARD_ADDRESSES=${WIREGUARD_ADDRESSES} - WIREGUARD_ADDRESSES=${WIREGUARD_ADDRESSES}
# - WIREGUARD_PUBLIC_KEY=${WIREGUARD_PUBLIC_KEY}
- WIREGUARD_PRESHARED_KEY=${WIREGUARD_PRESHARED_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} - SERVER_COUNTRIES=${SERVER_COUNTRIES}
# --- Port forwarding (ProtonVPN, AirVPN, PIA) ---
# - VPN_PORT_FORWARDING=${VPN_PORT_FORWARDING}
- FIREWALL_VPN_INPUT_PORTS=${FIREWALL_VPN_INPUT_PORTS} - FIREWALL_VPN_INPUT_PORTS=${FIREWALL_VPN_INPUT_PORTS}
- FIREWALL_OUTBOUND_SUBNETS=192.168.0.0/22 - FIREWALL_OUTBOUND_SUBNETS=192.168.0.0/22
# --- General ---
- PUID=${PUID} - PUID=${PUID}
- PGID=${PGID} - PGID=${PGID}
- UMASK=002 - UMASK=002
@@ -80,8 +57,7 @@ services:
restart: unless-stopped restart: unless-stopped
# ============================================================ # ============================================================
# QBITTORRENT — Torrent Client (runs through Gluetun VPN) # QBITTORRENT — Torrent Client
# ALL traffic goes through the VPN tunnel. No direct internet.
# ============================================================ # ============================================================
qbittorrent: qbittorrent:
image: lscr.io/linuxserver/qbittorrent:latest image: lscr.io/linuxserver/qbittorrent:latest
@@ -92,7 +68,7 @@ services:
condition: service_healthy condition: service_healthy
restart: true restart: true
labels: labels:
- deunhealth.restart.on.unhealthy=true - deunhealth.restart.on.unhealthy=true
environment: environment:
- PUID=${PUID} - PUID=${PUID}
- PGID=${PGID} - PGID=${PGID}
@@ -113,7 +89,6 @@ services:
# ============================================================ # ============================================================
# DEUNHEALTH — Auto-restarts unhealthy containers # DEUNHEALTH — Auto-restarts unhealthy containers
# If qBittorrent loses VPN connection, this restarts it automatically.
# ============================================================ # ============================================================
deunhealth: deunhealth:
image: qmcgaw/deunhealth image: qmcgaw/deunhealth
@@ -129,8 +104,7 @@ services:
restart: always restart: always
# ============================================================ # ============================================================
# PROWLARR — Indexer Manager (runs through Gluetun VPN) # PROWLARR — Indexer Manager
# Manages torrent/usenet indexers. Syncs to Radarr/Sonarr/Lidarr.
# ============================================================ # ============================================================
prowlarr: prowlarr:
image: lscr.io/linuxserver/prowlarr:latest image: lscr.io/linuxserver/prowlarr:latest
@@ -150,8 +124,7 @@ services:
restart: unless-stopped restart: unless-stopped
# ============================================================ # ============================================================
# FLARESOLVERR — Cloudflare Bypass (runs through Gluetun VPN) # FLARESOLVERR — Cloudflare Bypass
# Some indexers use Cloudflare protection. This gets around it.
# ============================================================ # ============================================================
flaresolverr: flaresolverr:
image: ghcr.io/flaresolverr/flaresolverr:latest image: ghcr.io/flaresolverr/flaresolverr:latest
@@ -169,9 +142,7 @@ services:
restart: unless-stopped restart: unless-stopped
# ============================================================ # ============================================================
# RADARR — Movie Manager (NOT behind VPN) # RADARR — Movie Manager
# Searches via Prowlarr, sends downloads to qBittorrent,
# renames and hard-links completed files to media folder.
# ============================================================ # ============================================================
radarr: radarr:
image: lscr.io/linuxserver/radarr:latest image: lscr.io/linuxserver/radarr:latest
@@ -192,8 +163,7 @@ services:
restart: unless-stopped restart: unless-stopped
# ============================================================ # ============================================================
# SONARR — TV Show Manager (NOT behind VPN) # SONARR — TV Show Manager
# Same pattern as Radarr but for TV series.
# ============================================================ # ============================================================
sonarr: sonarr:
image: lscr.io/linuxserver/sonarr:latest image: lscr.io/linuxserver/sonarr:latest
@@ -214,8 +184,7 @@ services:
restart: unless-stopped restart: unless-stopped
# ============================================================ # ============================================================
# LIDARR — Music Manager (NOT behind VPN) # LIDARR — Music Manager
# Optional. Comment out if you don't need music automation.
# ============================================================ # ============================================================
lidarr: lidarr:
image: lscr.io/linuxserver/lidarr:latest image: lscr.io/linuxserver/lidarr:latest
@@ -236,8 +205,7 @@ services:
restart: unless-stopped restart: unless-stopped
# ============================================================ # ============================================================
# BAZARR — Subtitle Manager (NOT behind VPN) # BAZARR — Subtitle Manager
# Automatically downloads subtitles for movies and TV shows.
# ============================================================ # ============================================================
bazarr: bazarr:
image: lscr.io/linuxserver/bazarr:latest image: lscr.io/linuxserver/bazarr:latest
@@ -258,9 +226,7 @@ services:
restart: unless-stopped restart: unless-stopped
# ============================================================ # ============================================================
# JELLYFIN — Media Server (NOT behind VPN) # JELLYFIN — Media Server
# Your personal streaming service. Plays movies, TV, music.
# Needs full bandwidth — never put this behind the VPN.
# ============================================================ # ============================================================
jellyfin: jellyfin:
image: lscr.io/linuxserver/jellyfin:latest image: lscr.io/linuxserver/jellyfin:latest
@@ -275,36 +241,16 @@ services:
- /data/media:/data/media - /data/media:/data/media
ports: ports:
- 8096:8096 - 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: networks:
arrnetwork: arrnetwork:
ipv4_address: ${IP_JELLYFIN} ipv4_address: ${IP_JELLYFIN}
restart: unless-stopped restart: unless-stopped
# ============================================================ # ============================================================
# SEERR — Request System (NOT behind VPN) # SEERR — Request System
# 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: seerr:
image: ghcr.io/seerr-team/seerr:v3.0.1 image: ghcr.io/seerr-team/seerr:latest
init: true init: true
container_name: seerr container_name: seerr
environment: environment:
@@ -315,7 +261,7 @@ services:
- TZ=${TZ} - TZ=${TZ}
- PORT=5055 - PORT=5055
volumes: volumes:
- seerr_volume:/app/config # <--- Needed or will cause a permissions issue. - seerr_volume:/app/config
ports: ports:
- 5055:5055 - 5055:5055
healthcheck: healthcheck:
@@ -329,6 +275,9 @@ services:
ipv4_address: ${IP_SEERR} ipv4_address: ${IP_SEERR}
restart: unless-stopped restart: unless-stopped
# ============================================================
# LISTENARR — Audiobooks & Podcasts
# ============================================================
listenarr: listenarr:
image: ghcr.io/listenarrs/listenarr:canary image: ghcr.io/listenarrs/listenarr:canary
container_name: listenarr container_name: listenarr
@@ -348,6 +297,9 @@ services:
arrnetwork: arrnetwork:
ipv4_address: ${IP_LIST} ipv4_address: ${IP_LIST}
# ============================================================
# AUDIOBOOKSHELF — Audiobook / Podcast Server
# ============================================================
audiobookshelf: audiobookshelf:
image: ghcr.io/advplyr/audiobookshelf:latest image: ghcr.io/advplyr/audiobookshelf:latest
container_name: audiobookshelf container_name: audiobookshelf
@@ -367,6 +319,10 @@ services:
networks: networks:
arrnetwork: arrnetwork:
ipv4_address: ${IP_AUDIO} ipv4_address: ${IP_AUDIO}
# ============================================================
# NAVIDROME — Music Streaming
# ============================================================
navidrome: navidrome:
image: deluan/navidrome:latest image: deluan/navidrome:latest
container_name: navidrome container_name: navidrome
@@ -387,17 +343,19 @@ services:
networks: networks:
arrnetwork: arrnetwork:
ipv4_address: ${IP_NAVI} ipv4_address: ${IP_NAVI}
# ============================================================
# WATCHTOWER — Automatic Image Updates
# ============================================================
watchtower: watchtower:
image: containrrr/watchtower image: nickfedor/watchtower:latest
container_name: watchtower container_name: watchtower
restart: unless-stopped restart: unless-stopped
env_file: .env
environment: environment:
- DOCKER_API_VERSION=1.44 - DOCKER_API_VERSION=1.44
- TZ=${TZ} - TZ=${TZ}
- PUID:=${PUID} # Reference PUID from .env - PUID=${PUID}
- PGID=${PGID} # Reference PGID from .env - PGID=${PGID}
- WATCHTOWER_CLEANUP=${WATCHTOWER_CLEANUP} - WATCHTOWER_CLEANUP=${WATCHTOWER_CLEANUP}
- WATCHTOWER_INCLUDE_RESTARTING=${WATCHTOWER_INCLUDE_RESTARTING} - WATCHTOWER_INCLUDE_RESTARTING=${WATCHTOWER_INCLUDE_RESTARTING}
- WATCHTOWER_ROLLING_RESTARTING=${WATCHTOWER_ROLLING_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_PORT=${WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PORT}
- WATCHTOWER_NOTIFICATION_EMAIL_SERVER_USER=${WATCHTOWER_NOTIFICATION_EMAIL_SERVER_USER} - WATCHTOWER_NOTIFICATION_EMAIL_SERVER_USER=${WATCHTOWER_NOTIFICATION_EMAIL_SERVER_USER}
- WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PASSWORD=${WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PASSWORD} - WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PASSWORD=${WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PASSWORD}
- WATCHTOWER_NOTIFICATION_EMAIL_DELAY=${WATCHTOWER_NOTIFICATION_EMAIL_DELAY}
security_opt: security_opt:
- no-new-privileges:true - no-new-privileges:true
volumes: volumes:
@@ -421,7 +380,22 @@ services:
networks: networks:
arrnetwork: arrnetwork:
ipv4_address: ${IP_WATCH} 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: volumes:
gluetun_volume: gluetun_volume:
qbittorrent_volume: qbittorrent_volume:
@@ -437,4 +411,4 @@ volumes:
listenarr_volume: listenarr_volume:
audiobookshelf_volume: audiobookshelf_volume:
navidrome_volume: navidrome_volume:
watchtower_volume: watchtower_volume:
+25 -17
View File
@@ -1,20 +1,28 @@
#For a fresh authentik installation, you need to generate a password and a secret key. # ============================================================
PG_PASS=vXqYGFaTTldI8+DydREqaf3RRvHVRDXAlyKfaEXQ92Nw570A # SYSTEM SETTINGS
AUTHENTIK_SECRET_KEY=voCiuozip37G/UISer4WV8FBLrMD8diHINmALHvWQ0A7PkzMoYH9xf3MnTDWEylN1TS1dp7JJ2f3nv1V # ============================================================
TZ=America/New_York
PUID=1000
PGID=1000
DATA_PATH=/home/miker/docker/authentik
#Enable error reporting # ============================================================
AUTHENTIK_ERROR_REPORTING__ENABLED=true # AUTHENTIK VERSION & PORTS
# ============================================================
# SMTP Host Emails are sent to AUTHENTIK_IMAGE=ghcr.io/goauthentik/server
AUTHENTIK_EMAIL__HOST=mail.mmcfetridge.net AUTHENTIK_TAG=2026.5.6
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
COMPOSE_PORT_HTTP=9500 COMPOSE_PORT_HTTP=9500
COMPOSE_PORT_HTTPS=9543 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
+44 -65
View File
@@ -1,100 +1,79 @@
--- # Authentik Identity & SSO Stack
services: services:
postgresql: postgresql:
image: docker.io/library/postgres:16-alpine image: docker.io/library/postgres:16-alpine
restart: unless-stopped
container_name: authentik-db 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: healthcheck:
test: ["CMD-SHELL", "pg_isready -d $${POSTGRES_DB} -U $${POSTGRES_USER}"] test: ["CMD-SHELL", "pg_isready -d $${POSTGRES_DB} -U $${POSTGRES_USER}"]
start_period: 20s
interval: 30s interval: 30s
retries: 5
timeout: 5s 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 retries: 5
timeout: 3s start_period: 20s
volumes:
- ./redis:/data
networks: networks:
- authentik - authentik
server: server:
image: ${AUTHENTIK_IMAGE:-ghcr.io/goauthentik/server}:${AUTHENTIK_TAG:-2025.8.1} image: ${AUTHENTIK_IMAGE:-ghcr.io/goauthentik/server}:${AUTHENTIK_TAG:-2026.5.6}
restart: unless-stopped
container_name: authentik-server container_name: authentik-server
restart: unless-stopped
command: server command: server
environment: environment:
AUTHENTIK_REDIS__HOST: redis - AUTHENTIK_POSTGRESQL__HOST=postgresql
AUTHENTIK_POSTGRESQL__HOST: postgresql - AUTHENTIK_POSTGRESQL__NAME=${PG_DB:-authentik}
AUTHENTIK_POSTGRESQL__USER: ${PG_USER:-authentik} - AUTHENTIK_POSTGRESQL__USER=${PG_USER:-authentik}
AUTHENTIK_POSTGRESQL__NAME: ${PG_DB:-authentik} - AUTHENTIK_POSTGRESQL__PASSWORD=${PG_PASS}
AUTHENTIK_POSTGRESQL__PASSWORD: ${PG_PASS} - AUTHENTIK_SECRET_KEY=${AUTHENTIK_SECRET_KEY}
- TZ=${TZ}
volumes: volumes:
- ./media:/media - ${DATA_PATH}/data:/data
- ./custom-templates:/templates - ${DATA_PATH}/custom-templates:/templates
env_file:
- .env
ports: ports:
- "${COMPOSE_PORT_HTTP:-9000}:9000" - "${COMPOSE_PORT_HTTP}:9000"
- "${COMPOSE_PORT_HTTPS:-9443}:9443" - "${COMPOSE_PORT_HTTPS}:9443"
shm_size: 512mb
depends_on: depends_on:
- postgresql postgresql:
- redis condition: service_healthy
networks: networks:
- authentik - authentik
- main
worker: worker:
image: ${AUTHENTIK_IMAGE:-ghcr.io/goauthentik/server}:${AUTHENTIK_TAG:-2025.8.1} image: ${AUTHENTIK_IMAGE:-ghcr.io/goauthentik/server}:${AUTHENTIK_TAG:-2026.5.6}
restart: unless-stopped
container_name: authentik-worker container_name: authentik-worker
restart: unless-stopped
command: worker 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 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: volumes:
- /var/run/docker.sock:/var/run/docker.sock - /var/run/docker.sock:/var/run/docker.sock
- ./media:/media - ${DATA_PATH}/data:/data
- ./certs:/certs - ${DATA_PATH}/certs:/certs
- ./custom-templates:/templates - ${DATA_PATH}/custom-templates:/templates
env_file: shm_size: 512mb
- .env
depends_on: depends_on:
- postgresql postgresql:
- redis condition: service_healthy
networks: networks:
- authentik - authentik
- main
networks: networks:
main:
external: true
authentik: authentik:
external: true external: true
+18
View File
@@ -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
@@ -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
+347 -478
View File
@@ -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 { /* APPLY STYLING AND THEME VARIABLES GLOBALLY & ON ACTIVE THEMES */
font-family: 'DM Sans', sans-serif; :root, .dark, .theme-gray, .theme-slate, .theme-zinc {
font-family: 'Poppins', sans-serif;
/* DRACULA COLORS */ /* DRACULA & CYBERPUNK COLOR SYSTEM */
--dracula-background: #282a36; --dracula-background: #181923;
--dracula-background-dark: #15161d; --dracula-background-dark: #0f1015;
--dracula-foreground: #44475a; --dracula-foreground: #2d3142;
--dracula-text: #f8f8f2; --dracula-text: #f8f8f2;
--dracula-slate: #6272a4; --dracula-slate: #6272a4;
--dracula-cyan: #8be9fd; --dracula-cyan: #8be9fd;
--dracula-green: #50fa7ae8; --dracula-green: #50fa7b;
--dracula-orange: #ffb86c; --dracula-orange: #ffb86c;
--dracula-pink: #ff79c6; --dracula-pink: #ff79c6;
--dracula-purple: #bd93f9; --dracula-purple: #bd93f9;
--dracula-red: #ff5555; --dracula-red: #ff5555;
--dracula-yellow: #f1fa8c; --dracula-yellow: #f1fa8c;
/* Theme preset colors */ /* Theme preset colors (RGB values for Tailwind transparency support) */
--color-50: 249 250 251; --color-50: 249 250 251;
--color-100: 243 244 246; --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-300: 209 213 219;
--color-400: 156 163 175; --color-400: 156 163 175;
--color-500: 107 114 128; --color-500: 107 114 128;
--color-600: 75 85 99; --color-600: 75 85 99;
--color-700: 55 65 81; --color-700: 45 49 66;
--color-800: 40 42 54; /* Background color - use Dracula theme color */ --color-800: 24 25 35; /* Main container background */
--color-900: 21 22 29; /* Dracula specific */ --color-900: 15 16 21; /* Core background */
--color-logo-start: 156 163 175; --color-logo-start: 189 147 249;
--color-logo-stop: 55 65 81; --color-logo-stop: 139 233 253;
--standard-bg: #44475a8e; --standard-bg: rgba(45, 49, 66, 0.45);
/* INFO WIDGET COLORS */ /* INFO WIDGET COLORS */
--info-widgets: var(--dracula-purple); --info-widgets: var(--dracula-cyan);
--resource-bar-bg: var(--standard-bg); --resource-bar-bg: rgba(98, 114, 164, 0.2);
--resource-bar-fg: var(--dracula-green); --resource-bar-fg: var(--dracula-cyan);
--widget-border: var(--dracula-foreground); --widget-border: rgba(139, 233, 253, 0.2);
/* SERVICES COLORS */ /* SERVICES COLORS */
--service-group: var(--dracula-purple); --service-group: var(--dracula-purple);
--service-name: var(--dracula-text); --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); --service-block-text: var(--dracula-pink);
/* BOOKMARKS COLORS */ /* BOOKMARKS COLORS */
--bookmark-group: var(--dracula-purple); --bookmark-group: var(--dracula-purple);
--bookmark-icon-bg: rgba(189, 147, 249, 0.15);
--bookmark-icon-bg: #44475a60;
--bookmark-icon: var(--dracula-purple); --bookmark-icon: var(--dracula-purple);
--bookmark-name: var(--dracula-text); --bookmark-name: var(--dracula-text);
/* ALL CARD COLORS */ /* ALL CARD COLORS (GLASSMORPHISM DEFAULT) */
--card-color: #44475a46; --card-color: rgba(30, 32, 48, 0.55);
--card-color-hover: #44475a91; --card-color-hover: rgba(40, 44, 68, 0.8);
/* FOOTER COLORS */
--footer-items: var(--dracula-pink);
/* FOOTER COLORS */ /* FOOTER COLORS */
--footer-items: var(--dracula-purple);
--scrollbar-fg: var(--dracula-purple); --scrollbar-fg: var(--dracula-purple);
--scrollbar-bg: var(--standard-bg); --scrollbar-bg: var(--dracula-background-dark);
/*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);
}
} }
/* ********************************************************************************************* */
/* CARD COLOURING - DONE VIA "ID:" TAGS IN SERVICES.YAML */ /* ==========================================
.service-card::before { * FUTURISTIC SCIFI HUD OVERLAY
content: ""; * ========================================== */
opacity: 0.40; body {
position: absolute; top: 0px; left: 0px; right: 0px; bottom: 0px; z-index: 0; background-color: #0c0d12 !important;
position: relative;
overflow-x: hidden;
} }
/* DARK */
#red .dark\:hover\:bg-white\/10:is(.dark *).service-card::before { background-color: #812020; } body::before {
#yellow .dark\:hover\:bg-white\/10:is(.dark *).service-card::before { background-color: #818120; } content: "";
#green .dark\:hover\:bg-white\/10:is(.dark *).service-card::before { background-color: #208120; } position: fixed;
#cyan .dark\:hover\:bg-white\/10:is(.dark *).service-card::before { background-color: #208181; } top: 0; left: 0; right: 0; bottom: 0;
#blue .dark\:hover\:bg-white\/10:is(.dark *).service-card::before { background-color: #202081; } background:
#purple .dark\:hover\:bg-white\/10:is(.dark *).service-card::before { background-color: #812081; } linear-gradient(rgba(12, 13, 18, 0.75), rgba(12, 13, 18, 0.85)),
#black .dark\:hover\:bg-white\/10:is(.dark *).service-card::before { background-color: #000000; } linear-gradient(90deg, rgba(139, 233, 253, 0.02) 1px, transparent 1px),
#white .dark\:hover\:bg-white\/10:is(.dark *).service-card::before { background-color: #ffffff; } linear-gradient(rgba(139, 233, 253, 0.02) 1px, transparent 1px);
/* LIGHT */ background-size: 100% 100%, 50px 50px, 50px 50px;
#red .hover\:bg-theme-300\/20.service-card::before { background-color: #ff0000; } pointer-events: none;
#yellow .hover\:bg-theme-300\/20.service-card::before { background-color: #ffff00; } z-index: -1;
#green .hover\:bg-theme-300\/20.service-card::before { background-color: #00ff00; } animation: gridPan 120s linear infinite;
#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; } /* Add a neon scanline effect */
#black .hover\:bg-theme-300\/20.service-card::before { background-color: #ffffff; } body::after {
#white .hover\:bg-theme-300\/20.service-card::before { background-color: #000000; } content: "";
#orange .hover\:bg-theme-300\/20.service-card::before { background-color: #ffa500; } position: fixed;
#pink .hover\:bg-theme-300\/20.service-card::before { background-color: #ffc0cb; } top: 0; left: 0; width: 100%; height: 100%;
#teal .hover\:bg-theme-300\/20.service-card::before { background-color: #008080; } 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));
#magenta .hover\:bg-theme-300\/20.service-card::before { background-color: #ff00ff; } background-size: 100% 4px, 6px 100%;
#lime .hover\:bg-theme-300\/20.service-card::before { background-color: #00ff00; } pointer-events: none;
#navy .hover\:bg-theme-300\/20.service-card::before { background-color: #000080; } z-index: 9999;
#maroon .hover\:bg-theme-300\/20.service-card::before { background-color: #800000; } opacity: 0.15;
#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; } @keyframes gridPan {
#gold .hover\:bg-theme-300\/20.service-card::before { background-color: #ffd700; } from { background-position: 0 0, 0 0, 0 0; }
#coral .hover\:bg-theme-300\/20.service-card::before { background-color: #ff7f50; } to { background-position: 0 0, 1000px 1000px, 1000px 1000px; }
#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; } * TYPOGRAPHY & TITLE STYLES
#plum .hover\:bg-theme-300\/20.service-card::before { background-color: #dda0dd; } * ========================================== */
#orchid .hover\:bg-theme-300\/20.service-card::before { background-color: #da70d6; } .service-group-name, .bookmark-group-name, #widgets-title {
#tan .hover\:bg-theme-300\/20.service-card::before { background-color: #d2b48c; } font-family: 'Orbitron', sans-serif !important;
#beige .hover\:bg-theme-300\/20.service-card::before { background-color: #f5f5dc; } font-weight: 700 !important;
#mint .hover\:bg-theme-300\/20.service-card::before { background-color: #98ff98; } letter-spacing: 0.15em !important;
#lavender .hover\:bg-theme-300\/20.service-card::before { background-color: #e6e6fa; } text-transform: uppercase !important;
#chocolate .hover\:bg-theme-300\/20.service-card::before { background-color: #d2691e; } text-shadow: 0 0 10px rgba(189, 147, 249, 0.6) !important;
#crimson .hover\:bg-theme-300\/20.service-card::before { background-color: #dc143c; } color: var(--dracula-purple) !important;
#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; } .service-name {
#bisque .hover\:bg-theme-300\/20.service-card::before { background-color: #ffe4c4; } font-family: 'Rajdhani', sans-serif !important;
#bronze .hover\:bg-theme-300\/20.service-card::before { background-color: #cd7f32; } font-weight: 700 !important;
#charcoal .hover\:bg-theme-300\/20.service-card::before { background-color: #36454f; } font-size: 1.15rem !important;
#emerald .hover\:bg-theme-300\/20.service-card::before { background-color: #50c878; } letter-spacing: 0.03em !important;
#ivory .hover\:bg-theme-300\/20.service-card::before { background-color: #fffff0; } color: var(--dracula-text) !important;
#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; } .service-description {
#ruby .hover\:bg-theme-300\/20.service-card::before { background-color: #e0115f; } font-family: 'Poppins', sans-serif !important;
#sapphire .hover\:bg-theme-300\/20.service-card::before { background-color: #0f52ba; } font-size: 0.8rem !important;
#sepia .hover\:bg-theme-300\/20.service-card::before { background-color: #704214; } color: #a9b1d6 !important;
#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; } * GLASSMORPHISM CARDS & ANIMATIONS
#scarlet .hover\:bg-theme-300\/20.service-card::before { background-color: #ff2400; } * ========================================== */
#slate .hover\:bg-theme-300\/20.service-card::before { background-color: #708090; } .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; }
Binary file not shown.
+127 -99
View File
@@ -1,7 +1,7 @@
--- ---
######################################### HOME TAB SERVICES ###################################################################### ######################################### HOME TAB SERVICES ######################################################################
- Infrastructure: - Infrastructure:
- Proxmox 1: - Proxmox 1: # Main Virt Server
id: blue id: blue
tab: Home tab: Home
href: https://192.168.2.1:8006 href: https://192.168.2.1:8006
@@ -37,30 +37,36 @@
description: Authentik SSO description: Authentik SSO
widget: widget:
type: authentik type: authentik
url: https://192.168.2.3:9543 url: https://192.168.2.6:9543
key: NW5ldUK8qDRY91ny67dE6ckWCMXThF9nwj6EZw7pKbS5FzXx5wouAo4sC19n key: NW5ldUK8qDRY91ny67dE6ckWCMXThF9nwj6EZw7pKbS5FzXx5wouAo4sC19n
version: 2 version: 2
- Dockhand: - Dockhand:
id: cyan id: cyan
tab: Home tab: Home
href: http://192.168.2.3:3200 href: http://192.168.2.6:3200
icon: dockhand.png icon: dockhand.png
description: Dockhand description: Dockhand
widget: widget:
type: dockhand type: dockhand
url: http://192.168.2.3:3200 url: http://192.168.2.6:3200
username: mmcfetridge username: mmcfetridge
password: "!Sucyetat123" password: "!Sucyetat123"
fields: ["running", "total", "pending_updates", "paused"]
- Applications: - Mailcow:
- OwnCloud: id: cyan
id: purple
tab: Home tab: Home
icon: owncloud.png href: https://216.144.227.142/admin
href: https://owncloud.mcfetridge.us icon: mailcow.png
description: File Sync & Share description: mailcow
widget:
type: mailcow
url: https://mail.mmcfetridge.net
key: 2C3DAF-9DA97F-22FF12-851295-2A7E37
############################################## APPS TAB Services ###########################################################
- Applications:
- Immich: - Immich:
id: white id: white
tab: Home tab: Home
@@ -69,49 +75,61 @@
description: Photos Server description: Photos Server
widget: widget:
type: immich type: immich
url: http://192.168.2.3:2283 url: http://192.168.2.6:2283
key: "MLbcal27A67J6FZV1PIb3AdMsRf8xZC1uruOLB7js" key: "MLbcal27A67J6FZV1PIb3AdMsRf8xZC1uruOLB7js"
fields: ["users", "photos", "storage"] fields: ["users", "photos", "storage"]
version: 2 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: - MySpeed:
id: lime id: lime
tab: Home tab: Home
icon: myspeed.png icon: myspeed.png
href: http://192.168.2.3:5216 href: http://192.168.2.13:5216
widget: widget:
type: myspeed type: myspeed
url: http://192.168.2.3:5216 url: http://192.168.2.13:5216
password: "!Sucyetat123" # only required if password is set password: "!Sucyetat123" # only required if password is set
- mealie: - mealie:
id: cobalt id: cobalt
tab: Home tab: Home
icon: mealie.png icon: mealie.png
href: http://192.168.2.7:9000/ href: http://192.168.2.13:9200/
widget: widget:
type: mealie type: mealie
url: http://192.168.2.7:9000 url: http://192.168.2.13:9200
key: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJsb25nX3Rva2VuIjp0cnVlLCJpZCI6IjVlYzIwNTk2LTEyY2QtNDFkMS05MTc5LWUzOWFkYjk3OWE2MyIsIm5hbWUiOiJob21lcGFnZSIsImludGVncmF0aW9uX2lkIjoiZ2VuZXJpYyIsImV4cCI6MTkzNjU0MzE3N30.C1PWK51JOpmzHwR9zmlvVShWC7sasKv0aO6PS47LQqo key: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJsb25nX3Rva2VuIjp0cnVlLCJpZCI6IjMxNWM4ZmNjLWI1Y2ItNDMyMy1hNDNmLTIyNjAwYjU2ZTJlOSIsIm5hbWUiOiJob21lcGFnZSIsImludGVncmF0aW9uX2lkIjoiZ2VuZXJpYyIsImV4cCI6MTk0MjI2NjU4NH0.iPE6newlQ3PVqdbgDCDdsAqZrwZ6glROWI1kvq5zb_I
version: 2 # only required if version > 1, defaults to 1 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 TAB Services ###########################################################
- Media downloader: - Media downloader:
- Calendar: - Calendar:
@@ -131,39 +149,51 @@
service_group: Media downloader service_group: Media downloader
service_name: Radarr 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: - Sonarr:
id: crimson id: crimson
tab: Media tab: Media
href: http://192.168.2.16:8989 href: http://192.168.2.8:8989
icon: sonarr.png icon: sonarr.png
description: TV Show Service description: TV Show Service
widget: widget:
type: sonarr type: sonarr
url: http://192.168.2.16:8989 url: http://192.168.2.8:8989
key: 8746f486831545e3b6c9014657ac9c11 key: b4227fd07fd046f094d620b88d92e494
fields: ["wanted", "queued", "series"] fields: ["wanted", "queued", "series"]
- Radarr: - Radarr:
id: lavender id: lavender
tab: Media tab: Media
href: http://192.168.2.16:7878 href: http://192.168.2.8:7878
icon: radarr.png icon: radarr.png
description: Movie Service description: Movie Service
widget: widget:
type: radarr type: radarr
url: http://192.168.2.16:7878 url: http://192.168.2.8:7878
key: ee95503f6fca4cf7b9c8c3f3fc45df39 key: 9b0e1202f7b94907ba92a1ea23304fa4
fields: ["wanted", "missing", "queued", "movies"] fields: ["wanted", "missing", "queued", "movies"]
- Qbittorrent: - Qbittorrent:
id: teal id: teal
tab: Media tab: Media
href: http://192.168.2.16:8118 href: http://192.168.2.8:8080
icon: qbittorrent.png icon: qbittorrent.png
description: Download Client description: Download Client
widget: widget:
type: qbittorrent type: qbittorrent
url: http://192.168.2.16:8118 url: http://192.168.2.8:8080
username: admin username: admin
password: "!Sucyetat123" password: "!Sucyetat123"
@@ -171,36 +201,36 @@
- Jellyfin: - Jellyfin:
id: violet id: violet
tab: Media tab: Media
href: http://192.168.2.16:8096 href: http://192.168.2.8:8096
icon: jellyfin.png icon: jellyfin.png
description: Movies & TV Shows description: Movies & TV Shows
widget: widget:
type: jellyfin type: jellyfin
url: http://192.168.2.16:8096 url: http://192.168.2.8:8096
key: 617cc65c15da4b3eaac10568c25a8c36 key: ffe8e2b31fd24464ac779121e920ac25
enableBlocks: true enableBlocks: true
enableNowPlaying: true enableNowPlaying: true
- Jellyseerr: - Jellyseerr:
id: aqua id: aqua
tab: Media tab: Media
href: http://192.168.2.16:5055 href: http://192.168.2.8:5055
icon: jellyseerr.png icon: jellyseerr.png
description: Movie/show Database description: Movie/show Database
widget: widget:
type: jellyseerr type: jellyseerr
url: http://192.168.2.16:5055 url: http://192.168.2.8:5055
key: MTc1NDI2NTczOTQyMDA2ODRjOWY0LWJmZmEtNGE1OC05MzM2LTAwMDM4OWRmYmQ3Yg== key: MTc4MzM0NDc0OTI1OWY1YzJkYWJkLTA0OWEtNDY0NS05ZTMwLTI3NjFkZjYxNjdhZQ==
fields: ["pending", "approved", "available"] fields: ["pending", "approved", "available"]
- Navidrome: - Navidrome:
id: navy id: navy
tab: Media tab: Media
icon: navidrome.png icon: navidrome.png
href: http://192.168.2.16:4533 href: http://192.168.2.8:4533
widget: widget:
type: navidrome type: navidrome
url: http://192.168.2.16:4533 url: http://192.168.2.8:4533
user: mmcfetridge user: mmcfetridge
token: 05dee16046666bb05d98291b9c6e39d3 token: 05dee16046666bb05d98291b9c6e39d3
salt: 50c05a salt: 50c05a
@@ -208,51 +238,26 @@
- AudioBookShelf: - AudioBookShelf:
id: beige id: beige
tab: Media tab: Media
href: http://192.168.2.16:13378 href: http://192.168.2.8:13378
icon: audiobookshelf.png icon: audiobookshelf.png
description: Index Server description: Index Server
widget: widget:
type: audiobookshelf type: audiobookshelf
url: http://192.168.2.16:13378 url: http://192.168.2.8:13378
key: "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiI4MDQ5Y2U4Mi0xZjlmLTRiYTEtOWY3Zi03N2U4YmRiYjg0OGEiLCJ1c2VybmFtZSI6Im1tY2ZldHJpZGdlIiwiaWF0IjoxNzQ4MTk4NzUyfQ.Tey3wxo61euuJEwc2ziE_PukdOUz7pNZKG8SmOdWB-c" key: "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJrZXlJZCI6IjU1MzViZDFiLTI3NGUtNGNjOC1iMWZkLTNiZWFiNjg0NDQ1YiIsIm5hbWUiOiJob21lcGFnZSIsInR5cGUiOiJhcGkiLCJpYXQiOjE3ODM0NjE1NjJ9.BYvicD24tA3lEx_ktwmf6Igme6dpLj1SUrc0Y9ISBMs"
fields: ["podcasts", "books"] fields: ["podcasts", "books"]
##################################### Network & System TAB Services ############################################################## ##################################### Network & System TAB Services ##############################################################
- Network: - Network:
- Pi-hole: - Nginx Proxy Manager:
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:
id: emerald id: emerald
tab: Network tab: Network
href: http://192.168.2.3:81 href: http://192.168.2.12:81
icon: nginx-proxy-manager.png icon: nginx-proxy-manager.png
description: Nginx Proxy Manager description: Nginx Proxy Manager
widget: widget:
type: npm type: npm
url: http://192.168.2.3:81 url: http://192.168.2.12:81
username: mmcfetridg@aol.com username: mmcfetridg@aol.com
password: "!Sucyetat123" password: "!Sucyetat123"
fields: ["enabled", "disabled", "total"] fields: ["enabled", "disabled", "total"]
@@ -261,25 +266,17 @@
id: salmon id: salmon
tab: Network tab: Network
icon: pangolin.png icon: pangolin.png
href: https://pangolin.mmcfetridge.net href: https://app.pangolin.net
description: External network description: External network
widget: widget:
type: pangolin type: pangolin
url: https://api.mmcfetridge.net/v1 url: https://api.pangolin.net
key: "2o4g9gak61mig2i.5s5yxu4o2ek7haepzumar2ldl4mmzqpbrcfnpqdf" key: "w3f8ong2hz7a3da.dappsg2veyo36my5ibsmrmnzd2c2626lyrok7inn"
org: homelab org: org_lsxd0ocafwikxgs
fields: ["sites", "resources", "targets"]
######################################## System TAB Services ######################################################################
- Systems: - 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: - Public IP:
icon: mdi-web icon: mdi-web
@@ -294,6 +291,37 @@
label: WAN IP label: WAN IP
format: text 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 ############################################################# ############################################## Bookmark TAB Services #############################################################
- Bookmarks: - Bookmarks:
@@ -313,7 +341,7 @@
description: Web Bookmarker description: Web Bookmarker
widget: widget:
type: linkwarden 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" key: "eyJhbGciOiJkaXIiLCJlbmMiOiJBMjU2R0NNIn0..ZLJgig_ol-n3i1tv.vhWCnMSHVd81bdidL85-imXKpxGC0U3mHlvmkQyIJqJvcFRRJVBAasw9C0cmfSXVPq08HT-B-3zUAmftnPRymPHMJCkfo8pv_XBbEPneIFH-n59_dg26.qcXSK2REP3M_Vdgp0aOqcA"
fields: ["links", "collections"] fields: ["links", "collections"]
@@ -321,14 +349,14 @@
id: cerulean id: cerulean
tab: Bookmarks tab: Bookmarks
icon: semaphore.png icon: semaphore.png
href: http://192.168.2.11:3000 href: http://192.168.2.13:3020
description: CI/CD Automation description: CI/CD Automation
- Wg-Easy: - Wg-Easy:
id: rose id: rose
tab: Bookmarks tab: Bookmarks
icon: wireguard.png icon: wireguard.png
href: http://192.168.2.3:10086 href: http://192.168.2.13:10086
description: Wireguard VPN description: Wireguard VPN
- YouTube: - YouTube:
@@ -338,4 +366,4 @@
href: https://youtube.com/ href: https://youtube.com/
description: Video Platform description: Video Platform
#
+5 -5
View File
@@ -34,9 +34,9 @@
hour12: true hour12: true
timeZone: 'America/New_York' timeZone: 'America/New_York'
# /config/widgets.yaml
- search: - search:
provider: custom provider: google # google, duckduckgo, bing, baidu, brave or custom
url: http://localhost:8080/search?q= focus: true # Optional, will set focus to the search bar on page load
focus: true showSearchSuggestions: true # Optional, will show search suggestions. Defaults to false
target: _blank target: _blank # One of _self, _blank, _parent or _top
showSearchSuggestions: true
+14 -28
View File
@@ -1,44 +1,30 @@
services: services:
homepage: homepage:
image: ghcr.io/gethomepage/homepage:latest image: ghcr.io/gethomepage/homepage:latest
container_name: homepage container_name: homepage
environment: environment:
HOMEPAGE_ALLOWED_HOSTS: "*" # required, may need port. See gethomepage.dev/installation/#homepage_allowed_hosts HOMEPAGE_ALLOWED_HOSTS: "*" # required, may need port.
PUID: ${PUID} # Reference PUID from .env PUID: 1000
PGID: ${PGID} # Reference PGID from .env PGID: 1000
DOCKER_HOST: tcp://socket-proxy:2375 DOCKER_HOST: tcp://socket-proxy:2375
ports: ports:
- 3000:3000 - 3100:3000
env_file:
- .env # Link to the .env file
volumes: volumes:
- ./config:/app/config # Make sure your local config directory exists - /opt/Docker-Deployments/Homepage/config:/app/config # Make sure your local config directory exists
- ./images:/app/public/images - /opt/Docker-Deployments/Homepage/images:/app/public/images
- /var/run/docker.sock:/var/run/docker.sock:ro # optional, for docker integrations - /var/run/docker.sock:/var/run/docker.sock:ro # optional, for docker integrations
networks:
- external
restart: unless-stopped restart: unless-stopped
healthcheck: healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:3000"] test: ["CMD", "curl", "-f", "http://localhost:3000"]
interval: 10s interval: 10s
retries: 3 retries: 3
timeout: 10s timeout: 10s
start_period: 30s start_period: 30s
dockerproxy: networks:
image: ghcr.io/tecnativa/docker-socket-proxy:latest external:
container_name: dockerproxy external: true # Tells Compose not to create this network
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
+14 -25
View File
@@ -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 # PATH LOCATIONS
# ============================================================
# The location where your database files are stored UPLOAD_LOCATION=/home/miker/docker/immich/library
DB_DATA_LOCATION=/home/miker/docker/immich/postgres 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 # DATABASE CREDENTIALS
# ============================================================
# The Immich version to use. You can pin this to a specific version like "v1.71.0" DB_USERNAME=postgresadmin
IMMICH_VERSION=release DB_PASSWORD=mM3PXXUjK0QMz7
# 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
DB_DATABASE_NAME=immich DB_DATABASE_NAME=immich
REDIS_HOSTNAME=immich_redis
IMMICH_SERVER_URL=https://immich.mikemcfetridge.com
IMMICH_WEB_URL=https://immich.mikemcfetridge.com
+67 -41
View File
@@ -1,60 +1,86 @@
# Immich — Self-Hosted Photo & Video Management
name: immich
services: services:
immich-server: immich-server:
container_name: 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: volumes:
- /home/miker/dockerapps/immich/upload:/usr/src/app/upload - ${UPLOAD_LOCATION}:/data
- /etc/localtime:/etc/localtime:ro - /etc/localtime:/etc/localtime:ro
- /home/miker/docker/immich/upload/import:/import
env_file:
- .env
ports: ports:
- 2283:3001 - "2283:2283"
depends_on: depends_on:
- redis database:
- database condition: service_healthy
restart: always redis:
condition: service_healthy
immich-microservices: restart: unless-stopped
container_name: immich_microservices networks:
image: ghcr.io/immich-app/immich-server:${IMMICH_VERSION} - immich
extends: - main
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
immich-machine-learning: immich-machine-learning:
container_name: 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: volumes:
- /home/miker/dockerapps/immich/model-cache:/cache - model-cache:/cache
env_file: restart: unless-stopped
- .env networks:
restart: always - immich
redis: redis:
container_name: immich_redis container_name: immich_redis
image: redis:6.2-alpine@sha256:70a7a5b641117670beae0d80658430853896b5ef269ccf00d1827427e3263fa3 image: docker.io/valkey/valkey:9@sha256:3b55fbaa0cd93cf0d9d961f405e4dfcc70efe325e2d84da207a0a8e6d8fde4f9
restart: always restart: unless-stopped
healthcheck:
test: ["CMD-SHELL", "valkey-cli ping || exit 1"]
interval: 10s
timeout: 5s
retries: 5
networks:
- immich
database: database:
container_name: immich_postgres container_name: immich_postgres
image: ghcr.io/immich-app/postgres:14-vectorchord0.3.0-pgvectors0.2.0@sha256:fa4f6e0971f454cd95fec5a9aaed2ed93d8f46725cc6bc61e0698e97dba96da1 image: ghcr.io/immich-app/postgres:14-vectorchord0.4.3-pgvectors0.2.0
env_file:
- .env
environment: environment:
POSTGRES_PASSWORD: ${DB_PASSWORD} - POSTGRES_USER=${DB_USERNAME}
POSTGRES_USER: ${DB_USERNAME} - POSTGRES_PASSWORD=${DB_PASSWORD}
POSTGRES_DB: ${DB_DATABASE_NAME} - POSTGRES_DB=${DB_DATABASE_NAME}
POSTGRES_INITDB_ARGS: '--data-checksums' - POSTGRES_INITDB_ARGS=--data-checksums
- TZ=${TZ}
volumes: volumes:
- /home/miker/dockerapps/immich/pgdata:/var/lib/postgresql/data - ${DB_DATA_LOCATION}:/var/lib/postgresql/data
restart: always 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
+20 -9
View File
@@ -1,11 +1,22 @@
# General Settings
TZ=America/New_York
PUID=1000 PUID=1000
PGID=1000 PGID=1000
# TZ for container timezone DATA_DIR=/opt/Docker-Deployments/Mealie
TZ=America/New_York MEALIE_PORT=9200
SMTP_HOST=smtp.zoho.com MEMORY_LIMIT=1000M
SMTP_FROM_NAME=miker@mcfetridge.us
SMTP_AUTH_STRATEGY=TLS # Mealie Application Settings
SMTP_FROM_EMAIL=miker@mcfetridge.us ALLOW_SIGNUP=false
SMTP_USER=miker@mcfetridge.us MAX_WORKERS=1
SMTP_PASSWORD="!Sucyetat123" WEB_CONCURRENCY=1
SMTP_PORT=465 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
+26 -21
View File
@@ -1,37 +1,42 @@
services: services:
mealie: mealie:
image: ghcr.io/mealie-recipes/mealie:latest # Specifies the Mealie Docker i> image: ghcr.io/mealie-recipes/mealie:latest
container_name: mealie # Names the container for easier> container_name: mealie
restart: always restart: unless-stopped
networks: ports:
- proxy # Ensures the container restart> - "${MEALIE_PORT}:9000"
# ports:
# - "9925:9000" # Maps port 9925 on the host to >
deploy: deploy:
resources: resources:
limits: limits:
memory: 1000M # Limits the container to use a > memory: ${MEMORY_LIMIT}
volumes: volumes:
- /home/miker/docker/mealie/data:/app/data/ # Persists data in> - ${DATA_DIR}/data:/app/data/
- ./config/addons_config/mealie/config.yaml:/config/config.yanl - ${DATA_DIR}/config/addons_config/mealie/config.yaml:/config/config.yaml
environment: environment:
- ALLOW_SIGNUP=false # Allows new user signups on the> - ALLOW_SIGNUP=${ALLOW_SIGNUP}
- PUID=${PUID} # Sets the user ID for the conta> - PUID=${PUID}
- PGID=${PGID} # Sets the group ID for the cont> - PGID=${PGID}
- TZ=${TZ} # Sets the timezone for the cont> - TZ=${TZ}
- MAX_WORKERS=1 # Limits the number of workers t> - MAX_WORKERS=${MAX_WORKERS}
- WEB_CONCURRENCY=1 # Sets the concurrency level for> - WEB_CONCURRENCY=${WEB_CONCURRENCY}
- BASE_URL=mealie.mikemcfetridge.com # The base URL where Mealie is a> - BASE_URL=${BASE_URL}
# Email Settings # Email Settings
- SMTP_HOST=${SMTP_HOST} - SMTP_HOST=${SMTP_HOST}
- SMTP_PORT=${SMTP_PORT} - SMTP_PORT=${SMTP_PORT}
- SMTP_FROM_NAME=${SMTP_FROM_NAME} - SMTP_FROM_NAME=${SMTP_FROM_NAME}
- SMTP_AUTH_STRATEGY=${SMTP_AUTH_STRATEGY} - SMTP_AUTH_STRATEGY=${SMTP_AUTH_STRATEGY}
- SMTP_FROM_EMAIL=${SMTP_FROM_EMAI} - SMTP_FROM_EMAIL=${SMTP_FROM_EMAIL}
- SMTP_USER=${SMTP_USER} - SMTP_USER=${SMTP_USER}
- SMTP_PASSWORD=${SMTP_PASSWORD} - SMTP_PASSWORD=${SMTP_PASSWORD}
env_file: networks:
- .env - external
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:9000"]
interval: 10s
retries: 3
timeout: 10s
start_period: 30s
networks: networks:
proxy: external:
external: true external: true
+7 -2
View File
@@ -1,9 +1,14 @@
services: services:
myspeed: myspeed:
container_name: MySpeed container_name: MySpeed
image: germannewsmaker/myspeed image: germannewsmaker/myspeed:latest
ports: ports:
- '5216:5216' - '5216:5216'
volumes: volumes:
- ./myspeed:/myspeed/data - /opt/Docker-Deployments/MySpeed/data:/myspeed/data
restart: unless-stopped restart: unless-stopped
networks:
- external
networks:
external:
external: true # Tells Compose not to create this network
+9 -3
View File
@@ -1,7 +1,13 @@
# ============================================================
# SYSTEM SETTINGS
# ============================================================
TZ=America/New_York
DATA_PATH=/opt/Docker-Deployments/NginxProxyManager/data
# ============================================================
# DATABASE CREDENTIALS
# ============================================================
MYSQL_ROOT_PASSWORD=rhDGjilZm6XEMJ MYSQL_ROOT_PASSWORD=rhDGjilZm6XEMJ
MYSQL_DATABASE=npm MYSQL_DATABASE=npm
MYSQL_USER=npm MYSQL_USER=npm
MYSQL_PASSWORD=rhDGjilZm6XEMJ MYSQL_PASSWORD=rhDGjilZm6XEMJ
# TZ for container timezone
TZ=America/New_York
@@ -1,33 +1,31 @@
--- # Nginx Proxy Manager & MariaDB Stack
services: services:
db: db:
image: 'jc21/mariadb-aria:latest' image: jc21/mariadb-aria:latest
container_name: npm-db container_name: npm-db
restart: unless-stopped restart: unless-stopped
env_file: .env
environment: environment:
- MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD} - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
- MYSQL_DATABASE=${MYSQL_DATABASE} - MYSQL_DATABASE=${MYSQL_DATABASE}
- MYSQL_USER=${MYSQL_USER} - MYSQL_USER=${MYSQL_USER}
- MYSQL_PASSWORD=${MYSQL_PASSWORD} - MYSQL_PASSWORD=${MYSQL_PASSWORD}
- MARIADB_AUTO_UPGRADE=1 - MARIADB_AUTO_UPGRADE=1
- TZ=${TZ}
volumes: volumes:
- ./data/mysql:/var/lib/mysql - ${DATA_PATH}/mysql:/var/lib/mysql
networks: networks:
- proxy - internal
- proxydb
healthcheck: 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 interval: 20s
timeout: 5s timeout: 5s
retries: 5 retries: 5
start_period: 30s start_period: 30s
app: nginx-proxy-manager:
image: 'jc21/nginx-proxy-manager:latest' image: jc21/nginx-proxy-manager:latest
container_name: nginx-proxy-manager container_name: nginx-proxy-manager
restart: unless-stopped restart: unless-stopped
env_file: .env
environment: environment:
- TZ=${TZ} - TZ=${TZ}
- DB_MYSQL_HOST=db - DB_MYSQL_HOST=db
@@ -40,22 +38,24 @@ services:
- '81:81' - '81:81'
- '443:443' - '443:443'
volumes: volumes:
- ./data/npm:/data - ${DATA_PATH}/npm:/data
- ./data/letsencrypt:/etc/letsencrypt - ${DATA_PATH}/letsencrypt:/etc/letsencrypt
depends_on: depends_on:
- db db:
condition: service_healthy
restart: true
networks: networks:
- proxy - internal
- proxydb - external
healthcheck: healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:81/api/status"] test: ["CMD", "curl", "-f", "http://localhost:81/"]
interval: 20s interval: 20s
timeout: 5s timeout: 5s
retries: 5 retries: 5
start_period: 40s start_period: 40s
networks: networks:
proxy: internal:
external: true
external:
external: true external: true
proxydb:
external: true
+15
View File
@@ -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
+24 -18
View File
@@ -1,26 +1,32 @@
--- ---
services: services:
obsidian: couchdb-obsidian-livesync:
image: lscr.io/linuxserver/obsidian:latest image: docker.io/oleduc/docker-obsidian-livesync-couchdb:master
container_name: obsidian container_name: obsidian-livesync
security_opt: restart: unless-stopped
- seccomp:unconfined #optional
environment: environment:
- PUID=1000 - COUCHDB_USER=${COUCHDB_USER}
- PGID=1000 - COUCHDB_PASSWORD=${COUCHDB_PASSWORD}
- TZ=America/New_York - COUCHDB_DATABASE=${COUCHDB_DATABASE}
- SERVER_DOMAIN=${SERVER_DOMAIN}
- PUID=${PUID}
- PGID=${PGID}
- UMASK=002
- TZ=${TZ}
volumes: volumes:
- ./config:/config - ${DATA_PATH}/data:/opt/couchdb/data
- ${DATA_PATH}/config:/opt/couchdb/etc/local.d
ports: ports:
- 3000:3000 - "5984:5984"
- 3001:3001 healthcheck:
devices: test: ["CMD", "curl", "-f", "http://localhost:5984/_up"]
- /dev/dri:/dev/dri #optional interval: 30s
shm_size: "1gb" timeout: 10s
restart: always retries: 5
# used to place in the NPM / traefik network so they can talk with each other. start_period: 20s
networks: networks:
- proxy - main
networks: networks:
proxy: main:
external: true external: true
+169
View File
@@ -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
+118
View File
@@ -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
+26
View File
@@ -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
-31
View File
@@ -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
@@ -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
-22
View File
@@ -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, well 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
+15
View File
@@ -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
+5 -5
View File
@@ -1,17 +1,17 @@
TZ=America/New_York TZ=America/New_York
PUID=1000
PGID=1000
WATCHTOWER_CLEANUP=true WATCHTOWER_CLEANUP=true
WATCHTOWER_INCLUDE_RESTARTING=true WATCHTOWER_INCLUDE_RESTARTING=true
WATCHTOWER_ROLLING_RESTARTING=true WATCHTOWER_ROLLING_RESTARTING=true
WATCHTOWER_SCHEDULE=0 0 4 * * * WATCHTOWER_SCHEDULE="0 0 4 * * *"
WATCHTOWER_INCLUDE_STOPPED=true WATCHTOWER_INCLUDE_STOPPED=true
WATCHTOWER_NOTIFICATIONS=email 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_FROM=miker@mmcfetridge.net
WATCHTOWER_NOTIFICATION_EMAIL_TO=miker@mmcfetridge.net WATCHTOWER_NOTIFICATION_EMAIL_TO=miker@mmcfetridge.net
WATCHTOWER_NOTIFICATION_EMAIL_SERVER=mail.mmcfetridge.net WATCHTOWER_NOTIFICATION_EMAIL_SERVER=mail.mmcfetridge.net
WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PORT=465 WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PORT=465
WATCHTOWER_NOTIFICATION_EMAIL_SERVER_USER=miker@mmcfetridge.net WATCHTOWER_NOTIFICATION_EMAIL_SERVER_USER=miker@mmcfetridge.net
WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PASSWORD=!Sucyetat123 WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PASSWORD=!Sucyetat123
WATCHTOWER_NOTIFICATION_EMAIL_DELAY=2 WATCHTOWER_NOTIFICATION_EMAIL_DELAY=2
PUID=1000
PGID=1000
@@ -1,31 +1,39 @@
services: services:
watchtower: watchtower:
image: containrrr/watchtower image: nickfedor/watchtower:latest
container_name: watchtower container_name: watchtower
restart: unless-stopped restart: unless-stopped
env_file: .env env_file:
- .env
environment: environment:
- DOCKER_API_VERSION=1.44 - DOCKER_API_VERSION=1.44
- TZ=${TZ} - TZ=${TZ}
- PUID:=${PUID} # Reference PUID from .env - PUID=${PUID}
- PGID=${PGID} # Reference PGID from .env - PGID=${PGID}
- WATCHTOWER_CLEANUP=${WATCHTOWER_CLEANUP} - WATCHTOWER_CLEANUP=${WATCHTOWER_CLEANUP}
- WATCHTOWER_INCLUDE_RESTARTING=${WATCHTOWER_INCLUDE_RESTARTING} - WATCHTOWER_INCLUDE_RESTARTING=${WATCHTOWER_INCLUDE_RESTARTING}
- WATCHTOWER_ROLLING_RESTARTING=${WATCHTOWER_ROLLING_RESTARTING} - WATCHTOWER_ROLLING_RESTARTING=${WATCHTOWER_ROLLING_RESTARTING}
- WATCHTOWER_SCHEDULE=${WATCHTOWER_SCHEDULE} - WATCHTOWER_SCHEDULE=${WATCHTOWER_SCHEDULE}
- WATCHTOWER_INCLUDE_STOPPED=${WATCHTOWER_INCLUDE_STOPPED} - WATCHTOWER_INCLUDE_STOPPED=${WATCHTOWER_INCLUDE_STOPPED}
# - WATCHTOWER_NOTIFICATIONS=${WATCHTOWER_NOTIFICATIONS} - WATCHTOWER_NOTIFICATIONS=${WATCHTOWER_NOTIFICATIONS}
# - WATCHTOWER_NOTIFICATIONS_HOSTNAME=${WATCHTOWER_NOTIFICATIONS_HOSTNAME} - WATCHTOWER_NOTIFICATIONS_HOSTNAME=${WATCHTOWER_NOTIFICATIONS_HOSTNAME}
# - WATCHTOWER_NOTIFICATION_EMAIL_FROM=${WATCHTOWER_NOTIFICATION_EMAIL_FROM} - WATCHTOWER_NOTIFICATION_EMAIL_FROM=${WATCHTOWER_NOTIFICATION_EMAIL_FROM}
# - WATCHTOWER_NOTIFICATION_EMAIL_TO=${WATCHTOWER_NOTIFICATION_EMAIL_TO} - WATCHTOWER_NOTIFICATION_EMAIL_TO=${WATCHTOWER_NOTIFICATION_EMAIL_TO}
# - WATCHTOWER_NOTIFICATION_EMAIL_SERVER=${WATCHTOWER_NOTIFICATION_EMAIL_SERVER} - WATCHTOWER_NOTIFICATION_EMAIL_SERVER=${WATCHTOWER_NOTIFICATION_EMAIL_SERVER}
# - WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PORT=${WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PORT} - WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PORT=${WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PORT}
# - WATCHTOWER_NOTIFICATION_EMAIL_SERVER_USER=${WATCHTOWER_NOTIFICATION_EMAIL_SERVER_USER} - WATCHTOWER_NOTIFICATION_EMAIL_SERVER_USER=${WATCHTOWER_NOTIFICATION_EMAIL_SERVER_USER}
# - WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PASSWORD=${WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PASSWORD} - WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PASSWORD=${WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PASSWORD}
- WATCHTOWER_NOTIFICATION_EMAIL_DELAY=${WATCHTOWER_NOTIFICATION_EMAIL_DELAY}
security_opt: security_opt:
- no-new-privileges:true - no-new-privileges:true
volumes: volumes:
- /etc/timezone:/etc/timezone:ro - /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro - /etc/localtime:/etc/localtime:ro
- /var/run/docker.sock:/var/run/docker.sock - /var/run/docker.sock:/var/run/docker.sock
networks:
- external
networks:
external:
external: true
+19
View File
@@ -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
@@ -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
@@ -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
@@ -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
@@ -7,7 +7,7 @@ services:
- "8080:8080" - "8080:8080"
volumes: volumes:
- /opt/Docker-Deployments/searxng:/etc/searxng:rw - /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: environment:
- SEARXNG_BASE_URL=https://search.mikemcfetridge.com - SEARXNG_BASE_URL=https://search.mikemcfetridge.com
- UWSGI_WORKERS=${SEARXNG_UWSGI_WORKERS:-4} - UWSGI_WORKERS=${SEARXNG_UWSGI_WORKERS:-4}
@@ -17,4 +17,5 @@ services:
interval: 10s interval: 10s
retries: 3 retries: 3
timeout: 10s timeout: 10s
start_period: 30s start_period: 30s
#
+4 -19
View File
@@ -1,4 +1,4 @@
##### My SearXNG personal settings. # ##### My SearXNG personal settings.
use_default_settings: true use_default_settings: true
general: general:
@@ -10,8 +10,8 @@ brand:
issue_url: "" # Hides the links without crashing the parser issue_url: "" # Hides the links without crashing the parser
custom: custom:
links: links:
"Dockhand": "http://192.168.2.3:3200" "Dockhand": "http://192.168.0.8:3200"
"My Dashboard": "http://192.168.2.15:3100" "My Dashboard": "http://192.168.0.9:3100"
server: server:
port: 8080 port: 8080
@@ -35,20 +35,5 @@ ui:
# This is the standard way to cleanly enable/disable specific engines in SearXNG # This is the standard way to cleanly enable/disable specific engines in SearXNG
engines: engines:
- name: google
disabled: true
- name: duckduckgo
disabled: false
- name: wikipedia
disabled: false
- name: wikidata - name: wikidata
disabled: false disabled: true
- name: bing
disabled: false
- name: brave
disabled: false
@@ -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..