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