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