Compare commits

169 Commits

Author SHA1 Message Date
48690c04a4 Automated template extraction 2025-11-21 08:05:44 +00:00
903e786b99 test
All checks were successful
Deploy Containers / Prepare (push) Successful in 4s
2025-11-21 03:04:08 -05:00
465d46fd45 wait no that doesn't make sense
All checks were successful
Deploy Containers / Prepare (push) Successful in 4s
2025-11-21 03:01:58 -05:00
cd68af81c6 delete branch after creation
All checks were successful
Deploy Containers / Prepare (push) Successful in 4s
2025-11-21 03:01:44 -05:00
447f06dd8e don't auto-run template generation
All checks were successful
Deploy Containers / Prepare (push) Successful in 4s
2025-11-21 02:59:27 -05:00
949b82b67f lmao forgot my placeholders
All checks were successful
Deploy Containers / Prepare (push) Successful in 5s
2025-11-21 02:59:13 -05:00
3d3c4c109d clean up deployment script
Some checks failed
Deploy Containers / Prepare (push) Has been cancelled
2025-11-21 02:58:25 -05:00
3e07981021 remove helium
All checks were successful
Deploy Containers / Prepare (push) Successful in 16s
2025-11-19 17:06:57 -05:00
d60435c66e migrate glance
All checks were successful
Deploy Containers / Prepare (push) Successful in 20s
2025-11-19 17:05:42 -05:00
e41f2ba5be migrate excalidraw
All checks were successful
Deploy Containers / Prepare (push) Successful in 18s
2025-11-19 17:04:33 -05:00
3a812ce86f migrate dozzle
All checks were successful
Deploy Containers / Prepare (push) Successful in 19s
2025-11-19 17:03:16 -05:00
0a9ac7cfaf migrate dashdot
All checks were successful
Deploy Containers / Prepare (push) Successful in 30s
2025-11-19 17:01:20 -05:00
118bd4bcbd migrate cup
All checks were successful
Deploy Containers / Prepare (push) Successful in 19s
2025-11-19 16:51:12 -05:00
70ecb1f6d6 make some fields optional
All checks were successful
Deploy Containers / Prepare (push) Successful in 56s
2025-11-19 16:48:42 -05:00
31f2b51b37 add ability to build image
Some checks failed
Deploy Containers / Prepare (push) Failing after 19s
2025-11-19 16:44:47 -05:00
a8e6ed70ab add docker role, convert codeserver
All checks were successful
Deploy Containers / Prepare (push) Successful in 24s
2025-11-19 16:36:15 -05:00
57efba5cb3 add remote config for traefik
All checks were successful
Deploy Containers / Prepare (push) Successful in 4s
2025-11-19 16:21:50 -05:00
2c7eb799f8 add tinyauth middleware to file provider
All checks were successful
Deploy Containers / Prepare (push) Successful in 4s
2025-11-19 15:59:39 -05:00
fa6e8c4b5c update traefik url
All checks were successful
Deploy Containers / Prepare (push) Successful in 5s
2025-11-19 15:51:11 -05:00
4b93172b53 update cf key
All checks were successful
Deploy Containers / Prepare (push) Successful in 4s
Create New Secrets Template / Extract updated template (push) Successful in 6s
2025-11-19 12:39:42 -05:00
ecd7285ff7 use docker network name
All checks were successful
Deploy Containers / Prepare (push) Successful in 29s
2025-11-19 10:38:38 -05:00
8a04d9adaf update wings url
All checks were successful
Deploy Containers / Prepare (push) Successful in 4s
Create New Secrets Template / Extract updated template (push) Successful in 7s
2025-11-19 10:38:13 -05:00
095bb14b00 add wings to jackson
Some checks failed
Deploy Containers / Prepare (push) Failing after 23s
Create New Secrets Template / Extract updated template (push) Successful in 6s
2025-11-19 10:36:36 -05:00
2f4c43cb96 add script to update containers
All checks were successful
Deploy Containers / Prepare (push) Successful in 4s
2025-11-13 12:22:49 -05:00
ecb7963443 additional guard
All checks were successful
Deploy Containers / Prepare (push) Successful in 5s
2025-11-13 11:29:28 -05:00
80b1fbe629 guard
All checks were successful
Deploy Containers / Prepare (push) Successful in 4s
2025-11-13 11:29:14 -05:00
09cfb8e0d2 add tinyauth to nvr, remove from cup
Some checks failed
Deploy Containers / Prepare (push) Failing after 5s
2025-11-13 11:28:23 -05:00
c0ff714238 don't use owner
All checks were successful
Deploy Containers / Prepare (push) Successful in 1m13s
2025-11-12 18:58:45 -08:00
84d088443b add termix
Some checks failed
Deploy Containers / Prepare (push) Failing after 10s
2025-11-12 18:56:25 -08:00
00429c89fe sync mirror
All checks were successful
Deploy Containers / Prepare (push) Successful in 4s
2025-11-07 02:13:54 -05:00
d19b952c16 sync mirror 2
All checks were successful
Deploy Containers / Prepare (push) Successful in 5s
2025-11-07 02:07:36 -05:00
6bf421bdc8 sync mirror
All checks were successful
Deploy Containers / Prepare (push) Successful in 4s
2025-11-07 02:06:52 -05:00
4d5922ca58 don't run deployment if task was removed
All checks were successful
Deploy Containers / Prepare (push) Successful in 5s
2025-11-07 02:04:25 -05:00
2eb2fc9eb0 remove some unused services
All checks were successful
Deploy Containers / Prepare (push) Successful in 38s
2025-11-07 02:01:49 -05:00
7bc5fa6e2c Merge pull request 'Automated Template Extraction' (#7) from template-extraction-229 into main
All checks were successful
Deploy Containers / Prepare (push) Successful in 4s
Reviewed-on: #7
Reviewed-by: Alex Frantz <alex@alexav.gg>
2025-11-04 03:46:44 +00:00
fb96864437 Automated template extraction 2025-11-04 03:46:26 +00:00
d5c5a31bf5 add ptero/wings
All checks were successful
Deploy Containers / Prepare (push) Successful in 45s
Create New Secrets Template / Extract updated template (push) Successful in 7s
2025-11-03 22:45:25 -05:00
07534790a3 add render device to ersatz
All checks were successful
Deploy Containers / Prepare (push) Successful in 24s
2025-10-26 20:23:08 -04:00
d0685d63ed update tinyauth to v4
All checks were successful
Deploy Containers / Prepare (push) Successful in 21s
Create New Secrets Template / Extract updated template (push) Successful in 7s
2025-10-26 20:00:55 -04:00
7f387d410f add iptv to traefik config
Some checks failed
Deploy Containers / Prepare (push) Failing after 26s
2025-10-26 16:45:18 -04:00
0ae9867846 move back to nas
All checks were successful
Deploy Containers / Prepare (push) Successful in 4s
2025-10-26 16:42:54 -04:00
2d633491cb move to jade
All checks were successful
Deploy Containers / Prepare (push) Successful in 4s
2025-10-26 16:33:50 -04:00
4d0a37afbd add ersatztv
Some checks failed
Deploy Containers / Prepare (push) Failing after 1m19s
2025-10-26 16:30:58 -04:00
d261c0eb4f use address
All checks were successful
Deploy Containers / Prepare (push) Successful in 37s
2025-10-22 22:05:47 -04:00
ad74f0d77b change port
All checks were successful
Deploy Containers / Prepare (push) Successful in 38s
2025-10-22 22:04:14 -04:00
6766b01d49 remove command
All checks were successful
Deploy Containers / Prepare (push) Successful in 42s
2025-10-22 22:02:20 -04:00
3081861414 fix traefik labels
All checks were successful
Deploy Containers / Prepare (push) Successful in 38s
2025-10-22 21:52:28 -04:00
ce5c2afa85 add encryption vars
All checks were successful
Deploy Containers / Prepare (push) Successful in 33s
Create New Secrets Template / Extract updated template (push) Successful in 7s
2025-10-22 21:50:16 -04:00
c7e1a21363 add mastodon to deploy
All checks were successful
Deploy Containers / Prepare (push) Successful in 4s
2025-10-22 21:43:51 -04:00
2018de4ddb mastodon, don't recreate for now
All checks were successful
Deploy Containers / Prepare (push) Successful in 17s
Create New Secrets Template / Extract updated template (push) Successful in 6s
2025-10-22 21:41:42 -04:00
b8d1b9432d add database name
All checks were successful
Deploy Containers / Prepare (push) Successful in 22s
2025-10-20 13:45:06 -04:00
f12104707b update db/redis images
All checks were successful
Deploy Containers / Prepare (push) Successful in 49s
2025-10-20 13:42:15 -04:00
a7e2ada228 use updated image
All checks were successful
Deploy Containers / Prepare (push) Successful in 1m40s
2025-10-20 12:12:09 -04:00
4de181f01b whoops
Some checks failed
Deploy Containers / Prepare (push) Has been cancelled
2025-10-20 12:11:13 -04:00
f00be47d24 specify version
Some checks failed
Deploy Containers / Prepare (push) Failing after 13s
2025-10-20 12:10:11 -04:00
fa1b627345 pull latest immich image
All checks were successful
Deploy Containers / Prepare (push) Successful in 24s
2025-10-20 12:06:37 -04:00
c578d0c71e test updating secret
All checks were successful
Deploy Containers / Prepare (push) Successful in 3m24s
Create New Secrets Template / Extract updated template (push) Successful in 6s
2025-10-18 18:30:26 -04:00
d176da1e3f only run on specific secret files
All checks were successful
Deploy Containers / Prepare (push) Successful in 4s
2025-10-18 18:29:03 -04:00
208e81ee81 Merge pull request 'Automated Template Extraction' (#1) from template-extraction-200 into main
Some checks failed
Deploy Containers / Prepare (push) Failing after 3m35s
Create New Secrets Template / Extract updated template (push) Successful in 6s
Reviewed-on: #1
2025-10-18 22:24:37 +00:00
32141db102 Automated template extraction 2025-10-18 22:23:59 +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
c5d15a2f3f Merge branch 'main' of https://git.alexav.gg/alex/homelab
Some checks failed
Deploy Containers / Prepare (push) Failing after 3m37s
2025-08-02 23:07:06 -04:00
a8802492f1 add traefik 2025-08-02 23:06:46 -04:00
68 changed files with 2088 additions and 1016 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,17 @@
name: Update Images
on:
workflow_dispatch:
jobs:
run-update:
name: Run update script
runs-on: runner
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Run update script
run: |
echo "${{ secrets.VAULT_PASS }}" > ~/.vault_pass.txt
python3 scripts/run_updates.py

View File

@@ -0,0 +1,39 @@
name: Create New Secrets Template
on:
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] [defaults]
inventory=inventories/hosts inventory=hosts
host_key_checking=False host_key_checking=False
interpreter_python=auto_silent interpreter_python=auto_silent

View File

@@ -1,9 +1,65 @@
# global ansible_user:
data_dir: data_dir:
docker_network_name: docker_network_name:
TZ:
PUID: PUID:
PGID: PGID:
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:
# mastodon
MASTODON_DB_PASS:
MASTODON_LOCAL_DOMAIN:
MASTODON_SECRET_KEY_BASE:
MASTODON_OTP_SECRET:
MASTODON_VAPID_PRIVATE_KEY:
MASTODON_VAPID_PUBLIC_KEY:
MASTODON_ARE_DETERMINISTIC:
MASTODON_ARE_KEY_DERIVATION:
MASTODON_ARE_PRIMARY:
# wings
WINGS_URL:
WINGS_CONTAINER_DIR:
media_path:
# frigate
FRIGATE_RECORDINGS_PATH:
# plex
PLEX_CLAIM_TOKEN:
ansible_become_pass:
# glance # glance
GLANCE_PIHOLE_TOKEN: GLANCE_PIHOLE_TOKEN:
@@ -22,6 +78,7 @@ TINYAUTH_GENERIC_TOKEN_URL:
TINYAUTH_GENERIC_USER_URL: TINYAUTH_GENERIC_USER_URL:
TINYAUTH_GENERIC_SCOPES: TINYAUTH_GENERIC_SCOPES:
TINYAUTH_GENERIC_NAME: TINYAUTH_GENERIC_NAME:
TINYAUTH_REDIRECT_URL:
TINYAUTH_OAUTH_WHITELIST: TINYAUTH_OAUTH_WHITELIST:
TINYAUTH_APP_TITLE: TINYAUTH_APP_TITLE:
TINYAUTH_BACKGROUND_IMAGE: TINYAUTH_BACKGROUND_IMAGE:
@@ -45,11 +102,11 @@ GLUETUN_SERVER_HOSTNAMES:
# immich # immich
IMMICH_UPLOAD_LOCATION: IMMICH_UPLOAD_LOCATION:
IMMICH_DB_DATA_LOCATION: /postgres IMMICH_DB_DATA_LOCATION:
IMMICH_VERSION: release IMMICH_VERSION:
IMMICH_DB_PASSWORD: postgres IMMICH_DB_PASSWORD:
IMMICH_DB_USERNAME: postgres IMMICH_DB_USERNAME:
IMMICH_DB_DATABASE_NAME: postgres IMMICH_DB_DATABASE_NAME:
# jellyfin # jellyfin
JELLYFIN_TV_PATH: JELLYFIN_TV_PATH:
@@ -59,14 +116,8 @@ JELLYFIN_MUSIC_PATH:
# navidrome # navidrome
NAVIDROME_MUSIC_PATH: NAVIDROME_MUSIC_PATH:
# nextcloud
NEXTCLOUD_POSTGRES_PASSWORD:
NEXTCLOUD_POSTGRES_DATABASE:
NEXTCLOUD_POSTGRES_USER:
NEXTCLOUD_POSTGRES_HOST:
# ntfy # ntfy
NTFY_UPSTREAM_BASE_URL: https://ntfy.sh NTFY_UPSTREAM_BASE_URL:
NTFY_BASE_URL: NTFY_BASE_URL:
# nzbget # nzbget
@@ -96,9 +147,6 @@ ROMM_SERVER_APPLICATION_URL:
# servarr # servarr
SERVARR_MEDIA_PATH: SERVARR_MEDIA_PATH:
# syncthing
SYNCTHING_DATA_PATH:
# vaultwarden # vaultwarden
VAULTWARDEN_DOMAIN: VAULTWARDEN_DOMAIN:
@@ -108,5 +156,21 @@ GITEA_RUNNER_REGISTRATION_TOKEN:
GITEA_RUNNER_NAME: GITEA_RUNNER_NAME:
GITEA_RUNNER_LABELS: GITEA_RUNNER_LABELS:
# grafana # monitoring
GRAFANA_AUTH_ANONYMOUS_ENABLED: GRAFANA_AUTH_ANONYMOUS_ENABLED:
# drop
DROP_GIANT_BOMB_API_KEY:
# obsidian
COUCHDB_USER:
COUCHDB_PASSWORD:
# helium
HELIUM_BASE_URL:
HELIUM_EXT_HMAC_SECRET:
# pterodactyl
PTERODACTYL_APP_URL:
PTERODACTYL_MYSQL_PASSWORD:
PTERODACTYL_MYSQL_ROOT_PASSWORD:

View File

@@ -1,105 +1,113 @@
$ANSIBLE_VAULT;1.1;AES256 $ANSIBLE_VAULT;1.1;AES256
62643330653736373764393833363035323137393736633433346139333639663664303735373261 38663262326664303464653331306266333862363635643761346638366633666563303035346662
3531373434336335393763666437623039393165376462390a363439396662633661316232343336 6230313164666332623438636464313435323532393636650a333039326661383864373838333634
33326133336436663638303036386330613830333838383861633730616230336565316535613264 34653135643737393966353932343066653166653339313939666161363735636634643466363036
3766363466373364370a303934646532303033353130326264393634646562363132616437366432 3630633764646438650a393562343335316363616564383733363233343463356633353837353138
39303930643939363831373631366137373137393539303033316165633234666164376438306531 65376435343730626466393062656233326330303565376639386332306265306266356634383830
64363865653761386366653665666333643134336338333935363337303462636561623263303261 32613432386561346634633334666365323061313833396364313465326664353064653237623136
34303337346134373161316335666237323439303133313137666336393331366163633866323766 31343762383838316161306565323432643630343537346166616666353738343034346233313266
66373766373061643366323635346237343030356635613364643165373361343333383836633433 62353933323432343564303633636532396439643937306366313333626430313639653162333364
37353265623935323735306233316336373931613039616162393336326633643139313965363338 36646463353964323139613339326462666334376132633834313537653761333832333436663738
62353636303137353636396361316363626132666330363230373561653163623364303036663235 35393939326530353064633333323139356234643031653130633665303434313365663238643434
63323965666135393064333039396562373634383938613433333132333266336238366638346334 31663630313036343939646631326239343361653238646636363234353062346534363039373637
33366533326232376539353039373136303863373231346561666338386136656332343463633939 31313562666133343732626438353062663863336638323037373361616665613831616165393835
31616338316439373366326366353762313066356562613738366465343437666631373030646666 32336334393739666366623933626265643964663831336337343632643732383264623534383964
36666236373332363035336139616464666430343764613863343962616230316362353738373664 34313030336339613934303637363964653064653231666139353836653734626338333331383961
32343639666231386338396139353736313235646164613438303738356238303930653538353561 39646331623636613332393663663135363139653663383764333433316430313136356433326235
63323533333736616664353439613933323837646665303431633361373064326561653438333061 35303962646463323534623263623730313166643232303566343135323537386635396165383539
34663034306530613438373132356631616463306663313331656234613165353335393132366437 64393165623466633936393232363730313233656139383935343561343236343763623232343736
62326231653862613765643535623363366264363638623362376237373933326637653864383436 39383765633662653434383965646461663730373864326561343265663838643339616539396364
33383535356231303365316638356566373439346133653036326362373663343239383762323766 38313566343836363530613336326262373736643566323866386565346363363333636262613331
33303137363762306136383762323337333662326131346135633932313135353937346532316264 38613065333465363931623462653732626633316638626632353338373636383835653165336666
30613865363636623732383337376137383039376264313135653039306532353665343635643738 62646133383639663934656332613666663031623530336362633234633534363738363664623236
66656239373333323266383962666239346538343434353136306439326365323235626661613162 62316332363432346534353336343561303066633965373130626664343935393833663363393062
36353234643930663939373465383661303038316166326230333734326536303331396137623064 30333739626636323839623663393666393239663562653333383066303130363638366566666532
65366232623365303964363932666436353336316333623630646337616235626366613433303865 65346361636537393335393330313635336665636638366530346335313761323035623666623734
36643836626231333964653830376435643563613538666339326464383365663265616535626238 30396531383064376661363363323161353132356164636132343531336337613837613931656136
30616533663032323663643438656666626330633164663161626530306134306433373430336239 64303034626261643635356165636463326565653035316335353730396431663261363333656265
32363237313861373964316139613766356334313064346135343739353361376630386130626633 38626664636637623866343138303131643462366639336237363566386235656438343138666237
34613732383630646335653633313466313864326430663633353231653765356566353766333833 61653164376663326663646631393666386630666531666465373433393734653737343765363964
63316439383938663334323635633538396134343232626234363337353331643336303037343332 64313337336539336664303262343333623161646135633039376637653932626432333533356532
63386664653534366438633464316534643261366237393336396535323435656533643137343137 35306561323464623762336432366530343661363037383939383035653237353466336531653434
39356135623333316532353962333630663432393238333334386637663735646530626562613839 36383530633661616564333230363633383665376139353836643334646262323938643139663138
36333834363562363931343264646337343766303464366264316564313736656136376336626163 33653766666233393332333134386631316535643163323362356539633932323738353636393164
33373731623930656266623433613164396166323332643035643734353138626632376434323337 66646466613864633631656565303038613639633534306438303731356232663332316633623361
36306465663339363733393235653964646130396463356264663963366362653238386235623739 39303262353565383636616131333032306531646566313066373231313730386331633435336133
35613065366365333833643739376636333733396162666362393461616136653365326230386531 30626564643965303131666234663630653237373566653633343662623864393138353265646333
33653166313235653863346137626564336239656530386232636533396664353330663634373630 34336338356163323139616234323137366365656662633931666534303439326636333562366530
36626265373762313432333936303663646361353035336431346434306434383261656636336263 35363266633334616463623635666632386338653432653832326636336337626437643061623638
31363964343038626434613336663436383132343739393163356434333066386132353137666163 61646561666162616330623333346230613965316461383034333734383763383635396433373335
38346465303937633139363532653539383436396263613139636236363336336161393631656530 37653362636132313139316336356264373763333361333630366535336339623166306663623433
63393530333534353166646339613538323664633236383161396466376339323763313838316233 63333338613261633163613865303962383238383963353530633136623362313561316533343737
33616338323438623138383131393735396235623861323536613761643663393934353862326638 66336231323763353964376339613531613939336238656364353536346436663464636637303337
34643866626466663836333965376163653037386164366634623239653231623432616531386263 39313066613164656431383162326562353036613165613635346639656233626439623939393663
30366533306439633134333163316233656164306133323961366530666666336566363537626434 66306136656236663766643738303738616230626534333132666331316439363136326264386635
63633830363539373534663836353163306137613233366436613863346638363335373663333831 64616337613639306536373366366235633766613033313464353538376363663239333930363139
65396533626263383530353764376263643230656262363233336132316132656235663631663363 37666231626334373132363863346232623866353032626138353838333764633738386166666265
62303933616131336666336262663333376430383733333261393262623334353165633362653932 38393461633832306465633130343634323763346464643262653330356337353534636566353935
65623965323332353761323637343037396435616136343364323266303163336362366337303839 36333936343130653861303432626135383438653134326162613833336261613839376161616136
34346235333661613232623262626664363062653834383435666336336266343636666664363639 31666436353361303438303735623139613063333162303566623431373031646434643766363335
33386134633631306534303631613234393366373763626633323761386265666237636662653433 32363835376438613163666330333732353432396661666632663633393965396531653830333737
32313233393038383931303136633565313434623862643134353435333265306535313262343636 63356238613537643033643765616561666163386364376236353031656465333661333830626230
34646365623534373936626266613731643162366435306331336165383037613062346636666239 32346431633464636663366364643239386135396235336663626335383663373761383165646262
35396561653765653963313339353365396438313363336661643931633339653533653164626131 37313330376336373462623266343632393637663066313531646333666531653132633164353266
37326538383430353733386531383333623463663731643261346633343036393433333935366137 37636238623637363166323731653739373764343965626530333834366233323435646339636233
32373432326666383533623531383335313562363230373238333331306662633361323832633566 39626164653331643036386130663539663532643232333338656661333130376537333261346135
63613233393331373163343264633564646232636363333337383138663836393339663537333565 34373565643535616333326333383231346162383032636132333166376163373761306337643235
32323538623136376235386435663236626636393630653366343664356565383232363332313937 61636363323761366236326139373763306561383331303563333461386130353039333862336363
32653438393435373934393065666663323266343233316636343262336137313263323337353230 65323532623538346638333036316430303130316366376632623133643933393466353162643335
32383130643135663730623664633431663237613834333735346433333635336266616233393561 37383836323631393664636262333839323336353835663138653061623037636262333432613131
34646538653733343864356365336634653637643139323265623466313434653738626533383664 62303162646133376263306361663161636131323030396164313435356164386239393032633061
36386339393365366537323230346534376634333465306333666532316662363437633934346163 33346438373036306365363935626539653930386638383265373733386366663036393637656264
65376437623638336638623133363831373239623731373639333638366233653937616537643138 61303235326462626630366335373561313730613163623339333630313561663636353366393564
65613339306131313039616163393761383433613039386566346266363065376166373366613033 33303861623038623135346164376636323661373431653962363332653766663438323664376561
32626135366466643036306235626265353564663738656163666466326635386134323739333831 65313835386464616361306438316434656331653632346330333131626536323064386664633430
38313834663164663834666263343333383738636563386635663438313531616131666465623366 63353062336630663935353838316366316138323037383566613166336138306262313766383630
66356138383561626331313037306664653035323534616562643034663766666166303239323064 66336163666262636435326231326437336333666265663434316635313430623437306230646534
38666565636535633235393932663866316364623636316661376262663238656531353337366332 33643039376230643163303562376261316163626436626363316234396263633864376331353230
33346663373865333830633333383734346261643962613230633730326335313266386333356639 66656531646366633163336636343665393838666166643966306636363462666361303839656433
31363839363132623839626632646139363534326263653036616632633965623035626265633064 37353061656162653336363333343631633865636566646534306231353064643336383365376335
33643561383038383538343864666532313838643765373737633762643865306261646434623030 66396339376666623561393731633462643330363331623934643935303563393463346563373964
65313037396165653538383061383338326535346134336464326439383030303338656465626239 63623063376365646663386431653533373739343962656236356461383930373366383163666432
64386363663633353566306265363732646130323765633833356565623635353062663935313939 65353664363565646235393134316562643230383962636136633866376534326165343864383736
37613733643032363064623461306639633234343564666538313133613433393161366331316533 62306333386636306330373562336137386338303836303365353834303239336464613966313638
37643166633935393833306362363436613637623635656364373036613564313261326439343366 38333437313635653866396435656239313535376461623663343663333466393136313936353831
34323132646166353361633632663937353931376438356562376539333961336662643165636363 66646465663632323866376330316266343033646466316564613261656666313634663735616535
34396165626537643232326162366337303039373739316333653933633235356263616364336238 37393664613033346234633163373965393763356661636437626263326666643934653931393931
39613739626234323366336466383433626262623436316538643666343031333161363730663430 66373338636463393536633231663564386561313231323463343638383630396362336239333437
30306238633164376135623232633563663034633737643263336536666532366336396232326435 39343635663830313234316538636131653765616636613631353432646163376338346565383038
30616333376239626664356237336366343737396662336338653031316536343966633363313866 39306631646563636130643530353865393337373066336666353732633161383933626635623735
65383237623535316631303234663263326634626562653562633430356537393561613162623165 63623736613538396635306633393030613434373433663563643065613935376230363935343563
66363633363538363338393834343464393566343161613730373439363332613931346336646166 31316639333664303361626661353034396138623864373164383362356666633763323333363936
31343361376664313662646332366365396164636131336332346236663531373837656432303035 32366635633162376436393738663535313338363665383566656634323932303834656639363566
38363435643430623132343166363265346163643530633536616164383233616432303138346635 33663637643866333535646662643339383339353934383738343138323466313130666563633433
31326130313936393039636565646566633931303833313165373538656631346234646232373266 61383033616338646665323166623461366635636666326365326666393739303963353365636662
64393233383161363238636238383033666633336432393562306533313235653964616464393634 64653132376239636630396430346462626136323734353631356238303838663563643433643833
63646339643533363264643935333438303536383966336336666666373739366432626335373166 34656635373431623639653062386562623539303938336334303238666565363137613638626339
33616266373439633134636633366466623836663865363337353563376239383633343165373438 61666439303339323061326337623435383662613761336165336361343762373935626131383135
34663239303336626234336236666435363331343261396666366337323133373832623665393565 39633562353339363936646263313763326366623833333530373032393537373539386636616532
31323233323561336135366231656238633864353933626465656134636332346566663033666137 34663963646234356136653261386138356638393335626365333263396232613361306239323439
64313936343365393961363963666435353936653633343666376334393562363532336437616662 61663937646561336637313831373730316635383564346536663533656130323863393566386261
32393230346335646361316133663166386534343066326132623135663634656262653335383534 37343563333035333233666362653765333037353636646265366235316163646430616635336534
38343264363234346234646437663562616630346431623535616131663634393765343134353035 63663330303535663237373466666162356236613137623663343262626431316363356439643734
37643031386465336430663831353534633833656538663764313638636161623134353665623736 33646537383963316336353132366639306136353566313038363366666261313730303837643434
31333739376666306264333731396366383335633166383733646136306437653031373732386466 35663638616333346365313939303636656361363634373837383965373932663565666434383636
38363966616537616661383561393931613662326535316232326166626232316333346662316562 65333138666466356334353837303838303831353063333336393335343033373539383662363832
37653436386663616361616434333336336665383537363530333465346431653962366439303738 31303834366531393436303834316139663533333836376136326364383333393164656164353630
31666230393961373330643762386439336134663337333736633233333835333563353566633166 64646535363231303137303732643863616237666562363763363265326131356361333961356133
36633233316333393731656638323161306536313036346139653337313939653064663466376239 63396638636330393938613839383061616166373865316536323835363565613937363161323631
31623633623932633632346135346633666163353863663934643736376239313262313533396233 39343865393861373136383763646438616537373866663466303165616461373365656130613661
37616233396663323764373165663935333633396634306437393364313566303332646630366566 38663734376639623966633239376134386239383638653730643439656333326532303535373735
62343539376533636537366535643166386565343234366532303230393366393037356363326233 63663233663963333661643734316337323263666531373665343561396631396563306161373964
64613832353934346462653366646564666161613739386332386636326634303131643633636235 62653236366136353463363735376434343061643732636533636634653363386336303034393266
39386132303830363265333031333264386532303132333434323536613235376566623035613837 34616263376537383230653263323962366164643939646366653635663735373939633532323138
65646232303462373766306139366261623338646463663830313134616562343966303662653361 64393637326131666262316639353337666632646662663935393037303335353762326163353931
33613763373235613833 34663535363232383232356635633963626637333132366337356537313964616434323261653936
35316462373631626438343538363533393964333463666566323135643165633863633331653765
36373861386232303739636438653735396538623336366236353238643065353732643136333561
37663336636138306335356630313231373732333936656231626537376564313064653433313337
62343763343036636432613534346461386532626139346164633738346361653634353636623831
31626566336234656661303466623364626261356331623235306265333937316539333539373133
38373532353734653337313834323037656431666362333333666237386334373063653530623831
66343065303761303035346664653761376335363334373166393861373236666565373131303539
32373431613532643236

View File

@@ -1,425 +1,221 @@
$ANSIBLE_VAULT;1.1;AES256 $ANSIBLE_VAULT;1.1;AES256
31373965303265656439373665316439363231363639356266623537313937306633373266653434 62383466373737653035333232303338326366323539316363336337393862373265666333356433
6334326430343734333233653034356434343038373733610a663263326531653465316666383531 3261393563633166343066346436363532336261376134350a353937653561346237666134343561
34353262326634656261356330343830383432343033393935613232653063633230373562383039 32623332613731343631666563663731663739323633636239353035366335386366626366343934
6331643961656466390a343438323061653065386234313662336233356265623233326533653538 3333313835326639340a333463326635643561393464643063613530396430333838666234353538
32646166633139643139353233373537663538386239336635303065623737663732386162626264 32643366326165383435366266303463626330343533346561646232383337323332623663353131
32643031313230623564393839346339363733653461363539323335363334373765613332653534 66306538353864356466663233353237356132616161373166393736336438353066303963663764
39643965376138386563323831383937663038363966663030376463353562353138376435373165 65643465626461393232396461356132383939353035643736633437316132386461313131623961
39653964373433363935653066363062386537323837313362306538386631373530386134373237 35366464356133373333663530613066613233303161623534653331393864376333303937333037
65303166666231366533393564633438386531613534393432386639326237373364343631323564 61663239633030626339653062663939633662316633376135626466623637656239616234373461
36333566386166333963646535663030393866353832383035346538643264386462323363623437 64353633386638363132643530366237396335333263306136373939343565323765313565643666
37666363333566333137376233333833323835623364373535336266336466666431663863366634 30366162373337366331313232373333393939653561626238373236393430363464633333313562
37666263646165396136306163643665333930623330363238393863386535663238313039613166 63626463313336363961663431366364303065623933303261303963326266386131346566323638
65363637363964343463343865353339343033396338316132313432663534386634346265636335 36316161343738386436383731383961656336363137303566366335653538663432323765663062
30306336346462386236343739633165633337303330626238626265343962373836316630663163 34626232383533643363383039643762626337316636626438633438383037353432323132663464
61613539323834643063373962643762663938343230376335623735343731653139396361653166 38616532316534356632643630326534643962353634383162313338396538643862313061613838
36643763316638326336653139646431303933383162666133613463366533636139666236633535 35636165366337623532623737393738343230626530623330303465383263393763623664343466
36366537623735646132616532643831386462653333633132666265393635343131633139666266 63666135353663363961306366626162373836653461316537373961333364373236373361383238
38383736343234373437666436303631383331613461373461343339346566326338613137363230 66656636646665623739326638623061663765363030316263613666666364663261343830393330
35333863636462306362363163396562623935326538303662336365663030343066623261343431 65366366306333323837343666633935613635396663623962386430613937626366313232363962
65626434663638373362636538633631343734643432653464653964633731353039323434653365 65613064303731613865366432353866326135386464386637363335653135343665623632663066
63386262333766333638396133313763306336363262666262643364633666373834396635313438 66663165633163396264303236613734383464633966663663333731616665333037663538636530
38393435663330333935623131333737333338366534376661383665616639386134373234363164 32323830303864616565363862316132303131636635326431303261313131646234346164653862
33336562626266336536626335383438393732393165383030396237666466376531653665376633 62396666303961633165333931653061613132396433393436623665383033396130336231323337
38626463303264323866643031613366303235366661353134613438393463613333323033653438 39333563313137623035376139396261343432666130306566326662376636663938326439663235
37633564316136636133613866623138616364306237313232626130396134303230363735326132 66636561663464336637323663363363333338393665616339643864633839656463626665666664
61323536346465366638336231306662316262613734393866386131666466363639343930336234 30373463363135326134613730366430326666623766613131326562366265663662323438333563
39306135626162383966373434646363646366636565646235393934373034643764633233306233 62363037356231656664623332626562346266363035393562336262373363333366383739616636
36646662656637623165306262376561383761626230363735343464303063666365666235653762 63333763303038353234643564303132353834353439656239396463313862363464366634646439
63663535343933636333663136393161373563643730633336396565666531633764666639343965 32643638623035366632396234626134393461633163616664303934623861383462623438323831
39303862373532373236333261633166633764663161656536633261626632623034643434363736 33316361363830353062353832336366363161653630323735356239663037616364636665636330
36356236343638643164623162356231376639636635383062326566666234343038363032646265 65313531396530323064353862353939393565376662356138653736386637623265326632306561
30346363646530623764313933306566333262303561383634383131356461386562653465636362 61343764393034633461353432343830326661353663373965373961663330313035396437663738
64643631623762333033636362626538633132373735616639333364343461356234303563663936 66333539626565313635663531323366323636336237306561346234323962613636653864383532
34336464346162313063333866626136383566383634613031333165326330383632363338633733 36326138383566666434393932343439653263393332663766626261653336333432623337343439
62623832333032303666626664333564633466313437353462366365663262343531633432303435 30316336346466383333313332303238383761303033336164613462366532353761383333666665
65666130616663363966653431616439313366623830393662383437623037363438333838386337 36306661303832646432626461616236333730353538663765653539303561343534643862356463
62336132363339316438656564623237383735326464616530613631323339386562613631343839 61646361653464653462346334313232316633376539643836326462336236366330323061373538
38386362393339653533383232353237663431643536326235326134663834306234376366613366 63363638643862343539643639383935326439356534653339393835383139626539373834653238
61363631623364363636343861356361623038333363613361323865303964623034333762643034 62396464373766316132376136343631316132396661336233623637396166376466353936666263
38316137346664633139343337373538656336333438623337656135663663313662306635363838 31613261356366356130306437613364333866333830643665333866646263333034326336373563
64616532653966373866336364666338373463383963386331623463383463363532626365623162 66343764633164666666353161636236376163626262373536353464363032333561363963376266
36636366663762376136333065663835336531386235626233366135616362376334623530646635 37646539316163336637313863373064393466613863653834636639626566383535363663393866
38366436653465326633633131323137653466623964343632353766663131363866666239363962 31633737376532316165333531656166646533386439323130396430323431376662626661383564
35313831633462326564363933333931323638646231313639323933333537373433393439656439 63323265383933626631326133636163363630666538316331623733663535326261323438383263
32376665363964616637646165326365323935663530393666373433623362656433656332326238 66623035343132646466613063396561323164323336636639636535393832383234623062626630
62613336363863653866396661663063656631303064376339306138666466386434663465323866 66383739336565643563653438376430353961383062386539353965323462356462353266306163
37383761393361346661383032626265326265633138313466393339316536366664393363623366 35383964616562653563666262366264343735333461646564646264306365373933656565363136
38646431653163626330386362663765376533353432393730616336373033663939646230356630 64313530356536336665393333323464336238333637306562396635383835306135326165373763
63656664346665343733323565376634363134303830373064303935306362613039333731336562 63336665366461663137383834643136383034646238643463656539386330363761363064613434
66383165663565663436356639373562633364656364323366326363646337373735653033363732 65623836323732633262643062396366633264396334353938633463623462383563343631303239
34333664306465623164623961366132663362366362643661323635306461303165376664366334 37363263383935333665336334366334323166306165333466326232656637646132613339323239
65643261623336656361306233323966303131353762356365323533353431333865653464376664 66303830356330396432613163616166323261643861646264336436313733363362343835646464
39623662636230396463663131653037656366633738653961343761643032353761616164633139 66383762613665306465643938363631343630633733376137383133346465653662313938623237
38653135386538376266356532323938626266356266386434373162613338616539336237656564 63313333383933393131373039323065333635353030396163623130303462343764656533643936
37363033343933613632663331373862653236366135383432663333356164623061646137343532 65333239333236393537373863386435623231376163323261326331306263326662653132623032
30356137316237353662306564323732316635653439666463393231313738613134656232323037 61663532383865636566623761356533656363343863633161343230633433306533633130323131
33303664333431333561653238313530623838653565656663343636383961376339383835326636 37366234376565666633353962353939343634653662336139353662356337393438363261353636
38623535663439343035626330653937646234333339656162393735623661646339346362326462 35643563316165376233383134653363343262633035326261666633383437626237373637663932
64626439653939636432653361616633636565643538653139323639303439386535303538616465 66326636643662636539346138663530623365376330343833363263616666623938623736303030
39333532363362646432363939376432663338313632363636633033356534343938313439316638 62393135626565303464666138613365623632666638653265666139333930333737663965323631
64323930623535383332633961623334383366353665303839323837353537346431626662383566 39613330363561363366333765313837343462316633613835313865656363333132326336626539
35323934306232326666623934373464653939323738386533333934306263363538656135356630 39623364343131306263363863323730323939353261646335366133393962623137653864373131
61393661383036346166666434373538303739333336326337316435636363303831356361613336 62383935313265363937313664336432393965653463643466646137373630373631363736636431
31626437353263386564653763373130343639383738616464336439306632376138386561626135 35323432636633663138376339383131383461656465643766636636306565663639623163636234
36386262333164396135633165386539323039383531343434323739323938306433323761306639 33626237353334396432656530663833633235666239326336316139323439633337663433643331
38373434386535323161313039386232646239616633643161636134626464303032303661626662 35643766323361393064336137666664396465373765393034303462653737663063373065316465
33653336366331393834306664356238333066323835326631636432323266383631333830616633 61336363353831316338663536653063613061333034613237306531663037653835663538666337
65613939623231353965303530663466313137616561306563336535346535383264323761326436 37613834343164396133343736393165663263653161663537313234613366653532646630373766
63333462326133653433633931353734663437363331643933313561653138636530386238373136 37636331326338383039663030346666323234393632363233323037383863313564363563346338
34626466333537646261323430626661653830326533383635363166346162336464653164323438 63656261653464663663643231653833346130386433373562623662633963346630336533316435
32393539316363363265653433633466646662316665636636383262643530353331346639303930 66333439396638343563633138326431346131373439396566633232356535393565656231663737
32383333613435323036336564623537313338353137343438623439333561303466386132666330 36376163393133643337613639303039623832666438666661383436636661393233366663333838
33366330366661356365376631626666336336623731623165356163383336663431353761386136 64653564623562363339656162353836306437303738373439303933313637393464306265323336
64353862623830393934316637313263303162336263653431643737363161306361613564373838 63326436393364373931653563356363313139343734633663316362323738653738343732363138
39663064666437376235376234396437313866303561326661623864386639393230656531376361 61393761326138653036643332383235626236356564633232323462333135326264353937336463
64393233656432353637653839633933366232383735396236353862303337376532313532633132 31313965366132623737353232373134323433306564333862326634663362356238353465653364
64333230383366333164393238363135383362396336636335316530666533363934656335613632 31623933316465666331653831393461316538393537386636376461653236336434626134616662
32303730653833303661303935326631623364333039373031356638333665326664643733303663 62623634366336333739373332376239386336336631396263303535373564303862663666663562
33386237663430363962363333663433393637656665616363623638613763316537343563653330 61313830386438616262633533336334353735333331346436373230613363356166353430386430
35656334613765313238366335316634646532613239666364393030343661623862646366373461 62343735373231656139343035396562386661356538376661643435353237353962333930363939
33646663343734386435346434643362623135386434336133353065643966303066336532636531 61613733653064343833396530343432663238363537373631306132666235613330343866353031
63383964386336363733346137663862626430366364353261366162366235333965633866313033 64396531363337373236656235633261623239663439303834356139623833623339353862663230
30343336636631353464643764386633633739616134613765663137383635323361366638353734 31363039663033323663353766616465393063356263323239353461616239346332396532633066
37356130626631653736646265366131656462303965633066373335303736393562643463626362 64346563613934633937333433383764363731366132626365323661313962636464396539386236
39653832356536626166383235343037366537623933663165613163656334363730626363393332 63316563353661376330346139663737306162366661656461353862326666373030336136366632
65383234356232663733356664313737626535623834333037313237663065633639336332383462 63616439616630366435623065386430646537363333393965663534383531323462373833363965
61366663613432663632666664316230393032323362643664663539303466666239396535346635 64323931383534643730303466373366393435313663306631666364376665626434623430326164
37363464393963336435353636383032393862313062613961303635646464666161653738343339 64366437626634643362396565306665313231326336366630326163356630373663653633376434
34343332376166613631353234363764613035353163376631303733616137336366343731356664 64393033336463326631303862653337656163343932363661303862346133373562663537663930
32626237643464386364336137363832323636373333376438383261616632343234666130353431 34373761373537633130366661653539343931383663653234333663323738356535306664656664
63656131323838356331373764653861663862636239333836623962653430653033383433663361 61383337323238636634373830626138393466336666386262393039393963633835366531643831
34383462303864393665393833663433653862656230356536313538663766656335633435646635 35313531613832663637386566313436363566346432346536313263633038393438666431663737
33613232323335636331613932373036303630623338306335636331623164396237353335383237 62633631656534353961306663613634616336393833616166613836373539333131633066666365
33303961313139303033376134356431386464316561306531636364616635326663613862373366 63656264353831353630343834356239653331376539376331386663386334366463363935656431
63616562613737393032633934643461373365306430333439656138646639363333333839356238 64386439656135383139626136653066613166353738613262623231323132626330366561643030
66633638313737363165336363383038633836613261376335656438376634366533396664306463 36613765336339383863666535303930626534643934383731336461383432376461636230343030
65633831653561326436633764306635646333333065623637343732323162663663626633323031 36383330376231336661653735373961643936303064373365616333663836323663333361376462
62306461306232366631636264356337303137643266353165333635636238666331336465316666 34616538343235366332633430613130633237303363353932346366636631366466306533373063
32636562613831396533326162383832323963613133323830643037333630376463326263376564 66363832623237636266643861363238396534666164393735303165393933623766313262323333
32343538373035323966633038366436323364643664613232623038346262393864656337393835 37623830613733333162303061383166363838303965666664633861376238343165633234633232
31633863323266316131323932313264383631643162616361356462326262653862616436383738 63636633353937376131306435383061343030666361323061616262353935643030333966626433
39353832663434623362613765636535313736343532353338616666396266393436616565626361 35356562316336343932313539623239363036336361326234666339366335343033643435346536
61336463643837363434353031653961386130663539313939313634663135346230666530643235 65346261663338326465316237353934633334353033646433353035653530396232666638636262
63353532656634343634616531623835396430323337356138343463626335333263363238333935 37393532656561643839373333363331316235636566316531393865633131373936316236663839
61373939656466643034633364643963623934623035653265366263333739666363613833376337 63663835633437346336626432326235356432616364316465376239363864323561383636623338
61323330653366313433326336633939343133343565366339623337363237653265323263333731 39646266396162313938613062623430663237633465633261626562626636396637373137366465
32633333346633363032323065636232306232643238323164646261633630303831643862623133 65643134666236386538643062663135643266303861396337353638306532306236636136623039
31336134303466616364386539643535363335373035643563623839633633353837663766353037 34336130666633313661653761393536346661343063653562326462363434366531656430353232
63396133336638663530313262653863636665343033353362393135303666336261373937303135 32643164303364613362616631356364643835346561383962316265336637353837383462653037
30653165326238386636356132336634343561386533396465626637613039643362613638303866 34633031346261633835373131656166386439306361356636663338613731393434323039353665
32386231326137393065613966326463323934323736396230316166633565663637616637633332 35636365303365353833623463626463326632383737373235353464323939616539636531383665
35313166383233303233316162636630623238386263646338393662386530316530613862626336 32333761313439626339613834316464363835636331373331363730373861313739363164313330
33316239623632366362386265326533633732306566316436663539343335366563666430646136 33326136326566336633316437316132613430393166333130623335393232653065376131666465
39343863396333663932613163633839356133623864366132306232646635633932666635393132 31303132353465313761633265313266373132633231353766346633386639336464613134353832
30663930666134323738323766353562633637633939353834636639616237623133616633653064 34613035396165633864616664636563353265316432336636326632386234633263393261323136
39633964386336376131636532346265383532323965656265656630646436613530633934306462 66356338613666303863393937626365376631643666363830613836333236383466353835306535
65393933356336383439653362353266333136633164616362336162356161656364366238666534 63313939386335313936376233626231343062323662313565653439306534386133396336623265
39376162313530396435303466623735623863366535623061383330643335316634646533303332 30326334373433386639626362396138346234346630383930373636616239353734356432356237
37666136323165623865643562306430353938356664616534336362303631303234656662333761 33636135353736313961303730386433346433663332363465343732353132356162383936343238
63623737633939353736313936623338363262313466366239306534653362613538656461653036 35633866303031663238666662366137316366333564336134393465383438616465656666653664
66643238663436636330316563663835353966383666633334346532373164316633633461373430 37383231623136363163663562343938653631316131613864663936363336343465343931613830
64386537316131633066353137633431316530646663633835653532363332643161313032353164 61633166663534643765306337316635633163326238353561376631353661386437363935353636
37383933626234303065396133656137363262656633306335653965316632353235313362643065 35623831366532393061343764633735396363623161373661316238303639396166643430323432
39663964373437386539633266306566636438623035343630643463356566333537623865633936 36363137303834643233616331623764343161623264653531373431646364376662376238353233
65623633613233323361333330313938356332616237323638313261353062363661636634656134 62626464393336653530383434353066353865333139323363396635393530616332383463373032
62633862336264376631303037616539613466626139333462323735313238303933303165613162 36363665653234313263333334393535333961393063303366393034333734626235313835313665
31616632623231616564323762653139306532393361636566343733356661373931633264653165 39376330346132343035653531396430656231646631653131633064643530363561393665663661
33313763383237356636383931306364633461633632363631623338643563353537623837653235 64636133623231396663393662333738653631356436646166356531303066636139376166353830
37613566656130623930393039353435323135616537623561653837616361663832383430663434 36626461646635323730326463323065393061356633653931663334633532663834323332363534
35303163636335626634376339653136346134336439613934386364653532366630306431306330 34306539386532386365313766343462656264653332346363366231663764633436343334343235
32343430613336343766343064363036393961656263356562643834316261323563346138303864 61653465303635353062333232396261336139633561373034396533383933373933356462666134
34633062313562613531366262313566373539363165316465323964656131306163666265663265 32323631353536663761663439353162633539346561396166303738376432383533643766366465
32663633336632343932393031366438336336353866613563653432376138376363643834393238 61373536663836613237366666646133343532376461323139643565396135366533356439306438
37633862393732336331383935363966613561313839396237623533373963373432346338343962 62643235316231663564326238386238353536356330363236313064333862366336636363323834
32393665353534363839373636306636303539303961336262666630396163653265326165353438 33336236313939316162393964346363363236383263363638336531623463643338323461326338
35393462376437346233326465616535626461383130663862663439346462316234346261316538 33626430343834623466666461396534326466393934643631306637633562623531643636343031
33326661393131643039333561363662383365386462393833323139343963366339663436663766 35626637363265306563643463666337316633613263353363306330613064306664343735353265
33613162373966613332343535336165616662366332313332656634353936383063623538396164 38623033623364626437353434653732636161303732326239633837346336343666386138383935
32323962383138393433313166643135306439343365643966343937366133356261346235653465 63626238663630366630366635356531303564663866616563393164346564643338666561396432
30343566613935636434376665323361316363643730623064383434323632666561373462326262 37396439393866666661353463623865333863613765353264306633636239656530303230373537
33613431613064643134346364363732396161306134316630323338313961663634326638636131 61336634383861633165366265313136343464396464663136393864623436626537313935663831
61386639313633626262396635336132343336646133393238623862663231383762373635613862 64386162356665616331383839373533363161623630663431663136643732353065376161336564
64626261346135616534333764643037613130343236313465343438663165633663626430326335 36663931383033313130643831306364663365313265313831373636643861303261626130326234
66626637323463303438666537323335363332326538373163356330393630623363373337653836 36613038356132343936346463636463356332303261663830373333346435316364383161643065
37373438303936656131303563303464373837646466353961306364643234383132386630303361 35323262373736626636343562313731646234373464633664663562366364656466323737356435
32643236663065383163323832613166396432306632343037376336396236626663653666306639 63653266356265633163386337333731316266663032656131346134353264306436366466393464
61396536623266393934653631663162306435346434636565333838366132306631336264666433 66653662333464646437636439313565333465366339383365666538376464653563313835343561
37346164353932393034376436666432643432353664653462663837616139626362303566633334 35373661353832643363363266343561613066343138636339633033343932643633633035616232
31633761633761373863353432306231643530663565353739626465323265666339386461306239 39336635636135666461643134636435326433613331353035656232313662343735663833353234
36653961613937343662353438333666646332353836333362613162663034363366633566363932 39653337386430353364373237313533373933383333346536356337356535653531303532663235
62383330333166333365623261303364646361383337363237646236336134326232333363363239 36323531643735666538323838323932623438646236613330383863393836393365363636626232
65336635396164636436636435326265393334396464366430336630646266373732353563323065 34393239383236626537303666393532626335396434363763356466326633363464646565323431
35656435306365616432326534636666393963316130333230646438616564316434666637363032 35383934613964663839343332353539653136306566653763396564343538643663366636306331
30326437366530643336366532373537616434363565656231656233343765316163653431666331 63386531326635373134353564316532353333383834376332306237336366616532363034383866
64353661623038383266613362666666373466393332653937646532373738653232666263643162 32326133333932323861373433376662343537343935663864346537633063316561316538666431
30633165333036333234643534386138356234623537393335393433316339333931376662346535 32623863373432363264373637373864396363353933303762373662626364653434363738393234
33383233643330353136353934333332656639343462613332333264376363346266383862343862 64616464633433376336356236376635623232306264316464616465636139363861666435316563
34653736376361373163356130393738323365383462336164653762646466373535626431373539 66396630346437616433613665303462653662376563623763633466653166643536376466323133
62316462303333623336633531633332626364633962356434396665306133626638343266353438 64626630376338666164353839323062303132663633343937643761356535633238356634626165
30353032333764626531663433303665303861333730656634316166616636396631353661303837 62363237336264623932613835303236623333316564393338633861313333666466346435323766
36636135383730313931666138313336636637303233383331336638326332613433373161653365 35626432373737653138653931616562396161363037613339323961633534623537666637626133
33636534356236666138646365613937633666656536313361633231306137623831616164656135 61653637306531646239383639333366643937393932623131383335616436663863393064323833
33613432316337383064386563663837376461363932633732623865613463373738313131393939 35306635386336613037383761653638643930303334386139623135313434346232316233373632
35643562393634313030366534386134643362343966376433353966326334386565643962626335 38393737636132333138636534383565666230323831303964333132656663383838386538656537
30633364393130343366663161623263373466383864653964613663343363336662393961643833 36316166653239323162326333383035346636366163636233393936613563333032653339623264
64313664313361376332373633326635376166666564363437343066623165303134326430376365 35303766623730653939383439643265343365363064336430356431666163656661666330323563
61626133633432303564353266303062346233626633333564376265363739333433336637633634 33383761326562333937396535303366373136653163643138393931323838313531383264386463
30613837613735333437663063666138656535643239313664323232653463363538383431353034 63316230333735396538613561313132613861336166663238613730323438383830643963356230
63613664653862366262633930643661326237613663326230616337326237346330366130306336 66343933656536356136633065663037663233623662393133353739343065333438333235333836
63396131343632313562323035366435653639303162356563623731353438303362333232656561 39613962376238643933653131363261313164333333383032613235653136326262623461663032
33623839303038666239626366663237306164316466633062663664663663616362616565383535 36326164323036386562313638623331663166633039373264323333386635363437373839393432
65326532346262343438366366623534366261373338303463616264386130386165393839373462 31363564643536613530383066383530643537353263366565346533343761353530313739346137
66313364623634633066383063643235336130373663316362633234656236366461663332633331 38616335386539363861306232326330386563663433663132383938323866646564383864333864
37643866393935643961636338376462393161383862366362613561363565623631643634346239 64663733333961373730366137656563376562366366646135383662333831636462623762356563
39346666666163633162623462363936353563666330383739613462356231653661326363393162 65313433363633343662316337306638383132613131393765653135366631633561356138353730
39636136383835613463643666353561626638313533623664643166326235313634643465346263 61313135326366373837303130663466353563313465613932633863383664306262653833346462
63313765383739303163343638313236313261393463323135306166303538633063373831343835 32393566666566656339326531343265316631623230383130343633333535643939343733343161
63653564336334643863373534383037353135363564616136353133363566303861353464313432 64336639666233383865386533326437613630613536303063656631346463353564613030366662
39326238363362663834383566303632363939643337343039356562353336626461663932353137 35313331303564663835393439623730633031363435366363376230346432333834663933313834
62363063346164383163396163353365376532633562393931373539326632343933636166383463 37653561626430363962646136633865353138323835633062666631626436653461303966386164
30323161346238633131646233336330363637366633663864613165373231303732363739653264 31616235623932356136663763623263626331343131323933356439316430336564653630653836
63303433353933356534323037633237616432353937316535316639303864333339396561646362 38326538666265306230396461376635386464656637363461623639356531313939613363373461
31306231656136343531376365623335356632653764663063666339623266666562393235613138 34366136616238373731333962613437383563653161323337336135356462346431343064386463
62373734336233396461383930626461383634623764623035346230316133303233383034623963 36613235353263623430333035376133353966373130316134303639303865323534386239386632
30333864303136313866333736343865663438616261333232333365313961396134356461373866 31313935343336303535653861363036363461373537336561363532626137623066663932343037
65323764633632373837353461376332386239653134316363386131336663336131613036646332 37333164356232343763613464326234343230616362326333643665643261656266336638303330
31353532323538656136633133313064353231376230646439643436666536343665316134316335 36626133333166386661393833356661383337336136336537656233326666383133623637396264
64356536646631316363373866326131633163343038653863383065386635646132666363366266 64316264616439313565306666616238336661363365633833623263333363623132383830346130
66666130333830613139336331323565383566646237396538613066396335363835653238343733 35366234323837646531366330333632616133333364343766393233333237373836323837666161
62666130373632386536336531616331303064646561356366336635343139373261363738616332 63643138376538363639353330373136376564643261623731313931333666353239333561663432
66613234343261356465343734393132343236343734616438336165366663336338626136343661 65396663373436666236376434666632376335353566353530393533633132366130663038643264
62663239623339623537626365623436386365663534633065313463343163366462393764303866 37313832613732353230306135363466616162313137343436653064343231356433366563303738
34643636613061346438643337616338363961646538366536366433363664356438313736343833 35623531636631613061653963656664313038633434316336333633316661306563643262646334
31386465663263386635353834363666303661306239333435343234393737616664356534363062 33613563386330376333663133653138336234386366316538383362383665643361386366386538
64663261326336383863613134336438633436666537646437343235393234303465633331616431 65396534643064303332366532663834366537626261316139326236356136343136383638333339
39663666613462306630646464326632636436316434363037643264306637636362613933376366 36346530356565666332613037373364353366386130313464626565323730316132336262323264
62383061643938313834613762633939623965373235303066393361323035313831626335626566 36633532326534343362656465306535653539613265323634393865646235653363626637383339
66656161643964316431656535323065303434353463366465636235393265313762366562623663 32346264306561383332366462613236316364393931316132323937623763393935313830346430
36363565346462346630336636636462366138353139373461313831383234656438343638623233 64383236333664353431363934303132313434326534646239363366626530643536646230663139
61393861336566323465343432353536336566306533346563623364303565633566623839666638 65316466313562316266653665636361363734393461396630643637623462343866646265633838
35373565316663383464646639303037323662616562613962643135643932363262353338663134 39633137643937656438643433663765363430313337343166366161323434663439353562666132
35616665333266306438626637393439623532313333323836643466666363616538306138303637 38623464623962343534393064376237373231333939323666306465306134336234383932353635
39303262616531633631643737613332643937626365326133626165393432313739396665356463 62656337636465326532613139626462323162303730663837313935633437313265353930663463
35333838383331616566613838303533663564373338306263336463613638393331373531613766 38626231323462363461373131306261326463313763623737303466353835643931653334653132
33356632663936623234643033396662343566666133333664623764653765303730613233336466 65626639396365646333653064396662626566646666306362366334363934646237663830393962
66393533313766636161346566626565316361623035623464306137663031636439393936626234 31343561613162396632396336653834616663643130363131383463613265393337613866353365
35306139373139636339333733303730393434313531323339373835326165343061393963346238 62653737373132616335643731646236363263366433653965393736333766393262613836333365
38646562363766326666396664333632643464653663386437333035343465393162663830613666 34306635666366636430393365626364633061356165353661326563636366346562643733353334
38353332656331653364323434346331366334393636643265336464313536623838366635346161 63316437376330656661633661393362323133666434366565633436363034363039373761633032
62363937636333393133643336366230386630303237353236643333306162666636306464313831 37393163613131383537616434373730303664663562656333653232313937633164363236303663
35613332366532303832393135656166383265333361303735346635303139356334383832323466 32363065366634363731313534343566623830663361663430333061383765363137366662623139
63633762303831393866626531653365353164636536313861316665383431623332646531616534 66346334333061303437396532343330346366396362366362323535306639333962636232363730
61363534393434343131383037636362613464353730376330623764616633643730396231666433 33343236636163666136373264666236386361306337653564623637626135613562303636613535
39353061613533363463336561636237356561353837346464326638326539623965396639313738 38633130396532313362616666636238343035313233323661373032646432626262643662616262
32396161343466373334636464646166626139613365363038363330363238663839386564616532 61353166363330323665616561643736326236363438353636373063373738383361653539303131
65653034646338343434343138396263373534613766313033383934663165613863383365333962 30366364653464373662653066363865626338613433316362393564653739636635333562333036
36336338653336643064373733346234623039393531336436333337313532616333636162653666 30376530323462626264373235313231313163393838633437326265646638373439336638636166
33663066666434636663323162623435373164343961643639393637346463383136643865343830 64323762373835316138636137363166616161616633613632333063323632626637653630346562
37376136323466323162316333383463336564346135333637666338623038613138393864343132 33376334616439376161643038666438373833343632643934303164353866613231346262346261
62353533333363383664653233653032616530373436353035393635383765366630363935613730 61663265366461613634
39326639376234393132346334346166383961336639336137366532383366623135633562316331
37336165643439336132336431326161306263663264306632313766343066653833323038656437
34336566613234636162616134623539303439356363383464653864386331353865336266376131
66646338396336663234343165626237366264353230326230653964663965346636666466376263
63313564323166666236393266646533646464376139336464643636353732376166346234376361
30353931613137353530373030393430613664663461306261343962616636373231366264663237
38636463653036363061653566343531653535303238633464333833376634366462313962376137
62323164656131313762323030366364303831333965366136386130623563376363626439346531
33366664313637303365643231633733306637393165316132633136646265613231373836373639
35383335366461626362653730333538613530633038366263373139396562313063633562313430
34386362333663326437343161323366633030613762326136303933636464613564666261303736
64326364383238353135303933646164323961663835366665363039333161636461666532313138
34316639323231316135393864613633656366643437636536303463633434613533353165663863
39313438333033613938643439393031353761316538366361646564656531323362323061643866
37326630353264653230333332353963383834393063356636636630376463666365376161383633
34303636646631366539323931653334356662326462393464666265366566303966316231356466
63356162623735653364646465383665613333346236303135346333663037343161346262343532
36636265353663613837353932333030366234613539663864366464306635643066316537343666
63663064396339386362343639666131643830366361336533636633653265306530653632303937
37633032663937373934366430326665336266666537656234663233613235306336326535626262
66303164383062303839363231303464666266643536616536333832623561396132633236623566
33613362623065353265633433323362373734386230393339666364323232663864623366343433
39366166633439343364653231306662376230353462646537393965373066303561376461326638
30343565316633626466326661646637656232653738366362363434373565333563636431386634
35633661326365616136663637373265353363373162323437613433636466396237373530646534
33626563373033663264366439383139383762666632626335633261663336323634323732303264
63383732666363313938353534323039306331653863643338303239643064323439343033363534
38613266323865636136363936656666363036393866636164376365316235346239663739356461
35376236303134373939356435313838616238646165643034376334663535636464326238363932
65386664656537303663323634646634633539346563393961623937323331333630376664653232
38343039633264343934643161643431643739656535373030626534633835323061366164316339
34623564643064393937393562643766393365343133323030393663643536653931383364343632
34633461376632663765663164373631343537643563646633663533636366313933373230323037
66303435356635303865636130643934623634323763623530623865343166366439353965323162
38383539333237316564323431663635306436323565636466346432656137323336386132666639
63356562386264333230363931353233623465656535333136323538623637666464646330613165
66376630623531633364643763386631626339613632646562383765633932336637636265653830
66353339323936306539623665396436656562383835633464346562333063623233663134323336
37306236623637306162333433303732626362653933343437643939616238373239623061313435
33613762376136386661303630656631626466353661663936383430356337653163316536613732
32663838613163663535363263393233373663613031386136323437653130313330333738366535
39316633333137626131333464393636333861303562643839303961666163306538376539336662
32356139326337333232343263613437353961373139626533326262343637363535633931643436
35373638326132353737306461373436353637383434326164333164343034313039326463343935
38353836666538646531323238663430663162356131663433616233326462346433343463356664
39653564646237643062643466623165323036313638366161303937333766656539316237336536
34396236663835383539393161363439373732363439613961346433333261323032373266663434
61336464333865366466633834613262633634653037623264333435333166336335663735326139
38386162323933336263396636356661303035356339353630393733393363643863376534613431
37333136623530383261633463633030303365356261313735346236333565316461376230626364
38646336303533366634373662323530643533383064353966643738353537626332373338653161
32303836333766376361646165393166646536333861336263663334323637653935306161396636
31353833366537326265663834653864396435333930303434396234333137363034646538333062
35663562306161393830653863616661313039376235396132316338623064653232363830666439
32633336616237343234333763353764626430653534306663646331393539633631303264366532
32666164326666353466393539313234616138383637636230323562396332303964313037623239
39306365393333343265306630393839646365376263353262613736653535303864383235356135
64623361623332333330323137383966376364643637333434623138646665326137623935363333
33646232383237633161336237313439376365613361633937656138303265303135353132326462
38346663623733356639643336646664643131393134396239303163366462613233366362626130
39663264343031653836643237656432633938376136363737616632636234386331643631386266
38306466653263633737343432396164363639383533363139396538636666656266633562396264
65613135313563363634363431653031393634633330323964303364643833613336383532346366
32323163626636303432643665333564666335633630313837323562386664613038373165333364
38353933643130643730343266626563363566656462336636356637633435363461376263356335
61393134616165393134346335336432326336656231373336323333663538653539316364356665
64626265663237653965343463623138353336643032316263646538356538646562633337623431
66383432333362366331333139323631393039303333646339383065313535396434323235313439
36313266333363393130666536646438646633356634313032386136353263613632306161313738
33646634303738373933333562666462653138333334303564393131333238303466343135356266
36323563613937303364326132343965396231343333373633383737623162636362366537386264
37613438356332633839363263386361343561343638613833383236333965376666306362356364
38323532643232336461383239343665373938383238326534303263663361323034653139323565
35333830303635633064653939363431613562393661616565353235663531653261653439633163
38643236613661373634373131396632633630643063613661616131623734623136343638633162
31356230643433303133633465633638346135316632336632356364616362326638613166633166
34303165636239343033313731653232323730363761396238616238663566643062613236396639
31313166633435616139386565643437303437653139313831636334363235363839656266636230
63383066343036613036663039666131346264623761313032383264336635333734323166383462
33366536616166343235633838353063376463656366656564373235343136626538353662386635
64316632353739316666636664386563396637353838343632666434336234663363316633316466
34323332356238303261626563306161653665376266653838643765653733323333623438613666
33636534656238643932363239373964303036653038396338633965303736646436656666623234
30323065643933623638386262626131383666306432313335383138626637663061613835366134
39373162633735663035346534313436643030366532383965333338333539656163653433633432
62626365393731376439383563363333333961323661303333356362653761303861343439393663
35653266633330633838613265633863646139653964613235306365313864363633616631613262
37346665616630306539393762396438623862376533653530333930636137386636306430313662
62306334653262643765396632346533343635616161656331306637353863303836323233656433
66643932343932633163386432623739363365333261643833303534333538393231353937373231
34326532333531363735626234623132363934333331383133363864636137373132373837656165
37626461643065666234623666376238323265386263626431373736613734343033663039663963
64333531646237663933653634333238636664313666373362623264363832323261343830666664
38383934303633636365313362343935643830323032653838343565616339303366633037363938
32303637623331636537356464313531643032313465623966643833383735303563653232626632
38626666343832623638663761643561346363306139396336626335356639613363663064343030
36353138663434323832363465616232643330626266633933623637353031623637336532663062
30343336653539396233303039663430616461373435313430363337613934363637326164356439
65383337636333373333396534373761306365616663323432303538636138666666643835336261
66666136666262386465646262346437613734613532663638363539363264656632623661633064
34643136326636656566616666393537336535383566323831326233353263616232623539643633
63376236623139326232646537336533336564333264616161386232646535346432376365346131
39666535333435366634633233386537373764333166653865653531363364393462303531323561
34373431376461326437616632656534363731666565393933323135656232326265313533646631
65353035616263646338356436323966363062623263353561643665343139303039373739366565
36346632363461323539633239663237373863633132323739343438393530313631393833323233
63356238626566323266343138386161333061613838643964663330366365366236616661303533
33373037356162363035313031393863653561356133333036666239653339326234646561613431
38323461353662353564393032663037396439303635343437353736313538623166373262336534
36636434353665633236343265313839303837653665636631666338343639633138316239353463
39333866313337663864376263333037613833383538653165326461313864666433323061383332
30623761643765303035643836346139373461313137386163383764386531396465396138366166
38376330313430623763346338646135366133623862353237353334356434656138306639326234
36303635346137303932376462303739313831356137376436326636343233383964623832393735
35386534373235393139313133346166353732323364623139613263303865346264303933363833
38656163373966306236636635393963386337633865643439343762666134316566306666333466
30643762616433373834303061636239636663653463623830333537363765396564383666383233
62386538623432376638343734666531633636636161333738373865646461376466343031323865
65396562306435373931666561326334303330396539383062326365386532396431303236646334
62663137663162326634363537323364656238663138373830396331333137343531636133383663
39383038333535656331316664383534363434663635326632336439646565316261343362313065
62613734306663396439333932316331363131323665346564366562633164313864333562373663
63383637646435656366383965356130326564303439646531363839663466613736643161663834
62376266343031303965303735363563313737346534303261313535623566363532623062616239
32666537363836373262626338393230623632626261616663663463666338353937323139303839
64333464656266303161386633333165313931393931393366306633623035663238356564306133
32373037653462333762346163323566386539343263616665316334303466336264613266326631
33346536663338316466643839393536373064363161336131623935653666303262393761363764
30646239636530303065643334623636303437383866623737373937643537323361343936313165
37333131303366343133333038373831323239306564393364303734333535636138333736653232
63343636613662666531303261363865623737383935616438353538656439343665633532653636
63363835633639356463346633346263306566353062363439616265353432306539333562663136
39656262383033666666313933643531316163623366663361306263663764326333656231373864
39633339336262646639626435383639306338303237356637373035643432663965316635326636
35616430383862383534663836356266393864333839623932663161393331656661363662386137
62313032663565393065303233623662626464386365653862666664346135613535373232653264
66336365666534333435633535613935633862363065663639616164383266643132616661633936
63623139633834373133376464393238313236343233343132303464303532313464386433643664
66363463653236393033643837303862333863616332666166623636663662666563336566356661
65366564623063393039343365646130653465383064633261663662626661303931623964333163
61646365653566323861376231633366336364636632663431646335373435646439636238386136
38303262656265386664326330393234623434623364373461366632346133323632613039346666
61663233383430656362393466636564336163623836616134643064363437333535393731313030
66616364353737333565353138646638393637666334396331376639306637666331623733363039
33643762623430616566653535343963393961343166666165633432323864303830616262366333
30396565643135653465613337383130336635333331383765666530326365336132306164376561
62653631643565623365613637656562373534303534646462306536353339666465653466636233
33666461336462313839313862663734346637306433643262353565623838313035623961303465
35666232666234303837363535613261613863646439366363393335323332616363316262663863
34613634373234646264646562656363386361306336353862323537353462363631306661373339
38653438396136613962623332326634323161346234653130383933346537366433323231666539
31646439336139303834376132336264343733306338643062643032333630393265313663326633
65323136626130663331333137336238383866663832626164333964663966383536333032653565
39383536336264316130326165623131646665396363346261333363323162396431353638373932
30636566663537333738643334373633303937393438393766356262633834613965373039616234
64373139623961383233306535633938663931656530353739303161633739633034656537633438
64623330313932343633373535303764313339633835393839663430323664323961386665656665
63343763333162613931633431353636363039656532656131666465383435393861386364333831
64313836623138393335373933623631336163613138643166626264616263393663326562616435
31396463343335313633333830353064303165363137303631383035353063623737643937323034
39393464396532626561343735363638373364373539313064366534333262346638373233373838
31626431373439386231633665383738313163666236336464303363393361363166633565633539
62383233643330316463376464633233366566666434616137313634643632663462663630316537
32656436306564346163393366626662326537396438643361313237393761363566323161303639
66343230613461336531343739376634386464313562346332313930323933633463623366326238
65353436633632396130366532663263663238643835363637316635656339626537626132316363
31363030336364613965396664343666306137376233306362633365313763623864306238666235
33383062396632656530343432626537346532326662653933356133356363653266346366646163
66363535336533666364333930656235393364346264373665653364613438363039633261616264
37633731386362626466613538346636383634316430363332616666323639663838643261306634
36643864633533353834396532356339663266383061663638653765396564336566666537363632
63363563633437343931393633323433353764393731396366376266306135343639643932663232
39306338383863613265386330363933653633616261643334623233343838333062316237336637
61366563303066386532613261303466643130383338366538313635326562636235386539366436
38666233386230396334353032306335646339313631623334346461333833336430393637656166
66396439363233613865373035643839366630333938383263373266643438303331633735633234
39356364373434333563323566363935323063326436623137346165646262336438353866626637
39633939636361626635303663353233346263343430636362643131646537366561643138353562
33383539646339663435366133393364386532393334323261353939343465346535363637666537
33313966656666373931633836316535643964316132386536313766666137366637616139316462
34343861633539313033366632643439613835356562646232356436633139373566356435633535
66633963633135316261363464376461356431633433353863346530373963383765653466363936
30316466616231613537653834363665636136393333353534303531336662643133303631646433
35626435373137316666353136386437343633376435303161333563393238653538363539373330
30306266333266356631326239666565643736653730393134373565666634646130656235363763
31353237393132636434383932326664613461326336303339393463663930643365666362633164
30336539623032643131666130313234323337336666613234636465663737373434346530373832
66366330666530343831636465313330663735623662306533623438313831636631363565303235
36306536373163613632313062643439383231373734333637653637663661623163633035616434
38303162626664623336346439386565393564666239633563396535373139303462336234383664
34303532653837353438653134353165363232623937616630626662303639393762623731336532
61303832303464356238343535323732396430633135356139656232353036633765613834343362
61663466336362303066623064633464653131303333313566363634313431376562333862326363
34343739616666333666346665623330633232336564663037663037633532643135353666386236
63646463336532616634306566653636653739626632363561363562663263313738646464363031
38643664393631656432376461643233663732333164363632313239656535373866633137393666
36316338666634383331363639393965646535663736306332393365646662373936373833373438
34393538326136636162343565666566366164653432646635613131646539623161646636303564
62386461323933366230373664646361613336366561393534393462666166626137663338346133
61643038646365346665303230353563613239643563383235336531626433333935306561386231
31663832336139653462333265393830643535373136306164333530326134633038393435613136
32663439383234303933643734383837616133383134633863623336636163356566376161646363
36323032653462633462366363356463616336656533356266323066383839316663346238373666
62323362653063653739

31
host_vars/nas.yml Normal file
View File

@@ -0,0 +1,31 @@
$ANSIBLE_VAULT;1.1;AES256
62303937306432656235663330303934363930356632333966343535366438343261323139386135
6238653639363962373032656433623835313834366431380a653866666266313861643035653638
62343639336336353130363537356635653661333463386637333331353162636438393462353161
3531386264373537340a653431633436353030303733343738616431663831316238613930633038
62353466313762366561396366376363633132383438646362386239616362306563316461626438
37316232373664656165396237306333336433656464306664653566383761393636396537653331
30666631383234353064313061306164613364326638356636633636343133666638653261366339
37376632336133333736626130336165313735313033373138343662396265636563663234376138
32303137646437626435376463323539636264666663636533363733616637653934333936633139
36363162306237303931343133363238346231633732656535343963636262316363613434336363
36373339336332633332626534643762643264653365353062646663623837626463376363363161
31383865383166396663366230333334373037376333383938363738383862313736313261336234
65326434383165363861343131363139666238646562383837653233656365313932653163626564
38633761343338666662393333393165316563346636636135663133613062333836313561333963
39663733393738336336626438323365366566333331373433326539653565616230643936383737
38356434323433326432316265396661323964653039393164663533653731626162376134616261
39613666393764636331353764306531396339373032636531353165316437616464653237356536
66396661306235333732326136306439316362363063313837383663316361313731303634383331
30626239633235623164396666396533613734613962653030343334343832323664353431393636
38623838306239326537383765643036643830303066616232313935376635346237366434396162
66303932656265316463363432623037383462333638376430616562313238393762616263663138
63326239623666326636396361353764386363613364643935666339336565393830613435373231
64383265666661633664383031646530653539323037613837356638643335653235323135323361
37333731316234646135303566393439363338323264386635336432623862353661313962663965
35333631336233366364633537396234656430373832326334653030363635626439646532643032
30636666383865313737353962326665383936613434353830636561323439373537613538393836
31353164613631386665353762343938383766323739363363633634363433623039376564346333
64323939356238323462346562616335383437326233363838383930396238343261633863393232
39346165656662626631376362623663343164376634363532376363623737613962323434313339
3133306237396463313938383035643034616133336662636234

View File

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

View File

@@ -1,15 +1,12 @@
- hosts: jade - hosts: jade
roles: roles:
- role: caddy - role: traefik
tags: caddy_deploy tags: traefik_deploy
- role: gitea-runner vars:
tags: gitea-runner_deploy server: "jade"
tasks: tasks:
- name: Generate Caddyfile
import_tasks: roles/caddy/tasks/create.yml
tags: caddyfile_deploy
- name: Deploy Glance - name: Deploy Glance
import_tasks: tasks/glance.yml import_tasks: tasks/glance.yml
tags: glance_deploy tags: glance_deploy
@@ -31,9 +28,6 @@
- name: Deploy PocketID - name: Deploy PocketID
import_tasks: tasks/pocketid.yml import_tasks: tasks/pocketid.yml
tags: pocketid_deploy tags: pocketid_deploy
- name: Deploy Ntfy
import_tasks: tasks/ntfy.yml
tags: ntfy_deploy
- name: Deploy NZBGet - name: Deploy NZBGet
import_tasks: tasks/nzbget.yml import_tasks: tasks/nzbget.yml
tags: nzbget_deploy tags: nzbget_deploy
@@ -52,9 +46,9 @@
- name: Deploy Romm - name: Deploy Romm
import_tasks: tasks/romm.yml import_tasks: tasks/romm.yml
tags: romm_deploy tags: romm_deploy
- name: Deploy Nextcloud - name: Deploy Owncloud
import_tasks: tasks/nextcloud.yml import_tasks: tasks/owncloud.yml
tags: nextcloud_deploy tags: owncloud_deploy
- name: Deploy Excalidraw - name: Deploy Excalidraw
import_tasks: tasks/excalidraw.yml import_tasks: tasks/excalidraw.yml
tags: excalidraw_deploy tags: excalidraw_deploy
@@ -64,41 +58,42 @@
- name: Deploy Immich - name: Deploy Immich
import_tasks: tasks/immich.yml import_tasks: tasks/immich.yml
tags: immich_deploy 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 Syncthing
import_tasks: tasks/syncthing.yml
tags: syncthing_deploy
- name: Deploy Drop - name: Deploy Drop
import_tasks: tasks/drop.yml import_tasks: tasks/drop.yml
tags: drop_deploy tags: drop_deploy
- name: Deploy Home Assistant
import_tasks: tasks/home-assistant.yml
tags: home-assistant_deploy
- name: Deploy Gluetun - name: Deploy Gluetun
import_tasks: tasks/gluetun.yml import_tasks: tasks/gluetun.yml
tags: gluetun_deploy tags: gluetun_deploy
- name: Deploy QBittorrent - name: Deploy QBittorrent
import_tasks: tasks/qbittorrent.yml import_tasks: tasks/qbittorrent.yml
tags: qbittorrent_deploy tags: qbittorrent_deploy
- name: Deploy Jackett
import_tasks: tasks/jackett.yml
tags: jackett_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 Pterodactyl
import_tasks: tasks/pterodactyl.yml
tags: pterodactyl_deploy
- name: Deploy Termix
import_tasks: tasks/termix.yml
tags: termix_deploy
- hosts: jackson - hosts: jackson
roles: roles:
- role: caddy - role: traefik
tags: caddy_deploy tags: traefik_deploy
vars:
server: "jackson"
- role: fivem
tags: fivem_deploy
tasks: tasks:
- name: Generate Caddyfile
import_tasks: roles/caddy/tasks/create.yml
tags: caddyfile_deploy
- name: Deploy Gitea - name: Deploy Gitea
import_tasks: tasks/gitea.yml import_tasks: tasks/gitea.yml
tags: gitea_deploy tags: gitea_deploy
@@ -111,6 +106,31 @@
- name: Deploy Plausible - name: Deploy Plausible
import_tasks: tasks/plausible.yml import_tasks: tasks/plausible.yml
tags: plausible_deploy tags: plausible_deploy
- name: Deploy Nextcloud - name: Deploy Owncloud
import_tasks: tasks/nextcloud.yml import_tasks: tasks/owncloud.yml
tags: nextcloud_deploy tags: owncloud_deploy
- name: Deploy Wings
import_tasks: tasks/wings.yml
tags: wings_deploy
- hosts: nas
roles:
- role: traefik
tags: traefik_deploy
vars:
server: "nas"
tasks:
- name: Deploy Plex
import_tasks: tasks/plex.yml
tags: plex_deploy
- name: Deploy Frigate
import_tasks: tasks/frigate.yml
tags: frigate_deploy
- name: Deploy Ersatz
import_tasks: tasks/ersatztv.yml
tags: ersatztv_deploy
- name: Deploy Wings
import_tasks: tasks/wings.yml
tags: wings_deploy

View File

@@ -1,6 +1,7 @@
# Homelab IaC # Homelab IaC
This repository hosts my homelab infrastructure setup, built using Ansible & Gitea Workflows. 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 ## Getting started
@@ -10,4 +11,30 @@ You'll need to install Ansible Playbook, either through APT or another avenue.
sudo apt install ansible-core 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,49 @@
---
- name: Create folder structure
file:
path: "{{ item }}"
state: directory
with_items: "{{ directories }}"
when: directories is defined
- name: Clone repository
git:
repo: "{{ build.git.repo }}"
dest: "{{ build.git.dest }}"
when: build is defined
- name: Build Docker Image
docker_image:
name: "{{ image.name }}"
tag: "{{ image.tag }}"
build:
nocache: true
path: "{{ build.git.dest }}"
dockerfile: Dockerfile
source: build
force_source: true
state: present
when: build is defined
- name: Pull latest Docker image
docker_image:
name: "{{ image.name }}"
tag: "{{ image.tag }}"
source: pull
- name: Create Docker Network
docker_network:
name: "{{ network_name }}"
when: network_name is defined
- name: Create Docker Container
docker_container:
name: "{{ name }}"
image: "{{ image.name }}:{{ image.tag }}"
command: "{{ command | default(omit) }}"
recreate: true
restart_policy: unless-stopped
networks: "{{ networks }}"
volumes: "{{ volumes | default(omit) }}"
env: "{{ env | default(omit) }}"
labels: "{{ labels | default(omit) }}"

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

@@ -0,0 +1,56 @@
---
- name: Create folder structure
file:
path: "{{ item }}"
state: directory
with_items:
- "{{ data_dir }}/traefik"
- "{{ data_dir }}/traefik/data"
- "{{ data_dir }}/traefik/config"
- name: Pull latest Traefik Docker Image
docker_image:
name: traefik
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:
- "80:80"
- "443:443"
- "8080:8080"
env:
CF_API_EMAIL: "{{ TRAEFIK_CF_API_EMAIL }}"
CF_DNS_API_TOKEN: "{{ TRAEFIK_CF_API_KEY }}"
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- "{{ data_dir }}/traefik/data:/data"
- "{{ data_dir }}/traefik/traefik.yml:/traefik.yml"
- "{{ data_dir }}/traefik/dynamic.yml:/dynamic.yml"
networks:
- name: "{{ docker_network_name }}"

View File

@@ -0,0 +1,32 @@
api:
dashboard: true
insecure: true
debug: false
entryPoints:
web:
address: ":80"
http:
redirections:
entryPoint:
to: websecure
scheme: https
webSecure:
address: ":443"
serversTransport:
insecureSkipVerify: true
providers:
docker:
exposedByDefault: false
network: homelab
file:
filename: /dynamic.yml
watch: true
certificatesResolvers:
letsencrypt:
acme:
email: {{ TRAEFIK_CF_API_EMAIL }}
storage: /data/acme.json
caServer: https://acme-v02.api.letsencrypt.org/directory
dnsChallenge:
provider: cloudflare
delayBeforeCheck: 10

View File

@@ -0,0 +1,77 @@
http:
middlewares:
tinyauth:
forwardauth:
address: http://tinyauth:3000/api/auth/traefik
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
middlewares: tinyauth
entryPoints:
- webSecure
tls:
certResolver: letsencrypt
iptv:
rule: "Host(`iptv.fntz.net`)"
service: iptv
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://172.16.0.29:5000/"
iptv:
loadBalancer:
servers:
- url: "http://nas:8409/"

View File

@@ -0,0 +1,18 @@
http:
middlewares:
landiteRedirect:
redirectRegex:
regex: ".*"
replacement: "https://alexav.gg/?ref=landite"
permanent: true
routers:
landite:
rule: "Host(`landite.games`)"
middlewares:
- landiteRedirect
service: noop@internal
entryPoints:
- webSecure
tls:
certResolver: letsencrypt

View File

@@ -1,88 +1,120 @@
import re
import sys import sys
import os
import subprocess import subprocess
bracket_regex = r'\[([^\]]*)\]'
quote_regex = r'"([^"]*)"'
def git_diff(): def git_diff():
args = sys.argv args = sys.argv
res = subprocess.run(f"git diff --name-only {args[1]} {args[2]}", capture_output=True, shell=True, text=True) 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]
def construct_ansible_command(tag = None): def construct_command(tag = None, host = None):
command = "ANSIBLE_CONFIG=ansible.cfg /usr/bin/ansible-playbook main.yml --vault-password-file ~/.vault_pass.txt" 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: if tag:
command += f" --tags {tag}" command += f" --tags {tag}_deploy"
return command return command
def run_deployment(tag = None): def deploy(tag = None, host = None):
command = construct_command(tag, host)
if tag: if tag:
command = construct_ansible_command(tag=tag) print(f"Deploying {tag}...\n")
else:
print(f"Deploying {host}...\n")
res = subprocess.run(command, shell=True, stdout=subprocess.DEVNULL)
print(f"Running deployment for {tag}..") return res.returncode == 0
res = subprocess.run(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
lines = res.stdout.decode(encoding='utf-8').split("\n")
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)
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
def main(): def main():
dir_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), '../')
diff = git_diff() diff = git_diff()
# containers that need special treatment
removed_containers = []
vpn_containers = [ vpn_containers = [
"tasks/qbittorrent.yml" "tasks/qbittorrent.yml",
"tasks/jackett.yml"
]
managed_roles = [
"roles/fivem",
"roles/gitea-runner",
"roles/traefik"
] ]
print("Reloading Caddyfile..") # special actions
subprocess.run(construct_ansible_command(tag="caddyfile_deploy"), shell=True, stdout=subprocess.PIPE)
success = True
deployed = 0
# auto-heal any vpn-dependent containers
if "tasks/gluetun.yml" in diff: if "tasks/gluetun.yml" in diff:
print("[MAIN] Detected Gluetun in diff, recreating dependent containers..")
for container in vpn_containers: for container in vpn_containers:
if container not in diff: if container not in diff:
print(f"Adding {container} to restart list as Gluetun is present..")
diff.append(container) diff.append(container)
# clean up the diff
new_diff = []
for file in diff: for file in diff:
if "tasks" in file: task_name = f"{file.split("/")[0]}/{file.split("/")[1]}"
task_name = file.split("/")[1].split(".")[0] + "_deploy"
state = run_deployment(tag=task_name)
if not state: # i'm not proud of this either
success = False if not os.path.exists(os.path.join(dir_path, file)):
break if "roles" in file and not os.path.exists(os.path.join(dir_path, task_name)) and task_name in managed_roles:
else: print(f"[MAIN] '{task_name}' role removed, marking for cleanup..")
deployed += 1 removed_containers.append(task_name)
elif "tasks" in task_name:
print(f"[MAIN] '{task_name}' non-existent, marking for cleanup..")
removed_containers.append(task_name)
elif "roles" in file:
if task_name in managed_roles:
if task_name not in new_diff:
new_diff.append(task_name)
elif "tasks" in file:
new_diff.append(file.split(".")[0])
else:
new_diff.append(file)
if success and deployed > 0: deployed = []
failed = []
for task in new_diff:
deployment = deploy(tag=task)
if not deployment:
failed.append(task)
else:
deployed.append(task)
for task in removed_containers:
print(f"[MAIN] Attempting to remove containers related to '{task}'...")
task_name = task.split("/")[1].split(".")[0]
containers = subprocess.Popen(f"docker container list | grep {task_name}_", shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
for line in containers.stdout:
docker_container_id = line.rstrip().decode('utf8').split(" ")[0]
if docker_container_id and docker_container_id.strip() != "":
print(f"[MAIN] Found Docker container {docker_container_id} related to {task}, removing..")
# clean up containers & dangling images
subprocess.run(f"/usr/bin/docker container stop {docker_container_id}", shell=True, stdout=subprocess.DEVNULL)
subprocess.run(f"/usr/bin/docker container rm {docker_container_id}", shell=True, stdout=subprocess.DEVNULL)
subprocess.run("/usr/bin/docker image prune -f", shell=True, stdout=subprocess.DEVNULL)
subprocess.run("/usr/bin/docker container prune -f", shell=True, stdout=subprocess.DEVNULL)
if len(failed) <= 0 and len(deployed) > 0:
print("\n---------------------") print("\n---------------------")
print(" Deployment succeeded!") print(" Deployment succeeded!")
print(f" Tasks: {", ".join(diff)}") print(f" All tasks: {", ".join(deployed)}")
print("---------------------\n") print("---------------------\n")
elif deployed == 0: sys.exit(0)
print("Successful, no containers required deployment") 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("[MAIN] Successfully executed, no tasks required execution")
sys.exit(0)
if __name__ == "__main__": if __name__ == "__main__":
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!")

52
scripts/run_updates.py Normal file
View File

@@ -0,0 +1,52 @@
import requests
import subprocess
import os
import yaml
def search_for_image(image_name):
tasks_folder = os.path.realpath(os.path.join('./', 'tasks'))
if "library/" in image_name:
image_name = image_name.replace("library/", "")
for task in os.listdir(tasks_folder):
with open(os.path.join(tasks_folder, task), 'r') as file:
data = yaml.safe_load(file)
for key in data:
if "docker_image" in key:
if image_name in key["docker_image"]["name"]:
return f"{task.split(".")[0]}_deploy"
def main():
update_list = requests.get("https://cup.fntz.net/api/v3/json")
update_list.raise_for_status()
update_list = update_list.json()
deployable_tags = []
with open("main.yml", 'r') as file:
data = yaml.safe_load(file)
for host in data:
for task in host['tasks']:
deployable_tags.append(task['tags'])
if len(update_list["images"]) <= 0:
print("No images to update!")
else:
print(f"Updating {update_list["metrics"]["updates_available"]} image(s)..\n")
for image in update_list["images"]:
if image['result']['has_update']:
if "remote_digest" in image["result"]["info"]:
image_name = image["parts"]["repository"]
ansible_tag = search_for_image(image_name)
if ansible_tag and ansible_tag in deployable_tags:
print(f"Updating '{image_name}' ({ansible_tag})..")
subprocess.run(f'docker image pull {image_name}', shell=True)
subprocess.run(f'ANSIBLE_CONFIG=ansible.cfg ansible-playbook main.yml --tags {ansible_tag} --vault-password-file=~/.vault_pass.txt', shell=True)
print("\nAll images updated, refreshing Cup")
requests.get("https://cup.fntz.net/api/v3/refresh")
if __name__ == "__main__":
main()

View File

@@ -1,64 +1,52 @@
--- ---
- name: "Create file structure" - name: Deploy API Database
file: include_role:
path: "{{ item }}" name: docker
state: directory vars:
with_items:
- "{{ data_dir }}/api"
- "{{ data_dir }}/api/db"
- "{{ data_dir }}/api/app"
- name: "Clone latest API"
git:
repo: git@git.alexav.gg:alex/api.git
dest: "{{ data_dir }}/api/app"
- name: "Build API Docker Image"
docker_image:
name: api
tag: "latest"
build:
path: "{{ data_dir }}/api/app"
dockerfile: Dockerfile
source: build
state: present
- name: Create API Network
docker_network:
name: api
- name: Deploy Redis Container
docker_container:
name: api_redis
image: redis:latest
restart_policy: unless-stopped
recreate: true
networks:
- name: api
- name: Deploy Database Container
docker_container:
name: api_postgres name: api_postgres
image: postgres:latest network_name: api
restart_policy: unless-stopped directories:
recreate: true - "{{ data_dir }}/api/db"
image:
name: postgres
tag: latest
networks: networks:
- name: api - name: api
volumes: volumes:
- "{{ data_dir }}/api/db:/var/lib/postgresql/data" - "{{ data_dir }}/api/db:/var/lib/postgresql/data"
env: env:
POSTGRES_USER: "api"
POSTGRES_PASSWORD: "{{ API_POSTGRES_PASSWORD }}" POSTGRES_PASSWORD: "{{ API_POSTGRES_PASSWORD }}"
PGDATA: "/var/lib/postgresql/data/pgdata" PGDATA: "/var/lib/postgresql/data/pgdata"
- name: Deploy API Container - name: Deploy API Redis
docker_container: include_role:
name: docker
vars:
name: api_redis
network_name: api
image:
name: redis
tag: latest
networks:
- name: api
- name: Deploy API
include_role:
name: docker
vars:
name: api name: api
image: api:latest network_name: api
recreate: true
restart_policy: unless-stopped
networks: networks:
- name: api - name: api
- name: "{{ docker_network_name }}" - name: "{{ docker_network_name }}"
build:
git:
repo: git@git.alexav.gg:alex/api.git
dest: "{{ data_dir }}/api/app"
image:
name: api
tag: latest
env: env:
NODE_ENV: "production" NODE_ENV: "production"
VERSION: "v4" VERSION: "v4"
@@ -70,3 +58,9 @@
STEAM_API_KEY: "{{ API_STEAM_API_KEY }}" STEAM_API_KEY: "{{ API_STEAM_API_KEY }}"
CONTACT_WEBHOOK: "{{ API_CONTACT_WEBHOOK }}" CONTACT_WEBHOOK: "{{ API_CONTACT_WEBHOOK }}"
JWT_KEY: "{{ API_JWT_KEY }}" 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

@@ -1,17 +1,14 @@
--- ---
- name: Create folder structure - name: Deploy Code Server
file: include_role:
path: "{{ item }}" name: docker
state: directory vars:
with_items: name: "codeserver"
- "{{ data_dir }}/code-server" directories:
- "{{ data_dir }}/code-server"
- name: Create Code Server Docker Container image:
docker_container: name: lscr.io/linuxserver/code-server
name: codeserver tag: latest
image: lscr.io/linuxserver/code-server:latest
restart_policy: unless-stopped
recreate: true
networks: networks:
- name: homelab - name: homelab
volumes: volumes:
@@ -23,3 +20,10 @@
TZ: "{{ TZ }}" TZ: "{{ TZ }}"
PUID: "{{ PUID }}" PUID: "{{ PUID }}"
PGID: "{{ PGID }}" PGID: "{{ PGID }}"
labels:
traefik.enable: "true"
traefik.http.routers.code.rule: Host(`code.fntz.net`)
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,12 +1,20 @@
--- ---
- name: Create Cup Docker Container - name: Deploy Cup
docker_container: include_role:
name: Cup name: docker
image: ghcr.io/sergi0g/cup vars:
name: cup
command: serve command: serve
restart_policy: unless-stopped
recreate: true
networks: networks:
- name: homelab - name: homelab
volumes: volumes:
- "/var/run/docker.sock:/var/run/docker.sock:ro" - "/var/run/docker.sock:/var/run/docker.sock:ro"
labels:
traefik.enable: "true"
traefik.http.routers.cup.rule: Host(`cup.fntz.net`)
traefik.http.routers.cup.entrypoints: webSecure
traefik.http.routers.cup.tls.certresolver: letsencrypt
traefik.http.services.cup.loadbalancer.server.port: "8000"
image:
name: ghcr.io/sergi0g/cup
tag: latest

View File

@@ -1,11 +1,19 @@
--- ---
- name: Create Dashdot Docker Container - name: Deploy Dashdot
docker_container: include_role:
name: docker
vars:
name: dashdot name: dashdot
image: mauricenino/dashdot image:
restart_policy: unless-stopped name: mauricenino/dashdot
recreate: true tag: latest
networks: networks:
- name: homelab - name: homelab
volumes: volumes:
- "/:/mnt/host:ro" - "/:/mnt/host:ro"
labels:
traefik.enable: "true"
traefik.http.routers.dash.rule: Host(`stats.fntz.net`)
traefik.http.routers.dash.entrypoints: webSecure
traefik.http.routers.dash.tls.certresolver: letsencrypt
traefik.http.services.dash.loadbalancer.server.port: "3001"

View File

@@ -1,14 +1,23 @@
--- ---
- name: Create Dozzle Docker Container - name: Deploy Dozzle
docker_container: include_role:
name: docker
vars:
name: dozzle name: dozzle
image: amir20/dozzle:latest
restart_policy: unless-stopped
recreate: true
networks: networks:
- name: homelab - name: homelab
image:
name: amir20/dozzle
tag: latest
volumes: volumes:
- "/var/run/docker.sock:/var/run/docker.sock" - "/var/run/docker.sock:/var/run/docker.sock"
env: env:
DOZZLE_ENABLE_ACTIONS: "{{ DOZZLE_ACTIONS }}" DOZZLE_ENABLE_ACTIONS: "{{ DOZZLE_ACTIONS }}"
DOZZLE_ENABLE_SHELL: "{{ DOZZLE_SHELL }}" DOZZLE_ENABLE_SHELL: "{{ DOZZLE_SHELL }}"
labels:
traefik.enable: "true"
traefik.http.routers.dz.rule: Host(`logs.fntz.net`)
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: docker_network:
name: drop 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 - name: Create Drop DB Container
docker_container: docker_container:
name: drop_postgres name: drop_postgres
image: postgres:14-alpine image: postgres:14-alpine
recreate: true recreate: true
restart_policy: unless-stopped
networks: networks:
- name: drop - name: drop
healthcheck: healthcheck:
@@ -35,8 +42,9 @@
- name: Create Drop Container - name: Create Drop Container
docker_container: docker_container:
name: drop name: drop
image: ghcr.io/drop-oss/drop:v0.3.0 image: ghcr.io/drop-oss/drop:latest
recreate: true recreate: true
restart_policy: unless-stopped
networks: networks:
- name: homelab - name: homelab
- name: drop - name: drop
@@ -46,3 +54,10 @@
env: env:
DATABASE_URL: "postgres://drop:drop@drop_postgres:5432/drop" DATABASE_URL: "postgres://drop:drop@drop_postgres:5432/drop"
GIANT_BOMB_API_KEY: "{{ DROP_GIANT_BOMB_API_KEY }}" 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`)
traefik.http.routers.drop.entrypoints: webSecure
traefik.http.routers.drop.tls.certresolver: letsencrypt
traefik.http.services.drop.loadbalancer.server.port: "3000"

31
tasks/ersatztv.yml Normal file
View File

@@ -0,0 +1,31 @@
---
- name: Create folder structure
file:
path: "{{ item }}"
state: directory
with_items:
- "{{ data_dir }}/ersatz"
- name: Pull latest Docker Image
docker_image:
name: ghcr.io/ersatztv/ersatztv
tag: latest
source: pull
- name: Create Docker Container
docker_container:
name: ersatztv
image: ghcr.io/ersatztv/ersatztv:latest
recreate: true
restart_policy: unless-stopped
devices:
- /dev/dri/renderD128:/dev/dri/renderD128
mounts:
- type: tmpfs
target: /transcode
tmpfs_size: 5G
volumes:
- "{{ data_dir }}/ersatz:/config"
- "{{ media_path }}:{{ media_path }}:ro"
published_ports:
- "8409:8409"

View File

@@ -1,9 +1,17 @@
--- ---
- name: Create Excalidraw Docker Container - name: Deploy Excalidraw
docker_container: include_role:
name: docker
vars:
name: excalidraw name: excalidraw
image: excalidraw/excalidraw image:
restart_policy: unless-stopped name: excalidraw/excalidraw
recreate: true tag: latest
networks: networks:
- name: homelab - name: homelab
labels:
traefik.enable: "true"
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: "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: with_items:
- "{{ data_dir }}/gitea" - "{{ 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 - name: Create Gitea Docker Container
docker_container: docker_container:
name: gitea name: gitea
@@ -22,3 +28,9 @@
env: env:
USER_UID: "1000" USER_UID: "1000"
USER_GID: "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

@@ -1,19 +1,16 @@
--- ---
- name: Create folder structure - name: Deploy Glance
file: include_role:
path: "{{ item }}" name: docker
state: directory vars:
with_items:
- "{{ data_dir }}/glance"
- "{{ data_dir }}/glance/config"
- "{{ data_dir }}/glance/assets"
- name: Create Glance Docker Container
docker_container:
name: glance name: glance
image: glanceapp/glance image:
restart_policy: unless-stopped name: glanceapp/glance
recreate: true tag: latest
directories:
- "{{ data_dir }}/glance"
- "{{ data_dir }}/glance/config"
- "{{ data_dir }}/glance/assets"
networks: networks:
- name: homelab - name: homelab
env: env:
@@ -25,3 +22,9 @@
- "{{ data_dir }}/glance/config:/app/config" - "{{ data_dir }}/glance/config:/app/config"
- "{{ data_dir }}/glance/assets:/app/assets" - "{{ data_dir }}/glance/assets:/app/assets"
- "/var/run/docker.sock:/var/run/docker.sock:ro" - "/var/run/docker.sock:/var/run/docker.sock:ro"
labels:
traefik.enable: "true"
traefik.http.routers.glance.rule: Host(`fntz.net`)
traefik.http.routers.glance.entrypoints: webSecure
traefik.http.routers.glance.tls.certresolver: letsencrypt
traefik.http.services.glance.loadbalancer.server.port: "8080"

View File

@@ -16,6 +16,7 @@
docker_container: docker_container:
name: gluetun name: gluetun
image: qmcgaw/gluetun image: qmcgaw/gluetun
recreate: true
capabilities: capabilities:
- NET_ADMIN - NET_ADMIN
devices: devices:
@@ -27,7 +28,7 @@
published_ports: published_ports:
- 8888:8888/tcp - 8888:8888/tcp
- 8388:8388/tcp - 8388:8388/tcp
- 8388:8388/ud - 8388:8388/udp
env: env:
VPN_SERVICE_PROVIDER: "{{ GLUETUN_VPN_SERVICE_PROVIDER }}" VPN_SERVICE_PROVIDER: "{{ GLUETUN_VPN_SERVICE_PROVIDER }}"
VPN_TYPE: "wireguard" VPN_TYPE: "wireguard"
@@ -36,3 +37,17 @@
SERVER_COUNTRIES: "{{ GLUETUN_SERVER_COUNTRIES }}" SERVER_COUNTRIES: "{{ GLUETUN_SERVER_COUNTRIES }}"
SERVER_CITIES: "{{ GLUETUN_SERVER_CITIES }}" SERVER_CITIES: "{{ GLUETUN_SERVER_CITIES }}"
SERVER_HOSTNAMES: "{{ GLUETUN_SERVER_HOSTNAMES }}" 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"

View File

@@ -23,3 +23,9 @@
- "{{ data_dir }}/homeassistant:/config" - "{{ data_dir }}/homeassistant:/config"
- "/etc/localtime:/etc/localtime" - "/etc/localtime:/etc/localtime"
- "/run/dbus:/run/dbus:ro" - "/run/dbus:/run/dbus:ro"
labels:
traefik.enable: "true"
traefik.http.routers.ha.rule: Host(`ha.fntz.net`)
traefik.http.routers.ha.entrypoints: webSecure
traefik.http.routers.ha.tls.certresolver: letsencrypt
traefik.http.services.ha.loadbalancer.server.url: "http://{{ TRAEFIK_HOST_IP }}:8123"

View File

@@ -6,6 +6,12 @@
with_items: with_items:
- "{{ data_dir }}/homebridge" - "{{ data_dir }}/homebridge"
- name: Pull latest Homebridge Docker Image
docker_image:
name: homebridge/homebridge
tag: latest
source: pull
- name: Create Homebridge Docker Container - name: Create Homebridge Docker Container
docker_container: docker_container:
name: homebridge name: homebridge
@@ -15,3 +21,10 @@
recreate: true recreate: true
volumes: volumes:
- "{{ data_dir }}/homebridge:/homebridge" - "{{ data_dir }}/homebridge:/homebridge"
labels:
traefik.enable: "true"
traefik.http.routers.bridge.rule: Host(`bridge.fntz.net`)
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

@@ -8,10 +8,16 @@
- "{{ data_dir }}/immich/model-cache" - "{{ data_dir }}/immich/model-cache"
- "{{ data_dir }}/immich/db" - "{{ data_dir }}/immich/db"
- name: Pull latest Immich Server Docker Image
docker_image:
name: ghcr.io/immich-app/immich-server
tag: v2.1.0
source: pull
- name: Create Immich Redis Docker Container - name: Create Immich Redis Docker Container
docker_container: docker_container:
name: immich_redis name: immich_redis
image: docker.io/valkey/valkey:8-bookworm@sha256:ff21bc0f8194dc9c105b769aeabf9585fea6a8ed649c0781caeac5cb3c247884 image: docker.io/valkey/valkey:8-bookworm@sha256:fea8b3e67b15729d4bb70589eb03367bab9ad1ee89c876f54327fc7c6e618571
restart_policy: unless-stopped restart_policy: unless-stopped
recreate: true recreate: true
networks: networks:
@@ -20,7 +26,7 @@
- name: Create Immich DB Docker Container - name: Create Immich DB Docker Container
docker_container: docker_container:
name: immich_postgres name: immich_postgres
image: ghcr.io/immich-app/postgres:14-vectorchord0.4.3-pgvectors0.2.0 image: ghcr.io/immich-app/postgres:14-vectorchord0.4.3-pgvectors0.2.0@sha256:bcf63357191b76a916ae5eb93464d65c07511da41e3bf7a8416db519b40b1c23
restart_policy: unless-stopped restart_policy: unless-stopped
recreate: true recreate: true
volumes: volumes:
@@ -33,21 +39,10 @@
networks: networks:
- name: immich - 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 - name: Create Immich Server Docker Container
docker_container: docker_container:
name: immich_server name: immich_server
image: ghcr.io/immich-app/immich-server:release image: ghcr.io/immich-app/immich-server:v2.1.0
restart_policy: unless-stopped restart_policy: unless-stopped
recreate: true recreate: true
networks: networks:
@@ -61,3 +56,10 @@
REDIS_HOSTNAME: "immich_redis" REDIS_HOSTNAME: "immich_redis"
DB_PASSWORD: "{{ IMMICH_DB_PASSWORD }}" DB_PASSWORD: "{{ IMMICH_DB_PASSWORD }}"
DB_USERNAME: "{{ IMMICH_DB_USERNAME }}" DB_USERNAME: "{{ IMMICH_DB_USERNAME }}"
DB_DATABASE_NAME: "{{ IMMICH_DB_DATABASE_NAME }}"
labels:
traefik.enable: "true"
traefik.http.routers.img.rule: Host(`img.fntz.net`)
traefik.http.routers.img.entrypoints: webSecure
traefik.http.routers.img.tls.certresolver: letsencrypt
traefik.http.services.img.loadbalancer.server.port: "2283"

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: with_items:
- "{{ data_dir }}/jellyfin" - "{{ 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 - name: Create Jellyfin Docker Container
docker_container: docker_container:
name: jellyfin name: jellyfin
@@ -25,3 +31,9 @@
PUID: "{{ PUID }}" PUID: "{{ PUID }}"
PGID: "{{ PGID }}" PGID: "{{ PGID }}"
TZ: "{{ TZ }}" TZ: "{{ TZ }}"
labels:
traefik.enable: "true"
traefik.http.routers.jf.rule: Host(`jf.fntz.net`)
traefik.http.routers.jf.entrypoints: webSecure
traefik.http.routers.jf.tls.certresolver: letsencrypt
traefik.http.services.jf.loadbalancer.server.port: "8096"

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,74 +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 }}"
- 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: with_items:
- "{{ data_dir }}/navidrome" - "{{ data_dir }}/navidrome"
- name: Pull latest Navidrome Docker Image
docker_image:
name: deluan/navidrome
tag: latest
source: pull
- name: Create Navidrome Docker Container - name: Create Navidrome Docker Container
docker_container: docker_container:
name: navidrome name: navidrome
@@ -17,3 +23,9 @@
volumes: volumes:
- "{{ data_dir }}/navidrome:/data" - "{{ data_dir }}/navidrome:/data"
- "{{ NAVIDROME_MUSIC_PATH }}:/music:ro" - "{{ NAVIDROME_MUSIC_PATH }}:/music:ro"
labels:
traefik.enable: "true"
traefik.http.routers.music.rule: Host(`music.fntz.net`)
traefik.http.routers.music.entrypoints: webSecure
traefik.http.routers.music.tls.certresolver: letsencrypt
traefik.http.services.music.loadbalancer.server.port: "4533"

View File

@@ -12,10 +12,16 @@
docker_network: docker_network:
name: nextcloud name: nextcloud
- name: Pull latest Nextcloud Docker Image
docker_image:
name: nextcloud
tag: latest
source: pull
- name: Create Nextcloud DB Docker Container - name: Create Nextcloud DB Docker Container
docker_container: docker_container:
name: nc_postgresql name: nc_postgresql
image: postgres:16-alpine image: postgres:17-alpine
restart_policy: unless-stopped restart_policy: unless-stopped
recreate: true recreate: true
networks: networks:
@@ -40,3 +46,9 @@
- name: nextcloud - name: nextcloud
volumes: volumes:
- "{{ data_dir }}/nextcloud/data:/var/www/html" - "{{ 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"

View File

@@ -1,25 +0,0 @@
---
- name: Create folder structure
file:
path: "{{ item }}"
state: directory
with_items:
- "{{ data_dir }}/ntfy"
- "{{ data_dir }}/ntfy/cache"
- "{{ data_dir }}/ntfy/data"
- name: Create Ntfy Docker Container
docker_container:
name: ntfy
image: binwiederhier/ntfy
command: serve
restart_policy: unless-stopped
recreate: true
networks:
- name: homelab
volumes:
- "{{ data_dir }}/ntfy/cache:/var/cache/ntfy"
- "{{ data_dir }}/ntfy/data:/etc/ntfy"
env:
UPSTREAM_BASE_URL: "{{ NTFY_UPSTREAM_BASE_URL }}"
BASE_URL: "{{ NTFY_BASE_URL }}"

View File

@@ -6,6 +6,12 @@
with_items: with_items:
- "{{ data_dir }}/nzbget" - "{{ 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 - name: Create NZBGet Docker Container
docker_container: docker_container:
name: nzbget name: nzbget
@@ -23,3 +29,10 @@
TZ: "{{ TZ }}" TZ: "{{ TZ }}"
PUID: "{{ PUID }}" PUID: "{{ PUID }}"
PGID: "{{ PGID }}" PGID: "{{ PGID }}"
labels:
traefik.enable: "true"
traefik.http.routers.nzb.rule: Host(`nzb.fntz.net`)
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: with_items:
- "{{ data_dir }}/pihole" - "{{ data_dir }}/pihole"
- name: Pull latest PiHole Docker Image
docker_image:
name: pihole/pihole
tag: latest
source: pull
- name: Create PiHole Docker Container - name: Create PiHole Docker Container
docker_container: docker_container:
name: pihole name: pihole
@@ -15,10 +21,16 @@
networks: networks:
- name: homelab - name: homelab
published_ports: published_ports:
- "{{ CADDY_HOST_IP }}:53:53/tcp" - "{{ TRAEFIK_HOST_IP }}:53:53/tcp"
- "{{ CADDY_HOST_IP }}:53:53/udp" - "{{ TRAEFIK_HOST_IP }}:53:53/udp"
volumes: volumes:
- "{{ data_dir }}/pihole:/etc/pihole" - "{{ data_dir }}/pihole:/etc/pihole"
env: env:
FTLCONF_webserver_api_password: "{{ PIHOLE_FTLCONF_WEBSERVER_API_PASSWORD }}" FTLCONF_webserver_api_password: "{{ PIHOLE_FTLCONF_WEBSERVER_API_PASSWORD }}"
TZ: "{{ TZ }}" TZ: "{{ TZ }}"
labels:
traefik.enable: "true"
traefik.http.routers.pihole.rule: Host(`pihole.fntz.net`)
traefik.http.routers.pihole.entrypoints: webSecure
traefik.http.routers.pihole.tls.certresolver: letsencrypt
traefik.http.services.pihole.loadbalancer.server.port: "80"

View File

@@ -16,10 +16,16 @@
docker_network: docker_network:
name: metrics 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 - name: Deploy Plausible Database Docker Container
docker_container: docker_container:
name: metrics_postgres name: metrics_postgres
image: postgres:16-alpine image: postgres:17-alpine
restart_policy: unless-stopped restart_policy: unless-stopped
recreate: true recreate: true
volumes: volumes:
@@ -76,3 +82,9 @@
CLICKHOUSE_DATABASE_URL: "http://metrics_clickhouse:8123/plausible_events_db" CLICKHOUSE_DATABASE_URL: "http://metrics_clickhouse:8123/plausible_events_db"
BASE_URL: "{{ PLAUSIBLE_BASE_URL }}" BASE_URL: "{{ PLAUSIBLE_BASE_URL }}"
SECRET_KEY_BASE: "{{ PLAUSIBLE_SECRET_KEY_BASE }}" 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: with_items:
- "{{ data_dir }}/pocketid" - "{{ 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 - name: Create PocketID Docker Container
docker_container: docker_container:
name: pocketid name: pocketid
@@ -21,3 +27,9 @@
TRUST_PROXY: "{{ POCKETID_TRUST_PROXY }}" TRUST_PROXY: "{{ POCKETID_TRUST_PROXY }}"
PUID: "{{ PUID }}" PUID: "{{ PUID }}"
PGID: "{{ PGID }}" PGID: "{{ PGID }}"
labels:
traefik.enable: "true"
traefik.http.routers.oidc.rule: Host(`oidc.fntz.net`)
traefik.http.routers.oidc.entrypoints: webSecure
traefik.http.routers.oidc.tls.certresolver: letsencrypt
traefik.http.services.oidc.loadbalancer.server.port: "1411"

89
tasks/pterodactyl.yml Normal file
View File

@@ -0,0 +1,89 @@
---
- name: Create folder structure
file:
path: "{{ item }}"
state: directory
with_items:
- "{{ data_dir }}/pterodactyl"
- "{{ data_dir }}/pterodactyl/var"
- "{{ data_dir }}/pterodactyl/logs"
- "{{ data_dir }}/pterodactyl/nginx"
- "{{ data_dir }}/pterodactyl/db"
- name: Create Pterodactyl Network
docker_network:
name: pterodactyl
- name: Pull latest MariaDB Docker Image
docker_image:
name: mariadb
tag: "10.5"
source: pull
- name: Pull latest Redis Docker image
docker_image:
name: redis
tag: 7-alpine
source: pull
- name: Pull latest Pterodactyl Docker image
docker_image:
name: ghcr.io/pterodactyl/panel
tag: latest
source: pull
- name: Create Redis Container
docker_container:
name: pterodactyl_redis
image: redis:7-alpine
recreate: true
restart_policy: unless-stopped
networks:
- name: pterodactyl
- name: Create Database Container
docker_container:
name: pterodactyl_db
image: mariadb:10.5
command: --default-authentication-plugin=mysql_native_password
recreate: true
restart_policy: unless-stopped
volumes:
- "{{ data_dir }}/pterodactyl/db:/var/lib/mysql"
networks:
- name: pterodactyl
env:
MYSQL_DATABASE: "panel"
MYSQL_USER: "pterodactyl"
MYSQL_ROOT_PASSWORD: "{{ PTERODACTYL_MYSQL_ROOT_PASSWORD }}"
MYSQL_PASSWORD: "{{ PTERODACTYL_MYSQL_PASSWORD }}"
- name: Create Pterodactyl Docker Container
docker_container:
name: pterodactyl
image: ghcr.io/pterodactyl/panel:latest
recreate: true
restart_policy: unless-stopped
networks:
- name: pterodactyl
- name: homelab
volumes:
- "{{ data_dir }}/pterodactyl/nginx:/etc/nginx/http.d"
- "{{ data_dir }}/pterodactyl/logs:/app/storage/logs"
- "{{ data_dir }}/pterodactyl/var:/app/var"
env:
APP_URL: "{{ PTERODACTYL_APP_URL }}"
APP_ENVIRONMENT_ONLY: "false"
APP_TIMEZONE: "{{ TZ }}"
DB_PASSWORD: "{{ PTERODACTYL_MYSQL_PASSWORD }}"
APP_ENV: "production"
CACHE_DRIVER: "redis"
SESSION_DRIVER: "redis"
QUEUE_DRIVER: "redis"
REDIS_HOST: "pterodactyl_redis"
DB_HOST: "pterodactyl_db"
TRUSTED_PROXIES: "*"
labels:
traefik.enable: "true"
traefik.http.routers.panel.rule: Host(`panel.fntz.net`)
traefik.http.routers.panel.entrypoints: webSecure
traefik.http.routers.panel.tls.certresolver: letsencrypt
traefik.http.services.panel.loadbalancer.server.port: "80"

View File

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

View File

@@ -10,6 +10,12 @@
- "{{ data_dir }}/romm/config" - "{{ data_dir }}/romm/config"
- "{{ data_dir }}/romm/db" - "{{ 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 - name: Create Romm DB Docker Container
docker_container: docker_container:
name: romm-db name: romm-db
@@ -61,3 +67,9 @@
OIDC_CLIENT_SECRET: "{{ ROMM_OIDC_CLIENT_SECRET }}" OIDC_CLIENT_SECRET: "{{ ROMM_OIDC_CLIENT_SECRET }}"
OIDC_REDIRECT_URL: "{{ ROMM_OIDC_REDIRECT_URL }}" OIDC_REDIRECT_URL: "{{ ROMM_OIDC_REDIRECT_URL }}"
SERVER_APPLICATION_URL: "{{ ROMM_SERVER_APPLICATION_URL }}" SERVER_APPLICATION_URL: "{{ ROMM_SERVER_APPLICATION_URL }}"
labels:
traefik.enable: "true"
traefik.http.routers.emu.rule: Host(`emu.fntz.net`)
traefik.http.routers.emu.entrypoints: webSecure
traefik.http.routers.emu.tls.certresolver: letsencrypt
traefik.http.services.emu.loadbalancer.server.port: "8080"

View File

@@ -9,6 +9,22 @@
- "{{ data_dir }}/servarr/radarr_config" - "{{ data_dir }}/servarr/radarr_config"
- "{{ data_dir }}/servarr/lidarr_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 - name: Deploy Radarr Container
docker_container: docker_container:
name: radarr name: radarr
@@ -21,6 +37,16 @@
- "{{ NZBGET_DOWNLOADS_PATH }}:/downloads" - "{{ NZBGET_DOWNLOADS_PATH }}:/downloads"
networks: networks:
- name: homelab - name: homelab
env:
PUID: "{{ PUID }}"
PGID: "{{ PGID }}"
TZ: "{{ TZ }}"
labels:
traefik.enable: "true"
traefik.http.routers.radarr.rule: Host(`radarr.fntz.net`)
traefik.http.routers.radarr.entrypoints: webSecure
traefik.http.routers.radarr.tls.certresolver: letsencrypt
traefik.http.services.radarr.loadbalancer.server.port: "7878"
- name: Deploy Sonarr Container - name: Deploy Sonarr Container
docker_container: docker_container:
@@ -32,8 +58,18 @@
- "{{ data_dir }}/servarr/sonarr_config:/config" - "{{ data_dir }}/servarr/sonarr_config:/config"
- "{{ SERVARR_MEDIA_PATH }}:/data" - "{{ SERVARR_MEDIA_PATH }}:/data"
- "{{ NZBGET_DOWNLOADS_PATH }}:/downloads" - "{{ NZBGET_DOWNLOADS_PATH }}:/downloads"
env:
PUID: "{{ PUID }}"
PGID: "{{ PGID }}"
TZ: "{{ TZ }}"
networks: networks:
- name: homelab - name: homelab
labels:
traefik.enable: "true"
traefik.http.routers.sonarr.rule: Host(`sonarr.fntz.net`)
traefik.http.routers.sonarr.entrypoints: webSecure
traefik.http.routers.sonarr.tls.certresolver: letsencrypt
traefik.http.services.sonarr.loadbalancer.server.port: "8989"
- name: Deploy Lidarr Container - name: Deploy Lidarr Container
docker_container: docker_container:
@@ -41,9 +77,19 @@
image: lscr.io/linuxserver/lidarr:latest image: lscr.io/linuxserver/lidarr:latest
restart_policy: unless-stopped restart_policy: unless-stopped
recreate: true recreate: true
env:
PUID: "{{ PUID }}"
PGID: "{{ PGID }}"
TZ: "{{ TZ }}"
volumes: volumes:
- "{{ data_dir }}/servarr/lidarr_config:/config" - "{{ data_dir }}/servarr/lidarr_config:/config"
- "{{ SERVARR_MEDIA_PATH }}:/media" - "{{ SERVARR_MEDIA_PATH }}:/media"
- "{{ NZBGET_DOWNLOADS_PATH }}:/downloads" - "{{ NZBGET_DOWNLOADS_PATH }}:/downloads"
networks: networks:
- name: homelab - name: homelab
labels:
traefik.enable: "true"
traefik.http.routers.lidarr.rule: Host(`lidarr.fntz.net`)
traefik.http.routers.lidarr.entrypoints: webSecure
traefik.http.routers.lidarr.tls.certresolver: letsencrypt
traefik.http.services.lidarr.loadbalancer.server.port: "8686"

View File

@@ -36,3 +36,9 @@
env: env:
TZ: "{{ TZ }}" TZ: "{{ TZ }}"
TOKEN: "{{ API_ADMIN_KEY }}" 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

@@ -1,22 +0,0 @@
- name: Create folder structure
file:
path: "{{ item }}"
state: directory
with_items:
- "{{ data_dir }}/syncthing"
- name: Deploy Syncthing Docker Container
docker_container:
name: syncthing
image: lscr.io/linuxserver/syncthing:latest
recreate: true
restart_policy: unless-stopped
networks:
- name: homelab
env:
PUID: "{{ PUID }}"
PGID: "{{ PGID }}"
TZ: "{{ TZ }}"
volumes:
- "{{ data_dir }}/syncthing:/config"
- "{{ SYNCTHING_DATA_PATH }}:/data"

View File

@@ -6,6 +6,12 @@
with_items: with_items:
- "{{ data_dir }}/tautulli" - "{{ 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 - name: Create Tautulli Docker Container
docker_container: docker_container:
name: tautulli name: tautulli
@@ -20,3 +26,9 @@
PUID: "{{ PUID }}" PUID: "{{ PUID }}"
PGID: "{{ PGID }}" PGID: "{{ PGID }}"
TZ: "{{ TZ }}" TZ: "{{ TZ }}"
labels:
traefik.enable: "true"
traefik.http.routers.tt.rule: Host(`tt.fntz.net`)
traefik.http.routers.tt.entrypoints: webSecure
traefik.http.routers.tt.tls.certresolver: letsencrypt
traefik.http.services.tt.loadbalancer.server.port: "8181"

32
tasks/termix.yml Normal file
View File

@@ -0,0 +1,32 @@
---
- name: Create folder structure
file:
path: "{{ item }}"
state: directory
with_items:
- "{{ data_dir }}/termix"
- name: Pull latest Termix Docker Image
docker_image:
name: ghcr.io/lukegus/termix
tag: latest
source: pull
- name: Create Termix Docker Container
docker_container:
name: termix
image: ghcr.io/lukegus/termix:latest
restart_policy: unless-stopped
recreate: true
networks:
- name: homelab
volumes:
- "{{ data_dir }}/termix:/app/data"
env:
PORT: "8080"
labels:
traefik.enable: "true"
traefik.http.routers.termix.rule: Host(`ssh.fntz.net`)
traefik.http.routers.termix.entrypoints: webSecure
traefik.http.routers.termix.tls.certresolver: letsencrypt
traefik.http.services.termix.loadbalancer.server.port: "8080"

View File

@@ -1,8 +1,14 @@
--- ---
- name: Pull latest Tinyauth Docker Image
docker_image:
name: ghcr.io/steveiliop56/tinyauth
tag: v4
source: pull
- name: Create Tinyauth Docker Container - name: Create Tinyauth Docker Container
docker_container: docker_container:
name: tinyauth name: tinyauth
image: ghcr.io/steveiliop56/tinyauth:v3 image: ghcr.io/steveiliop56/tinyauth:v4
restart_policy: unless-stopped restart_policy: unless-stopped
recreate: true recreate: true
networks: networks:
@@ -11,13 +17,22 @@
USERS: "{{ TINYAUTH_USERS }}" USERS: "{{ TINYAUTH_USERS }}"
SECRET: "{{ TINYAUTH_SECRET }}" SECRET: "{{ TINYAUTH_SECRET }}"
APP_URL: "{{ TINYAUTH_APP_URL }}" APP_URL: "{{ TINYAUTH_APP_URL }}"
GENERIC_CLIENT_ID: "{{ TINYAUTH_GENERIC_CLIENT_ID }}" PROVIDERS_POCKETID_CLIENT_ID: "{{ TINYAUTH_GENERIC_CLIENT_ID }}"
GENERIC_CLIENT_SECRET: "{{ TINYAUTH_GENERIC_CLIENT_SECRET }}" PROVIDERS_POCKETID_CLIENT_SECRET: "{{ TINYAUTH_GENERIC_CLIENT_SECRET }}"
GENERIC_AUTH_URL: "{{ TINYAUTH_GENERIC_AUTH_URL }}" PROVIDERS_POCKETID_AUTH_URL: "{{ TINYAUTH_GENERIC_AUTH_URL }}"
GENERIC_TOKEN_URL: "{{ TINYAUTH_GENERIC_TOKEN_URL }}" PROVIDERS_POCKETID_TOKEN_URL: "{{ TINYAUTH_GENERIC_TOKEN_URL }}"
GENERIC_USER_URL: "{{ TINYAUTH_GENERIC_USER_URL }}" PROVIDERS_POCKETID_USER_INFO_URL: "{{ TINYAUTH_GENERIC_USER_URL }}"
GENERIC_SCOPES: "{{ TINYAUTH_GENERIC_SCOPES }}" PROVIDERS_POCKETID_SCOPES: "{{ TINYAUTH_GENERIC_SCOPES }}"
GENERIC_NAME: "{{ TINYAUTH_GENERIC_NAME }}" PROVIDERS_POCKETID_NAME: "{{ TINYAUTH_GENERIC_NAME }}"
PROVIDERS_POCKETID_REDIRECT_URL: "{{ TINYAUTH_REDIRECT_URL }}"
OAUTH_WHITELIST: "{{ TINYAUTH_OAUTH_WHITELIST }}" OAUTH_WHITELIST: "{{ TINYAUTH_OAUTH_WHITELIST }}"
APP_TITLE: "{{ TINYAUTH_APP_TITLE }}" APP_TITLE: "{{ TINYAUTH_APP_TITLE }}"
BACKGROUND_IMAGE: "{{ TINYAUTH_BACKGROUND_IMAGE }}" BACKGROUND_IMAGE: "{{ TINYAUTH_BACKGROUND_IMAGE }}"
volumes:
- "/var/run/docker.sock:/var/run/docker.sock"
labels:
traefik.enable: "true"
traefik.http.routers.tinyauth.rule: Host(`auth.fntz.net`)
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: with_items:
- "{{ data_dir }}/vaultwarden" - "{{ data_dir }}/vaultwarden"
- name: Pull latest Vaultwarden Docker Image
docker_image:
name: vaultwarden/server
tag: latest
source: pull
- name: Create Vaultwarden Docker Container - name: Create Vaultwarden Docker Container
docker_container: docker_container:
name: vaultwarden name: vaultwarden
@@ -18,3 +24,9 @@
- "{{ data_dir }}/vaultwarden:/data" - "{{ data_dir }}/vaultwarden:/data"
env: env:
DOMAIN: "{{ VAULTWARDEN_DOMAIN }}" DOMAIN: "{{ VAULTWARDEN_DOMAIN }}"
labels:
traefik.enable: "true"
traefik.http.routers.vw.rule: Host(`vw.fntz.net`)
traefik.http.routers.vw.entrypoints: webSecure
traefik.http.routers.vw.tls.certresolver: letsencrypt
traefik.http.services.vw.loadbalancer.server.port: "80"

51
tasks/wings.yml Normal file
View File

@@ -0,0 +1,51 @@
---
- name: Create folder structure
file:
path: "{{ item }}"
state: directory
with_items:
- "{{ data_dir }}/wings"
- "{{ data_dir }}/wings/lib"
- name: Pull latest Wings Docker image
docker_image:
name: ghcr.io/pterodactyl/wings
tag: latest
source: pull
- name: Create Wings Network
docker_network:
name: wings
driver: bridge
ipam_config:
- subnet: "172.55.0.0/16"
- name: Create Wings Docker Container
docker_container:
name: pterodactyl_wings
image: ghcr.io/pterodactyl/wings:latest
recreate: true
restart_policy: unless-stopped
networks:
- name: wings
- name: "{{ docker_network_name }}"
volumes:
- "/var/run/docker.sock:/var/run/docker.sock"
- "/etc/pterodactyl:/etc/pterodactyl"
- "{{ data_dir }}/wings/lib:{{ data_dir }}/wings/lib"
- "{{ WINGS_CONTAINER_DIR }}:{{ WINGS_CONTAINER_DIR }}"
- "/var/log/pterodactyl:/var/log/pterodactyl"
- "/tmp/pterodactyl:/tmp/pterodactyl"
env:
TZ: "{{ TZ }}"
WINGS_UID: "988"
WINGS_GID: "988"
WINGS_USERNAME: pterodactyl
published_ports:
- "2022:2022"
labels:
traefik.enable: "true"
traefik.http.routers.wings.rule: Host(`{{ WINGS_URL }}`)
traefik.http.routers.wings.entrypoints: webSecure
traefik.http.routers.wings.tls.certresolver: letsencrypt
traefik.http.services.wings.loadbalancer.server.port: "8080"

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"]