Compare commits

108 Commits

Author SHA1 Message Date
a4978133b9 Automated template extraction 2025-10-18 22:23:35 +00:00
9f0a0bd2e4 whoops
All checks were successful
Deploy Containers / Prepare (push) Successful in 4s
2025-10-18 18:23:20 -04:00
4589e17b4b special branch name
All checks were successful
Deploy Containers / Prepare (push) Successful in 4s
2025-10-18 18:22:39 -04:00
cd0d0f2402 forgot backslash
All checks were successful
Deploy Containers / Prepare (push) Successful in 4s
2025-10-18 18:20:25 -04:00
b237e4a078 using gitea..
All checks were successful
Deploy Containers / Prepare (push) Successful in 5s
2025-10-18 18:19:40 -04:00
1c35d3d826 handle existing vault removal
All checks were successful
Deploy Containers / Prepare (push) Successful in 4s
2025-10-18 18:15:19 -04:00
a990c7bc19 add template extraction
All checks were successful
Deploy Containers / Prepare (push) Successful in 4s
2025-10-18 18:13:41 -04:00
59473e55f7 update readme
All checks were successful
Deploy Containers / Prepare (push) Successful in 4s
2025-10-18 15:15:16 -04:00
42b310d47a init on github
All checks were successful
Deploy Containers / Prepare (push) Successful in 5s
2025-10-18 15:13:56 -04:00
6f87087dc3 update config
All checks were successful
Deploy Containers / Prepare (push) Successful in 4s
2025-10-18 15:02:17 -04:00
506121b0bb use personal forked helium-services repo
All checks were successful
Deploy Containers / Prepare (push) Successful in 3m44s
2025-10-18 14:25:19 -04:00
4694ada8f4 helium services
Some checks failed
Deploy Containers / Prepare (push) Failing after 3m10s
2025-10-18 12:05:43 -04:00
07c2351b9f use tmux for fivem service
All checks were successful
Deploy Containers / Prepare (push) Successful in 29s
2025-10-16 14:23:02 -04:00
1d3ebb0fe0 stop & restart only if service exists
All checks were successful
Deploy Containers / Prepare (push) Successful in 25s
2025-10-16 14:19:49 -04:00
c713f2c8cd disable automatic restart
Some checks failed
Deploy Containers / Prepare (push) Failing after 22s
2025-10-16 14:18:37 -04:00
00024dda5b update timeout in systemd fivem service
All checks were successful
Deploy Containers / Prepare (push) Successful in 29s
2025-10-16 14:15:20 -04:00
8a0d4af868 only run deployment task once
All checks were successful
Deploy Containers / Prepare (push) Successful in 4s
2025-10-15 23:41:33 -04:00
2feb2a9cfb always recreate fivem systemd service
All checks were successful
Deploy Containers / Prepare (push) Successful in 50s
2025-10-15 23:39:40 -04:00
18a7d431ef remove stale fivem docker task
All checks were successful
Deploy Containers / Prepare (push) Successful in 26s
2025-10-15 23:37:12 -04:00
20aacc0abd use absolute path for ExecStart
Some checks failed
Deploy Containers / Prepare (push) Failing after 54s
2025-10-15 23:35:45 -04:00
2ebafbedeb add remote_src option
Some checks failed
Deploy Containers / Prepare (push) Failing after 49s
2025-10-15 23:33:08 -04:00
11ee38c3c1 change variable name
All checks were successful
Deploy Containers / Prepare (push) Successful in 5s
2025-10-15 23:32:10 -04:00
505f5581fb add fivem role
Some checks failed
Deploy Containers / Prepare (push) Failing after 23s
2025-10-15 23:30:27 -04:00
63e30189ec end me
All checks were successful
Deploy Containers / Prepare (push) Successful in 21s
2025-10-15 01:24:49 -04:00
c538f4cb74 add traefik to couchdb
All checks were successful
Deploy Containers / Prepare (push) Successful in 18s
2025-10-15 01:19:06 -04:00
6a8a0e8953 add source to docker_image
All checks were successful
Deploy Containers / Prepare (push) Successful in 27s
2025-10-15 01:07:10 -04:00
4d717a95f6 fix ansible hosts file
Some checks failed
Deploy Containers / Prepare (push) Failing after 5m13s
2025-10-15 01:00:27 -04:00
ab83831871 add couchdb for obsidian
Some checks failed
Deploy Containers / Prepare (push) Failing after 14s
2025-10-15 00:48:24 -04:00
fd6003aecc recreate all containers when secrets change
All checks were successful
Deploy Containers / Prepare (push) Successful in 5s
2025-10-14 12:54:17 -04:00
cee5c13c9b mount docker socket to uptime-kuma
All checks were successful
Deploy Containers / Prepare (push) Successful in 22s
2025-10-09 14:43:42 -04:00
43af41dd21 add fivem
All checks were successful
Deploy Containers / Prepare (push) Successful in 21s
2025-10-09 11:43:32 -04:00
d1f35cc107 for the main app as well..
All checks were successful
Deploy Containers / Prepare (push) Successful in 29s
2025-10-08 21:55:18 -04:00
3ce27245e8 fix drop's restart policy
Some checks failed
Deploy Containers / Prepare (push) Has been cancelled
2025-10-08 21:55:00 -04:00
bd05d56bd2 fix incorrect field
All checks were successful
Deploy Containers / Prepare (push) Successful in 23s
2025-10-08 21:51:31 -04:00
cbd1b74d0d remove specified endpoint
All checks were successful
Deploy Containers / Prepare (push) Successful in 1m12s
2025-10-08 21:49:09 -04:00
507703d662 run deployment on roles
All checks were successful
Deploy Containers / Prepare (push) Successful in 4s
2025-10-08 21:49:00 -04:00
f92b77f320 mane
All checks were successful
Deploy Containers / Prepare (push) Successful in 4s
2025-10-08 21:43:12 -04:00
fce4ce64f3 try different traefik config
All checks were successful
Deploy Containers / Prepare (push) Successful in 4s
2025-10-08 21:42:48 -04:00
9ae11acd83 whoops
All checks were successful
Deploy Containers / Prepare (push) Successful in 16s
2025-10-08 21:36:13 -04:00
1da228edc6 update restart key
Some checks failed
Deploy Containers / Prepare (push) Failing after 11s
2025-10-08 21:35:34 -04:00
b7691ebfcf exit with error code
All checks were successful
Deploy Containers / Prepare (push) Successful in 4s
2025-10-08 21:35:09 -04:00
fab89d7e19 update nas host, fix uptime kuma
All checks were successful
Deploy Containers / Prepare (push) Successful in 34s
2025-10-08 21:33:52 -04:00
b675eb19e8 remove duplicate key from frigate conf
All checks were successful
Deploy Containers / Prepare (push) Successful in 2m20s
2025-10-08 21:20:29 -04:00
22bd7d36ca run on tasks but not roles
All checks were successful
Deploy Containers / Prepare (push) Successful in 5s
2025-10-08 21:19:08 -04:00
21564a9613 simplify deployment script
All checks were successful
Deploy Containers / Prepare (push) Successful in 4s
2025-10-08 21:14:59 -04:00
c1f0098a98 add uptime kuma
All checks were successful
Deploy Containers / Prepare (push) Successful in 10s
2025-10-08 15:22:45 -04:00
1920868835 disable immich ml container
All checks were successful
Deploy Containers / Prepare (push) Successful in 22s
2025-10-06 10:18:36 -04:00
5e378243cc update secrets
All checks were successful
Deploy Containers / Prepare (push) Successful in 4s
2025-10-05 18:08:28 -04:00
7c785bb3c6 update secrets
All checks were successful
Deploy Containers / Prepare (push) Successful in 4s
2025-10-05 18:03:09 -04:00
8a2f5034c8 update droposs external url
All checks were successful
Deploy Containers / Prepare (push) Successful in 32s
2025-10-05 17:30:27 -04:00
6c95392c51 update drop container
All checks were successful
Deploy Containers / Prepare (push) Successful in 35s
2025-10-05 17:23:48 -04:00
d4308a26d4 add postgres username
All checks were successful
Deploy Containers / Prepare (push) Successful in 42s
2025-09-25 20:02:30 -04:00
4ddc186eae hopefully catch that case
All checks were successful
Deploy Containers / Prepare (push) Successful in 5s
2025-09-13 23:36:09 -04:00
105b05e823 now test..
All checks were successful
Deploy Containers / Prepare (push) Successful in 19s
2025-09-13 23:33:06 -04:00
8a7d901e2a fuck me
All checks were successful
Deploy Containers / Prepare (push) Successful in 4s
2025-09-13 23:32:43 -04:00
cfe4b8d02c Create dozzle.yml
All checks were successful
Deploy Containers / Prepare (push) Successful in 5s
2025-09-13 23:32:06 -04:00
4adad675db lol probably helps
All checks were successful
Deploy Containers / Prepare (push) Successful in 4s
2025-09-13 23:31:48 -04:00
45ba631a5e Create dozzle.yml
All checks were successful
Deploy Containers / Prepare (push) Successful in 5s
2025-09-13 23:30:45 -04:00
9c2dce07de uhh?
All checks were successful
Deploy Containers / Prepare (push) Successful in 5s
2025-09-13 23:30:40 -04:00
f741ac8eef readd dozzle
All checks were successful
Deploy Containers / Prepare (push) Successful in 5s
2025-09-13 23:29:19 -04:00
805d60a0de diagnosing
Some checks failed
Deploy Containers / Prepare (push) Has been cancelled
2025-09-13 23:29:12 -04:00
3706dd028e readd dozzle
All checks were successful
Deploy Containers / Prepare (push) Successful in 5s
2025-09-13 23:28:30 -04:00
c5a6afc08e testing
All checks were successful
Deploy Containers / Prepare (push) Successful in 4s
2025-09-13 23:28:03 -04:00
de7d226f26 Revert "test script"
All checks were successful
Deploy Containers / Prepare (push) Successful in 5s
This reverts commit 5e8b481197.
2025-09-13 23:25:29 -04:00
5e8b481197 test script
All checks were successful
Deploy Containers / Prepare (push) Successful in 4s
2025-09-13 23:24:53 -04:00
da90344e27 run in shell
All checks were successful
Deploy Containers / Prepare (push) Successful in 4s
2025-09-13 23:24:47 -04:00
4559d1c0ed Revert "actually trigger the code"
All checks were successful
Deploy Containers / Prepare (push) Successful in 5s
This reverts commit fa8baad3f2.
2025-09-13 23:24:19 -04:00
1d3ee6d58e fix removal script
Some checks failed
Deploy Containers / Prepare (push) Failing after 5s
2025-09-13 23:23:12 -04:00
514adbc568 Revert "remove monitoring stack for now"
All checks were successful
Deploy Containers / Prepare (push) Successful in 5s
This reverts commit 84941c0e2c.
2025-09-13 23:21:41 -04:00
fa8baad3f2 actually trigger the code
Some checks failed
Deploy Containers / Prepare (push) Failing after 5s
2025-09-13 23:21:00 -04:00
f06832c50b test deletion script
All checks were successful
Deploy Containers / Prepare (push) Successful in 4s
2025-09-13 23:19:50 -04:00
84941c0e2c remove monitoring stack for now
All checks were successful
Deploy Containers / Prepare (push) Successful in 6s
2025-09-13 23:09:54 -04:00
242378f0c7 clean up traefik
All checks were successful
Deploy Containers / Prepare (push) Successful in 1m13s
2025-09-12 01:08:28 -04:00
7261f29a7c move to owncloud
All checks were successful
Deploy Containers / Prepare (push) Successful in 1m54s
2025-09-11 21:55:32 -04:00
7f10dfa67a update postgresl, container versions
All checks were successful
Deploy Containers / Prepare (push) Successful in 1m32s
2025-09-09 23:33:02 -04:00
e4fe271c36 rebuild api always
All checks were successful
Deploy Containers / Prepare (push) Successful in 58s
2025-09-08 20:27:39 -04:00
c168924364 add nocache to api image
All checks were successful
Deploy Containers / Prepare (push) Successful in 45s
2025-09-06 20:34:51 -04:00
b7e64d12cd fix loadbalancer
All checks were successful
Deploy Containers / Prepare (push) Successful in 53s
2025-08-14 12:51:11 -04:00
546105dbb6 proxy to nfl proxy
All checks were successful
Deploy Containers / Prepare (push) Successful in 49s
2025-08-14 12:48:32 -04:00
93669a4f08 use venv python
All checks were successful
Deploy Containers / Prepare (push) Successful in 20s
2025-08-14 12:44:36 -04:00
d2c0b599ee add virtual env
All checks were successful
Deploy Containers / Prepare (push) Successful in 20s
2025-08-14 12:43:01 -04:00
0aa92f67d4 ignore errors from deletion job
All checks were successful
Deploy Containers / Prepare (push) Successful in 20s
2025-08-14 12:37:30 -04:00
bc28106e44 direct file link
All checks were successful
Deploy Containers / Prepare (push) Successful in 14s
2025-08-14 12:36:27 -04:00
bb4e7464da add nfl proxy
All checks were successful
Deploy Containers / Prepare (push) Successful in 14s
2025-08-14 12:34:31 -04:00
887924a928 update romm iage tag
All checks were successful
Deploy Containers / Prepare (push) Successful in 30s
2025-08-11 03:09:08 -04:00
1178504d93 don't auto-redeploy gitea runner
All checks were successful
Deploy Containers / Prepare (push) Successful in 4s
2025-08-11 03:03:32 -04:00
0772ea36d0 don't excessively fail action
All checks were successful
Deploy Containers / Prepare (push) Successful in 4s
2025-08-11 03:01:36 -04:00
ecaf52f268 pull images when deploying
Some checks failed
Deploy Containers / Prepare (push) Failing after 5m21s
2025-08-10 18:01:58 -04:00
a611529e05 possibly fix some permission issue
All checks were successful
Deploy Containers / Prepare (push) Successful in 30s
2025-08-06 22:15:50 -04:00
1e7330a1c2 rip
All checks were successful
Deploy Containers / Prepare (push) Successful in 45s
2025-08-06 22:06:18 -04:00
182b1cc6c3 add service to routers
All checks were successful
Deploy Containers / Prepare (push) Successful in 47s
2025-08-06 22:05:01 -04:00
f8fbc95229 run through vpn
All checks were successful
Deploy Containers / Prepare (push) Successful in 48s
2025-08-06 22:02:50 -04:00
04b3c8ae18 traefik on gluetun
All checks were successful
Deploy Containers / Prepare (push) Successful in 32s
2025-08-06 21:58:52 -04:00
68592c5e5d add jackett, fix gluetun
All checks were successful
Deploy Containers / Prepare (push) Successful in 54s
2025-08-06 21:54:45 -04:00
bcf0df52ea bad indentation
All checks were successful
Deploy Containers / Prepare (push) Successful in 15s
2025-08-04 00:50:31 -04:00
15901d2325 add kavita
Some checks failed
Deploy Containers / Prepare (push) Failing after 37s
2025-08-04 00:49:40 -04:00
dd3c1d0350 try this..
All checks were successful
Deploy Containers / Prepare (push) Successful in 22s
2025-08-04 00:44:59 -04:00
120208ed43 gotta deploy it first..
All checks were successful
Deploy Containers / Prepare (push) Successful in 31s
2025-08-04 00:42:58 -04:00
b433549587 update traefik
All checks were successful
Deploy Containers / Prepare (push) Successful in 15s
2025-08-04 00:40:54 -04:00
f292246a4f add ubooquity
All checks were successful
Deploy Containers / Prepare (push) Successful in 31s
2025-08-04 00:39:24 -04:00
727e28051a add docker mod
All checks were successful
Deploy Containers / Prepare (push) Successful in 21s
2025-08-04 00:25:34 -04:00
389c764119 add calibre-web
All checks were successful
Deploy Containers / Prepare (push) Successful in 53s
2025-08-04 00:19:50 -04:00
0ed6b8b408 implement nas
All checks were successful
Deploy Containers / Prepare (push) Successful in 45s
2025-08-03 15:13:29 -04:00
93583a4c04 fix nc, fix excalidrae
All checks were successful
Deploy Containers / Prepare (push) Successful in 38s
2025-08-03 03:46:15 -04:00
543acaed07 fix api
All checks were successful
Deploy Containers / Prepare (push) Successful in 39s
2025-08-03 03:33:47 -04:00
32e50b2307 migrate jackson to traefik
Some checks failed
Deploy Containers / Prepare (push) Failing after 11s
2025-08-03 03:17:48 -04:00
b4640b8764 fix tinyauth domain
All checks were successful
Deploy Containers / Prepare (push) Successful in 12s
2025-08-02 23:14:22 -04:00
b8fbb21d2c add tinyauth
All checks were successful
Deploy Containers / Prepare (push) Successful in 1m24s
2025-08-02 23:12:34 -04:00
61 changed files with 1504 additions and 624 deletions

