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
# ============================================================
# Your timezone (list: https://en.wikipedia.org/wiki/List_of_tz_database_time_zones)
TZ=America/New_York
# Your Linux user/group ID. Find yours with: id
# Most systems default to 1000. If yours is different, change these.
PUID=1000
PGID=1000
# ============================================================
# VPN SETTINGS — Pick your provider and fill in credentials
# Full provider list: https://github.com/qdm12/gluetun-wiki/tree/main/setup/providers
#
# IMPORTANT: VPN credentials are NOT your login email/password!
# You need service credentials from your VPN provider's manual
# setup or API section. See the provider examples at the bottom of this file.
# VPN SETTINGS (AirVPN WireGuard)
# ============================================================
# Your VPN provider (surfshark, nordvpn, protonvpn, airvpn, mullvad, private internet access, windscribe, etc.)
VPN_SERVICE_PROVIDER=airvpn
# Protocol: wireguard (recommended, faster) or openvpn
VPN_TYPE=wireguard
# --- WIREGUARD CREDENTIALS ---
# For Surfshark: go to https://my.surfshark.com/vpn/manual-setup/main → WireGuard
# For other providers: see the examples at the bottom of this file
WIREGUARD_PRIVATE_KEY=eDgf3GPFy2ltgx2RkD/Vx5wKZ4dVi28YbQmSJOrbWmk=
WIREGUARD_ADDRESSES=10.175.23.30
# Only needed for some providers (AirVPN). Leave blank if not required.
# WIREGUARD_PUBLIC_KEY=
WIREGUARD_PRESHARED_KEY=+0+hrSdzRUxKDNk1Q37PNmNJ2jsj2EzF45JtbZad4lI=
# --- OPENVPN CREDENTIALS ---
# Only needed if VPN_TYPE=openvpn. Leave blank if using WireGuard.
# OPENVPN_USER=
# OPENVPN_PASSWORD=
# --- SERVER SELECTION ---
# Pick a country close to you for best speeds
SERVER_COUNTRIES=Canada
# --- PORT FORWARDING ---
# Supported by: ProtonVPN, AirVPN, PIA. Can help with upload speeds and seeding.
# Not required for downloading. Most users don't need this.
# Set to "on" if your provider supports it, leave blank otherwise (Surfshark, NordVPN, etc.).
#VPN_PORT_FORWARDING=
# If your provider requires manually specifying a port (e.g. AirVPN):
FIREWALL_VPN_INPUT_PORTS=29261
# ============================================================
# NETWORK — Static IPs for each service
# You shouldn't need to change these unless you have a conflict.
# STATIC IP ALLOCATIONS
# ============================================================
IP_GLUETUN=172.39.0.2
IP_RADARR=172.39.0.3
@@ -76,69 +30,17 @@ IP_AUDIO=172.39.0.9
IP_NAVI=172.39.0.10
IP_LIST=172.39.0.11
IP_WATCH=172.39.0.12
# ============================================================
# PROVIDER-SPECIFIC EXAMPLES
# Uncomment and fill in the section for your VPN provider.
# WATCHTOWER CONFIGURATION
# ============================================================
# --- NORDVPN ---
# 1. Go to: https://my.nordaccount.com/dashboard/nordvpn/manual-configuration/
# 2. Generate a WireGuard private key (NordLynx)
# 3. Paste the private key below
# VPN_SERVICE_PROVIDER=nordvpn
# VPN_TYPE=wireguard
# WIREGUARD_PRIVATE_KEY=your_nordvpn_private_key_here
# WIREGUARD_ADDRESSES=10.5.0.2/16
# SERVER_COUNTRIES=United States
# --- PROTONVPN ---
# 1. Go to: https://account.protonvpn.com/ → Downloads → WireGuard configuration
# 2. Generate a config, open the file, copy the PrivateKey and Address
# 3. Port forwarding is supported on paid plans
# VPN_SERVICE_PROVIDER=protonvpn
# VPN_TYPE=wireguard
# WIREGUARD_PRIVATE_KEY=your_proton_private_key_here
# WIREGUARD_ADDRESSES=10.2.0.2/32
# SERVER_COUNTRIES=United States
# VPN_PORT_FORWARDING=on
# --- SURFSHARK ---
# 1. Go to: https://my.surfshark.com/vpn/manual-setup/main
# 2. Get WireGuard credentials
# VPN_SERVICE_PROVIDER=surfshark
# VPN_TYPE=wireguard
# WIREGUARD_PRIVATE_KEY=your_surfshark_private_key_here
# WIREGUARD_ADDRESSES=10.14.0.2/16
# SERVER_COUNTRIES=United States
# --- AIRVPN ---
# 1. Go to: https://airvpn.org/ → Client Area → Config Generator
# 2. Select Linux → WireGuard → pick a server → Generate
# 3. Copy all keys and the assigned IP
# VPN_SERVICE_PROVIDER=airvpn
# VPN_TYPE=wireguard
# WIREGUARD_PRIVATE_KEY=your_airvpn_private_key_here
# WIREGUARD_PUBLIC_KEY=your_airvpn_public_key_here
# WIREGUARD_PRESHARED_KEY=your_airvpn_preshared_key_here
# WIREGUARD_ADDRESSES=your_assigned_ip/32
# FIREWALL_VPN_INPUT_PORTS=your_forwarded_port
# VPN_PORT_FORWARDING=on
# --- MULLVAD ---
# 1. Go to: https://mullvad.net/en/account → WireGuard configuration
# VPN_SERVICE_PROVIDER=mullvad
# VPN_TYPE=wireguard
# WIREGUARD_PRIVATE_KEY=your_mullvad_private_key_here
# WIREGUARD_ADDRESSES=your_assigned_ip/32
# SERVER_COUNTRIES=United States
# --- Watchtower ---
WATCHTOWER_CLEANUP=true
WATCHTOWER_INCLUDE_RESTARTING=true
WATCHTOWER_ROLLING_RESTARTING=true
WATCHTOWER_SCHEDULE=0 0 4 * * *
WATCHTOWER_SCHEDULE="0 0 4 * * *"
WATCHTOWER_INCLUDE_STOPPED=true
WATCHTOWER_NOTIFICATIONS=email
WATCHTOWER_NOTIFICATIONS_HOSTNAME=Docker-Deply # Add Server Name or IP Address
WATCHTOWER_NOTIFICATIONS_HOSTNAME=Docker-ArrStack
WATCHTOWER_NOTIFICATION_EMAIL_FROM=miker@mmcfetridge.net
WATCHTOWER_NOTIFICATION_EMAIL_TO=miker@mmcfetridge.net
WATCHTOWER_NOTIFICATION_EMAIL_SERVER=mail.mmcfetridge.net
@@ -146,5 +48,3 @@ WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PORT=465
WATCHTOWER_NOTIFICATION_EMAIL_SERVER_USER=miker@mmcfetridge.net
WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PASSWORD=!Sucyetat123
WATCHTOWER_NOTIFICATION_EMAIL_DELAY=2
PUID=1000
PGID=1000
+46 -72
View File
@@ -1,16 +1,5 @@
# Tom Spark's ARR Stack — Automated Media Server
# ARR Stack — Automated Media Server
# https://github.com/loponai/arrstack
#
# Usage:
# 1. Copy .env.example to .env and fill in your VPN credentials
# 2. Run: bash setup-folders.sh
# 3. Run: docker compose up -d
#
# All VPN-protected services (qBittorrent, Prowlarr, FlareSolverr) run
# through Gluetun. If the VPN drops, traffic stops. Zero leaks.
#
# Radarr, Sonarr, Lidarr, Bazarr, Jellyfin, and Seerr do NOT run through
# the VPN — they need direct network access for speed and local connectivity.
networks:
arrnetwork:
@@ -22,10 +11,7 @@ networks:
services:
# ============================================================
# GLUETUN — VPN Container (kill switch + tunnel)
# All VPN-protected services route through this container.
# Ports for those services are mapped HERE, not on the services themselves.
# Docs: https://github.com/qdm12/gluetun-wiki
# GLUETUN — VPN Container
# ============================================================
gluetun:
image: qmcgaw/gluetun:latest
@@ -49,21 +35,12 @@ services:
environment:
- VPN_SERVICE_PROVIDER=${VPN_SERVICE_PROVIDER}
- VPN_TYPE=${VPN_TYPE}
# --- WireGuard credentials (most providers) ---
- WIREGUARD_PRIVATE_KEY=${WIREGUARD_PRIVATE_KEY}
- WIREGUARD_ADDRESSES=${WIREGUARD_ADDRESSES}
# - WIREGUARD_PUBLIC_KEY=${WIREGUARD_PUBLIC_KEY}
- WIREGUARD_PRESHARED_KEY=${WIREGUARD_PRESHARED_KEY}
# --- OpenVPN credentials (if using OpenVPN instead) ---
# - OPENVPN_USER=${OPENVPN_USER}
# - OPENVPN_PASSWORD=${OPENVPN_PASSWORD}
# --- Server selection ---
- SERVER_COUNTRIES=${SERVER_COUNTRIES}
# --- Port forwarding (ProtonVPN, AirVPN, PIA) ---
# - VPN_PORT_FORWARDING=${VPN_PORT_FORWARDING}
- FIREWALL_VPN_INPUT_PORTS=${FIREWALL_VPN_INPUT_PORTS}
- FIREWALL_OUTBOUND_SUBNETS=192.168.0.0/22
# --- General ---
- PUID=${PUID}
- PGID=${PGID}
- UMASK=002
@@ -80,8 +57,7 @@ services:
restart: unless-stopped
# ============================================================
# QBITTORRENT — Torrent Client (runs through Gluetun VPN)
# ALL traffic goes through the VPN tunnel. No direct internet.
# QBITTORRENT — Torrent Client
# ============================================================
qbittorrent:
image: lscr.io/linuxserver/qbittorrent:latest
@@ -113,7 +89,6 @@ services:
# ============================================================
# DEUNHEALTH — Auto-restarts unhealthy containers
# If qBittorrent loses VPN connection, this restarts it automatically.
# ============================================================
deunhealth:
image: qmcgaw/deunhealth
@@ -129,8 +104,7 @@ services:
restart: always
# ============================================================
# PROWLARR — Indexer Manager (runs through Gluetun VPN)
# Manages torrent/usenet indexers. Syncs to Radarr/Sonarr/Lidarr.
# PROWLARR — Indexer Manager
# ============================================================
prowlarr:
image: lscr.io/linuxserver/prowlarr:latest
@@ -150,8 +124,7 @@ services:
restart: unless-stopped
# ============================================================
# FLARESOLVERR — Cloudflare Bypass (runs through Gluetun VPN)
# Some indexers use Cloudflare protection. This gets around it.
# FLARESOLVERR — Cloudflare Bypass
# ============================================================
flaresolverr:
image: ghcr.io/flaresolverr/flaresolverr:latest
@@ -169,9 +142,7 @@ services:
restart: unless-stopped
# ============================================================
# RADARR — Movie Manager (NOT behind VPN)
# Searches via Prowlarr, sends downloads to qBittorrent,
# renames and hard-links completed files to media folder.
# RADARR — Movie Manager
# ============================================================
radarr:
image: lscr.io/linuxserver/radarr:latest
@@ -192,8 +163,7 @@ services:
restart: unless-stopped
# ============================================================
# SONARR — TV Show Manager (NOT behind VPN)
# Same pattern as Radarr but for TV series.
# SONARR — TV Show Manager
# ============================================================
sonarr:
image: lscr.io/linuxserver/sonarr:latest
@@ -214,8 +184,7 @@ services:
restart: unless-stopped
# ============================================================
# LIDARR — Music Manager (NOT behind VPN)
# Optional. Comment out if you don't need music automation.
# LIDARR — Music Manager
# ============================================================
lidarr:
image: lscr.io/linuxserver/lidarr:latest
@@ -236,8 +205,7 @@ services:
restart: unless-stopped
# ============================================================
# BAZARR — Subtitle Manager (NOT behind VPN)
# Automatically downloads subtitles for movies and TV shows.
# BAZARR — Subtitle Manager
# ============================================================
bazarr:
image: lscr.io/linuxserver/bazarr:latest
@@ -258,9 +226,7 @@ services:
restart: unless-stopped
# ============================================================
# JELLYFIN — Media Server (NOT behind VPN)
# Your personal streaming service. Plays movies, TV, music.
# Needs full bandwidth — never put this behind the VPN.
# JELLYFIN — Media Server
# ============================================================
jellyfin:
image: lscr.io/linuxserver/jellyfin:latest
@@ -275,36 +241,16 @@ services:
- /data/media:/data/media
ports:
- 8096:8096
# Uncomment the lines below to enable hardware transcoding (Intel Quick Sync / VAAPI).
# Only works if your system has Intel/AMD integrated graphics (/dev/dri must exist).
# If you get an error about /dev/dri not found, leave these commented out.
# devices:
# - /dev/dri:/dev/dri
networks:
arrnetwork:
ipv4_address: ${IP_JELLYFIN}
restart: unless-stopped
# ============================================================
# SEERR — Request System (NOT behind VPN)
# Netflix-like UI for requesting movies and TV shows.
# Share this with family — they never need to touch Radarr.
#
# Seerr is the unified successor to Overseerr and Jellyseerr
# (merged under seerr-team). Supports Plex, Jellyfin, and Emby.
#
# Config uses a NAMED Docker volume (not a bind mount). This is
# required: Seerr runs as the `node` user (UID 1000) and a
# bind-mounted host folder is created root-owned, causing a
# permission-denied crash loop. On Windows/WSL, bind mounts also
# corrupt the SQLite DB over SMB. Named volumes fix both cases
# (matches upstream Seerr docs).
#
# Migrating from ./jellyseerr or ./seerr bind mount? See README
# troubleshooting "Migrating Seerr config to a named volume".
# SEERR — Request System
# ============================================================
seerr:
image: ghcr.io/seerr-team/seerr:v3.0.1
image: ghcr.io/seerr-team/seerr:latest
init: true
container_name: seerr
environment:
@@ -315,7 +261,7 @@ services:
- TZ=${TZ}
- PORT=5055
volumes:
- seerr_volume:/app/config # <--- Needed or will cause a permissions issue.
- seerr_volume:/app/config
ports:
- 5055:5055
healthcheck:
@@ -329,6 +275,9 @@ services:
ipv4_address: ${IP_SEERR}
restart: unless-stopped
# ============================================================
# LISTENARR — Audiobooks & Podcasts
# ============================================================
listenarr:
image: ghcr.io/listenarrs/listenarr:canary
container_name: listenarr
@@ -348,6 +297,9 @@ services:
arrnetwork:
ipv4_address: ${IP_LIST}
# ============================================================
# AUDIOBOOKSHELF — Audiobook / Podcast Server
# ============================================================
audiobookshelf:
image: ghcr.io/advplyr/audiobookshelf:latest
container_name: audiobookshelf
@@ -367,6 +319,10 @@ services:
networks:
arrnetwork:
ipv4_address: ${IP_AUDIO}
# ============================================================
# NAVIDROME — Music Streaming
# ============================================================
navidrome:
image: deluan/navidrome:latest
container_name: navidrome
@@ -388,16 +344,18 @@ services:
arrnetwork:
ipv4_address: ${IP_NAVI}
# ============================================================
# WATCHTOWER — Automatic Image Updates
# ============================================================
watchtower:
image: containrrr/watchtower
image: nickfedor/watchtower:latest
container_name: watchtower
restart: unless-stopped
env_file: .env
environment:
- DOCKER_API_VERSION=1.44
- TZ=${TZ}
- PUID:=${PUID} # Reference PUID from .env
- PGID=${PGID} # Reference PGID from .env
- PUID=${PUID}
- PGID=${PGID}
- WATCHTOWER_CLEANUP=${WATCHTOWER_CLEANUP}
- WATCHTOWER_INCLUDE_RESTARTING=${WATCHTOWER_INCLUDE_RESTARTING}
- WATCHTOWER_ROLLING_RESTARTING=${WATCHTOWER_ROLLING_RESTARTING}
@@ -411,6 +369,7 @@ services:
- WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PORT=${WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PORT}
- WATCHTOWER_NOTIFICATION_EMAIL_SERVER_USER=${WATCHTOWER_NOTIFICATION_EMAIL_SERVER_USER}
- WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PASSWORD=${WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PASSWORD}
- WATCHTOWER_NOTIFICATION_EMAIL_DELAY=${WATCHTOWER_NOTIFICATION_EMAIL_DELAY}
security_opt:
- no-new-privileges:true
volumes:
@@ -421,7 +380,22 @@ services:
networks:
arrnetwork:
ipv4_address: ${IP_WATCH}
# Go to the VERY BOTTOM of your file (outside of services) and add this:
sencho:
image: saelix/sencho:latest
container_name: sencho
restart: unless-stopped
ports:
- "1852:1852"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- /opt/Docker-Deployments/Sencho/data:/app/data
# Change this line so the container path matches the host path.
- /opt/Docker-Deployments:/opt/Docker-Deployments
environment:
- COMPOSE_DIR=/opt/Docker-Deployments
- DATA_DIR=/app/data
volumes:
gluetun_volume:
qbittorrent_volume:
+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
AUTHENTIK_SECRET_KEY=voCiuozip37G/UISer4WV8FBLrMD8diHINmALHvWQ0A7PkzMoYH9xf3MnTDWEylN1TS1dp7JJ2f3nv1V
# ============================================================
# SYSTEM SETTINGS
# ============================================================
TZ=America/New_York
PUID=1000
PGID=1000
DATA_PATH=/home/miker/docker/authentik
#Enable error reporting
AUTHENTIK_ERROR_REPORTING__ENABLED=true
# SMTP Host Emails are sent to
AUTHENTIK_EMAIL__HOST=mail.mmcfetridge.net
AUTHENTIK_EMAIL__PORT=587
AUTHENTIK_EMAIL__USERNAME=miker@mmcfetridge.net
AUTHENTIK_EMAIL__PASSWORD=!Sucyetat123
AUTHENTIK_EMAIL__USE_TLS=true
AUTHENTIK_EMAIL__USE_SSL=false
AUTHENTIK_EMAIL__TIMEOUT=10
AUTHENTIK_EMAIL__FROM=miker@mmcfetridge.net
# Authentik listens on port 9000 for HTTP and 9443 for HTTPS. To change the exposed ports change these values
# ============================================================
# AUTHENTIK VERSION & PORTS
# ============================================================
AUTHENTIK_IMAGE=ghcr.io/goauthentik/server
AUTHENTIK_TAG=2026.5.6
COMPOSE_PORT_HTTP=9500
COMPOSE_PORT_HTTPS=9543
# ============================================================
# DATABASE CREDENTIALS
# ============================================================
PG_DB=authentik
PG_USER=authentik
PG_PASS=vXqYGFaTTldI8+DydREqaf3RRvHVRDXAlyKfaEXQ92Nw570A
# ============================================================
# SECURITY KEYS
# ============================================================
# Generate with: openssl rand -base64 36
AUTHENTIK_SECRET_KEY=voCiuozip37G/UISer4WV8FBLrMD8diHINmALHvWQ0A7PkzMoYH9xf3MnTDWEylN1TS1dp7JJ2f3nv1V
+44 -65
View File
@@ -1,100 +1,79 @@
---
# Authentik Identity & SSO Stack
services:
postgresql:
image: docker.io/library/postgres:16-alpine
restart: unless-stopped
container_name: authentik-db
restart: unless-stopped
environment:
- POSTGRES_DB=${PG_DB:-authentik}
- POSTGRES_USER=${PG_USER:-authentik}
- POSTGRES_PASSWORD=${PG_PASS}
- TZ=${TZ}
volumes:
- ${DATA_PATH}/database:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -d $${POSTGRES_DB} -U $${POSTGRES_USER}"]
start_period: 20s
interval: 30s
retries: 5
timeout: 5s
volumes:
- ./database:/var/lib/postgresql/data
environment:
POSTGRES_PASSWORD: ${PG_PASS:?database password required}
POSTGRES_USER: ${PG_USER:-authentik}
POSTGRES_DB: ${PG_DB:-authentik}
env_file:
- .env
networks:
- authentik
redis:
image: docker.io/library/redis:alpine
command: --save 60 1 --loglevel warning
restart: unless-stopped
container_name: authentik-redis
healthcheck:
test: ["CMD-SHELL", "redis-cli ping | grep PONG"]
start_period: 20s
interval: 30s
retries: 5
timeout: 3s
volumes:
- ./redis:/data
start_period: 20s
networks:
- authentik
server:
image: ${AUTHENTIK_IMAGE:-ghcr.io/goauthentik/server}:${AUTHENTIK_TAG:-2025.8.1}
restart: unless-stopped
image: ${AUTHENTIK_IMAGE:-ghcr.io/goauthentik/server}:${AUTHENTIK_TAG:-2026.5.6}
container_name: authentik-server
restart: unless-stopped
command: server
environment:
AUTHENTIK_REDIS__HOST: redis
AUTHENTIK_POSTGRESQL__HOST: postgresql
AUTHENTIK_POSTGRESQL__USER: ${PG_USER:-authentik}
AUTHENTIK_POSTGRESQL__NAME: ${PG_DB:-authentik}
AUTHENTIK_POSTGRESQL__PASSWORD: ${PG_PASS}
- AUTHENTIK_POSTGRESQL__HOST=postgresql
- AUTHENTIK_POSTGRESQL__NAME=${PG_DB:-authentik}
- AUTHENTIK_POSTGRESQL__USER=${PG_USER:-authentik}
- AUTHENTIK_POSTGRESQL__PASSWORD=${PG_PASS}
- AUTHENTIK_SECRET_KEY=${AUTHENTIK_SECRET_KEY}
- TZ=${TZ}
volumes:
- ./media:/media
- ./custom-templates:/templates
env_file:
- .env
- ${DATA_PATH}/data:/data
- ${DATA_PATH}/custom-templates:/templates
ports:
- "${COMPOSE_PORT_HTTP:-9000}:9000"
- "${COMPOSE_PORT_HTTPS:-9443}:9443"
- "${COMPOSE_PORT_HTTP}:9000"
- "${COMPOSE_PORT_HTTPS}:9443"
shm_size: 512mb
depends_on:
- postgresql
- redis
postgresql:
condition: service_healthy
networks:
- authentik
- main
worker:
image: ${AUTHENTIK_IMAGE:-ghcr.io/goauthentik/server}:${AUTHENTIK_TAG:-2025.8.1}
restart: unless-stopped
image: ${AUTHENTIK_IMAGE:-ghcr.io/goauthentik/server}:${AUTHENTIK_TAG:-2026.5.6}
container_name: authentik-worker
restart: unless-stopped
command: worker
environment:
AUTHENTIK_REDIS__HOST: redis
AUTHENTIK_POSTGRESQL__HOST: postgresql
AUTHENTIK_POSTGRESQL__USER: ${PG_USER:-authentik}
AUTHENTIK_POSTGRESQL__NAME: ${PG_DB:-authentik}
AUTHENTIK_POSTGRESQL__PASSWORD: ${PG_PASS}
# `user: root` and the docker socket volume are optional.
# See more for the docker socket integration here:
# https://goauthentik.io/docs/outposts/integrations/docker
# Removing `user: root` also prevents the worker from fixing the permissions
# on the mounted folders, so when removing this make sure the folders have the correct UID/GID
# (1000:1000 by default)
user: root
environment:
- AUTHENTIK_POSTGRESQL__HOST=postgresql
- AUTHENTIK_POSTGRESQL__NAME=${PG_DB:-authentik}
- AUTHENTIK_POSTGRESQL__USER=${PG_USER:-authentik}
- AUTHENTIK_POSTGRESQL__PASSWORD=${PG_PASS}
- AUTHENTIK_SECRET_KEY=${AUTHENTIK_SECRET_KEY}
- TZ=${TZ}
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- ./media:/media
- ./certs:/certs
- ./custom-templates:/templates
env_file:
- .env
- ${DATA_PATH}/data:/data
- ${DATA_PATH}/certs:/certs
- ${DATA_PATH}/custom-templates:/templates
shm_size: 512mb
depends_on:
- postgresql
- redis
postgresql:
condition: service_healthy
networks:
- authentik
- main
networks:
main:
external: true
authentik:
external: true
+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
+320 -451
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 {
font-family: 'DM Sans', sans-serif;
/* APPLY STYLING AND THEME VARIABLES GLOBALLY & ON ACTIVE THEMES */
:root, .dark, .theme-gray, .theme-slate, .theme-zinc {
font-family: 'Poppins', sans-serif;
/* DRACULA COLORS */
--dracula-background: #282a36;
--dracula-background-dark: #15161d;
--dracula-foreground: #44475a;
/* DRACULA & CYBERPUNK COLOR SYSTEM */
--dracula-background: #181923;
--dracula-background-dark: #0f1015;
--dracula-foreground: #2d3142;
--dracula-text: #f8f8f2;
--dracula-slate: #6272a4;
--dracula-cyan: #8be9fd;
--dracula-green: #50fa7ae8;
--dracula-green: #50fa7b;
--dracula-orange: #ffb86c;
--dracula-pink: #ff79c6;
--dracula-purple: #bd93f9;
--dracula-red: #ff5555;
--dracula-yellow: #f1fa8c;
/* Theme preset colors */
/* Theme preset colors (RGB values for Tailwind transparency support) */
--color-50: 249 250 251;
--color-100: 243 244 246;
--color-200: 248 248 242; /* Text Color - use Dracula text color */
--color-200: 248 248 242; /* Text Color */
--color-300: 209 213 219;
--color-400: 156 163 175;
--color-500: 107 114 128;
--color-600: 75 85 99;
--color-700: 55 65 81;
--color-800: 40 42 54; /* Background color - use Dracula theme color */
--color-900: 21 22 29; /* Dracula specific */
--color-logo-start: 156 163 175;
--color-logo-stop: 55 65 81;
--color-700: 45 49 66;
--color-800: 24 25 35; /* Main container background */
--color-900: 15 16 21; /* Core background */
--color-logo-start: 189 147 249;
--color-logo-stop: 139 233 253;
--standard-bg: #44475a8e;
--standard-bg: rgba(45, 49, 66, 0.45);
/* INFO WIDGET COLORS */
--info-widgets: var(--dracula-purple);
--resource-bar-bg: var(--standard-bg);
--resource-bar-fg: var(--dracula-green);
--info-widgets: var(--dracula-cyan);
--resource-bar-bg: rgba(98, 114, 164, 0.2);
--resource-bar-fg: var(--dracula-cyan);
--widget-border: var(--dracula-foreground);
--widget-border: rgba(139, 233, 253, 0.2);
/* SERVICES COLORS */
--service-group: var(--dracula-purple);
--service-name: var(--dracula-text);
--service-description: var(--dracula-purple);
--service-description: #a9b1d6;
--service-block-bg: #232530;
--service-block-bg: rgba(15, 16, 21, 0.7);
--service-block-text: var(--dracula-pink);
/* BOOKMARKS COLORS */
--bookmark-group: var(--dracula-purple);
--bookmark-icon-bg: #44475a60;
--bookmark-icon-bg: rgba(189, 147, 249, 0.15);
--bookmark-icon: var(--dracula-purple);
--bookmark-name: var(--dracula-text);
/* ALL CARD COLORS */
--card-color: #44475a46;
--card-color-hover: #44475a91;
/* FOOTER COLORS */
--footer-items: var(--dracula-pink);
/* ALL CARD COLORS (GLASSMORPHISM DEFAULT) */
--card-color: rgba(30, 32, 48, 0.55);
--card-color-hover: rgba(40, 44, 68, 0.8);
/* FOOTER COLORS */
--footer-items: var(--dracula-purple);
--scrollbar-fg: var(--dracula-purple);
--scrollbar-bg: var(--standard-bg);
--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;
}
/* ==========================================
* FUTURISTIC SCIFI HUD OVERLAY
* ========================================== */
body {
background-color: #0c0d12 !important;
position: relative;
overflow-x: hidden;
}
/*******************************
* INFORMATION WIDGETS STYLES *
*******************************/
#information-widgets {
border-color: var(--widget-border);
}
body::before {
content: "";
position: fixed;
top: 0; left: 0; right: 0; bottom: 0;
background:
linear-gradient(rgba(12, 13, 18, 0.75), rgba(12, 13, 18, 0.85)),
linear-gradient(90deg, rgba(139, 233, 253, 0.02) 1px, transparent 1px),
linear-gradient(rgba(139, 233, 253, 0.02) 1px, transparent 1px);
background-size: 100% 100%, 50px 50px, 50px 50px;
pointer-events: none;
z-index: -1;
animation: gridPan 120s linear infinite;
}
#information-widgets * {
color: var(--info-widgets);
}
/* Add a neon scanline effect */
body::after {
content: "";
position: fixed;
top: 0; left: 0; width: 100%; height: 100%;
background: linear-gradient(rgba(18, 16, 16, 0) 50%, rgba(0, 0, 0, 0.25) 50%), linear-gradient(90deg, rgba(255, 0, 0, 0.06), rgba(0, 255, 0, 0.02), rgba(0, 0, 255, 0.06));
background-size: 100% 4px, 6px 100%;
pointer-events: none;
z-index: 9999;
opacity: 0.15;
}
.resource-usage {
background-color: var(--resource-bar-bg);
}
@keyframes gridPan {
from { background-position: 0 0, 0 0, 0 0; }
to { background-position: 0 0, 1000px 1000px, 1000px 1000px; }
}
.resource-usage > div {
background-color: var(--resource-bar-fg);
}
/* ==========================================
* TYPOGRAPHY & TITLE STYLES
* ========================================== */
.service-group-name, .bookmark-group-name, #widgets-title {
font-family: 'Orbitron', sans-serif !important;
font-weight: 700 !important;
letter-spacing: 0.15em !important;
text-transform: uppercase !important;
text-shadow: 0 0 10px rgba(189, 147, 249, 0.6) !important;
color: var(--dracula-purple) !important;
}
/*******************************
* SERVICES STYLES *
*******************************/
.service-group-icon > div {
background: var(--service-group) !important; /* group label ICON color */
}
.service-name {
font-family: 'Rajdhani', sans-serif !important;
font-weight: 700 !important;
font-size: 1.15rem !important;
letter-spacing: 0.03em !important;
color: var(--dracula-text) !important;
}
.service-group-name {
color: var(--service-group); /* group label NAME color */
}
.service-description {
font-family: 'Poppins', sans-serif !important;
font-size: 0.8rem !important;
color: #a9b1d6 !important;
}
.services-group > button > svg {
color: var(--service-group); /* group label EXPAND/COLLAPSE ICON color */
}
/* ==========================================
* GLASSMORPHISM CARDS & ANIMATIONS
* ========================================== */
.service-card, li.bookmark > a, #information-widgets, #dracula-calendar {
background: var(--card-color) !important;
backdrop-filter: blur(14px) !important;
-webkit-backdrop-filter: blur(14px) !important;
border: 1px solid rgba(255, 255, 255, 0.06) !important;
box-shadow: 0 8px 32px 0 rgba(0, 0, 0, 0.4) !important;
transition: all 0.4s cubic-bezier(0.165, 0.84, 0.44, 1) !important;
position: relative;
overflow: hidden;
}
.service-card {
background-color: var(--card-color);
}
/* 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;
}
.service-card:hover {
background-color: var(--card-color-hover);
}
/* 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-name.text-sm {
font-size: 0.95rem;
color: var(--service-name);
}
.service-card:hover::after {
border-top-color: var(--dracula-cyan);
border-left-color: var(--dracula-cyan);
width: 15px; height: 15px;
}
.service-description.text-xs {
font-size: 0.75rem;
color: var(--service-description);
}
/* 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 img {
border-radius: 25%;
}
.service-card:hover img {
transform: rotate(5deg) scale(1.05);
border-color: rgba(139, 233, 253, 0.4);
}
.service-block {
background: var(--service-block-bg);
}
/* ==========================================
* 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;
}
.service-block .uppercase {
color: var(--service-block-text);
}
/* 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;
}
.service-block .font-thin {
color: var(--dracula-text);
}
@keyframes statusPulse {
0% { transform: scale(1); opacity: 0.8; }
100% { transform: scale(2.4); opacity: 0; }
}
/*******************************
* BOOKMARK STYLES *
*******************************/
.bg-red-500, .text-red-500 {
position: relative;
background-color: var(--dracula-red) !important;
box-shadow: 0 0 10px var(--dracula-red) !important;
}
.bookmark-group-name {
color: var(--bookmark-group);
}
.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;
}
.bookmark-icon {
/* ==========================================
* 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; /* If using si or md icons, make default purple */
}
.bookmark-icon > div > div {
background: var(--bookmark-icon) !important;
}
.bookmark-name.text-xs {
font-size: 0.85rem;
color: var(--bookmark-name);
}
.bookmark-name {
font-family: 'Poppins', sans-serif !important;
font-weight: 500;
}
li.bookmark > a {
background-color: var(--card-color);
}
/* Calendar widget tweaks */
#dracula-calendar .flex.justify-between.flex-wrap span {
color: var(--dracula-purple) !important;
font-family: 'Rajdhani', sans-serif;
font-weight: 700;
}
li.bookmark > a:hover {
background-color: var(--card-color-hover);
}
#footer svg {
color: var(--footer-items) !important;
filter: drop-shadow(0 0 5px rgba(189, 147, 249, 0.5));
}
/*******************************
* 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 {
content: "";
opacity: 0.40;
position: absolute; top: 0px; left: 0px; right: 0px; bottom: 0px; z-index: 0;
/* 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;
}
/* DARK */
#red .dark\:hover\:bg-white\/10:is(.dark *).service-card::before { background-color: #812020; }
#yellow .dark\:hover\:bg-white\/10:is(.dark *).service-card::before { background-color: #818120; }
#green .dark\:hover\:bg-white\/10:is(.dark *).service-card::before { background-color: #208120; }
#cyan .dark\:hover\:bg-white\/10:is(.dark *).service-card::before { background-color: #208181; }
#blue .dark\:hover\:bg-white\/10:is(.dark *).service-card::before { background-color: #202081; }
#purple .dark\:hover\:bg-white\/10:is(.dark *).service-card::before { background-color: #812081; }
#black .dark\:hover\:bg-white\/10:is(.dark *).service-card::before { background-color: #000000; }
#white .dark\:hover\:bg-white\/10:is(.dark *).service-card::before { background-color: #ffffff; }
/* LIGHT */
#red .hover\:bg-theme-300\/20.service-card::before { background-color: #ff0000; }
#yellow .hover\:bg-theme-300\/20.service-card::before { background-color: #ffff00; }
#green .hover\:bg-theme-300\/20.service-card::before { background-color: #00ff00; }
#cyan .hover\:bg-theme-300\/20.service-card::before { background-color: #00ffff; }
#blue .hover\:bg-theme-300\/20.service-card::before { background-color: #0000ff; }
#purple .hover\:bg-theme-300\/20.service-card::before { background-color: #ff00ff; }
#black .hover\:bg-theme-300\/20.service-card::before { background-color: #ffffff; }
#white .hover\:bg-theme-300\/20.service-card::before { background-color: #000000; }
#orange .hover\:bg-theme-300\/20.service-card::before { background-color: #ffa500; }
#pink .hover\:bg-theme-300\/20.service-card::before { background-color: #ffc0cb; }
#teal .hover\:bg-theme-300\/20.service-card::before { background-color: #008080; }
#magenta .hover\:bg-theme-300\/20.service-card::before { background-color: #ff00ff; }
#lime .hover\:bg-theme-300\/20.service-card::before { background-color: #00ff00; }
#navy .hover\:bg-theme-300\/20.service-card::before { background-color: #000080; }
#maroon .hover\:bg-theme-300\/20.service-card::before { background-color: #800000; }
#olive .hover\:bg-theme-300\/20.service-card::before { background-color: #808000; }
#silver .hover\:bg-theme-300\/20.service-card::before { background-color: #c0c0c0; }
#gray .hover\:bg-theme-300\/20.service-card::before { background-color: #808080; }
#gold .hover\:bg-theme-300\/20.service-card::before { background-color: #ffd700; }
#coral .hover\:bg-theme-300\/20.service-card::before { background-color: #ff7f50; }
#salmon .hover\:bg-theme-300\/20.service-card::before { background-color: #fa8072; }
#indigo .hover\:bg-theme-300\/20.service-card::before { background-color: #4b0082; }
#violet .hover\:bg-theme-300\/20.service-card::before { background-color: #ee82ee; }
#turquoise .hover\:bg-theme-300\/20.service-card::before { background-color: #40e0d0; }
#plum .hover\:bg-theme-300\/20.service-card::before { background-color: #dda0dd; }
#orchid .hover\:bg-theme-300\/20.service-card::before { background-color: #da70d6; }
#tan .hover\:bg-theme-300\/20.service-card::before { background-color: #d2b48c; }
#beige .hover\:bg-theme-300\/20.service-card::before { background-color: #f5f5dc; }
#mint .hover\:bg-theme-300\/20.service-card::before { background-color: #98ff98; }
#lavender .hover\:bg-theme-300\/20.service-card::before { background-color: #e6e6fa; }
#chocolate .hover\:bg-theme-300\/20.service-card::before { background-color: #d2691e; }
#crimson .hover\:bg-theme-300\/20.service-card::before { background-color: #dc143c; }
#khaki .hover\:bg-theme-300\/20.service-card::before { background-color: #f0e68c; }
#aqua .hover\:bg-theme-300\/20.service-card::before { background-color: #00ffff; }
#azure .hover\:bg-theme-300\/20.service-card::before { background-color: #f0ffff; }
#bisque .hover\:bg-theme-300\/20.service-card::before { background-color: #ffe4c4; }
#bronze .hover\:bg-theme-300\/20.service-card::before { background-color: #cd7f32; }
#charcoal .hover\:bg-theme-300\/20.service-card::before { background-color: #36454f; }
#emerald .hover\:bg-theme-300\/20.service-card::before { background-color: #50c878; }
#ivory .hover\:bg-theme-300\/20.service-card::before { background-color: #fffff0; }
#jade .hover\:bg-theme-300\/20.service-card::before { background-color: #00a86b; }
#peach .hover\:bg-theme-300\/20.service-card::before { background-color: #ffe5b4; }
#rose .hover\:bg-theme-300\/20.service-card::before { background-color: #ff007f; }
#ruby .hover\:bg-theme-300\/20.service-card::before { background-color: #e0115f; }
#sapphire .hover\:bg-theme-300\/20.service-card::before { background-color: #0f52ba; }
#sepia .hover\:bg-theme-300\/20.service-card::before { background-color: #704214; }
#steel .hover\:bg-theme-300\/20.service-card::before { background-color: #4682b4; }
#amber .hover\:bg-theme-300\/20.service-card::before { background-color: #ffbf00; }
#cerulean .hover\:bg-theme-300\/20.service-card::before { background-color: #007ba7; }
#periwinkle .hover\:bg-theme-300\/20.service-card::before { background-color: #ccccff; }
#scarlet .hover\:bg-theme-300\/20.service-card::before { background-color: #ff2400; }
#slate .hover\:bg-theme-300\/20.service-card::before { background-color: #708090; }
#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 ######################################################################
- Infrastructure:
- Proxmox 1:
- Proxmox 1: # Main Virt Server
id: blue
tab: Home
href: https://192.168.2.1:8006
@@ -37,30 +37,36 @@
description: Authentik SSO
widget:
type: authentik
url: https://192.168.2.3:9543
url: https://192.168.2.6:9543
key: NW5ldUK8qDRY91ny67dE6ckWCMXThF9nwj6EZw7pKbS5FzXx5wouAo4sC19n
version: 2
- Dockhand:
id: cyan
tab: Home
href: http://192.168.2.3:3200
href: http://192.168.2.6:3200
icon: dockhand.png
description: Dockhand
widget:
type: dockhand
url: http://192.168.2.3:3200
url: http://192.168.2.6:3200
username: mmcfetridge
password: "!Sucyetat123"
fields: ["running", "total", "pending_updates", "paused"]
- Applications:
- OwnCloud:
id: purple
- Mailcow:
id: cyan
tab: Home
icon: owncloud.png
href: https://owncloud.mcfetridge.us
description: File Sync & Share
href: https://216.144.227.142/admin
icon: mailcow.png
description: mailcow
widget:
type: mailcow
url: https://mail.mmcfetridge.net
key: 2C3DAF-9DA97F-22FF12-851295-2A7E37
############################################## APPS TAB Services ###########################################################
- Applications:
- Immich:
id: white
tab: Home
@@ -69,49 +75,61 @@
description: Photos Server
widget:
type: immich
url: http://192.168.2.3:2283
url: http://192.168.2.6:2283
key: "MLbcal27A67J6FZV1PIb3AdMsRf8xZC1uruOLB7js"
fields: ["users", "photos", "storage"]
version: 2
- Trilium:
id: gold
tab: Home
href: http://192.168.2.3:8180
icon: trilium.png
description: Trilium Server
widget:
type: trilium
url: http://192.168.2.3:8180
key: "Z0qLO33tMHgy_c0nq/pZAJMR/8Em5xrwOEJ6EfiyNEWkMurMSnRdVdtM="
- Forgejo:
id: green
tab: Home
href: https://forgejo.mikemcfetridge.com
icon: forgejo.png
description: Forgejo Git & CICD
- MySpeed:
id: lime
tab: Home
icon: myspeed.png
href: http://192.168.2.3:5216
href: http://192.168.2.13:5216
widget:
type: myspeed
url: http://192.168.2.3:5216
url: http://192.168.2.13:5216
password: "!Sucyetat123" # only required if password is set
- mealie:
id: cobalt
tab: Home
icon: mealie.png
href: http://192.168.2.7:9000/
href: http://192.168.2.13:9200/
widget:
type: mealie
url: http://192.168.2.7:9000
key: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJsb25nX3Rva2VuIjp0cnVlLCJpZCI6IjVlYzIwNTk2LTEyY2QtNDFkMS05MTc5LWUzOWFkYjk3OWE2MyIsIm5hbWUiOiJob21lcGFnZSIsImludGVncmF0aW9uX2lkIjoiZ2VuZXJpYyIsImV4cCI6MTkzNjU0MzE3N30.C1PWK51JOpmzHwR9zmlvVShWC7sasKv0aO6PS47LQqo
url: http://192.168.2.13:9200
key: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJsb25nX3Rva2VuIjp0cnVlLCJpZCI6IjMxNWM4ZmNjLWI1Y2ItNDMyMy1hNDNmLTIyNjAwYjU2ZTJlOSIsIm5hbWUiOiJob21lcGFnZSIsImludGVncmF0aW9uX2lkIjoiZ2VuZXJpYyIsImV4cCI6MTk0MjI2NjU4NH0.iPE6newlQ3PVqdbgDCDdsAqZrwZ6glROWI1kvq5zb_I
version: 2 # only required if version > 1, defaults to 1
- Nextcloud:
id: gold
tab: Home
href: https://next.mcfetridge.us
icon: nextcloud.png
description: Nextcloud Server
widget:
type: nextcloud
url: https://next.mcfetridge.us
username: mmcfetridge
password: "!Sucyetat123"
- MyGitea:
id: navy
tab: Home
icon: gitea.png
href: https://gitea.mikemcfetridge.com/
widget:
type: gitea
url: https://gitea.mikemcfetridge.com/
key: 6cac00dd2f58fcc1bcdeae858f896b1995a19fd9
- BookStack:
id: slate
tab: Home
icon: bookstack.png
href: https://book.mikemcfetridge.com/
############################################## MEDIA TAB Services ###########################################################
- Media downloader:
- Calendar:
@@ -131,39 +149,51 @@
service_group: Media downloader
service_name: Radarr
- Gluetun:
id: jade
tab: System
href: http://192.168.2.8:8000
icon: gluetun.png
description: Media VPN Server
widget:
type: gluetun
url: http://192.168.2.8:8000
fields: ["public_ip", "region", "country"]
version: 2 # optional, default is 1
- Sonarr:
id: crimson
tab: Media
href: http://192.168.2.16:8989
href: http://192.168.2.8:8989
icon: sonarr.png
description: TV Show Service
widget:
type: sonarr
url: http://192.168.2.16:8989
key: 8746f486831545e3b6c9014657ac9c11
url: http://192.168.2.8:8989
key: b4227fd07fd046f094d620b88d92e494
fields: ["wanted", "queued", "series"]
- Radarr:
id: lavender
tab: Media
href: http://192.168.2.16:7878
href: http://192.168.2.8:7878
icon: radarr.png
description: Movie Service
widget:
type: radarr
url: http://192.168.2.16:7878
key: ee95503f6fca4cf7b9c8c3f3fc45df39
url: http://192.168.2.8:7878
key: 9b0e1202f7b94907ba92a1ea23304fa4
fields: ["wanted", "missing", "queued", "movies"]
- Qbittorrent:
id: teal
tab: Media
href: http://192.168.2.16:8118
href: http://192.168.2.8:8080
icon: qbittorrent.png
description: Download Client
widget:
type: qbittorrent
url: http://192.168.2.16:8118
url: http://192.168.2.8:8080
username: admin
password: "!Sucyetat123"
@@ -171,36 +201,36 @@
- Jellyfin:
id: violet
tab: Media
href: http://192.168.2.16:8096
href: http://192.168.2.8:8096
icon: jellyfin.png
description: Movies & TV Shows
widget:
type: jellyfin
url: http://192.168.2.16:8096
key: 617cc65c15da4b3eaac10568c25a8c36
url: http://192.168.2.8:8096
key: ffe8e2b31fd24464ac779121e920ac25
enableBlocks: true
enableNowPlaying: true
- Jellyseerr:
id: aqua
tab: Media
href: http://192.168.2.16:5055
href: http://192.168.2.8:5055
icon: jellyseerr.png
description: Movie/show Database
widget:
type: jellyseerr
url: http://192.168.2.16:5055
key: MTc1NDI2NTczOTQyMDA2ODRjOWY0LWJmZmEtNGE1OC05MzM2LTAwMDM4OWRmYmQ3Yg==
url: http://192.168.2.8:5055
key: MTc4MzM0NDc0OTI1OWY1YzJkYWJkLTA0OWEtNDY0NS05ZTMwLTI3NjFkZjYxNjdhZQ==
fields: ["pending", "approved", "available"]
- Navidrome:
id: navy
tab: Media
icon: navidrome.png
href: http://192.168.2.16:4533
href: http://192.168.2.8:4533
widget:
type: navidrome
url: http://192.168.2.16:4533
url: http://192.168.2.8:4533
user: mmcfetridge
token: 05dee16046666bb05d98291b9c6e39d3
salt: 50c05a
@@ -208,51 +238,26 @@
- AudioBookShelf:
id: beige
tab: Media
href: http://192.168.2.16:13378
href: http://192.168.2.8:13378
icon: audiobookshelf.png
description: Index Server
widget:
type: audiobookshelf
url: http://192.168.2.16:13378
key: "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiI4MDQ5Y2U4Mi0xZjlmLTRiYTEtOWY3Zi03N2U4YmRiYjg0OGEiLCJ1c2VybmFtZSI6Im1tY2ZldHJpZGdlIiwiaWF0IjoxNzQ4MTk4NzUyfQ.Tey3wxo61euuJEwc2ziE_PukdOUz7pNZKG8SmOdWB-c"
url: http://192.168.2.8:13378
key: "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJrZXlJZCI6IjU1MzViZDFiLTI3NGUtNGNjOC1iMWZkLTNiZWFiNjg0NDQ1YiIsIm5hbWUiOiJob21lcGFnZSIsInR5cGUiOiJhcGkiLCJpYXQiOjE3ODM0NjE1NjJ9.BYvicD24tA3lEx_ktwmf6Igme6dpLj1SUrc0Y9ISBMs"
fields: ["podcasts", "books"]
##################################### Network & System TAB Services ##############################################################
- Network:
- Pi-hole:
id: slate
tab: Network
href: http://192.168.2.8/admin/login
icon: pi-hole.png
widget:
type: pihole
url: http://192.168.2.8
version: 6
key: "!Sucyetat123"
fields: ["queries", "blocked", "blocked_percent", "gravity"]
- Technitium:
id: burgundy
tab: Network
href: http://192.168.2.9:5380
icon: technitium.png
description: Technitium DNS Server
widget:
type: technitium
url: http://192.168.2.9:5380
key: 03348d06cd472fbd091d8232b1c13321ff70a8628dad7b0c23dd4512a18fb34b
range: LastDay
fields: ["totalQueries", "totalAuthoritative", "totalCached", "totalServerFailure"]
- Proxy Manager:
- Nginx Proxy Manager:
id: emerald
tab: Network
href: http://192.168.2.3:81
href: http://192.168.2.12:81
icon: nginx-proxy-manager.png
description: Nginx Proxy Manager
widget:
type: npm
url: http://192.168.2.3:81
url: http://192.168.2.12:81
username: mmcfetridg@aol.com
password: "!Sucyetat123"
fields: ["enabled", "disabled", "total"]
@@ -261,25 +266,17 @@
id: salmon
tab: Network
icon: pangolin.png
href: https://pangolin.mmcfetridge.net
href: https://app.pangolin.net
description: External network
widget:
type: pangolin
url: https://api.mmcfetridge.net/v1
key: "2o4g9gak61mig2i.5s5yxu4o2ek7haepzumar2ldl4mmzqpbrcfnpqdf"
org: homelab
url: https://api.pangolin.net
key: "w3f8ong2hz7a3da.dappsg2veyo36my5ibsmrmnzd2c2626lyrok7inn"
org: org_lsxd0ocafwikxgs
fields: ["sites", "resources", "targets"]
######################################## System TAB Services ######################################################################
- Systems:
- Gluetun:
id: jade
tab: System
href: http://192.168.2.16:8000
icon: gluetun.png
description: Media VPN Server
widget:
type: gluetun
url: http://192.168.2.16:8000
fields: ["public_ip", "region", "country"]
- Public IP:
icon: mdi-web
@@ -294,6 +291,37 @@
label: WAN IP
format: text
- Technitium:
id: burgundy
tab: Network
href: http://192.168.2.3:5380
icon: technitium.png
description: Technitium DNS Server
widget:
type: technitium
url: http://192.168.2.3:5380
key: 03348d06cd472fbd091d8232b1c13321ff70a8628dad7b0c23dd4512a18fb34b
range: LastDay
fields: ["totalQueries", "totalAuthoritative", "totalCached", "totalServerFailure"]
- PatchMon:
id: cyan
tab: Network
href: https://patch.mikemcfetridge.com
description: PatchMon Statistics
icon: https://patch.mikemcfetridge.com/assets/logo_square_default.svg
widget:
type: customapi
url: https://patch.mikemcfetridge.com/api/v1/gethomepage/stats
headers:
Authorization: Basic cGF0Y2htb25fYWVfNTIxMmM5ZDg4M2E1NzA0NGIzZmJhZDdhMzQyYjVlODg6MTI0YzlhYzQ3ZTBlM2EzYWZiMTdjOTE5MWExYzU5M2YxOGJhNDdkYWQ0NjBjZmU2MDJmZDQ5MzE2ZDM0MTQ1Ng==
mappings:
- field: total_hosts
label: Total Hosts
- field: hosts_needing_updates
label: Needs Updates
- field: security_updates
label: Security Updates
############################################## Bookmark TAB Services #############################################################
- Bookmarks:
@@ -313,7 +341,7 @@
description: Web Bookmarker
widget:
type: linkwarden
url: http://192.168.2.12:3000
url: http://192.168.2.10:3000
key: "eyJhbGciOiJkaXIiLCJlbmMiOiJBMjU2R0NNIn0..ZLJgig_ol-n3i1tv.vhWCnMSHVd81bdidL85-imXKpxGC0U3mHlvmkQyIJqJvcFRRJVBAasw9C0cmfSXVPq08HT-B-3zUAmftnPRymPHMJCkfo8pv_XBbEPneIFH-n59_dg26.qcXSK2REP3M_Vdgp0aOqcA"
fields: ["links", "collections"]
@@ -321,14 +349,14 @@
id: cerulean
tab: Bookmarks
icon: semaphore.png
href: http://192.168.2.11:3000
href: http://192.168.2.13:3020
description: CI/CD Automation
- Wg-Easy:
id: rose
tab: Bookmarks
icon: wireguard.png
href: http://192.168.2.3:10086
href: http://192.168.2.13:10086
description: Wireguard VPN
- YouTube:
@@ -338,4 +366,4 @@
href: https://youtube.com/
description: Video Platform
#
+5 -5
View File
@@ -34,9 +34,9 @@
hour12: true
timeZone: 'America/New_York'
# /config/widgets.yaml
- search:
provider: custom
url: http://localhost:8080/search?q=
focus: true
target: _blank
showSearchSuggestions: true
provider: google # google, duckduckgo, bing, baidu, brave or custom
focus: true # Optional, will set focus to the search bar on page load
showSearchSuggestions: true # Optional, will show search suggestions. Defaults to false
target: _blank # One of _self, _blank, _parent or _top
+13 -27
View File
@@ -1,21 +1,23 @@
services:
homepage:
image: ghcr.io/gethomepage/homepage:latest
container_name: homepage
environment:
HOMEPAGE_ALLOWED_HOSTS: "*" # required, may need port. See gethomepage.dev/installation/#homepage_allowed_hosts
PUID: ${PUID} # Reference PUID from .env
PGID: ${PGID} # Reference PGID from .env
HOMEPAGE_ALLOWED_HOSTS: "*" # required, may need port.
PUID: 1000
PGID: 1000
DOCKER_HOST: tcp://socket-proxy:2375
ports:
- 3000:3000
env_file:
- .env # Link to the .env file
- 3100:3000
volumes:
- ./config:/app/config # Make sure your local config directory exists
- ./images:/app/public/images
- /opt/Docker-Deployments/Homepage/config:/app/config # Make sure your local config directory exists
- /opt/Docker-Deployments/Homepage/images:/app/public/images
- /var/run/docker.sock:/var/run/docker.sock:ro # optional, for docker integrations
networks:
- external
restart: unless-stopped
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:3000"]
interval: 10s
@@ -23,22 +25,6 @@ services:
timeout: 10s
start_period: 30s
dockerproxy:
image: ghcr.io/tecnativa/docker-socket-proxy:latest
container_name: dockerproxy
environment:
- CONTAINERS=1 # Allow access to viewing containers
- SERVICES=1 # Allow access to viewing services (necessary when using Docker Swarm)
- TASKS=1 # Allow access to viewing tasks (necessary when using Docker Swarm)
- POST=0 # Disallow any POST operations (effectively read-only)
ports:
- 127.0.0.1:2375:2375
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro # Mounted as read-only
restart: unless-stopped
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:2375"]
interval: 10s
retries: 3
timeout: 10s
start_period: 30s
networks:
external:
external: true # Tells Compose not to create this network
+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
# The location where your database files are stored
# ============================================================
# PATH LOCATIONS
# ============================================================
UPLOAD_LOCATION=/home/miker/docker/immich/library
DB_DATA_LOCATION=/home/miker/docker/immich/postgres
# To set a timezone, uncomment the next line and change Etc/UTC to a TZ identifier from this list: https://en.wikipedia.org/wiki/Lis>
TZ=America/New_York
# The Immich version to use. You can pin this to a specific version like "v1.71.0"
IMMICH_VERSION=release
# Connection secrets for postgres and typesense. You should change these to random passwords
TYPESENSE_API_KEY=hOEZ7Tei3iIp
DB_PASSWORD=ee438M3pcXo6
# The values below this line do not need to be changed
###################################################################################
DB_HOSTNAME=immich_postgres
DB_USERNAME=postgres
# ============================================================
# DATABASE CREDENTIALS
# ============================================================
DB_USERNAME=postgresadmin
DB_PASSWORD=mM3PXXUjK0QMz7
DB_DATABASE_NAME=immich
REDIS_HOSTNAME=immich_redis
IMMICH_SERVER_URL=https://immich.mikemcfetridge.com
IMMICH_WEB_URL=https://immich.mikemcfetridge.com
+67 -41
View File
@@ -1,60 +1,86 @@
# Immich — Self-Hosted Photo & Video Management
name: immich
services:
immich-server:
container_name: immich_server
image: ghcr.io/immich-app/immich-server:${IMMICH_VERSION:-release}
image: ghcr.io/immich-app/immich-server:${IMMICH_VERSION:-v3}
# extends:
# file: hwaccel.transcoding.yml
# service: cpu
environment:
- DB_USERNAME=${DB_USERNAME}
- DB_PASSWORD=${DB_PASSWORD}
- DB_DATABASE_NAME=${DB_DATABASE_NAME}
- TZ=${TZ}
volumes:
- /home/miker/dockerapps/immich/upload:/usr/src/app/upload
- ${UPLOAD_LOCATION}:/data
- /etc/localtime:/etc/localtime:ro
- /home/miker/docker/immich/upload/import:/import
env_file:
- .env
ports:
- 2283:3001
- "2283:2283"
depends_on:
- redis
- database
restart: always
immich-microservices:
container_name: immich_microservices
image: ghcr.io/immich-app/immich-server:${IMMICH_VERSION}
extends:
file: hwaccel.yml
service: hwaccel
command: [ "start.sh", "microservices" ]
volumes:
- /home/miker/dockerapps/immich/upload:/usr/src/app/upload
env_file:
- .env
depends_on:
- redis
- database
restart: always
database:
condition: service_healthy
redis:
condition: service_healthy
restart: unless-stopped
networks:
- immich
- main
immich-machine-learning:
container_name: immich_machine_learning
image: ghcr.io/immich-app/immich-machine-learning:${IMMICH_VERSION:-release}
image: ghcr.io/immich-app/immich-machine-learning:${IMMICH_VERSION:-v3}
# extends:
# file: hwaccel.ml.yml
# service: cpu
environment:
- TZ=${TZ}
volumes:
- /home/miker/dockerapps/immich/model-cache:/cache
env_file:
- .env
restart: always
- model-cache:/cache
restart: unless-stopped
networks:
- immich
redis:
container_name: immich_redis
image: redis:6.2-alpine@sha256:70a7a5b641117670beae0d80658430853896b5ef269ccf00d1827427e3263fa3
restart: always
image: docker.io/valkey/valkey:9@sha256:3b55fbaa0cd93cf0d9d961f405e4dfcc70efe325e2d84da207a0a8e6d8fde4f9
restart: unless-stopped
healthcheck:
test: ["CMD-SHELL", "valkey-cli ping || exit 1"]
interval: 10s
timeout: 5s
retries: 5
networks:
- immich
database:
container_name: immich_postgres
image: ghcr.io/immich-app/postgres:14-vectorchord0.3.0-pgvectors0.2.0@sha256:fa4f6e0971f454cd95fec5a9aaed2ed93d8f46725cc6bc61e0698e97dba96da1
env_file:
- .env
image: ghcr.io/immich-app/postgres:14-vectorchord0.4.3-pgvectors0.2.0
environment:
POSTGRES_PASSWORD: ${DB_PASSWORD}
POSTGRES_USER: ${DB_USERNAME}
POSTGRES_DB: ${DB_DATABASE_NAME}
POSTGRES_INITDB_ARGS: '--data-checksums'
- POSTGRES_USER=${DB_USERNAME}
- POSTGRES_PASSWORD=${DB_PASSWORD}
- POSTGRES_DB=${DB_DATABASE_NAME}
- POSTGRES_INITDB_ARGS=--data-checksums
- TZ=${TZ}
volumes:
- /home/miker/dockerapps/immich/pgdata:/var/lib/postgresql/data
restart: always
- ${DB_DATA_LOCATION}:/var/lib/postgresql/data
shm_size: 512mb
restart: unless-stopped
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${DB_USERNAME} -d ${DB_DATABASE_NAME}"]
interval: 10s
timeout: 5s
retries: 5
start_period: 15s
networks:
- immich
volumes:
model-cache:
networks:
main:
external: true
immich:
driver: bridge
+19 -8
View File
@@ -1,11 +1,22 @@
# General Settings
TZ=America/New_York
PUID=1000
PGID=1000
# TZ for container timezone
TZ=America/New_York
SMTP_HOST=smtp.zoho.com
SMTP_FROM_NAME=miker@mcfetridge.us
SMTP_AUTH_STRATEGY=TLS
SMTP_FROM_EMAIL=miker@mcfetridge.us
SMTP_USER=miker@mcfetridge.us
SMTP_PASSWORD="!Sucyetat123"
DATA_DIR=/opt/Docker-Deployments/Mealie
MEALIE_PORT=9200
MEMORY_LIMIT=1000M
# Mealie Application Settings
ALLOW_SIGNUP=false
MAX_WORKERS=1
WEB_CONCURRENCY=1
BASE_URL=https://mealie.mikemcfetridge.com
# SMTP Email Configuration
SMTP_HOST=mail.mmcfetridge.net
SMTP_PORT=465
SMTP_FROM_NAME=miker@mmcfetridge.net
SMTP_FROM_EMAIL=miker@mmcfetridge.net
SMTP_USER=miker@mmcfetridge.net
SMTP_PASSWORD=!Sucyetat123
SMTP_AUTH_STRATEGY=SSL
+26 -21
View File
@@ -1,37 +1,42 @@
services:
mealie:
image: ghcr.io/mealie-recipes/mealie:latest # Specifies the Mealie Docker i>
container_name: mealie # Names the container for easier>
restart: always
networks:
- proxy # Ensures the container restart>
# ports:
# - "9925:9000" # Maps port 9925 on the host to >
image: ghcr.io/mealie-recipes/mealie:latest
container_name: mealie
restart: unless-stopped
ports:
- "${MEALIE_PORT}:9000"
deploy:
resources:
limits:
memory: 1000M # Limits the container to use a >
memory: ${MEMORY_LIMIT}
volumes:
- /home/miker/docker/mealie/data:/app/data/ # Persists data in>
- ./config/addons_config/mealie/config.yaml:/config/config.yanl
- ${DATA_DIR}/data:/app/data/
- ${DATA_DIR}/config/addons_config/mealie/config.yaml:/config/config.yaml
environment:
- ALLOW_SIGNUP=false # Allows new user signups on the>
- PUID=${PUID} # Sets the user ID for the conta>
- PGID=${PGID} # Sets the group ID for the cont>
- TZ=${TZ} # Sets the timezone for the cont>
- MAX_WORKERS=1 # Limits the number of workers t>
- WEB_CONCURRENCY=1 # Sets the concurrency level for>
- BASE_URL=mealie.mikemcfetridge.com # The base URL where Mealie is a>
- ALLOW_SIGNUP=${ALLOW_SIGNUP}
- PUID=${PUID}
- PGID=${PGID}
- TZ=${TZ}
- MAX_WORKERS=${MAX_WORKERS}
- WEB_CONCURRENCY=${WEB_CONCURRENCY}
- BASE_URL=${BASE_URL}
# Email Settings
- SMTP_HOST=${SMTP_HOST}
- SMTP_PORT=${SMTP_PORT}
- SMTP_FROM_NAME=${SMTP_FROM_NAME}
- SMTP_AUTH_STRATEGY=${SMTP_AUTH_STRATEGY}
- SMTP_FROM_EMAIL=${SMTP_FROM_EMAI}
- SMTP_FROM_EMAIL=${SMTP_FROM_EMAIL}
- SMTP_USER=${SMTP_USER}
- SMTP_PASSWORD=${SMTP_PASSWORD}
env_file:
- .env
networks:
- external
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:9000"]
interval: 10s
retries: 3
timeout: 10s
start_period: 30s
networks:
proxy:
external:
external: true
+7 -2
View File
@@ -1,9 +1,14 @@
services:
myspeed:
container_name: MySpeed
image: germannewsmaker/myspeed
image: germannewsmaker/myspeed:latest
ports:
- '5216:5216'
volumes:
- ./myspeed:/myspeed/data
- /opt/Docker-Deployments/MySpeed/data:/myspeed/data
restart: unless-stopped
networks:
- external
networks:
external:
external: true # Tells Compose not to create this network
+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_DATABASE=npm
MYSQL_USER=npm
MYSQL_PASSWORD=rhDGjilZm6XEMJ
# TZ for container timezone
TZ=America/New_York
@@ -1,33 +1,31 @@
---
# Nginx Proxy Manager & MariaDB Stack
services:
db:
image: 'jc21/mariadb-aria:latest'
image: jc21/mariadb-aria:latest
container_name: npm-db
restart: unless-stopped
env_file: .env
environment:
- MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
- MYSQL_DATABASE=${MYSQL_DATABASE}
- MYSQL_USER=${MYSQL_USER}
- MYSQL_PASSWORD=${MYSQL_PASSWORD}
- MARIADB_AUTO_UPGRADE=1
- TZ=${TZ}
volumes:
- ./data/mysql:/var/lib/mysql
- ${DATA_PATH}/mysql:/var/lib/mysql
networks:
- proxy
- proxydb
- internal
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u${MYSQL_USER}", "-p${MYSQL_PASSWORD}"]
test: ["CMD-SHELL", "mariadb-admin ping -h 127.0.0.1 -u root -p$$MYSQL_ROOT_PASSWORD || exit 1"]
interval: 20s
timeout: 5s
retries: 5
start_period: 30s
app:
image: 'jc21/nginx-proxy-manager:latest'
nginx-proxy-manager:
image: jc21/nginx-proxy-manager:latest
container_name: nginx-proxy-manager
restart: unless-stopped
env_file: .env
environment:
- TZ=${TZ}
- DB_MYSQL_HOST=db
@@ -40,22 +38,24 @@ services:
- '81:81'
- '443:443'
volumes:
- ./data/npm:/data
- ./data/letsencrypt:/etc/letsencrypt
- ${DATA_PATH}/npm:/data
- ${DATA_PATH}/letsencrypt:/etc/letsencrypt
depends_on:
- db
db:
condition: service_healthy
restart: true
networks:
- proxy
- proxydb
- internal
- external
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:81/api/status"]
test: ["CMD", "curl", "-f", "http://localhost:81/"]
interval: 20s
timeout: 5s
retries: 5
start_period: 40s
networks:
proxy:
internal:
external: true
proxydb:
external:
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:
obsidian:
image: lscr.io/linuxserver/obsidian:latest
container_name: obsidian
security_opt:
- seccomp:unconfined #optional
couchdb-obsidian-livesync:
image: docker.io/oleduc/docker-obsidian-livesync-couchdb:master
container_name: obsidian-livesync
restart: unless-stopped
environment:
- PUID=1000
- PGID=1000
- TZ=America/New_York
- COUCHDB_USER=${COUCHDB_USER}
- COUCHDB_PASSWORD=${COUCHDB_PASSWORD}
- COUCHDB_DATABASE=${COUCHDB_DATABASE}
- SERVER_DOMAIN=${SERVER_DOMAIN}
- PUID=${PUID}
- PGID=${PGID}
- UMASK=002
- TZ=${TZ}
volumes:
- ./config:/config
- ${DATA_PATH}/data:/opt/couchdb/data
- ${DATA_PATH}/config:/opt/couchdb/etc/local.d
ports:
- 3000:3000
- 3001:3001
devices:
- /dev/dri:/dev/dri #optional
shm_size: "1gb"
restart: always
# used to place in the NPM / traefik network so they can talk with each other.
- "5984:5984"
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:5984/_up"]
interval: 30s
timeout: 10s
retries: 5
start_period: 20s
networks:
- proxy
- main
networks:
proxy:
main:
external: true
+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
+4 -4
View File
@@ -1,11 +1,13 @@
TZ=America/New_York
PUID=1000
PGID=1000
WATCHTOWER_CLEANUP=true
WATCHTOWER_INCLUDE_RESTARTING=true
WATCHTOWER_ROLLING_RESTARTING=true
WATCHTOWER_SCHEDULE=0 0 4 * * *
WATCHTOWER_SCHEDULE="0 0 4 * * *"
WATCHTOWER_INCLUDE_STOPPED=true
WATCHTOWER_NOTIFICATIONS=email
WATCHTOWER_NOTIFICATIONS_HOSTNAME=Docker-Deply # Add Server Name or IP Address
WATCHTOWER_NOTIFICATIONS_HOSTNAME=Docker-03
WATCHTOWER_NOTIFICATION_EMAIL_FROM=miker@mmcfetridge.net
WATCHTOWER_NOTIFICATION_EMAIL_TO=miker@mmcfetridge.net
WATCHTOWER_NOTIFICATION_EMAIL_SERVER=mail.mmcfetridge.net
@@ -13,5 +15,3 @@ WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PORT=465
WATCHTOWER_NOTIFICATION_EMAIL_SERVER_USER=miker@mmcfetridge.net
WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PASSWORD=!Sucyetat123
WATCHTOWER_NOTIFICATION_EMAIL_DELAY=2
PUID=1000
PGID=1000
@@ -1,31 +1,39 @@
services:
watchtower:
image: containrrr/watchtower
image: nickfedor/watchtower:latest
container_name: watchtower
restart: unless-stopped
env_file: .env
env_file:
- .env
environment:
- DOCKER_API_VERSION=1.44
- TZ=${TZ}
- PUID:=${PUID} # Reference PUID from .env
- PGID=${PGID} # Reference PGID from .env
- PUID=${PUID}
- PGID=${PGID}
- WATCHTOWER_CLEANUP=${WATCHTOWER_CLEANUP}
- WATCHTOWER_INCLUDE_RESTARTING=${WATCHTOWER_INCLUDE_RESTARTING}
- WATCHTOWER_ROLLING_RESTARTING=${WATCHTOWER_ROLLING_RESTARTING}
- WATCHTOWER_SCHEDULE=${WATCHTOWER_SCHEDULE}
- WATCHTOWER_INCLUDE_STOPPED=${WATCHTOWER_INCLUDE_STOPPED}
# - WATCHTOWER_NOTIFICATIONS=${WATCHTOWER_NOTIFICATIONS}
# - WATCHTOWER_NOTIFICATIONS_HOSTNAME=${WATCHTOWER_NOTIFICATIONS_HOSTNAME}
# - WATCHTOWER_NOTIFICATION_EMAIL_FROM=${WATCHTOWER_NOTIFICATION_EMAIL_FROM}
# - WATCHTOWER_NOTIFICATION_EMAIL_TO=${WATCHTOWER_NOTIFICATION_EMAIL_TO}
# - WATCHTOWER_NOTIFICATION_EMAIL_SERVER=${WATCHTOWER_NOTIFICATION_EMAIL_SERVER}
# - WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PORT=${WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PORT}
# - WATCHTOWER_NOTIFICATION_EMAIL_SERVER_USER=${WATCHTOWER_NOTIFICATION_EMAIL_SERVER_USER}
# - WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PASSWORD=${WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PASSWORD}
- WATCHTOWER_NOTIFICATIONS=${WATCHTOWER_NOTIFICATIONS}
- WATCHTOWER_NOTIFICATIONS_HOSTNAME=${WATCHTOWER_NOTIFICATIONS_HOSTNAME}
- WATCHTOWER_NOTIFICATION_EMAIL_FROM=${WATCHTOWER_NOTIFICATION_EMAIL_FROM}
- WATCHTOWER_NOTIFICATION_EMAIL_TO=${WATCHTOWER_NOTIFICATION_EMAIL_TO}
- WATCHTOWER_NOTIFICATION_EMAIL_SERVER=${WATCHTOWER_NOTIFICATION_EMAIL_SERVER}
- WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PORT=${WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PORT}
- WATCHTOWER_NOTIFICATION_EMAIL_SERVER_USER=${WATCHTOWER_NOTIFICATION_EMAIL_SERVER_USER}
- WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PASSWORD=${WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PASSWORD}
- WATCHTOWER_NOTIFICATION_EMAIL_DELAY=${WATCHTOWER_NOTIFICATION_EMAIL_DELAY}
security_opt:
- no-new-privileges:true
volumes:
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
- /var/run/docker.sock:/var/run/docker.sock
networks:
- external
networks:
external:
external: true
+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"
volumes:
- /opt/Docker-Deployments/searxng:/etc/searxng:rw
- /opt/Docker-Deployments/searxng/data:/var/cache/searxng:rw
- /opt/Docker-Deployments/searxng_cache:/var/cache/searxng:rw
environment:
- SEARXNG_BASE_URL=https://search.mikemcfetridge.com
- UWSGI_WORKERS=${SEARXNG_UWSGI_WORKERS:-4}
@@ -18,3 +18,4 @@ services:
retries: 3
timeout: 10s
start_period: 30s
#
+4 -19
View File
@@ -1,4 +1,4 @@
##### My SearXNG personal settings. #
##### My SearXNG personal settings.
use_default_settings: true
general:
@@ -10,8 +10,8 @@ brand:
issue_url: "" # Hides the links without crashing the parser
custom:
links:
"Dockhand": "http://192.168.2.3:3200"
"My Dashboard": "http://192.168.2.15:3100"
"Dockhand": "http://192.168.0.8:3200"
"My Dashboard": "http://192.168.0.9:3100"
server:
port: 8080
@@ -35,20 +35,5 @@ ui:
# This is the standard way to cleanly enable/disable specific engines in SearXNG
engines:
- name: google
disabled: true
- name: duckduckgo
disabled: false
- name: wikipedia
disabled: false
- name: wikidata
disabled: false
- name: bing
disabled: false
- name: brave
disabled: false
disabled: true
@@ -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..