/
/
/
This repo is destined for my server automations and setup.
1---
2# Storage Servers Group Variables
3# Applied to all servers in the storage_servers group
4
5# ==============================================================================
6# STORAGE DEFAULTS
7# ==============================================================================
8storage_enabled: true
9backup_enabled: true
10
11# ==============================================================================
12# RAID CONFIGURATION
13# ==============================================================================
14storage_raid_arrays:
15 - name: "md0"
16 device: "/dev/md0"
17 mount_point: "/mnt/rstorage"
18 filesystem: "ext4"
19
20# ==============================================================================
21# COMMON STORAGE CONFIGURATION
22# ==============================================================================
23# Standard storage paths
24storage_base_path: "/mnt/rstorage"
25storage_docker_dir: "/docker"
26
27# User/Group defaults (ansible:users for group sharing)
28storage_uid: 1000
29storage_gid: 100
30
31# ==============================================================================
32# DEFAULT SERVICE ENABLEMENT
33# ==============================================================================
34# Enable all services by default (disable in host_vars if not needed)
35jellyfin_enabled: true
36arr_stack_enabled: true
37arr_vpn_enabled: true
38calibre_enabled: true
39restic_backup_server_enabled: true
40nextcloud_enabled: true
41gdu_enabled: true
42
43# Individual Arr services
44sonarr_enabled: true
45radarr_enabled: true
46prowlarr_enabled: true
47lazylibrarian_enabled: true
48bazarr_enabled: true
49jellyseer_enabled: true
50flaresolverr_enabled: true
51qbittorrent_enabled: true
52gluetun_enabled: "{{ arr_vpn_enabled }}"
53
54# ==============================================================================
55# PERFORMANCE DEFAULTS
56# ==============================================================================
57# Conservative defaults - override based on hardware capacity
58default_memory_limit: "2g"
59default_cpu_limit: "2"
60
61# Jellyfin gets more resources (media transcoding intensive)
62jellyfin_memory_limit: "4g"
63jellyfin_cpu_limit: "4"
64
65# Arr stack typically lightweight
66arr_memory_limit: "1g"
67arr_cpu_limit: "1"
68
69# ==============================================================================
70# NETWORK CONFIGURATION
71# ==============================================================================
72storage_docker_network: "storage-network"
73
74# Health check settings
75health_check_enabled: true
76health_check_interval: "30s"
77health_check_timeout: "10s"
78health_check_retries: 3
79
80# ==============================================================================
81# BACKUP CONFIGURATION
82# ==============================================================================
83# Backups are handled by roles/backup (backup.yml), scheduled in Semaphore.
84# What to back up / exclude is set in host_vars (backup_service_excludes,
85# backup_data_paths); schedule and retention are not configured here.
86
87# ==============================================================================
88# VPN DEFAULTS
89# ==============================================================================
90# Default VPN settings (credentials must be in vault)
91vpn_server_countries: "Netherlands,Switzerland"
92vpn_server_regions: "Europe"
93
94# ==============================================================================
95# SECURITY SETTINGS
96# ==============================================================================
97# System optimization for storage servers
98system_swappiness: 1 # Minimize swap usage
99
100# ==============================================================================
101# PORT ASSIGNMENTS
102# ==============================================================================
103# Standard ports - change in host_vars if conflicts exist
104jellyfin_host_port: 8096
105
106sonarr_host_port: 8989
107radarr_host_port: 7878
108prowlarr_host_port: 9696
109lazylibrarian_host_port: 5299
110
111restic_backup_host_port: 8000
112nextcloud_host_port: 8443
113gdu_host_port: 8098
114
115# ==============================================================================
116# DIRECTORY STRUCTURE
117# ==============================================================================
118# These will be created automatically
119media_directories:
120 - "{{ storage_base_path }}/media"
121 - "{{ storage_base_path }}/media/movies"
122 - "{{ storage_base_path }}/media/shows"
123 - "{{ storage_base_path }}/media/books"
124 - "{{ storage_base_path }}/downloads"
125 - "{{ storage_base_path }}/backups"
126
127 # D&D session agent. Kept out of media/music on purpose: that path is
128 # indexed by Navidrome and untagged ambience would fill the library with
129 # "Unknown Artist" entries.
130 - "{{ storage_base_path }}/media/dnd"
131 - "{{ storage_base_path }}/media/dnd/ambience" # atmosphere beds
132 - "{{ storage_base_path }}/media/dnd/effects" # one-shot sound effects
133 - "{{ storage_base_path }}/media/dnd/themes" # session open/close
134 # Raw per-speaker audio. The live pipeline needs tuning against real
135 # sessions, and speaker separation within the shared table track can only
136 # happen afterwards - without this, none of that is recoverable.
137 - "{{ storage_base_path }}/media/dnd/recordings"
138 - "{{ storage_base_path }}/media/dnd/transcripts"
139 - "{{ storage_base_path }}/media/dnd/battlemaps" # snapshots from Frigate
140 - "{{ storage_base_path }}/media/dnd/artwork" # generated artwork
141 # The campaign knowledge base. characters/ is canon and hand-written; the
142 # agent reads it and never writes it.
143 - "{{ storage_base_path }}/media/dnd/campaign"
144 - "{{ storage_base_path }}/media/dnd/campaign/characters"
145 - "{{ storage_base_path }}/media/dnd/campaign/sessions"
146 - "{{ storage_base_path }}/media/dnd/campaign/world"
147
148# ==============================================================================
149# USAGE NOTES
150# ==============================================================================
151# This file provides sensible defaults for all storage servers.
152#
153# To customize individual servers:
154# 1. Copy host_vars/storage.yml.example to host_vars/[hostname].yml
155# 2. Override any settings specific to that server
156# 3. Configure vault variables for VPN and authentication
157#
158# To deploy storage services:
159# ansible-playbook -i inventory/hosts storage.yml --limit storage_servers
160#
161# Or use the main playbook:
162# ansible-playbook -i inventory/hosts site.yml --limit storage_servers --tags "core,storage"
163
164# ============================================================================
165# BACKUP (roles/backup, run by backup.yml)
166# ============================================================================
167# Jellyfin's metadata is posters/artwork it re-downloads on a library scan.
168# Its cache is already covered by the global "cache" exclude.
169backup_service_excludes:
170 jellyfin: ["config/metadata"]
171
172# Irreplaceable data on the array, backed up hot from local disk (not over
173# NFS from the runner). Movies, shows, downloads, CCTV, the registry and the
174# D&D sound libraries are deliberately NOT here: they can be re-obtained,
175# and the array's RAID is their only protection.
176backup_data_paths:
177 - { name: code-repo, path: /mnt/rstorage/code-repo } # Forgejo repositories
178 - { name: pictures, path: /mnt/rstorage/media/pictures } # Immich library
179 - { name: nextcloud-data, path: /mnt/rstorage/nextcloud } # Nextcloud user files
180 - { name: dnd-campaigns, path: /mnt/rstorage/media/dnd/campaigns }
181 - { name: dnd-tokens, path: /mnt/rstorage/media/dnd/tokens }
182 - { name: dnd-tokens-fa, path: /mnt/rstorage/media/dnd/tokens-fa }
183 - { name: music, path: /mnt/rstorage/media/music }
184 - { name: books, path: /mnt/rstorage/media/books }
185