View File

@@ -0,0 +1,26 @@
name: Deploy All Containers
on:
workflow_dispatch:
jobs:
deploy:
name: Prepare
runs-on: runner
steps:
- name: Checkout Repo
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Deploy
run: |
mkdir -p ~/.ssh
echo "${{ secrets.SSH_KNOWN_HOSTS }}" >> ~/.ssh/known_hosts
chmod 644 ~/.ssh/known_hosts
eval $(ssh-agent -s)
ssh-add <(echo "${{ secrets.SSH_KEY }}")
echo "HOST *" > ~/.ssh/config
echo "${{ secrets.VAULT_PASS }}" > ~/.vault_pass.txt
chmod 600 ansible.cfg
/usr/bin/ansible-playbook main.yml --vault-password-file ~/.vault_pass.txt

View File

@@ -0,0 +1,44 @@
name: Create New Secrets Template
on:
push:
branches:
- main
paths:
- "host_vars/**"
workflow_dispatch:
jobs:
create-pr:
name: Extract updated template
runs-on: runner
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Run extraction script
run: |
echo "${{ secrets.VAULT_PASS }}" > ~/.vault_pass.txt
python3 scripts/extract_to_template.py
- name: Commit changes
run: |
git config user.name "Service Account"
git config user.email "alex+homelab@alexav.gg"
git checkout -b template-extraction-${{ github.run_number }}
git add .
git commit -m "Automated template extraction"
git push origin template-extraction-${{ github.run_number }}
- name: Create Pull Request
run: |
curl -X POST \
"https://git.alexav.gg/api/v1/repos/alex/homelab/pulls" \
-H "Authorization: token ${{ secrets.TOKEN }}" \
-H "Content-Type: application/json" \
-d '{
"title": "Automated Template Extraction",
"body": "Updates the `all.template.yml` file with latest secrets for services",
"head": "template-extraction-${{ github.run_number }}",
"base": "main"
}'

View File

@@ -1,4 +1,4 @@
[defaults]
inventory=inventories/hosts
inventory=hosts
host_key_checking=False
interpreter_python=auto_silent

View File

@@ -1,9 +1,50 @@
# global
ansible_user:
data_dir:
docker_network_name:
TZ:
# api
API_CONTACT_WEBHOOK:
API_JWT_KEY:
API_STEAM_API_KEY:
API_LASTFM_API_KEY:
API_DATABASE_URL:
API_POSTGRES_PASSWORD:
API_ADMIN_KEY:
# plausible
PLAUSIBLE_BASE_URL:
PLAUSIBLE_SECRET_KEY_BASE:
# owncloud
OWNCLOUD_APP_URL:
OWNCLOUD_DB_PASSWORD:
OWNCLOUD_DB_USER:
OWNCLOUD_DB_DATABASE:
OWNCLOUD_DB_HOST:
OWNCLOUD_ADMIN_USERNAME:
OWNCLOUD_ADMIN_PASSWORD:
# traefik
TRAEFIK_DASH_URL:
TRAEFIK_CF_API_EMAIL:
TRAEFIK_CF_API_KEY:
TRAEFIK_HOST_IP:
TRAEFIK_VIDEO_MACHINE:
TRAEFIK_ENABLE_DASH:
# fivem
FIVEM_LICENSE_KEY:
PUID:
PGID:
TZ:
media_path:
# frigate
FRIGATE_RECORDINGS_PATH:
# plex
PLEX_CLAIM_TOKEN:
ansible_become_pass:
# glance
GLANCE_PIHOLE_TOKEN:
@@ -45,11 +86,11 @@ GLUETUN_SERVER_HOSTNAMES:
# immich
IMMICH_UPLOAD_LOCATION:
IMMICH_DB_DATA_LOCATION: /postgres
IMMICH_VERSION: release
IMMICH_DB_PASSWORD: postgres
IMMICH_DB_USERNAME: postgres
IMMICH_DB_DATABASE_NAME: postgres
IMMICH_DB_DATA_LOCATION:
IMMICH_VERSION:
IMMICH_DB_PASSWORD:
IMMICH_DB_USERNAME:
IMMICH_DB_DATABASE_NAME:
# jellyfin
JELLYFIN_TV_PATH:
@@ -59,14 +100,8 @@ JELLYFIN_MUSIC_PATH:
# navidrome
NAVIDROME_MUSIC_PATH:
# nextcloud
NEXTCLOUD_POSTGRES_PASSWORD:
NEXTCLOUD_POSTGRES_DATABASE:
NEXTCLOUD_POSTGRES_USER:
NEXTCLOUD_POSTGRES_HOST:
# ntfy
NTFY_UPSTREAM_BASE_URL: https://ntfy.sh
NTFY_UPSTREAM_BASE_URL:
NTFY_BASE_URL:
# nzbget
@@ -96,9 +131,6 @@ ROMM_SERVER_APPLICATION_URL:
# servarr
SERVARR_MEDIA_PATH:
# syncthing
SYNCTHING_DATA_PATH:
# vaultwarden
VAULTWARDEN_DOMAIN:
@@ -108,5 +140,16 @@ GITEA_RUNNER_REGISTRATION_TOKEN:
GITEA_RUNNER_NAME:
GITEA_RUNNER_LABELS:
# grafana
# monitoring
GRAFANA_AUTH_ANONYMOUS_ENABLED:
# drop
DROP_GIANT_BOMB_API_KEY:
# obsidian
COUCHDB_USER:
COUCHDB_PASSWORD:
# helium
HELIUM_BASE_URL:
HELIUM_EXT_HMAC_SECRET:

View File

@@ -1,105 +1,70 @@
$ANSIBLE_VAULT;1.1;AES256
62643330653736373764393833363035323137393736633433346139333639663664303735373261
3531373434336335393763666437623039393165376462390a363439396662633661316232343336
33326133336436663638303036386330613830333838383861633730616230336565316535613264
3766363466373364370a303934646532303033353130326264393634646562363132616437366432
39303930643939363831373631366137373137393539303033316165633234666164376438306531
64363865653761386366653665666333643134336338333935363337303462636561623263303261
34303337346134373161316335666237323439303133313137666336393331366163633866323766
66373766373061643366323635346237343030356635613364643165373361343333383836633433
37353265623935323735306233316336373931613039616162393336326633643139313965363338
62353636303137353636396361316363626132666330363230373561653163623364303036663235
63323965666135393064333039396562373634383938613433333132333266336238366638346334
33366533326232376539353039373136303863373231346561666338386136656332343463633939
31616338316439373366326366353762313066356562613738366465343437666631373030646666
36666236373332363035336139616464666430343764613863343962616230316362353738373664
32343639666231386338396139353736313235646164613438303738356238303930653538353561
63323533333736616664353439613933323837646665303431633361373064326561653438333061
34663034306530613438373132356631616463306663313331656234613165353335393132366437
62326231653862613765643535623363366264363638623362376237373933326637653864383436
33383535356231303365316638356566373439346133653036326362373663343239383762323766
33303137363762306136383762323337333662326131346135633932313135353937346532316264
30613865363636623732383337376137383039376264313135653039306532353665343635643738
66656239373333323266383962666239346538343434353136306439326365323235626661613162
36353234643930663939373465383661303038316166326230333734326536303331396137623064
65366232623365303964363932666436353336316333623630646337616235626366613433303865
36643836626231333964653830376435643563613538666339326464383365663265616535626238
30616533663032323663643438656666626330633164663161626530306134306433373430336239
32363237313861373964316139613766356334313064346135343739353361376630386130626633
34613732383630646335653633313466313864326430663633353231653765356566353766333833
63316439383938663334323635633538396134343232626234363337353331643336303037343332
63386664653534366438633464316534643261366237393336396535323435656533643137343137
39356135623333316532353962333630663432393238333334386637663735646530626562613839
36333834363562363931343264646337343766303464366264316564313736656136376336626163
33373731623930656266623433613164396166323332643035643734353138626632376434323337
36306465663339363733393235653964646130396463356264663963366362653238386235623739
35613065366365333833643739376636333733396162666362393461616136653365326230386531
33653166313235653863346137626564336239656530386232636533396664353330663634373630
36626265373762313432333936303663646361353035336431346434306434383261656636336263
31363964343038626434613336663436383132343739393163356434333066386132353137666163
38346465303937633139363532653539383436396263613139636236363336336161393631656530
63393530333534353166646339613538323664633236383161396466376339323763313838316233
33616338323438623138383131393735396235623861323536613761643663393934353862326638
34643866626466663836333965376163653037386164366634623239653231623432616531386263
30366533306439633134333163316233656164306133323961366530666666336566363537626434
63633830363539373534663836353163306137613233366436613863346638363335373663333831
65396533626263383530353764376263643230656262363233336132316132656235663631663363
62303933616131336666336262663333376430383733333261393262623334353165633362653932
65623965323332353761323637343037396435616136343364323266303163336362366337303839
34346235333661613232623262626664363062653834383435666336336266343636666664363639
33386134633631306534303631613234393366373763626633323761386265666237636662653433
32313233393038383931303136633565313434623862643134353435333265306535313262343636
34646365623534373936626266613731643162366435306331336165383037613062346636666239
35396561653765653963313339353365396438313363336661643931633339653533653164626131
37326538383430353733386531383333623463663731643261346633343036393433333935366137
32373432326666383533623531383335313562363230373238333331306662633361323832633566
63613233393331373163343264633564646232636363333337383138663836393339663537333565
32323538623136376235386435663236626636393630653366343664356565383232363332313937
32653438393435373934393065666663323266343233316636343262336137313263323337353230
32383130643135663730623664633431663237613834333735346433333635336266616233393561
34646538653733343864356365336634653637643139323265623466313434653738626533383664
36386339393365366537323230346534376634333465306333666532316662363437633934346163
65376437623638336638623133363831373239623731373639333638366233653937616537643138
65613339306131313039616163393761383433613039386566346266363065376166373366613033
32626135366466643036306235626265353564663738656163666466326635386134323739333831
38313834663164663834666263343333383738636563386635663438313531616131666465623366
66356138383561626331313037306664653035323534616562643034663766666166303239323064
38666565636535633235393932663866316364623636316661376262663238656531353337366332
33346663373865333830633333383734346261643962613230633730326335313266386333356639
31363839363132623839626632646139363534326263653036616632633965623035626265633064
33643561383038383538343864666532313838643765373737633762643865306261646434623030
65313037396165653538383061383338326535346134336464326439383030303338656465626239
64386363663633353566306265363732646130323765633833356565623635353062663935313939
37613733643032363064623461306639633234343564666538313133613433393161366331316533
37643166633935393833306362363436613637623635656364373036613564313261326439343366
34323132646166353361633632663937353931376438356562376539333961336662643165636363
34396165626537643232326162366337303039373739316333653933633235356263616364336238
39613739626234323366336466383433626262623436316538643666343031333161363730663430
30306238633164376135623232633563663034633737643263336536666532366336396232326435
30616333376239626664356237336366343737396662336338653031316536343966633363313866
65383237623535316631303234663263326634626562653562633430356537393561613162623165
66363633363538363338393834343464393566343161613730373439363332613931346336646166
31343361376664313662646332366365396164636131336332346236663531373837656432303035
38363435643430623132343166363265346163643530633536616164383233616432303138346635
31326130313936393039636565646566633931303833313165373538656631346234646232373266
64393233383161363238636238383033666633336432393562306533313235653964616464393634
63646339643533363264643935333438303536383966336336666666373739366432626335373166
33616266373439633134636633366466623836663865363337353563376239383633343165373438
34663239303336626234336236666435363331343261396666366337323133373832623665393565
31323233323561336135366231656238633864353933626465656134636332346566663033666137
64313936343365393961363963666435353936653633343666376334393562363532336437616662
32393230346335646361316133663166386534343066326132623135663634656262653335383534
38343264363234346234646437663562616630346431623535616131663634393765343134353035
37643031386465336430663831353534633833656538663764313638636161623134353665623736
31333739376666306264333731396366383335633166383733646136306437653031373732386466
38363966616537616661383561393931613662326535316232326166626232316333346662316562
37653436386663616361616434333336336665383537363530333465346431653962366439303738
31666230393961373330643762386439336134663337333736633233333835333563353566633166
36633233316333393731656638323161306536313036346139653337313939653064663466376239
31623633623932633632346135346633666163353863663934643736376239313262313533396233
37616233396663323764373165663935333633396634306437393364313566303332646630366566
62343539376533636537366535643166386565343234366532303230393366393037356363326233
64613832353934346462653366646564666161613739386332386636326634303131643633636235
39386132303830363265333031333264386532303132333434323536613235376566623035613837
65646232303462373766306139366261623338646463663830313134616562343966303662653361
33613763373235613833
66306532353835666663633632373037633561613261613139306436626532656366336362343465
3966653330313132663633663462363361373230623262370a623661366633623762656363616537
66323464363164323131663335313264396538313237303432653532393631306635666138316261
3738653338316132640a643935646530393362346431653966643061643334316238333632346265
66633336316466356566336132626332623661316337613634373036646236363736376561643733
66383830386336653236633933623037316632326266363136613031373439383834653134336237
66363039316661353837383964363163353433383734656564313139383764346533313564616333
36336231363661326638373963393265323365636665653034373536663232353266656365656338
66313034646236356364323238326265633933346530393430373364393837376437623138306630
35306266643835316136323232393630336330346133313963646539636463323862306236653335
30356335366365356439653130376139616336346363656436356333333538373036313266353163
39306365303630636135373731366334623165363336383261386334313061356461303664343133
63383763633566393662623833346662366235323836353639306266383532333736386161393138
36666662306233306439386639666434353639343137653831343666393463323865316464396636
33646238363236303531323131613731343262353365306232343634313637613634626162363566
64326238383331316365343566623464383732653333326534636365386230343836396234396634
63646235356639363036313839643632333066653634323661313263313331393332656131393065
65303338323466383161333237643433303961613266623134383936663866363337653535326133
62323464636638643163313064373736353263356638666434333135656133336534343932613234
32356361346366316262383232653835396435333837633737356335353837336632376337616364
35616365633738366466623835653866663461393738396633343235316231636138333663383364
63376164646563353335333133333665396132343439363861623734336335356663393735313837
34323034336431643362313332633665653837353635303061376235306665336362323630376132
36313539326336656134633564343538636264623932626164366138653035343732396464633863
32613363383366326332383835316666366430623235636536353337373035386361373236363036
31353865333933356561623661353133353864643038626366666431313831353234653430396331
35653864633263613963333734636364366336613430623032666666666266613538663665623437
30643562333561626636646337626234653936616438623738623364653561396638383564333262
39323265346263366530643132303033343835353334373865373561613539613461343962316663
32636461316234313832313635636431326134323638646164396537383963326439633063313063
37353062616233323932343033376636613039343734336630303139616331626431616330396363
65623565653235303630383534343739346234316337343233366530313238623139666538363430
61613833663666386161356331656131356462376463373432316331626531393136393838313065
34323361323836323561633032663833343537663637346330326337363165306237616335333233
35656530303666633438303732623232383965633038616632633164663461393465336233643635
30363334646161363234393533663064363364343838396562626232383036623236343664313366
35646532383164393365343366633134393061633362303164393034653862653535613761356630
65633634393033653363373235323933333766306165326237636530663737393063623664343031
63643538366238363066666566333236653362633861346136663036373731626136383530356466
33326230303864353838333136373736373963386638663164363139386638396265626365356535
35396236306639316631366461373235326665643565326539333739393264373733363163366537
31656366343831616339393065323331636136346236386131306533383436356566633830623163
37303036663935376132323733353433306361383234343962633165616538626564653239393137
65346236656266383130323662636565643033663933346337663836643765656266623563656430
31386365646437306362643965653631373862623266303165386666626430663130666130323062
36326331313838316339653231666138616332653564323635356366316237313662353531336636
31666263313134656136663862303536366631663965343565646637663566656466646435613839
39656230616465653465316633373561343237356637643336373535653438656137323264643239
66363066666161316362383737333638336565613230306138343735633432356661386631383530
64353161396463313532336430613862396537643436396562633665613736663965356335313131
63303563383734353331656164313638386135343336346263643430323932366133306261663562
32633363373537626633373433396565363032323536336263373835653363323661663834333365
65636332383232653933363736363131653032666135373436663834656337653739333338636437
62613463626437306133333632663662303732376364663339306637653534396433643665353366
30633332383136306230613435346536323434666431653834333639343234613631323031643138
38613536336465656232336238653532636664313766633432363364613937323337653464616461
32653939386537663635653733336463303538333431303537323633623834623637666132613030
31666539353762346335643134333637366533313833383634356266653831663333393661353439
64353432393432333865306535643261376536663064323163393266373235623530626138316237
63333631396234326534386238623937626661663265383631386662383866636231646531633562
64323762616431663664613564366562303630313137353838323064333966323062643233353830
37363763666530643535666235383062646163626164353037346365366332366162636563313361
37343861373764653633393930316666613335393232663332323035386431326566663038613861
37303061653936636234363937623162313731353961343337356663623362306461636438333131
32376633663639333534396162383438373863633664383266626537343165396435346337343935
62623232646432346362623430363665353036376564323734346536393430336135306335613238
35633365333430626134353535623363396330343138616530613333633961303930623633663662
65313032353232653233346665616562363138333639323562653035646431313365623036393665
3363

View File

@@ -1,190 +1,209 @@
$ANSIBLE_VAULT;1.1;AES256
34613132613738633435316130386263343061303161633063646466373138346138323037323639
6630653636343366313566373865343930633031396466650a306363313065653666356265643730
62336434313438616463643034363237326434666263666336303230316432366263313261336135
3264633436646562340a333039313766633930643264636637653664643636363134653666633035
30613535383636396436323762616365386338396565313134313932336430333863323431663733
32343561323436386432323263623435313935616235306536396636386165326337363637303864
33363833623430343530383632656530336536613830303962363335383866626463353138336336
37663836366638313132376337366632653135646531613631313830363439313963353530336538
39313135303736373963656330363938636235383265393961626632356330653438663466303862
30346633663364376362343865666230326233363163383761326564313132323136363234373638
30626565303563396131653937353230353837666139616539313630373737386265393839313039
39613862613263383164303264623066343863306163623163653632323865653166373635666338
32636639626435396533383439373331306335336663316638373432623966653662353265633166
33343163653439376134393338613339396364633539386435633664643665613664316330646230
62386239313837646135393662363735393665386432356535306132613038373336306464646466
35666631303334646164626163393061383132623132356161323830363562326664323833333766
39393035376638653338373137613464356266616335626665316162326431346236313666396137
38663736373036656431646235343332386365663461333734623461313166376562343761306338
37333437303163646439316333343663353764353030313461373033373339613966623734643736
61616466383230653735323130333631326161343566653435326634326164653336633937663636
62643264353466303661326530653164363935626331613234616139613833303530633830356337
36643762636366623939653636333564636565643939633233653036303931343833323830333731
35346330616435383437653764333430396236363563616433326334373761656264313336373361
34373830656334313230333463333139363061343836656638646230346364313032613036353731
39646138326533363830306430643236366433613136306633303762306463646562613431666535
30393532376434613362653734336362663935326438323232626437356530616138373735633161
37353339653533616536626537336462646632356234396239393230633263656439633330366135
33663862343039346632393037306137313630393330333532663565613165383332313635333134
66353861303066366638616666636232303335313137343064363031376337643930363062323566
35346262633031383762323136663934623833313539313965366164353935633933633732363138
38333537613831396565666364333333316338313537393130393161623532393266636163326332
39333834643333363037333637396530386432643762393261666639343966363662306237373938
39333439306131613730343564636563626232626238373565653537333330326130306330383036
63396435633736663532303661643232306134333333386439383236383637386533663831613133
35356137623037316138393735316165643437666336313163383935366434353230626130383136
66346537373430653236336239326262383639353163656339343933666137643539313865646239
30633330313235396532346264666564313765316165336532373162333062343062353162663536
66616537636566316366653031386661626539623164336662646466373734656661613565633637
35666565663266343436393430626138663764343661333262613065323264393163646230663839
39353864366566333465386532373036373665633762336433316438633939396465353433366462
63343436353339383363613630386134363935373863383162396631366562393833333564376666
64363832313439386261653364363130326266333065306164613665343465353566663338343138
39323731386632663064643739666436616630653838333237336366346139373137613265623034
38306461366530373562636161326361613836376266373836323462626364383666376664623839
65376130383462343331396236376532643335376561316332616439613333393836303765363137
33316366323232396566623332356338396637383763306130336261623366383062303766663565
32363036356534643035623339656437393765393365333638383863653365343230333837346535
61643263633863326561396266366563333765613935386631663437383734316238633731356636
33323966633336366236373431376266666162653936313136303366343532353338303736373130
65323634333838626237656334336131636438643435353131626430656131346332323032396434
33626332316138303935633539396565393266643664356131396265356563653632346166666137
66303665633238323266306435653230323965643663373661613438323461366535353662363466
35636331613761326565373165653763383030666366383263616234386266663263336361363737
31346336643064326264633636316164393065356437633162346332373063326563373535633734
39643666373835306331623133346637383137303662613134313038313265323438363830383065
66666238613930633763363838343733616537643032636364326465333463323665373937383033
61386639396532353366646661366265333838633732613866616164633765663034323632316134
64656637396339616564386264633732356462313031303565343630653265373132623336356161
32623534653361356632663930343830656238376234383538616533323466656332373463376236
66333634346130373866373735323464366534396362306430653832303434393431653264386533
34336263383062663232613939373063613137633438393730653434336639663532613231353865
38653636323236343066353637653235383238343837633861663631353665383262303737626339
32656537373364383233626631386231343838616564323234336264653636356637346166656265
65336166376134386134623932313332323265386664636466313436376132306663343233306631
36666439633236336333656137313665383163323234363530366534363731383832633737396330
38323863636566623031393763633934616632313534653666353361383663323061616462386661
63346361386563366535666363323334376533343233306236326162353865643631373565303037
35646264306237383966636565363163393434633339653039373363663932336333633162656536
38383035313233633362663938383730396266663138623461393035303234663738303363393632
34643461343461313162303430383235303961323832383537356232313066643961346463613064
30343864336237623165343539643833393963653534643531613262343162363136663231353432
35356264326235336363623734656639343161633365373138373533303966646263393637303966
64646638316462663365396330303439663464666433326434326634666536333335353434626466
62306633626637663736373164363364363164656434303136363639376561343131353331666435
64303133383431353765376162306366643238376661313832643239323665666435316362373931
36643365353063393563333835376538653963336135613038623865383734353936336335313532
64646666303332613738356134623436313039643432393439306230653864393131366536383237
30326434613039643839303031396531626461343637623363373065356363633961393466363435
33646661373162343062313339633730366362353762613235643665383664616437346532633935
36396534393836646230313931343761346234363063373539373132373365383064636661396437
30363233663430626137386134393636333765616335383664376665666337393735373030376230
36643162326639346564653363393336343138336662393735303438313730336163303039326535
39306664626263353337303362326433663765363264343839366434363162366537633266393261
38396130353231366633623565383162616364363534646539373434363834316365333634313634
32353664653133326462313361613235613261393136383834323465626664363534616534323535
35323664316438333764356330383630343635346263393564393533386331613766313030336130
31396466353062303935343765656166343864303961393863343365326333316233663835623636
62666461646330356266323639633564666631363066333635326533303539383635363530353530
38616534313137616464656537613564656631313266623832346236623030373033623638303730
32376338383363613931663431343535393831353337393836383362306665383535383736653663
36636339303662633363653333306566326439323934393831393131336165356431376639653138
65376333656135343463363737613630636533343537623066343865613365616562646366353463
38333263306236383133313532363565386461623438353865653939323161373331383338656237
31643836396232393662393639666536373965313036373034393230346132656630653166346338
31396139343131353535376364323966653336353163623931346366346339633432636336636135
38613063393839643064323536373534643066346261353938666361336562393130626530616631
31393761333931303533363161383439326137636565666435316566313034363237376135373931
64326332643264653266303836613037313037646365363732313865336332613638643531376634
65386465653136336234613165303261313035646566613337633939333435633338393731346263
36376333363738373339383866373835663632663332313634623562653663636235393939656435
39393563393465383931396435663863333036373466336235653163646231663463643462386661
62393539633964626564393866386634363330636261376266646630393132623935653134666637
32323735343833656539623061636463343334623730363139343031313661386434613264613137
33353434633561363734353061316132643765303237353931323039653637353464643034626363
34646365633631383231643636323536366432363536353063376633633531666539666631623832
38636132313165326132653138653564373032666630656362643037666439356330383834386539
66343863643566353563623938623533663631313139363435353562653835653930373463646335
63303938633736633734316361386436643931316534633737346639396137653036383638393163
63386435646562646265363066346139646361383838653638633334646561623461623762663432
35396335643431636265626631633538373535633864336538613437323031646263663832376361
33333238613031373739653739636362323132343838643963353465343966633163366337663566
37363332643161346637636665383635343930323632373865336165346237626534346232623735
34353063313638383466653939666433666432346235663538363931393330363438376665356362
63363561396566666630383233376630376530303732343939643338353461396332303839646664
32353935333664646431316137623837633233393137396530323931323066623531323038383538
64343365356439386334663234356639613031343934663962306633663534336462613337633838
33306431323662376335333562663362663466373364613333353037396666326462396666306137
62333764633631616162383231373132666561383664313266633136323266316339343635316439
36383332373735363930303239633836653435643739356463643263353636636563346330306565
64363933343837613438383231643632396463653862343930613539393663616163623463386666
30336436356162383966613337313633666433663231643730366233383438363737333162623836
63353962636337366139356463663138653737616563323464383539613637616363646132323565
32366266623761666330356239336339336434353737373739313864353365313435353663393735
32373333323538396331366337396637356131393234316562653936633166306431333436313161
66353965366438656139633030303233373733313964363636306261323265356233663034323766
38633235646239333331633136313934623136386466653366393037613765643161656430333933
31643062623837653039623335383466646232353130346536663831313035323537363638663861
37663830623565643638666236343063643164366164346230663264376665613339663164396131
32353139353435396631363763353430663534323065313930303764326364376632393364636334
61393165383363653661393038626538376233326231376463303935646432336635323961323135
65633336633639303839616266633065343365343363393431306335653536363639353963393662
37633338323366376332366231396236613463663837346263346263656564333265373036376230
35623066303961303866633062336430626462396665626330323864666336396339373438386236
34313163376139666136643232616561326163353261323737323434303937306534613335336135
30616361633365623939366438366536323335626135656136363936663663616262376362326561
61653066323061303237383562386337316331303937346232316339636638343463383131333136
62326530663665316238386330323630386433636563356537313061656161373264646632613538
65326663363637316236303761386131633535363237363061346135313037373238333030333962
65396139346431656165386334353831373132636566666362653934303063323962353030383365
35353137306533333635303264646233366633323066393736396133303764613731333565303962
62386161303066343462383365396233393563386138373763646264346161653935316566313261
33646163656134306339373634396266353861333632346464613830356534346562613534663762
38353662636662343361316233666264626631646162323737666637636165613566623330303166
37643566353137663666623663383232303865386162393030616133326233393364376161633139
39316438336632353935323733626537386534343239396166353961383563393738363131616538
32353931623037393630333063653133303564633030393861393739353962313263393261356532
38383835306464353865306362333966643732383830386362373038306465343364346633656366
34323432656337333666636233643838373563326464313930633934663662663635333036316333
30643765303539343264623936346166636538653630363030333439656634396539653039353137
35663632656231386465623939343235383763336165313939343231666466376534343663343366
66366266336435343661306331326333623763363933633533613335366535316166646662653664
38373833366262363465306366396537623164383466663634373539363238356266653337396262
31663032336335383833623439346165643135353564336261393134306163313734663634336431
66336339336638396232356334663830633236373138626631353132306465383463313362636665
65646435653963333736313830626233646263373862333761663937663761353234643833336266
66653037656235646338663432333662376361343639633263616630343564396661636262323035
64356231616433356439393435363332373966363631653834373731666533663666636139613632
36313133336636656135396364663234323964303633393462666435623562313363656363373566
63623531623130616362323965323833386565366132306464396265316131663334396661333731
35323537393437666339643963313063326536646139333563303163343264656332343334386364
66353830313733316330636161376635336138653164373335366138383136343239333462623662
34656639386431313037363261633263313433393466633963363330633835316539363334626530
64646632376138636136616130376665323533363330653531656132306636643662393338663631
32643736386339336536353865363865623033623163656136353631656562306535666435633964
66393834363239666366383165646333353963313563613465626232653039633331666433383439
32356138396263616139636230646336653336393739623334356566353834353236653832323734
34396338623434623961616433653536346236343162363534373565393464343639613263353331
36313364333064313261343533636138643561363831326136383437353435386531396337623861
32643735616234666163393361363631343035346134363330663733653538363631343038636430
62343432646265333862663963353837303631653161323033373530633165643463656161323839
61626363303036383034336261653565393963386435666663346332396432386431343461386461
35343634396639393633383864393462626230663339353332383739373230613661313938386463
65313465376664383737336438333737396230366139633433643130353264653733353436626162
38306639623435323431646338613236333431346138313134356164393133373462353732623164
61626166343536653436343734313739336632343534356638396563346435343031656238383630
66646664323530346630323663663361336537363435393062323236363466626135623735383461
38626365323163333037316361303934616363623031633065623830376633353565336338643565
62326333333466636265643263326132316566656163613633383865366663666135653739613939
38316335323765356562666266386566363162306139343463616533366561613834383263323639
65396263663235356130376539313535656336343464656536336231373833633466636137633238
37656335636637373466303730363862653033626263356134376538626131303038353765636363
64383032313666376632316161363930663135623037346163303166663233326632343835656433
36646161636332316661333336363961313537326264646135356365636564646336386431393937
66393863386463626331363439353164663562306663326361643035303963343162303565636635
63323739623363383039393336373631303666636265343331393833363762373463383662373164
62353536313239353764633637633931376365353835343432353930616666353730346338383439
65623263613031666263346561643438643162366433643136646637666532393833313162353365
34383061653330646134313434643663386361393031383739653339336266356337373232316130
64613032613664376535653261666461666366326661663038383931646535316661
62316431346466333036383039323736336662386634373664343961343732303963323361663530
3038393463616438356133633430393535333335663236350a323064386662623762656138373763
36343534333364666466656138313034393239626435323163376239333662373538323530646663
3961386133613637320a333536636263646133303231386663386237626430626439373435333233
66306661326232303032653066353433363839303630376237363538626537303765663065653336
33346335363733343938393335626661626431343134353164396533373562396332616262666362
62396662653461643331373664653735653563396330303165646233363266333562313532303164
63363566353336646664373633376331633465353037656332333562663731373463636133303637
32346231386463353864343465336333623136336663633531343830613935666535306131326666
30353866646264313536333165373638373034346230373738666531613934313762613131333634
36656566376535643833623631383539363163323933343662306365383732303764346665306363
39336162653734303062346335656431366636626262666639393162346430343737376233613761
38366263663062653332366137346235376261356666663331353430663836626339663064396461
65386431646435313038653131633531326631386436333361316233306465333533393163653437
38633765666362383236386130313961386266353463396138353439643232333965643062356334
37326136396133373061323366383631663165396564623631653362623438336464356633303538
64346435613736633839626561363161383435663333383133343030653835323131373937613435
31396661613534636138616336333538663835623531313835616266653662353262616162646431
34393366633433643536666230356635376332393632333531633139396432613463653030623564
64356232653337613535326661633539333663316566616133663338656139656639393538306332
65333036663563333733383439393332386137313437623834633231646433653233623037346535
62386262373032646230303764323138623332353236653461393838316663633033353339623132
39356438653366633464666638656630333438323936333035383764396334326637656238383932
36313165353534336666626664373033616132643536366335333466346631323262616239343564
38376135616264313461323739616663326631636431633937366534646366383430623062316537
37313536663139656235663335636665633634626237303365326665383965636265353262643362
65323963326430353362346235346434306133376334613831396635373936666565633232316465
61316135336633356534356363636130353837653435343032663361363335623164373835613364
64643365616165393436376263323439613637326434666639613164383066306365396463633633
32633332346335623831383734653838323436346463633435333530363036393838346231663932
38356663653066323966626137623334623739666463366166646636306638393638356332336630
39626534666235613237343634313933653931343831316137656439653266393663343930303462
34666266653162323231376564393662326430353965383364326337363333666562326262326233
36383733646362303330303934326533653365643538623039366265663931613031373862366634
31343835626430663962386532326666346261653236613132373535303937386535303432663766
37313932366562643933303434623234393765363464666362323635646462326438303333393132
32393735303039623135613033636532613763396362366565316536323933366631663765333033
34356536646339346130383338316162646530326239373235663632643034616331356533363234
32373365343435343561623265343237376265663039653634663538313062626633373238356262
64356431353936663536363362626165383662343835626238353036393235343034643465653663
30393861363965636436663732616165393231636235316533663264383265323763656536626166
32363562656266656331353262356435353030323330663032653930363437313934633265333861
33616531326633383237323231353866366531636437356230636330393533333331313566383138
38303562643435383736363036353138626561323530393736666236346639326162383638303165
39616361316632323936653734656264333764356431393635613833346434303861646264373337
31623435646463346630336235653762656561633035343332636135393464393332633139643761
66613964663862626664393133326638343336373962343566646231356261386339393162313438
38303036323132353132653633333064346338653566346437356633666565643730343763373137
36363432346633626336373934646635353264623834303431313466346536653839366661646636
30616461653938633562613536393864376230393262313663666634303566333766626435643333
63393461643266643538343132356130383262366463313132383239323838636361653638653437
61383936303836323931666164373963656138343962326135623565623930346136656566373335
35623132613663356430363139323936643137393337653438306361316464363734313135356362
34636566663636363933363462666635643135323631356262323635323932363035323763623734
34316637626263313734326466366364313732383465383062326137646262383130313365356463
38376565396339346463653833303361646430323636623830646233633362353838333131386461
64323464376361333239313739376436623830393937353934386339366339326439386564306434
66396136656463643462353663633233333931316532346162653961383334656337636261663266
39636331353566343966616166363066623561633837313062633038633137633264346663623730
31336438643536396134643338316637333562663639366133663637646236613963353966643938
30366364643165616435353062323330396631326137633034666330376633353466336230643466
36626366313639373331303734353862336665643962303837393164616266323433316665626436
31303137326331646539373863623638663839373461363135326132646632343764656538393035
30663833653236396563393634373364306536323965656331666465643762643036633866343139
33343438333137643733616530666466376563653535326261633933303539383032643439383030
32643033346463366335303663363339323866316437383366393731373034323763363562333033
35663464336636623835333632623166623163323237353831643666343564303632646539623461
61613864326438653935396434613761376234306261396262323732393338376339613866643639
36386537363536376135323862396363323062356161353638393063336466653437323838633862
62663738353235663230636639616638313237313638626334633061633535373733613734626665
38316464643035343261633466343238393632333530323562333066326334663932643337626530
32373366323364306236653465633964326539646265346466633730396236366638313032613363
32323332613562613835363433376562643431623266323131313031316163366137623434323030
34336234363861366435393532616466363631313535303264643765346631396564613432616363
64336364393563396132646166313163323666373638616136313061386561623338656538373033
38373166333762323065326464363134346335653236613530313235333864393265383633663637
32363134313230333039613137306135373964386230326561626137633133326463373935646239
35316536623932323135306233383332333832396338366561666565323462656666363834346431
61316139343634653538396233656262396466376263643236346438306630666534303337323565
61343636303564363132393236363333653263353061376330653534333762346130653561623039
66656135393864313934393233663738386430333534303432396534623831333363393439386135
35616436303439653132356530626138373934383962396564646237316665323538396666366437
30376339383233383664343965306534386166613964313534636261316537316637343631393836
30613761323964636433613036653631303434346633623166636139326637363537613833386165
34303032346137623736373563303464306232663066373931626532373639343535313830613135
66656261646465366366313436313139376136373939396330393464346365383730626466613530
36303663626337633735633636666164366237323635383664333938373362626164386233663165
30643432356433346536663932616530326339383736343036333663383039613132303263646236
38633939383866646534366663393434373464616165633335373034306133393666326439613761
65373661346661366437663236663236663632356466386564376163636636343666303535653661
66646465386133353539323863656131653238363633336239376131613531396336313562623331
66393466613461393931343765303565383730356131663533346133386337316431366461343731
38646562613462653733323163653062663332393438313238316530653165363762313537333961
39666635363534646232386538396530316232363130666231643363336361336339653461326236
61373932346234343537366433386335353636636666326164393364623035656530333036363632
30643836393939646139646134636362336332383836663862663935383536613031316135613137
62613065363265666165363732636437313536383037313863613937656437316331356630636161
37386335303237313365346134356266336330303134646339353432333062303931336639613365
64353431373862616363616330393034396630333232383661353533323034383762353062303538
62326433366439393030373163656332353636343432633133626139613535363063353263393761
65383238636564663061356561616430633033323233336530663335623538643466343165326434
35313835386566326138663736613838613064306238383063376530636362303938656364653436
32313364653439393132353961343264346231333732323537623065303839663939323466613834
30393138346632623236356130346538643934623762663538666432343065643465663164386564
39356565646566353830383338623939306161373437336230373166316530313331626139633039
32336535633839643532626632356464336533623766626233336335366639346666663931306536
64333239613736343534353663383232626638396438653262393835643138353466373936353234
39626439663463636237306630376231343537623262313635316164316539613231343565333532
66363539626638336637396532386437363438373530393165613434616162353561633839366533
35643265646439393563303433386432316663643165613065306461313939636133613733373138
31623965393466363831626135663335646661373136613934316532333964346230633238646539
38613732393135363430663334316162623330663865393234343730653434386462366234343332
39646636646630303964623662663437326161316635646361623833343136373333336463346230
61353830383364393137343134306665306633396632633634326339393331303231343461623364
32353131333133323939656637633664663437316666623438666335376264353637323562343935
32336261653664303965316132353764346663656466323464643434373736393462616166636162
66336563626536656533316165313735386334393533623038656664333438376536396264353030
35366532613733346366353366623630306630623130653331363165346338343832373338393765
30336130326639333334393338366362646235383635343139643136366630373761386438343130
38613831663533626632623632653934653635633366353130663538326538316636383262386433
34326163363136613861646438323132376139306533643765316435356363643235616365303932
65303737306339633330633937363638663337636538623535323637383761666461306363616338
63356364646463346437303665376266656466636265663864663163333032623836646533326437
34316131633031363966316238643163613838653061383734366631653733633438313038333432
36633963653366353431386261303264323931353465343333323339613138313562616464663931
37663636376633333033383666323161656234346261363536343134343566656530346433383766
61373166666530323637303737653733396333313335646666613936623630303262306565343239
35363639393138323062393436306466383831656638666232616466343065363464313333333162
32393539623737373231636235666233656132383966663964343161626563383965616161623666
31356461653264353239356433646132316462386161356330663932353461386339346530653232
33306566663061616133323230643930643030386633666133313132353436336135383336356563
32393838333532383637363531396234623038386665336363303731376461306630663761303139
64333130356538623032373839313864633561316565383434383962353738353666636366333765
34353334646365616234623031393339663666633765636432666666336261343761333733396534
65303064643535383866623363333162303333393461313964396365363666313134333033383233
63393837636161653031633066326662366366663636313666663834376332356336666530396263
66326634376365343635666130333936346133656263343463613763393738393862353934343237
61316437383830636264326564346535646635386562613466323832343665636630346462333863
32623537396538643964663936623031326265373066313637636232363364653538363064613262
62306561373133373532376366336637393131383233393036313161363563303666303339363230
65633263363064633837363362393632383966366337393030353132346465346463636535303062
37316665653230656363313937663636336336333136306536303861303439366531323266336662
62376339646334303233376134323065363938366162316461626566343235303761633132383433
66303435633336313961333734353236623536653739336164353037343334386163326432303031
37353630346164633766353365613662373936663265353962333566336238336533396639373839
62346564646261303762663366303939393963393134303730383038326562353837623130396439
66636535663137333535393864613464636334363132376562393531376132333230346632363230
32306363336638326235663466333236646130336539333533306236653861313465343661613235
32643633633832636336313431653134623234303534363838306337363164326531343061306264
62643033326137643461636534623965343161636437326165303536343135393163643734373936
61373237326663616461326462393431633765346330313136383030323736313533313662633438
30616335373732303931643131383732646261333432323537393736313438616336306439626535
65306137303464636330303765303663366436353063643434383631376462303530643836366632
64613730316439666462613534383561343632323832383336636535626163316535383833313834
61383433643637366561316665346335623135323361346532656139353261663531396464343638
65653137303664613562333661363636623533333735616231623139343661353866623864363533
62636131393364643938363463303465333430386564306531366436316365613063623866666666
65653261363562653363306331666566336462613661646264306361663835633162323032616236
33393663613762313033396136356339356538376633353837613366326634303438373036633362
30613361633037356633376336353539616134663561663462633336373836373736646363306165
33323935313131376531643733353965353761393532333835616534613062373237353932656234
35356538633032383961326562346161356231613564656336343039616339306335666563323464
31393961636330333966306332373837636135646465316235653533626261393865653932613930
32376539343530326138656361356238653238643830663636656435383634336562306339366330
37613663343837626661383235303238653533326436643236653034636139333630393934633462
39613365636262613736316530663732623837653134653133363032623931663933666262323035
38666662333835336464316434303436373663353333396162653333663234643139386332313762
30303365646236653362376464656165366536303331393935303936306639656331636261646530
39333332626565343964623136643734643664383662663133663431353161303639666437386638
37653332613865636666373634626466623638326237656663323734303363636334643430626533
39386437366430613737376433366539376637393963613137633162653130666535313363343437
39363232366136343937343131303438353837613335326437333166643336306638623665616439
65616662613331623137653539313462336138633739623036623264313835363435303262643031
65316236636432346562643262353663656364353536666138623437373334623131613238353763
61356664323066356533616563336231393432643038306464396664333236326332393161373963
32663435383363356563363134623736363966613834663933633963383463313335643036613633
63336661393531346534373231316537353539373738373433383666313435633433613031643538
36326135306139353032656230663734383437623439333031323163643230613866323535663162
37346161303935333966346565613234356331333031656431376238336438666239623032356435
36653235663664303235303933626163616363633866393337326430376335303736626561386231
34376563633963323565616136343765316365383538333765346365653432353261346533656661
30346433333639626234643630366638616563623133646666323061366530646264363566333530
32623161393733383036336238626236356361656633343732393438663937376163323865653366
34613035623230613362346337343535313139363636353536656131353139363835616236663863
62363666396338653732316133666536393663663030313531616437343761613637636233313431
36306566303832393136663963323836653561653664666661356461313131636435306632343836
64613839633264343239626430363632656162343233626330613538663362356561623965336232
66393432343132643039383138323733353463323263663239303233316366626437336531313562
31626561663962326431336138643438623836633262616533656434343436636134333066613065
66633663643632313436616533326163343733393035636433303336613463333532633066633565
38613932633632353434393433373738326166663764383765613136326630663434363764316431
35353562653363363533363538646336646666393564613933303066333033653965333033316163
61393666383935393261373335626262313661653639643830376265633562356638326336663432
35333936313866383432666239313630613661613433303330363539303462366237313533636263
63376331633865396639643530663237326338383535643930653233306166343834333061346463
61353734613765356165346437336137346639616561643238613565323938386161326139623861
31643866393765656263646663376638656237323532363935353961633361623862316431643861
36333339386266396132613066323834376265396563326261646561323434323639343561613161
38306464383031393633363764303930306163643365333532363138376365316239363361643962
30393333646233363564643661373865373034663131656331386631616466333166373331643963
64346234386338663464356165366461353365323737343165616439646463353661323534323331
66643931636631616331383065613334333262633639636164333165373237623235316434326531
30336663373437343264353032363737633838303034396561303035656234653333636366343463
30393966336664386434303764356531326665376230623830303237346261666162633864393866
63646332616135653138333437356565643333663730333263396466303234643331653836356431
37316434366533316132336238373833346165303062633866623033623037646461346263623734
62393039626239393435316538636433333634616161663833653564353637663864373264313530
30343533306335623130

26
host_vars/nas.yml Normal file
View File

@@ -0,0 +1,26 @@
$ANSIBLE_VAULT;1.1;AES256
34633334666530383466643739336536363136366631613464383161656535656466616261663232
6237633664336364643136643738643563653637613136360a363431663336626432616538623435
35373839383830393334663037353262653763353935623332383534376436613161313934316338
3930623638356537630a616339653631666163376134343535313235363234356664366234663038
30376239633164643335336166663737346262313864626234663839333132386232346139666131
33633463353330343037306365666463653039643235333566663164313730663738663036623539
64636663613566656338636638383066353562306137376432346639316533303665613463333832
37313361623639653533343536616566613865353733656338633833666263323433306431633635
35393333346134333466323239666335613862663935353662373833343635393532633461653932
38303034613166336632376264313961336665303332306165636663306237653336316330376236
31313362616434663861333264306661653532316365306138333131643731346636646365353733
62366335643566636631633630336231353666363965623664376231363164313362366164333431
33323632366335646137666466316530613862373162376461623633333238616637373336333064
39303761353139656333663362303365316131646633303238623031386137656263646364373163
36336633323266393663336462626236353466353266656264343639303739313362313537396238
36303637386266386665663163633438633763386232313861653438303965393938656166656562
63373064396135346361633739663534666230356566366333636266643932316264343339303833
38313233643536356232363636306363333463323133656536366662323963643637343365643035
30393061343630633263303864336438653339323264396434623038363464366235626235326464
62623861333264616331396230383831346163303433653236663738396164643937643663363834
30316530623433313633653639363065343264353630613436393237363930326632343230343538
64356230316530353663663534343739376138653266323037336163386130623361613632393037
33376232666337316536613763623066653431303366656333646361613839323831623562613266
36323263616364653666343264303338373232343063313266653661323933656662386237323637
66666337356337343864613034633934656461653834306338313031366432353263

View File

@@ -1,8 +1,4 @@
[jade]
[ungrouped]
jade ansible_host=fntz.net ansible_user=alex
[jackson]
jackson ansible_host=direct.jackson.alexav.gg ansible_user=root
[nas]
nas ansible_host=nas.fntz.net ansible_user=alex
nas ansible_host=172.16.0.29 ansible_user=alex

View File

@@ -3,8 +3,8 @@
roles:
- role: traefik
tags: traefik_deploy
- role: gitea-runner
tags: gitea-runner_deploy
vars:
server: "jade"
tasks:
- name: Deploy Glance
@@ -49,9 +49,9 @@
- name: Deploy Romm
import_tasks: tasks/romm.yml
tags: romm_deploy
- name: Deploy Nextcloud
import_tasks: tasks/nextcloud.yml
tags: nextcloud_deploy
- name: Deploy Owncloud
import_tasks: tasks/owncloud.yml
tags: owncloud_deploy
- name: Deploy Excalidraw
import_tasks: tasks/excalidraw.yml
tags: excalidraw_deploy
@@ -61,15 +61,9 @@
- name: Deploy Immich
import_tasks: tasks/immich.yml
tags: immich_deploy
- name: Deploy Jellyfin
import_tasks: tasks/jellyfin.yml
tags: jellyfin_deploy
- name: Deploy Navidrome
import_tasks: tasks/navidrome.yml
tags: navidrome_deploy
- name: Deploy Monitoring Stack
import_tasks: tasks/monitoring.yml
tags: monitoring_deploy
- name: Deploy Drop
import_tasks: tasks/drop.yml
tags: drop_deploy
@@ -82,17 +76,31 @@
- name: Deploy QBittorrent
import_tasks: tasks/qbittorrent.yml
tags: qbittorrent_deploy
- name: Deploy Jackett
import_tasks: tasks/jackett.yml
tags: jackett_deploy
- name: Deploy NFL Proxy
import_tasks: tasks/nfl-proxy.yml
tags: nfl-proxy_deploy
- name: Deploy Uptime Kuma
import_tasks: tasks/uptime-kuma.yml
tags: uptime-kuma_deploy
- name: Deploy CouchDB for obsidian
import_tasks: tasks/obsidian.yml
tags: obsidian_deploy
- name: Deploy Helium services
import_tasks: tasks/helium.yml
tags: helium_deploy
- hosts: jackson
roles:
- role: caddy
tags: caddy_deploy
- role: traefik
tags: traefik_deploy
- role: fivem
tags: fivem_deploy
tasks:
- name: Generate Caddyfile
import_tasks: roles/caddy/tasks/create.yml
tags: caddyfile_deploy
- name: Deploy Gitea
import_tasks: tasks/gitea.yml
tags: gitea_deploy
@@ -105,6 +113,16 @@
- name: Deploy Plausible
import_tasks: tasks/plausible.yml
tags: plausible_deploy
- name: Deploy Nextcloud
import_tasks: tasks/nextcloud.yml
tags: nextcloud_deploy
- name: Deploy Owncloud
import_tasks: tasks/owncloud.yml
tags: owncloud_deploy
- hosts: nas
tasks:
- name: Deploy Plex
import_tasks: tasks/plex.yml
tags: plex_deploy
- name: Deploy Frigate
import_tasks: tasks/frigate.yml
tags: frigate_deploy

View File

@@ -1,6 +1,7 @@
# Homelab IaC
This repository hosts my homelab infrastructure setup, built using Ansible & Gitea Workflows.
I primarily host this on my [Gitea](https://git.alexav.gg/alex/homelab) server, but it is mirrored to my GitHub account.
## Getting started
@@ -10,4 +11,30 @@ You'll need to install Ansible Playbook, either through APT or another avenue.
sudo apt install ansible-core
```
Then, configure your vaults using the variable templates provided & update the hosts file to match your hosts. After you've done so, you can simply run `ansible-playbook main.yml` & it will deploy all containers.
Once you've done so, configure the [hosts](./hosts) file to direct to your server(s). You'll need to deal with the SSH setup, alongside setting up the host variables for each service you want to use.
## Project setup
I have this project set up like so;
- **tasks/** - All of the playbooks for the services I deploy
- **roles/** - More comprehensive tasks, like FiveM which requires multiple JNinja templates
- **scripts/** - Any utility scripts, like the one used for deployment
- **host_vars/** - All host variables, containings variables for each service
- **main.yml** - Playbook that contains all the setup for the automated deployment
## Deployment
In my lab, I have a Git runner sitting on my local network. I use this to deploy changes to this repository across all of my machines.
The business logic for how this is done is in the `scripts/deploy_containers.py` script, which handles
- Deploying new containers
- Redeploying changed containers based on the Git diff
- Redeploying VPN-based containers that need to restart when Gluetun does
- Redeploying containers when secrets update
- Cleaning up containers/images when tasks are removed
This uses `tags` in [main.yml](./main.yml), structured as `{container}_deploy` - so if I update Immich, it will run ansible-playbook with the argument `--tags immich_deploy`.
When secrets for a specific host are detected as updated, it will run the deploy tasks for all containers that host has (`-l {host}`) to refresh environment variables.

View File

@@ -1,8 +0,0 @@
---
- name: Create Caddyfile
template:
src: roles/caddy/templates/Caddyfile.j2
dest: "{{ data_dir }}/caddy/Caddyfile"
- name: Reload Caddyfile
command: docker exec -w /etc/caddy caddy caddy reload

View File

@@ -1,44 +0,0 @@
---
- name: "Create file structure"
file:
path: "{{ item }}"
state: directory
with_items:
- "{{ data_dir }}/caddy"
- "{{ data_dir }}/caddy/data"
- "{{ data_dir }}/caddy/certs"
- name: Create Dockerfile
template:
src: Dockerfile.j2
dest: "{{ data_dir }}/caddy/Dockerfile"
- name: Build Caddy Image
docker_image:
name: caddy
tag: "latest"
build:
path: "{{ data_dir }}/caddy"
dockerfile: "Dockerfile"
source: build
state: present
- name: Deploy Caddy Container
docker_container:
name: caddy
image: caddy:latest
recreate: true
restart_policy: unless-stopped
networks:
- name: "{{ docker_network_name }}"
env:
CLOUDFLARE_TOKEN: "{{ CADDY_CLOUDFLARE_TOKEN }}"
HOST_IP: "{{ CADDY_HOST_IP }}"
VIDEO_MACHINE: "{{ CADDY_VIDEO_MACHINE }}"
volumes:
- "{{ data_dir }}/caddy/data:/data"
- "{{ data_dir }}/caddy/certs:/etc/letsencrypt"
- "{{ data_dir }}/caddy/Caddyfile:/etc/caddy/Caddyfile"
published_ports:
- 80:80
- 443:443

View File

@@ -1,52 +0,0 @@
# Snippets
{% if caddy_snippets is defined %}
{% for snippet_name, snippet_content in caddy_snippets.items() %}
({{ snippet_name }}) {
{% for line in snippet_content %}
{{ line }}
{% endfor %}
}
{% endfor %}
{% endif %}
# Sites
{% for site in caddy_sites %}
{{ site.domains | join(', ') }} {
{% if site.tls is defined %}
tls {
{% if site.tls.dns is defined %}
dns {{ site.tls.dns.provider }} {{ site.tls.dns.token }}
{% endif %}
{% if site.tls.cert is defined %}
{{ site.tls.cert }} {{ site.tls.key }}
{% endif %}
}
{% endif %}
{% for matcher in site.matchers | default([]) %}
@{{ matcher.name }} {{ matcher.type }} {{ matcher.value }}
{% endfor %}
{% for handler in site.handlers | default([]) %}
handle {% if handler.matcher is defined %}@{{ handler.matcher }} {% endif %}{
{% if handler.reverse_proxy is defined %}
reverse_proxy {{ handler.reverse_proxy }}
{% endif %}
{% if handler.import_tinyauth is defined %}
import tinyauth_forwarder *
{% endif %}
}
{% endfor %}
{% if handler.default is defined %}
handle {
{% if handler.default.redir is defined %}
redir {{ handler.default.redir }}
{% else %}
respond 404
{% endif %}
}
{% endif %}
}
{% endfor %}

View File

@@ -1,5 +0,0 @@
FROM caddy:builder AS builder
RUN caddy-builder \
github.com/caddy-dns/cloudflare
FROM caddy:latest
COPY --from=builder /usr/bin/caddy /usr/bin/caddy

View File

@@ -0,0 +1,71 @@
---
- name: Create folder structure
file:
path: "{{ item }}"
state: directory
with_items:
- "{{ data_dir }}/fivem"
- "{{ data_dir }}/fivem/server"
- "{{ data_dir }}/fivem/server-data"
- name: Check if FiveM has already been downloaded
stat:
path: "{{ data_dir }}/fivem/server/run.sh"
register: fivem_server
- name: Check if FiveM Config directory already exists
stat:
path: "{{ data_dir }}/fivem/server-data/server.cfg"
register: fivem_server_data
- name: Check if FiveM systemd service exists
stat:
path: "/etc/systemd/system/fivem.service"
register: fivem_systemd
- name: Download FiveM Linux Build
get_url:
url: https://runtime.fivem.net/artifacts/fivem/build_proot_linux/master/20944-eaa15781d4695bd97b050d848e34aac3607c6696/fx.tar.xz
dest: "{{ data_dir }}/fivem/server.tar.xz"
mode: 0755
when: not fivem_server.stat.exists
- name: Unpack FiveM Linux Build
unarchive:
src: "{{ data_dir }}/fivem/server.tar.xz"
dest: "{{ data_dir }}/fivem/server"
remote_src: yes
when: not fivem_server.stat.exists
- name: Clone FiveM Server Data
git:
repo: https://github.com/citizenfx/cfx-server-data.git
dest: "{{ data_dir }}/fivem/server-data"
when: not fivem_server_data.stat.exists
- name: Create FiveM server configuration
template:
src: server.cfg.j2
dest: "{{ data_dir }}/fivem/server-data/server.cfg"
when: not fivem_server_data.stat.exists
- name: Stop & remove FiveM systemd service
become: yes
shell: |
systemctl stop fivem.service &&
rm /etc/systemd/system/fivem.service
when: fivem_systemd.stat.exists
- name: Create FiveM systemd service
become: yes
template:
src: fivem.service.j2
dest: "/etc/systemd/system/fivem.service"
- name: Enable FiveM systemd service
become: yes
command: systemctl enable fivem.service
- name: Start FiveM systemd service
become: yes
command: systemctl start fivem.service

View File

@@ -0,0 +1,15 @@
[Unit]
Description=FiveM Server
Documentation=https://git.alexav.gg/alex/homelab
[Service]
Type=forking
ExecStart=/usr/bin/tmux new-session -s fivem -d '/bin/sh {{data_dir}}/fivem/server/run.sh +exec server.cfg'
WorkingDirectory={{ data_dir }}/fivem/server-data
TimeoutSec=30
RestartSec=30
Restart=no
User=root
[Install]
WantedBy=multi-user.target

View File

@@ -0,0 +1,81 @@
# Only change the IP if you're using a server with multiple network interfaces, otherwise change the port only.
endpoint_add_tcp "0.0.0.0:30120"
endpoint_add_udp "0.0.0.0:30120"
# These resources will start by default.
ensure mapmanager
ensure chat
ensure spawnmanager
ensure sessionmanager
ensure basic-gamemode
ensure hardcap
ensure rconlog
# This allows players to use scripthook-based plugins such as the legacy Lambda Menu.
# Set this to 1 to allow scripthook. Do note that this does _not_ guarantee players won't be able to use external plugins.
sv_scriptHookAllowed 0
# Uncomment this and set a password to enable RCON. Make sure to change the password - it should look like set rcon_password "YOURPASSWORD"
#set rcon_password ""
# A comma-separated list of tags for your server.
# For example:
# - sets tags "drifting, cars, racing"
# Or:
# - sets tags "roleplay, military, tanks"
sets tags "default"
# A valid locale identifier for your server's primary language.
# For example "en-US", "fr-CA", "nl-NL", "de-DE", "en-GB", "pt-BR"
sets locale "root-AQ"
# please DO replace root-AQ on the line ABOVE with a real language! :)
# Set an optional server info and connecting banner image url.
# Size doesn't matter, any banner sized image will be fine.
#sets banner_detail "https://url.to/image.png"
#sets banner_connecting "https://url.to/image.png"
# Set your server's hostname. This is not usually shown anywhere in listings.
sv_hostname "Medal.tv Testing Server"
# Set your server's Project Name
sets sv_projectName "Medal.tv Testing Server"
# Set your server's Project Description
sets sv_projectDesc "A test server for QA"
# Set Game Build (https://docs.fivem.net/docs/server-manual/server-commands/#sv_enforcegamebuild-build)
#sv_enforceGameBuild 2802
# Nested configs!
#exec server_internal.cfg
# Loading a server icon (96x96 PNG file)
#load_server_icon myLogo.png
# convars which can be used in scripts
set temp_convar "hey world!"
# Remove the `#` from the below line if you want your server to be listed as 'private' in the server browser.
# Do not edit it if you *do not* want your server listed as 'private'.
# Check the following url for more detailed information about this:
# https://docs.fivem.net/docs/server-manual/server-commands/#sv_master1-newvalue
#sv_master1 ""
# Add system admins
add_ace group.admin command allow # allow all commands
add_ace group.admin command.quit deny # but don't allow quit
add_principal identifier.fivem:1 group.admin # add the admin to the group
# enable OneSync (required for server-side state awareness)
set onesync on
# Server player slot limit (see https://fivem.net/server-hosting for limits)
sv_maxclients 48
# Steam Web API key, if you want to use Steam authentication (https://steamcommunity.com/dev/apikey)
# -> replace "" with the key
set steam_webApiKey ""
# License key for your server (https://portal.cfx.re)
sv_licenseKey {{ FIVEM_LICENSE_KEY }}

View File

@@ -14,16 +14,30 @@
tag: latest
source: pull
# create static configuration for traefik
- name: Create Traefik Configuration
template:
src: config.yml.j2
dest: "{{ data_dir }}/traefik/traefik.yml"
# create dynamic provider files for each system
- name: Create Traefik Dynamic File (Local)
template:
src: local-dynamic.yml.j2
dest: "{{ data_dir }}/traefik/dynamic.yml"
when: server == "jade" or server == "nas"
- name: Create Traefik Dynamic File (Remote)
template:
src: remote-dynamic.yml.j2
dest: "{{ data_dir }}/traefik/dynamic.yml"
when: server == "jackson"
- name: Deploy Traefik Docker Container
docker_container:
name: traefik
image: traefik
restart_policy: unless-stopped
recreate: true
command:
- --providers.file.directory=/config
published_ports:
@@ -37,11 +51,6 @@
- /var/run/docker.sock:/var/run/docker.sock:ro
- "{{ data_dir }}/traefik/data:/data"
- "{{ data_dir }}/traefik/traefik.yml:/traefik.yml"
labels:
traefik.enable: "true"
traefik.http.routers.traefik.rule: Host(`traefik.fntz.net`)
traefik.http.routers.traefik.entrypoints: webSecure
traefik.http.routers.traefik.tls.certresolver: letsencrypt
traefik.http.services.traefik.loadbalancer.server.port: "8080"
- "{{ data_dir }}/traefik/dynamic.yml:/dynamic.yml"
networks:
- name: homelab
- name: "{{ docker_network_name }}"

View File

@@ -16,9 +16,11 @@ serversTransport:
insecureSkipVerify: true
providers:
docker:
endpoint: "unix:///var/run/docker.sock"
exposedByDefault: false
network: homelab
file:
filename: /dynamic.yml
watch: true
certificatesResolvers:
letsencrypt:
acme:

View File

@@ -0,0 +1,60 @@
http:
routers:
plex:
rule: "Host(`tv.fntz.net`)"
service: plex
entryPoints:
- webSecure
tls:
certResolver: letsencrypt
jtraefik:
rule: "Host(`traefik-jackson.fntz.net`)"
service: jtraefik
entryPoints:
- webSecure
tls:
certResolver: letsencrypt
traefik:
rule: "Host(`traefik.fntz.net`)"
service: traefik
entryPoints:
- webSecure
tls:
certResolver: letsencrypt
nflproxy:
rule: "Host(`nfl.fntz.net`)"
service: nflproxy
entryPoints:
- webSecure
tls:
certResolver: letsencrypt
nvr:
rule: "Host(`nvr.fntz.net`)"
service: nvr
entryPoints:
- webSecure
tls:
certResolver: letsencrypt
services:
plex:
loadBalancer:
servers:
- url: "http://172.16.0.29:32400"
jtraefik:
loadBalancer:
servers:
- url: "http://jackson:8080/"
traefik:
loadBalancer:
servers:
- url: "http://jade:8080/"
nflproxy:
loadBalancer:
servers:
- url: "http://jade:5000/"
nvr:
loadBalancer:
servers:
- url: "http://nas:5000/"

View File

@@ -1,85 +1,117 @@
import re
import sys
import os
import subprocess
bracket_regex = r'\[([^\]]*)\]'
quote_regex = r'"([^"]*)"'
def git_diff():
args = sys.argv
res = subprocess.run(f"git diff --name-only {args[1]} {args[2]}", capture_output=True, shell=True, text=True)
return res.stdout.strip().split("\n")
return [x for x in res.stdout.strip().split("\n") if "tasks/" in x or "roles/" in x or "host_vars" in x]
def construct_ansible_command(tag = None):
command = "ANSIBLE_CONFIG=ansible.cfg /usr/bin/ansible-playbook main.yml --vault-password-file ~/.vault_pass.txt"
def construct_command(tag = None, host = None):
command = f"ANSIBLE_CONFIG=ansible.cfg /usr/bin/ansible-playbook main.yml --vault-password-file ~/.vault_pass.txt"
if host:
command += f" -l {host}"
if tag:
command += f" --tags {tag}"
command += f" --tags {tag}_deploy"
return command
def run_deployment(tag = None):
if tag:
command = construct_ansible_command(tag=tag)
print(f"Running deployment for {tag}..")
res = subprocess.run(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
lines = res.stdout.decode(encoding='utf-8').split("\n")
def deploy(tag = None, host = None):
command = construct_command(tag, host)
success = True
for ind, line in enumerate(lines):
if "fatal:" in line:
host = re.findall(bracket_regex, line)[0]
task_failed = re.findall(bracket_regex, lines[ind - 1])[0]
reason_failed = re.findall(quote_regex, line)
if tag:
print(f"Deploying {tag}...\n")
else:
print(f"Deploying {host}...\n")
res = subprocess.run(command, shell=True)
print("\n---------------------")
print(" Deployment failed!")
print(f" Task: {task_failed}")
print(f" Host: {host}")
print(f" Reason: {reason_failed[2].split(":")[1].strip()}")
print(line)
print("---------------------\n")
success = False
break
return success
return res.returncode == 0
def main():
tasks_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "../tasks")
diff = git_diff()
host_vars_changed_for = []
vpn_containers = [
"tasks/qbittorrent.yml"
"tasks/qbittorrent.yml",
"tasks/jackett.yml"
]
success = True
deployed = 0
# auto-heal any vpn-dependent containers
# because these containers rely on gluetun for network, they need to be recreated when gluetun is recreated
if "tasks/gluetun.yml" in diff:
print("Gluetun detected in diff, queuing dependent containers for recreation")
for container in vpn_containers:
if container not in diff:
print(f"Adding {container} to restart list as Gluetun is present..")
diff.append(container)
# when variables update for a host, recreate containers
for file in diff:
if "tasks" in file:
task_name = file.split("/")[1].split(".")[0] + "_deploy"
state = run_deployment(tag=task_name)
if "host_vars" in file:
hostname = file.split("/")[1].split(".")[0]
print(f"Secret file for '{hostname}' changed, will recreate containers on host after deployment")
host_vars_changed_for.append(hostname)
if not state:
success = False
break
else:
deployed += 1
deployed = []
failed = []
for file in diff:
# separating these for now because roles will typically
# have a bunch of other things tied to them
if "roles/" not in file and "host_vars/" not in file:
task_name = file.split("/")[1].split(".")[0]
task_file_path = os.path.join(tasks_path, file.split("/")[1])
if success and deployed > 0:
if not os.path.exists(task_file_path):
print(f"{task_name} doesn't exist, running cleanup")
res = subprocess.run(f"/usr/bin/docker container stop {task_name}", shell=True)
if res.returncode == 0:
subprocess.run(f"/usr/bin/docker container rm {task_name}", shell=True)
subprocess.run("/usr/bin/docker image prune -f", shell=True)
subprocess.run("/usr/bin/docker container prune -f", shell=True)
print(f"Cleaned up container {task_name}")
if "host_vars" not in file:
# deploy the task, regardless of its status
if "roles/" not in file:
if task_name not in deployed:
task = deploy(tag=task_name)
else:
task_name = file.split("/")[1]
if task_name not in deployed:
task = deploy(tag=task_name)
if not task:
failed.append(task_name)
else:
deployed.append(task_name)
if len(host_vars_changed_for) > 0:
for host in host_vars_changed_for:
print(f"Redeploying containers on {host} due to host vars update")
task = deploy(host=host)
if task:
deployed.append(host)
else:
failed.append(host)
if len(failed) <= 0 and len(deployed) > 0:
print("\n---------------------")
print(" Deployment succeeded!")
print(f" Tasks: {", ".join(diff)}")
print(f" All tasks: {", ".join(deployed)}")
print("---------------------\n")
elif deployed == 0:
print("Successful, no containers required deployment")
sys.exit(0)
elif len(failed) > 0:
print("\n---------------------")
print(" Deployment failed!")
print(f" Failed tasks: {", ".join(failed)}")
print(f" All tasks: {", ".join(deployed)}")
print("---------------------\n")
sys.exit(1)
elif len(deployed) <= 0:
print("Successfully executed, no tasks required execution")
sys.exit(0)
if __name__ == "__main__":
main()

View File

@@ -0,0 +1,30 @@
import os
import subprocess
host_vars_path = os.path.abspath('host_vars')
file_contents = ""
if os.path.exists(host_vars_path):
if os.path.exists(os.path.join(host_vars_path, 'all.template.yml')):
os.remove(os.path.join(host_vars_path, 'all.template.yml'))
vaults = os.listdir(host_vars_path)
for vault in vaults:
vault_path = os.path.join(host_vars_path, vault)
vault_contents = subprocess.run(f'ansible-vault decrypt "{vault_path}" --vault-password-file ~/.vault_pass.txt --output -', shell=True, universal_newlines=True, stdout=subprocess.PIPE, stderr=subprocess.DEVNULL)
stdout = vault_contents.stdout.strip().splitlines()
for line in stdout:
if line.startswith("#") and line not in file_contents:
file_contents += f"\n{line}\n"
if ":" in line:
if line.split(":")[0] not in file_contents:
file_contents += f'{line.split(":")[0]}:\n'
with open(os.path.join(host_vars_path, 'all.template.yml'), 'w', encoding="utf8") as template_file:
template_file.write(file_contents)
template_file.close()
print("Written to disk!")

View File

@@ -18,9 +18,11 @@
name: api
tag: "latest"
build:
nocache: true
path: "{{ data_dir }}/api/app"
dockerfile: Dockerfile
source: build
force_source: true
state: present
- name: Create API Network
@@ -47,6 +49,7 @@
volumes:
- "{{ data_dir }}/api/db:/var/lib/postgresql/data"
env:
POSTGRES_USER: "api"
POSTGRES_PASSWORD: "{{ API_POSTGRES_PASSWORD }}"
PGDATA: "/var/lib/postgresql/data/pgdata"
@@ -70,3 +73,9 @@
STEAM_API_KEY: "{{ API_STEAM_API_KEY }}"
CONTACT_WEBHOOK: "{{ API_CONTACT_WEBHOOK }}"
JWT_KEY: "{{ API_JWT_KEY }}"
labels:
traefik.enable: "true"
traefik.http.routers.aapi.rule: Host(`api.alexav.gg`)
traefik.http.routers.aapi.entrypoints: webSecure
traefik.http.routers.aapi.tls.certresolver: letsencrypt
traefik.http.services.aapi.loadbalancer.server.url: http://api:3000

View File

@@ -6,6 +6,12 @@
with_items:
- "{{ data_dir }}/code-server"
- name: Pull latest Code Server Docker Image
docker_image:
name: lscr.io/linuxserver/code-server
tag: latest
source: pull
- name: Create Code Server Docker Container
docker_container:
name: codeserver
@@ -29,3 +35,4 @@
traefik.http.routers.code.entrypoints: webSecure
traefik.http.routers.code.tls.certresolver: letsencrypt
traefik.http.services.code.loadbalancer.server.port: "8443"
traefik.http.routers.code.middlewares: tinyauth

View File

@@ -1,4 +1,10 @@
---
- name: Pull latest Cup Docker Image
docker_image:
name: ghcr.io/sergi0g/cup
tag: latest
source: pull
- name: Create Cup Docker Container
docker_container:
name: Cup
@@ -16,3 +22,4 @@
traefik.http.routers.cup.entrypoints: webSecure
traefik.http.routers.cup.tls.certresolver: letsencrypt
traefik.http.services.cup.loadbalancer.server.port: "8000"
traefik.http.routers.cup.middlewares: tinyauth

View File

@@ -1,4 +1,10 @@
---
- name: Pull latest Dashdot Docker Image
docker_image:
name: mauricenino/dashdot
tag: latest
source: pull
- name: Create Dashdot Docker Container
docker_container:
name: dashdot

View File

@@ -1,4 +1,10 @@
---
- name: Pull latest Dozzle Docker Image
docker_image:
name: amir20/dozzle
tag: latest
source: pull
- name: Create Dozzle Docker Container
docker_container:
name: dozzle
@@ -18,3 +24,4 @@
traefik.http.routers.dz.entrypoints: webSecure
traefik.http.routers.dz.tls.certresolver: letsencrypt
traefik.http.services.dz.loadbalancer.server.port: "8080"
traefik.http.routers.dz.middlewares: tinyauth

View File

@@ -12,11 +12,18 @@
docker_network:
name: drop
- name: Pull latest Drop Docker Image
docker_image:
name: ghcr.io/drop-oss/drop
tag: v0.3.3
source: pull
- name: Create Drop DB Container
docker_container:
name: drop_postgres
image: postgres:14-alpine
recreate: true
restart_policy: unless-stopped
networks:
- name: drop
healthcheck:
@@ -35,8 +42,9 @@
- name: Create Drop Container
docker_container:
name: drop
image: ghcr.io/drop-oss/drop:v0.3.0
image: ghcr.io/drop-oss/drop:latest
recreate: true
restart_policy: unless-stopped
networks:
- name: homelab
- name: drop
@@ -46,6 +54,7 @@
env:
DATABASE_URL: "postgres://drop:drop@drop_postgres:5432/drop"
GIANT_BOMB_API_KEY: "{{ DROP_GIANT_BOMB_API_KEY }}"
EXTERNAL_URL: "https://games.fntz.net"
labels:
traefik.enable: "true"
traefik.http.routers.drop.rule: Host(`games.fntz.net`)

View File

@@ -1,4 +1,10 @@
---
- name: Pull latest Excalidraw Docker Image
docker_image:
name: excalidraw/excalidraw
tag: latest
source: pull
- name: Create Excalidraw Docker Container
docker_container:
name: excalidraw
@@ -12,4 +18,4 @@
traefik.http.routers.draw.rule: Host(`draw.fntz.net`)
traefik.http.routers.draw.entrypoints: webSecure
traefik.http.routers.draw.tls.certresolver: letsencrypt
traefik.http.services.draw.loadbalancer.server.port: "3000"
traefik.http.services.draw.loadbalancer.server.port: "80"

40
tasks/frigate.yml Normal file
View File

@@ -0,0 +1,40 @@
---
- name: Create folder structure
file:
path: "{{ item }}"
state: directory
with_items:
- "{{ data_dir }}/frigate"
- name: Pull latest Frigate Docker Image
docker_image:
name: ghcr.io/blakeblackshear/frigate
tag: stable
source: pull
- name: Deploy Frigate Docker Container
docker_container:
name: frigate
image: ghcr.io/blakeblackshear/frigate:stable
recreate: true
privileged: true
restart_policy: unless-stopped
published_ports:
- "5000:5000"
- "8555:8555/tcp"
- "8555:8555/udp"
- "8554:8554"
devices:
- /dev/dri/renderD128:/dev/dri/renderD128
networks:
- name: "{{ docker_network_name }}"
volumes:
- /etc/localtime:/etc/localtime:ro
- "{{ data_dir }}/frigate:/config"
- "{{ FRIGATE_RECORDINGS_PATH }}:/media/frigate"
labels:
traefik.enable: "true"
traefik.http.routers.frigate.rule: Host(`nvr.fntz.net`)
traefik.http.routers.frigate.entrypoints: webSecure
traefik.http.routers.frigate.tls.certresolver: letsencrypt
traefik.http.services.frigate.loadbalancer.server.port: "5000"

View File

@@ -6,6 +6,12 @@
with_items:
- "{{ data_dir }}/gitea"
- name: Pull latest Gitea Docker Image
docker_image:
name: docker.gitea.com/gitea
tag: latest
source: pull
- name: Create Gitea Docker Container
docker_container:
name: gitea
@@ -22,3 +28,9 @@
env:
USER_UID: "1000"
USER_GID: "1000"
labels:
traefik.enable: "true"
traefik.http.routers.git.rule: Host(`git.alexav.gg`)
traefik.http.routers.git.entrypoints: webSecure
traefik.http.routers.git.tls.certresolver: letsencrypt
traefik.http.services.git.loadbalancer.server.port: "3000"

View File

@@ -8,6 +8,12 @@
- "{{ data_dir }}/glance/config"
- "{{ data_dir }}/glance/assets"
- name: Pull latest Glance Docker Image
docker_image:
name: glanceapp/glance
tag: latest
source: pull
- name: Create Glance Docker Container
docker_container:
name: glance

View File

@@ -16,6 +16,7 @@
docker_container:
name: gluetun
image: qmcgaw/gluetun
recreate: true
capabilities:
- NET_ADMIN
devices:
@@ -27,7 +28,7 @@
published_ports:
- 8888:8888/tcp
- 8388:8388/tcp
- 8388:8388/ud
- 8388:8388/udp
env:
VPN_SERVICE_PROVIDER: "{{ GLUETUN_VPN_SERVICE_PROVIDER }}"
VPN_TYPE: "wireguard"
@@ -36,3 +37,17 @@
SERVER_COUNTRIES: "{{ GLUETUN_SERVER_COUNTRIES }}"
SERVER_CITIES: "{{ GLUETUN_SERVER_CITIES }}"
SERVER_HOSTNAMES: "{{ GLUETUN_SERVER_HOSTNAMES }}"
labels:
traefik.enable: "true"
traefik.http.routers.qbit.rule: Host(`qbit.fntz.net`)
traefik.http.routers.qbit.service: qbit
traefik.http.routers.qbit.entrypoints: webSecure
traefik.http.routers.qbit.tls.certresolver: letsencrypt
traefik.http.services.qbit.loadbalancer.server.port: "8090"
traefik.http.routers.jackett.rule: Host(`jackett.fntz.net`)
traefik.http.routers.jackett.service: jackett
traefik.http.routers.jackett.entrypoints: webSecure
traefik.http.routers.jackett.tls.certresolver: letsencrypt
traefik.http.services.jackett.loadbalancer.server.port: "9117"

95
tasks/helium.yml Normal file
View File

@@ -0,0 +1,95 @@
---
- name: Create folder structure
file:
path: "{{ item }}"
state: directory
with_items:
- "{{ data_dir }}/helium"
- name: Clone latest services
git:
repo: git@git.alexav.gg:alex/helium-services.git
dest: "{{ data_dir }}/helium"
- name: Build NGINX image
docker_image:
name: helium_nginx
tag: "latest"
build:
args:
SERVICES_HOSTNAME: "{{ HELIUM_BASE_URL }}"
path: "{{ data_dir }}/helium/svc"
dockerfile: "{{ data_dir }}/helium/svc/nginx/Dockerfile"
source: build
force_source: yes
state: present
- name: Build Extension Proxy image
docker_image:
name: helium_ext_proxy
tag: "latest"
build:
path: "{{ data_dir }}/helium/svc/extension-proxy"
dockerfile: Dockerfile
source: build
force_source: yes
state: present
- name: Build UBO image
docker_image:
name: helium_ubo
tag: "latest"
build:
path: "{{ data_dir }}/helium/svc/ubo"
dockerfile: Dockerfile
source: build
force_source: yes
state: present
- name: Create Helium Network
docker_network:
name: helium
- name: Create NGINX Container
docker_container:
name: helium_nginx
image: helium_nginx:latest
recreate: true
restart_policy: unless-stopped
shm_size: "512M"
networks:
- name: helium
- name: homelab
mounts:
- type: tmpfs
target: /tmp
tmpfs_size: 5G
labels:
traefik.enable: "true"
traefik.http.routers.helium.rule: Host(`helium.fntz.net`)
traefik.http.routers.helium.entrypoints: webSecure
traefik.http.routers.helium.tls.certresolver: letsencrypt
traefik.http.services.helium.loadbalancer.server.port: "80"
- name: Create UBO Proxy Container
docker_container:
name: helium_ubo
image: helium_ubo:latest
restart_policy: unless-stopped
recreate: true
networks:
- name: helium
env:
UBO_PROXY_BASE_URL: "https://{{ HELIUM_BASE_URL }}/ubo"
- name: Create Extension Proxy Container
docker_container:
name: helium_ext_proxy
image: helium_ext_proxy:latest
restart_policy: unless-stopped
recreate: true
networks:
- name: helium
env:
HMAC_SECRET: "{{ HELIUM_EXT_HMAC_SECRET }}"
PROXY_BASE_URL: "https://{{ HELIUM_BASE_URL }}/ext"

View File

@@ -6,6 +6,12 @@
with_items:
- "{{ data_dir }}/homebridge"
- name: Pull latest Homebridge Docker Image
docker_image:
name: homebridge/homebridge
tag: latest
source: pull
- name: Create Homebridge Docker Container
docker_container:
name: homebridge
@@ -21,3 +27,4 @@
traefik.http.routers.bridge.entrypoints: webSecure
traefik.http.routers.bridge.tls.certresolver: letsencrypt
traefik.http.services.bridge.loadbalancer.server.url: "http://{{ TRAEFIK_HOST_IP }}:8581"
traefik.http.routers.bridge.middlewares: tinyauth

View File

@@ -33,16 +33,16 @@
networks:
- name: immich
- name: Create Immich ML Docker Container
docker_container:
name: immich_machine_learning
image: ghcr.io/immich-app/immich-machine-learning:release
restart_policy: unless-stopped
recreate: true
volumes:
- "{{ data_dir }}/immich/model-cache:/cache"
networks:
- name: immich
# - name: Create Immich ML Docker Container
# docker_container:
# name: immich_machine_learning
# image: ghcr.io/immich-app/immich-machine-learning:release
# restart_policy: unless-stopped
# recreate: true
# volumes:
# - "{{ data_dir }}/immich/model-cache:/cache"
# networks:
# - name: immich
- name: Create Immich Server Docker Container
docker_container:

28
tasks/jackett.yml Normal file
View File

@@ -0,0 +1,28 @@
---
- name: Create folder structure
file:
path: "{{ item }}"
state: directory
with_items:
- "{{ data_dir }}/jackett"
- name: Pull latest Jackett Docker Image
docker_image:
name: lscr.io/linuxserver/jackett
tag: latest
source: pull
- name: Deploy Jackett Docker Container
docker_container:
name: jackett
image: lscr.io/linuxserver/jackett
recreate: true
restart_policy: unless-stopped
network_mode: "container:gluetun"
volumes:
- "{{ data_dir }}/jackett:/config"
- "{{ media_path}}/Downloads:/downloads"
env:
PUID: "{{ PUID }}"
PGID: "{{ PGID }}"
TZ: "{{ TZ }}"

View File

@@ -6,6 +6,12 @@
with_items:
- "{{ data_dir }}/jellyfin"
- name: Pull latest Jellyfin Docker Image
docker_image:
name: lscr.io/linuxserver/jellyfin
tag: latest
source: pull
- name: Create Jellyfin Docker Container
docker_container:
name: jellyfin

35
tasks/kavita.yml Normal file
View File

@@ -0,0 +1,35 @@
---
- name: Create folder structure
file:
path: "{{ item }}"
state: directory
with_items:
- "{{ data_dir }}/kavita"
- name: Pull latest Kavita Docker Image
docker_image:
name: lscr.io/linuxserver/kavita
tag: latest
source: pull
- name: Deploy Kavita Docker Container
docker_container:
name: kavita
image: lscr.io/linuxserver/kavita
recreate: true
restart_policy: unless-stopped
volumes:
- "{{ data_dir }}/kavita:/config"
- "{{ media_path }}/Books:/books"
env:
PUID: "{{ PUID }}"
PGID: "{{ PGID }}"
TZ: "{{ TZ }}"
networks:
- name: homelab
labels:
traefik.enable: "true"
traefik.http.routers.read.rule: Host(`read.fntz.net`)
traefik.http.routers.read.entrypoints: webSecure
traefik.http.routers.read.tls.certresolver: letsencrypt
traefik.http.services.read.loadbalancer.server.port: "5000"

View File

@@ -1,80 +0,0 @@
---
- name: Create folder structure
file:
path: "{{ item }}"
state: directory
with_items:
- "{{ data_dir }}/monitoring"
- "{{ data_dir }}/monitoring/prometheus"
- "{{ data_dir }}/monitoring/grafana"
- name: Create Monitoring Docker Network
docker_network:
name: monitoring
- name: Create Grafana Docker Container
docker_container:
name: grafana
user: "{{ PUID }}"
image: grafana/grafana:latest
restart_policy: unless-stopped
recreate: true
networks:
- name: homelab
- name: monitoring
volumes:
- "{{ data_dir }}/monitoring/grafana:/var/lib/grafana"
env:
GF_AUTH_ANONYMOUS_ENABLED: "{{ GRAFANA_AUTH_ANONYMOUS_ENABLED }}"
labels:
traefik.enable: "true"
traefik.http.routers.graf.rule: Host(`graf.fntz.net`)
traefik.http.routers.graf.entrypoints: webSecure
traefik.http.routers.graf.tls.certresolver: letsencrypt
traefik.http.services.graf.loadbalancer.server.port: "3000"
- name: Copy Prometheus Config
template:
src: "prometheus.yml.j2"
dest: "{{ data_dir }}/monitoring/prometheus/config.yml"
mode: "0744"
- name: Create Prometheus Docker Container
docker_container:
name: prometheus
image: prom/prometheus:latest
restart_policy: unless-stopped
recreate: true
networks:
- name: homelab
- name: monitoring
volumes:
- "{{ data_dir }}/monitoring/prometheus:/prometheus"
- "{{ data_dir }}/monitoring/prometheus/config.yml:/etc/prometheus/prometheus.yml"
- name: Create CAdvisor Docker Container
docker_container:
name: cadvisor
image: gcr.io/cadvisor/cadvisor:latest
restart_policy: unless-stopped
recreate: true
privileged: true
networks:
- name: monitoring
devices:
- /dev/kmsg
volumes:
- "/:/rootfs:ro"
- "/var/run:/var/run:ro"
- "/sys:/sys:ro"
- "/var/lib/docker:/var/lib/docker:ro"
- "/dev/disk/:/dev/disk:ro"
- name: Create Node-Exporter Docker Container
docker_container:
name: node-exporter
image: prom/node-exporter:latest
restart_policy: unless-stopped
recreate: true
networks:
- name: monitoring

View File

@@ -6,6 +6,12 @@
with_items:
- "{{ data_dir }}/navidrome"
- name: Pull latest Navidrome Docker Image
docker_image:
name: deluan/navidrome
tag: latest
source: pull
- name: Create Navidrome Docker Container
docker_container:
name: navidrome

View File

@@ -12,10 +12,16 @@
docker_network:
name: nextcloud
- name: Pull latest Nextcloud Docker Image
docker_image:
name: nextcloud
tag: latest
source: pull
- name: Create Nextcloud DB Docker Container
docker_container:
name: nc_postgresql
image: postgres:16-alpine
image: postgres:17-alpine
restart_policy: unless-stopped
recreate: true
networks:
@@ -40,3 +46,9 @@
- name: nextcloud
volumes:
- "{{ data_dir }}/nextcloud/data:/var/www/html"
labels:
traefik.enable: "true"
traefik.http.routers.nc.rule: Host(`{{ NEXTCLOUD_APP_URL }}`)
traefik.http.routers.nc.entrypoints: webSecure
traefik.http.routers.nc.tls.certresolver: letsencrypt
traefik.http.services.nc.loadbalancer.server.port: "80"

23
tasks/nfl-proxy.yml Normal file
View File

@@ -0,0 +1,23 @@
---
- name: Create folder structure
file:
path: "{{ item }}"
state: directory
with_items:
- "{{ data_dir }}/nfl-proxy"
- name: "Clone latest NFL-Proxy"
git:
repo: "git@git.alexav.gg:alex/nfl-proxy.git"
dest: "{{ data_dir }}/nfl-proxy"
- name: "Stop & remove existing PM2 containers"
ignore_errors: yes
shell: |
/home/alex/.nvm/versions/node/v24.4.0/bin/pm2 delete "nfl-proxy"
- name: "Start new PM2 container"
args:
chdir: "{{ data_dir }}/nfl-proxy"
shell: |
/home/alex/.nvm/versions/node/v24.4.0/bin/pm2 start --name="nfl-proxy" "venv/bin/activate && venv/bin/python main.py"

View File

@@ -8,6 +8,12 @@
- "{{ data_dir }}/ntfy/cache"
- "{{ data_dir }}/ntfy/data"
- name: Pull latest Ntfy Docker Image
docker_image:
name: binwiederhier/ntfy
tag: latest
source: pull
- name: Create Ntfy Docker Container
docker_container:
name: ntfy

View File

@@ -6,6 +6,12 @@
with_items:
- "{{ data_dir }}/nzbget"
- name: Pull latest NZBGet Docker Image
docker_image:
name: lscr.io/linuxserver/nzbget
tag: latest
source: pull
- name: Create NZBGet Docker Container
docker_container:
name: nzbget
@@ -29,3 +35,4 @@
traefik.http.routers.nzb.entrypoints: webSecure
traefik.http.routers.nzb.tls.certresolver: letsencrypt
traefik.http.services.nzb.loadbalancer.server.port: "6789"
traefik.http.routers.nzb.middlewares: tinyauth

36
tasks/obsidian.yml Normal file
View File

@@ -0,0 +1,36 @@
---
- name: Create folder structure
file:
path: "{{ item }}"
state: directory
with_items:
- "{{ data_dir }}/obsidian"
- "{{ data_dir }}/obsidian/data"
- "{{ data_dir }}/obsidian/etc"
- name: Pull Docker Image
docker_image:
name: couchdb
tag: latest
source: pull
- name: Create Docker Container
docker_container:
name: couchdb
image: couchdb:latest
recreate: true
restart_policy: unless-stopped
networks:
- name: homelab
volumes:
- "{{ data_dir }}/obsidian/data:/opt/couchdb/data"
- "{{ data_dir }}/obsidian/etc:/opt/couchdb/etc/local.d"
env:
COUCHDB_USER: "{{ COUCHDB_USER }}"
COUCHDB_PASSWORD: "{{ COUCHDB_PASSWORD }}"
labels:
traefik.enable: "true"
traefik.http.routers.couch.rule: Host(`couch.fntz.net`)
traefik.http.routers.couch.entrypoints: webSecure
traefik.http.routers.couch.tls.certresolver: letsencrypt
traefik.http.services.couch.loadbalancer.server.port: "5984"

93
tasks/owncloud.yml Normal file
View File

@@ -0,0 +1,93 @@
---
- name: Create folder structure
file:
path: "{{ item }}"
state: directory
with_items:
- "{{ data_dir }}/owncloud"
- "{{ data_dir }}/owncloud/data"
- "{{ data_dir }}/owncloud/db"
- "{{ data_dir }}/owncloud/redis"
- name: Create Owncloud Docker Network
docker_network:
name: owncloud
- name: Pull latest Owncloud Docker Image
docker_image:
name: owncloud/server
tag: "10.15"
source: pull
- name: Create Owncloud DB Docker Container
docker_container:
name: oc_database
image: mariadb:latest
restart_policy: unless-stopped
recreate: true
networks:
- name: owncloud
volumes:
- "{{ data_dir }}/owncloud/db:/var/lib/mysql"
env:
MYSQL_ROOT_PASSWORD: "{{ OWNCLOUD_DB_PASSWORD }}"
MYSQL_DATABASE: "owncloud"
MYSQL_USER: "owncloud"
MYSQL_PASSWORD: "{{ OWNCLOUD_DB_PASSWORD }}"
MARIADB_AUTO_UPGRADE: "1"
command: "--max-allowed-packet=128M --innodb-log-file-size=64M"
healthcheck:
test: "CMD mysqladmin ping -u root --password={{ OWNCLOUD_DB_PASSWORD }}"
interval: 10s
timeout: 5s
retries: 5
- name: Create Owncloud Redis Container
docker_container:
name: oc_redis
image: redis:latest
restart_policy: unless-stopped
recreate: true
networks:
- name: owncloud
command: "--databases 1"
healthcheck:
test: CMD redis-cli ping
interval: 10s
timeout: 5s
retries: 5
volumes:
- "{{ data_dir }}/owncloud/redis:/data"
- name: Create Owncloud Docker Container
docker_container:
name: owncloud
image: owncloud/server:10.15
restart_policy: unless-stopped
recreate: true
networks:
- name: "{{ docker_network_name }}"
- name: owncloud
volumes:
- "{{ data_dir }}/owncloud/data:/mnt/data"
env:
OWNCLOUD_DOMAIN: "{{ OWNCLOUD_APP_URL }}"
OWNCLOUD_TRUSTED_DOMAINS: "{{ OWNCLOUD_APP_URL }}"
OWNCLOUD_DB_TYPE: "mysql"
OWNCLOUD_DB_NAME: "owncloud"
OWNCLOUD_DB_USERNAME: "owncloud"
OWNCLOUD_DB_PASSWORD: "{{ OWNCLOUD_DB_PASSWORD }}"
OWNCLOUD_DB_HOST: "oc_database"
OWNCLOUD_ADMIN_USERNAME: "{{ OWNCLOUD_ADMIN_USERNAME }}"
OWNCLOUD_ADMIN_PASSWORD: "{{ OWNCLOUD_ADMIN_PASSWORD }}"
OWNCLOUD_MYSQL_UTF8MB4: "true"
OWNCLOUD_REDIS_ENBALED: "true"
OWNCLOUD_REDIS_HOST: "oc_redis"
labels:
traefik.enable: "true"
traefik.http.routers.nc.rule: Host(`{{ OWNCLOUD_APP_URL }}`)
traefik.http.routers.nc.entrypoints: webSecure
traefik.http.routers.nc.tls.certresolver: letsencrypt
traefik.http.services.nc.loadbalancer.server.port: "8080"
traefik.http.middlewares.limit.buffering.maxRequestBodyBytes: "1073741824"
traefik.http.routers.nc.middlewares: "limit"

View File

@@ -6,6 +6,12 @@
with_items:
- "{{ data_dir }}/pihole"
- name: Pull latest PiHole Docker Image
docker_image:
name: pihole/pihole
tag: latest
source: pull
- name: Create PiHole Docker Container
docker_container:
name: pihole
@@ -15,8 +21,8 @@
networks:
- name: homelab
published_ports:
- "{{ CADDY_HOST_IP }}:53:53/tcp"
- "{{ CADDY_HOST_IP }}:53:53/udp"
- "{{ TRAEFIK_HOST_IP }}:53:53/tcp"
- "{{ TRAEFIK_HOST_IP }}:53:53/udp"
volumes:
- "{{ data_dir }}/pihole:/etc/pihole"
env:

View File

@@ -16,10 +16,16 @@
docker_network:
name: metrics
- name: Pull latest Plausible Docker Image
docker_image:
name: ghcr.io/plausible/community-edition
tag: v3.0.1
source: pull
- name: Deploy Plausible Database Docker Container
docker_container:
name: metrics_postgres
image: postgres:16-alpine
image: postgres:17-alpine
restart_policy: unless-stopped
recreate: true
volumes:
@@ -76,3 +82,9 @@
CLICKHOUSE_DATABASE_URL: "http://metrics_clickhouse:8123/plausible_events_db"
BASE_URL: "{{ PLAUSIBLE_BASE_URL }}"
SECRET_KEY_BASE: "{{ PLAUSIBLE_SECRET_KEY_BASE }}"
labels:
traefik.enable: "true"
traefik.http.routers.metrics.rule: Host(`metrics.alexav.gg`)
traefik.http.routers.metrics.entrypoints: webSecure
traefik.http.routers.metrics.tls.certresolver: letsencrypt
traefik.http.services.metrics.loadbalancer.server.port: "8000"

32
tasks/plex.yml Normal file
View File

@@ -0,0 +1,32 @@
---
- name: Create folder structure
file:
path: "{{ item }}"
state: directory
with_items:
- "{{ data_dir }}/plex"
- name: Pull latest Plex Docker Image
docker_image:
name: lscr.io/linuxserver/plex
tag: latest
source: pull
- name: Deploy Plex Docker Container
docker_container:
name: plex
image: lscr.io/linuxserver/plex
network_mode: host
restart_policy: unless-stopped
recreate: true
devices:
- /dev/dri:/dev/dri
env:
PUID: "{{ PUID }}"
PGID: "{{ PGID }}"
TZ: "{{ TZ }}"
VERSION: "docker"
PLEX_CLAIM: "{{ PLEX_CLAIM_TOKEN }}"
volumes:
- "{{ data_dir }}/plex:/config"
- "{{ media_path }}:/media"

View File

@@ -6,6 +6,12 @@
with_items:
- "{{ data_dir }}/pocketid"
- name: Pull latest PocketID Docker Image
docker_image:
name: ghcr.io/pocket-id/pocket-id
tag: v1
source: pull
- name: Create PocketID Docker Container
docker_container:
name: pocketid

View File

@@ -17,6 +17,7 @@
name: qbittorrent
image: lscr.io/linuxserver/qbittorrent
network_mode: "container:gluetun"
recreate: true
env:
PUID: "{{ PUID }}"
PGID: "{{ PGID }}"

View File

@@ -10,6 +10,12 @@
- "{{ data_dir }}/romm/config"
- "{{ data_dir }}/romm/db"
- name: Pull latest Romm Docker Image
docker_image:
name: rommapp/romm
tag: latest
source: pull
- name: Create Romm DB Docker Container
docker_container:
name: romm-db

View File

@@ -9,6 +9,22 @@
- "{{ data_dir }}/servarr/radarr_config"
- "{{ data_dir }}/servarr/lidarr_config"
- name: Pull latest Radarr Docker Image
docker_image:
name: lscr.io/linuxserver/radarr
tag: latest
source: pull
- name: Pull latest Sonarr Docker Image
docker_image:
name: lscr.io/linuxserver/sonarr
tag: latest
source: pull
- name: Pull latest Lidarr Docker Image
docker_image:
name: lscr.io/linuxserver/lidarr
tag: latest
source: pull
- name: Deploy Radarr Container
docker_container:
name: radarr
@@ -21,6 +37,10 @@
- "{{ NZBGET_DOWNLOADS_PATH }}:/downloads"
networks:
- name: homelab
env:
PUID: "{{ PUID }}"
PGID: "{{ PGID }}"
TZ: "{{ TZ }}"
labels:
traefik.enable: "true"
traefik.http.routers.radarr.rule: Host(`radarr.fntz.net`)
@@ -38,6 +58,10 @@
- "{{ data_dir }}/servarr/sonarr_config:/config"
- "{{ SERVARR_MEDIA_PATH }}:/data"
- "{{ NZBGET_DOWNLOADS_PATH }}:/downloads"
env:
PUID: "{{ PUID }}"
PGID: "{{ PGID }}"
TZ: "{{ TZ }}"
networks:
- name: homelab
labels:
@@ -53,6 +77,10 @@
image: lscr.io/linuxserver/lidarr:latest
restart_policy: unless-stopped
recreate: true
env:
PUID: "{{ PUID }}"
PGID: "{{ PGID }}"
TZ: "{{ TZ }}"
volumes:
- "{{ data_dir }}/servarr/lidarr_config:/config"
- "{{ SERVARR_MEDIA_PATH }}:/media"

View File

@@ -36,3 +36,9 @@
env:
TZ: "{{ TZ }}"
TOKEN: "{{ API_ADMIN_KEY }}"
labels:
traefik.enable: "true"
traefik.http.routers.storage.rule: Host(`storage.alexav.gg`)
traefik.http.routers.storage.entrypoints: webSecure
traefik.http.routers.storage.tls.certresolver: letsencrypt
traefik.http.services.storage.loadbalancer.server.port: "3001"

View File

@@ -6,6 +6,12 @@
with_items:
- "{{ data_dir }}/tautulli"
- name: Pull latest Tautulli Docker Image
docker_image:
name: ghcr.io/tautulli/tautulli
tag: latest
source: pull
- name: Create Tautulli Docker Container
docker_container:
name: tautulli

View File

@@ -1,4 +1,10 @@
---
- name: Pull latest Tinyauth Docker Image
docker_image:
name: ghcr.io/steveiliop56/tinyauth
tag: v3
source: pull
- name: Create Tinyauth Docker Container
docker_container:
name: tinyauth
@@ -24,6 +30,6 @@
labels:
traefik.enable: "true"
traefik.http.routers.tinyauth.rule: Host(`auth.fntz.net`)
traefik.http.routers.tt.entrypoints: webSecure
traefik.http.routers.tt.tls.certresolver: letsencrypt
traefik.http.routers.tinyauth.entrypoints: webSecure
traefik.http.routers.tinyauth.tls.certresolver: letsencrypt
traefik.http.middlewares.tinyauth.forwardauth.address: http://tinyauth:3000/api/auth/traefik

31
tasks/uptime-kuma.yml Normal file
View File

@@ -0,0 +1,31 @@
---
- name: Create folder structure
file:
path: "{{ item }}"
state: directory
with_items:
- "{{ data_dir }}/uptime-kuma"
- name: Pull latest Uptime Kuma Docker Image
docker_image:
name: louislam/uptime-kuma
tag: latest
source: pull
- name: Create Uptime Kuma Docker Container
docker_container:
name: uptime-kuma
image: louislam/uptime-kuma
restart_policy: unless-stopped
recreate: true
networks:
- name: homelab
volumes:
- "{{ data_dir }}/uptime-kuma:/app/data"
- "/var/run/docker.sock:/var/run/docker.sock:ro"
labels:
traefik.enable: "true"
traefik.http.routers.status.rule: Host(`status.fntz.net`)
traefik.http.routers.status.entrypoints: webSecure
traefik.http.routers.status.tls.certresolver: letsencrypt
traefik.http.services.status.loadbalancer.server.port: "3001"

View File

@@ -6,6 +6,12 @@
with_items:
- "{{ data_dir }}/vaultwarden"
- name: Pull latest Vaultwarden Docker Image
docker_image:
name: vaultwarden/server
tag: latest
source: pull
- name: Create Vaultwarden Docker Container
docker_container:
name: vaultwarden

View File

@@ -1,19 +0,0 @@
global:
scrape_interval: 15s
evaluation_interval: 15s
scrape_configs:
# Prometheus itself
- job_name: "prometheus"
static_configs:
- targets: ["localhost:9090"]
# Node Exporter (system metrics)
- job_name: "node-exporter"
static_configs:
- targets: ["node-exporter:9100"]
# Docker metrics
- job_name: "cadvisor"
static_configs:
- targets: ["cadvisor:8083"]