Compare commits

33 Commits

Author SHA1 Message Date
7806dbb7ef update extraction script
All checks were successful
Deploy Containers / Prepare (push) Successful in 4s
2025-11-22 17:39:26 -05:00
610c62b75a fix update script
All checks were successful
Deploy Containers / Prepare (push) Successful in 4s
2025-11-22 17:20:46 -05:00
60ef84f37d migrate immich
All checks were successful
Deploy Containers / Prepare (push) Successful in 25s
2025-11-22 17:20:33 -05:00
993fd8eee7 fix api
All checks were successful
Deploy Containers / Prepare (push) Successful in 4s
2025-11-22 16:54:31 -05:00
a32a59ca0a lmao
All checks were successful
Deploy Containers / Prepare (push) Successful in 4s
2025-11-22 16:43:37 -05:00
909631952b update api db version
All checks were successful
Deploy Containers / Prepare (push) Successful in 17s
2025-11-22 16:41:37 -05:00
5995621767 add omit to networks
All checks were successful
Deploy Containers / Prepare (push) Successful in 5s
2025-11-22 01:04:50 -05:00
77504eeffd fix update script
All checks were successful
Deploy Containers / Prepare (push) Successful in 4s
2025-11-21 21:52:00 -05:00
078cb8edff show stdout
All checks were successful
Deploy Containers / Prepare (push) Successful in 4s
2025-11-21 21:47:22 -05:00
023b48ace0 migrate gitea
All checks were successful
Deploy Containers / Prepare (push) Successful in 16s
2025-11-21 21:45:47 -05:00
20362a069a remove pull command, ansible does this
All checks were successful
Deploy Containers / Prepare (push) Successful in 4s
2025-11-21 21:39:03 -05:00
4c878661e8 migrate owncloud
All checks were successful
Deploy Containers / Prepare (push) Successful in 16s
2025-11-21 21:33:45 -05:00
fb19e9eefe migrate termix
All checks were successful
Deploy Containers / Prepare (push) Successful in 16s
2025-11-21 21:26:03 -05:00
9c32a10144 migrate storage api
All checks were successful
Deploy Containers / Prepare (push) Successful in 16s
2025-11-21 21:24:53 -05:00
18d632e4ce migrate servarr
All checks were successful
Deploy Containers / Prepare (push) Successful in 16s
2025-11-21 21:23:15 -05:00
ea30d599a9 migrate obsidian
All checks were successful
Deploy Containers / Prepare (push) Successful in 16s
2025-11-21 21:20:48 -05:00
390a571fa4 migrate frigate
All checks were successful
Deploy Containers / Prepare (push) Successful in 16s
2025-11-21 21:18:54 -05:00
70fa7c77a8 migrate ersatz
All checks were successful
Deploy Containers / Prepare (push) Successful in 17s
2025-11-21 21:17:19 -05:00
1b1d0181c7 fix weird formatting in actions
All checks were successful
Deploy Containers / Prepare (push) Successful in 5s
2025-11-21 21:15:51 -05:00
7724c47528 whoops
All checks were successful
Deploy Containers / Prepare (push) Successful in 17s
2025-11-21 21:14:48 -05:00
2ed283ae54 migrate drop
Some checks failed
Deploy Containers / Prepare (push) Failing after 6s
2025-11-21 21:14:01 -05:00
f5a2b4c6c8 clean up logging
All checks were successful
Deploy Containers / Prepare (push) Successful in 5s
2025-11-21 03:33:05 -05:00
f6b850574d forgot directories
All checks were successful
Deploy Containers / Prepare (push) Successful in 1m5s
2025-11-21 03:31:40 -05:00
5ea7ad74cd fix
All checks were successful
Deploy Containers / Prepare (push) Successful in 5s
2025-11-21 03:30:00 -05:00
2897d67957 always pull image
All checks were successful
Deploy Containers / Prepare (push) Successful in 4s
2025-11-21 03:28:00 -05:00
681a876dae migrate vaultwarden
All checks were successful
Deploy Containers / Prepare (push) Successful in 13s
2025-11-21 03:23:35 -05:00
a19de4c6a5 migrate uptime kuma
All checks were successful
Deploy Containers / Prepare (push) Successful in 12s
2025-11-21 03:22:34 -05:00
5efa6934e3 migrate tinyauth
All checks were successful
Deploy Containers / Prepare (push) Successful in 17s
2025-11-21 03:21:45 -05:00
183fb0f237 migrate tautulli
All checks were successful
Deploy Containers / Prepare (push) Successful in 17s
2025-11-21 03:20:17 -05:00
4805cca2ce migrate pocketid
All checks were successful
Deploy Containers / Prepare (push) Successful in 15s
2025-11-21 03:18:57 -05:00
30cb6e8786 migrate pihole
All checks were successful
Deploy Containers / Prepare (push) Successful in 17s
2025-11-21 03:17:11 -05:00
a8e6ec48a6 migrate nzbget
All checks were successful
Deploy Containers / Prepare (push) Successful in 17s
2025-11-21 03:13:17 -05:00
50c6c57372 migrate homebridge
All checks were successful
Deploy Containers / Prepare (push) Successful in 17s
2025-11-21 03:10:33 -05:00
27 changed files with 311 additions and 571 deletions

View File

@@ -61,12 +61,6 @@
- name: Deploy Drop - name: Deploy Drop
import_tasks: tasks/drop.yml import_tasks: tasks/drop.yml
tags: drop_deploy tags: drop_deploy
- name: Deploy Gluetun
import_tasks: tasks/gluetun.yml
tags: gluetun_deploy
- name: Deploy QBittorrent
import_tasks: tasks/qbittorrent.yml
tags: qbittorrent_deploy
- name: Deploy Jackett - name: Deploy Jackett
import_tasks: tasks/jackett.yml import_tasks: tasks/jackett.yml
tags: jackett_deploy tags: jackett_deploy

View File

@@ -25,12 +25,6 @@
state: present state: present
when: build is defined when: build is defined
- name: Pull latest Docker image
docker_image:
name: "{{ image.name }}"
tag: "{{ image.tag }}"
source: pull
- name: Create Docker Network - name: Create Docker Network
docker_network: docker_network:
name: "{{ network_name }}" name: "{{ network_name }}"
@@ -39,11 +33,18 @@
- name: Create Docker Container - name: Create Docker Container
docker_container: docker_container:
name: "{{ name }}" name: "{{ name }}"
image: "{{ image.name }}:{{ image.tag }}"
command: "{{ command | default(omit) }}"
recreate: true recreate: true
restart_policy: unless-stopped restart_policy: unless-stopped
networks: "{{ networks }}" pull: "{{ build is not defined }}"
published_ports: "{{ published_ports | default(omit) }}"
network_mode: "{{ network_mode | default(omit) }}"
image: "{{ image.name }}:{{ image.tag }}"
command: "{{ command | default(omit) }}"
networks: "{{ networks | default(omit) }}"
volumes: "{{ volumes | default(omit) }}" volumes: "{{ volumes | default(omit) }}"
env: "{{ env | default(omit) }}" env: "{{ env | default(omit) }}"
labels: "{{ labels | default(omit) }}" labels: "{{ labels | default(omit) }}"
healthcheck: "{{ healthcheck | default(omit) }}"
devices: "{{ devices | default(omit) }}"
mounts: "{{ mounts | default(omit) }}"
privileged: "{{ privileged | default(omit) }}"

View File

@@ -21,10 +21,10 @@ def deploy(tag = None, host = None):
command = construct_command(tag, host) command = construct_command(tag, host)
if tag: if tag:
print(f"Deploying {tag}...\n") print(f"[MAIN] Deploying {tag}...")
else: else:
print(f"Deploying {host}...\n") print(f"[MAIN] Deploying host {host}...")
res = subprocess.run(command, shell=True, stdout=subprocess.DEVNULL) res = subprocess.run(command, shell=True)
return res.returncode == 0 return res.returncode == 0
@@ -75,8 +75,9 @@ def main():
deployed = [] deployed = []
failed = [] failed = []
for task in new_diff: for task in new_diff:
deployment = deploy(tag=task) deployment = deploy(tag=task.split("/")[1])
if not deployment: if not deployment:
failed.append(task) failed.append(task)

View File

@@ -10,21 +10,39 @@ if os.path.exists(host_vars_path):
vaults = os.listdir(host_vars_path) vaults = os.listdir(host_vars_path)
# 1st run - extract ungrouped, global variables
for vault in vaults: for vault in vaults:
vault_path = os.path.join(host_vars_path, vault) 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) 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() stdout = vault_contents.stdout.strip().splitlines()
for line in stdout: for line in stdout:
if line.startswith("#") and line not in file_contents: if line.startswith("#"):
file_contents += f"\n{line}\n" break
elif line.split(":")[0] not in file_contents:
file_contents += f"{line.split(":")[0]}:\n"
if ":" in line: # 2nd run - extract service-specific variables
if line.split(":")[0] not in file_contents: for vault in vaults:
file_contents += f'{line.split(":")[0]}:\n' 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()
with open(os.path.join(host_vars_path, 'all.template.yml'), 'w', encoding="utf8") as template_file: has_found_start = False
template_file.write(file_contents) for line in stdout:
template_file.close() if has_found_start or line.startswith("#"):
if not has_found_start:
has_found_start = True
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!") print("Written to disk!")

View File

@@ -13,8 +13,8 @@ def search_for_image(image_name):
data = yaml.safe_load(file) data = yaml.safe_load(file)
for key in data: for key in data:
if "docker_image" in key: if "vars" in key:
if image_name in key["docker_image"]["name"]: if image_name in key["vars"]["image"]["name"] or image_name == key["vars"]["image"]["name"]:
return f"{task.split(".")[0]}_deploy" return f"{task.split(".")[0]}_deploy"
def main(): def main():
@@ -29,24 +29,36 @@ def main():
for task in host['tasks']: for task in host['tasks']:
deployable_tags.append(task['tags']) deployable_tags.append(task['tags'])
if len(update_list["images"]) <= 0: if len(update_list["images"]) > 0:
print("No images to update!") already_deployed = []
else: actually_updatable = []
print(f"Updating {update_list["metrics"]["updates_available"]} image(s)..\n") blacklist = []
for image in update_list["images"]: for image in update_list["images"]:
if image['result']['has_update']: if image['result']['has_update']:
if "remote_digest" in image["result"]["info"]: if image in blacklist:
image_name = image["parts"]["repository"] print(f"[UPDATE] Ignoring '{image}' due to its blacklist")
ansible_tag = search_for_image(image_name) elif 'version_update_type' in image['result']['info'] and image['result']['info']['version_update_type'] != "major":
actually_updatable.append({ 'reference': image['reference'], 'repository': image['parts']['repository'] })
elif 'type' in image['result']['info'] and image['result']['info']['type'] == "digest":
actually_updatable.append({ 'reference': image['reference'], 'repository': image['parts']['repository'] })
if ansible_tag and ansible_tag in deployable_tags: print(f"Redeploying {len(actually_updatable)} container(s)..")
print(f"Updating '{image_name}' ({ansible_tag})..") for image in actually_updatable:
subprocess.run(f'docker image pull {image_name}', shell=True) ansible_tag = search_for_image(image['repository'])
subprocess.run(f'ANSIBLE_CONFIG=ansible.cfg ansible-playbook main.yml --tags {ansible_tag} --vault-password-file=~/.vault_pass.txt', shell=True) print(ansible_tag, image['reference'])
if ansible_tag and ansible_tag in deployable_tags and ansible_tag not in already_deployed:
print(f'[UPDATE] Deploying {ansible_tag}..')
subprocess.run(f'ANSIBLE_CONFIG=ansible.cfg ansible-playbook main.yml --tags {ansible_tag} --vault-password-file=~/.vault_pass.txt', shell=True)
else:
print('[UPDATE] Could not find corresponding task, cleaning up..')
subprocess.run(f"docker image remove {image['reference']}", shell=True)
already_deployed.append(ansible_tag)
print("\nAll images updated, refreshing Cup") print("\nAll images updated, refreshing Cup")
requests.get("https://cup.fntz.net/api/v3/refresh") requests.get("https://cup.fntz.net/api/v3/refresh")
else:
print("No images to update!")
if __name__ == "__main__": if __name__ == "__main__":
main() main()

View File

@@ -9,7 +9,7 @@
- "{{ data_dir }}/api/db" - "{{ data_dir }}/api/db"
image: image:
name: postgres name: postgres
tag: latest tag: "17"
networks: networks:
- name: api - name: api
volumes: volumes:

View File

@@ -1,29 +1,16 @@
--- ---
- name: Create folder structure - name: Deploy Drop Database
file: include_role:
path: "{{ item }}" name: docker
state: directory vars:
with_items:
- "{{ data_dir }}/drop"
- "{{ data_dir }}/drop/db"
- "{{ data_dir }}/drop/app"
- name: Create Drop Network
docker_network:
name: drop
- name: Pull latest Drop Docker Image
docker_image:
name: ghcr.io/drop-oss/drop
tag: v0.3.3
source: pull
- name: Create Drop DB Container
docker_container:
name: drop_postgres name: drop_postgres
image: postgres:14-alpine directories:
recreate: true - "{{ data_dir }}/drop"
restart_policy: unless-stopped - "{{ data_dir }}/drop/db"
image:
name: postgres
tag: 14-alpine
network_name: drop
networks: networks:
- name: drop - name: drop
healthcheck: healthcheck:
@@ -39,12 +26,16 @@
POSTGRES_USER: "drop" POSTGRES_USER: "drop"
POSTGRES_DB: "drop" POSTGRES_DB: "drop"
- name: Create Drop Container - name: Deploy Drop
docker_container: include_role:
name: docker
vars:
name: drop name: drop
image: ghcr.io/drop-oss/drop:latest directories:
recreate: true - "{{ data_dir }}/drop/app"
restart_policy: unless-stopped image:
name: ghcr.io/drop-oss/drop
tag: latest
networks: networks:
- name: homelab - name: homelab
- name: drop - name: drop

View File

@@ -1,23 +1,14 @@
--- ---
- name: Create folder structure - name: Deploy Ersatz
file: include_role:
path: "{{ item }}" name: docker
state: directory vars:
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 name: ersatztv
image: ghcr.io/ersatztv/ersatztv:latest directories:
recreate: true - "{{ data_dir }}/ersatz"
restart_policy: unless-stopped image:
name: ghcr.io/ersatztv/ersatztv
tag: latest
devices: devices:
- /dev/dri/renderD128:/dev/dri/renderD128 - /dev/dri/renderD128:/dev/dri/renderD128
mounts: mounts:

View File

@@ -1,24 +1,15 @@
--- ---
- name: Create folder structure - name: Deploy Frigate
file: include_role:
path: "{{ item }}" name: docker
state: directory vars:
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 name: frigate
image: ghcr.io/blakeblackshear/frigate:stable directories:
recreate: true - "{{ data_dir }}/frigate"
image:
name: ghcr.io/blakeblackshear/frigate
tag: stable
privileged: true privileged: true
restart_policy: unless-stopped
published_ports: published_ports:
- "5000:5000" - "5000:5000"
- "8555:8555/tcp" - "8555:8555/tcp"

View File

@@ -1,23 +1,14 @@
--- ---
- name: Create folder structure - name: Deploy Gitea
file: include_role:
path: "{{ item }}" name: docker
state: directory vars:
with_items:
- "{{ data_dir }}/gitea"
- name: Pull latest Gitea Docker Image
docker_image:
name: docker.gitea.com/gitea
tag: latest
source: pull
- name: Create Gitea Docker Container
docker_container:
name: gitea name: gitea
image: docker.gitea.com/gitea:latest directories:
restart_policy: unless-stopped - "{{ data_dir }}/gitea"
recreate: true image:
name: docker.gitea.com/gitea
tag: latest
networks: networks:
- name: "{{ docker_network_name }}" - name: "{{ docker_network_name }}"
volumes: volumes:

View File

@@ -1,31 +0,0 @@
---
- name: Create folder structure
file:
path: "{{ item }}"
state: directory
with_items:
- "{{ data_dir }}/homeassistant"
- name: Pull HA Docker Image
docker_image:
name: ghcr.io/home-assistant/home-assistant:stable
source: pull
- name: Deploy Home Assistant Container
docker_container:
name: home_assistant
image: ghcr.io/home-assistant/home-assistant:stable
recreate: true
restart_policy: unless-stopped
network_mode: host
privileged: true
volumes:
- "{{ data_dir }}/homeassistant:/config"
- "/etc/localtime:/etc/localtime"
- "/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

@@ -1,24 +1,15 @@
--- ---
- name: Create Folder structure - name: Deploy Homebridge
file: include_role:
path: "{{ item }}" name: docker
state: directory vars:
with_items:
- "{{ data_dir }}/homebridge"
- name: Pull latest Homebridge Docker Image
docker_image:
name: homebridge/homebridge
tag: latest
source: pull
- name: Create Homebridge Docker Container
docker_container:
name: homebridge name: homebridge
image: homebridge/homebridge:latest directories:
restart_policy: unless-stopped - "{{ data_dir }}/homebridge:/homebridge"
image:
name: homebridge/homebridge
tag: latest
network_mode: host network_mode: host
recreate: true
volumes: volumes:
- "{{ data_dir }}/homebridge:/homebridge" - "{{ data_dir }}/homebridge:/homebridge"
labels: labels:

View File

@@ -1,34 +1,16 @@
--- ---
- name: Create folder structure - name: Deploy Immich DB
file: include_role:
path: "{{ item }}" name: docker
state: directory vars:
with_items:
- "{{ data_dir }}/immich"
- "{{ data_dir }}/immich/model-cache"
- "{{ 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
docker_container:
name: immich_redis
image: docker.io/valkey/valkey:8-bookworm@sha256:fea8b3e67b15729d4bb70589eb03367bab9ad1ee89c876f54327fc7c6e618571
restart_policy: unless-stopped
recreate: true
networks:
- name: immich
- name: Create Immich DB Docker Container
docker_container:
name: immich_postgres name: immich_postgres
image: ghcr.io/immich-app/postgres:14-vectorchord0.4.3-pgvectors0.2.0@sha256:bcf63357191b76a916ae5eb93464d65c07511da41e3bf7a8416db519b40b1c23 directories:
restart_policy: unless-stopped - "{{ data_dir }}/immich"
recreate: true - "{{ data_dir }}/immich/model-cache"
- "{{ data_dir }}/immich/db"
image:
name: ghcr.io/immich-app/postgres
tag: 14-vectorchord0.4.3-pgvectors0.2.0
volumes: volumes:
- "{{ data_dir }}/immich/db:/var/lib/postgresql/data" - "{{ data_dir }}/immich/db:/var/lib/postgresql/data"
env: env:
@@ -38,13 +20,27 @@
POSTGRES_INITDB_ARGS: "--data-checksums" POSTGRES_INITDB_ARGS: "--data-checksums"
networks: networks:
- name: immich - name: immich
network_name: immich
- name: Create Immich Server Docker Container - name: Deploy Immich Redis
docker_container: include_role:
name: immich_server name: docker
image: ghcr.io/immich-app/immich-server:v2.1.0 vars:
restart_policy: unless-stopped name: immich_redis
recreate: true image:
name: docker.io/valkey/valkey
tag: 8-bookworm
networks:
- name: immich
- name: Deploy Immich Server
include_role:
name: docker
vars:
name: immich
image:
name: ghcr.io/immich-app/immich-server
tag: v2.1.0
networks: networks:
- name: homelab - name: homelab
- name: immich - name: immich

View File

@@ -1,39 +0,0 @@
---
- name: Create folder structure
file:
path: "{{ item }}"
state: directory
with_items:
- "{{ data_dir }}/jellyfin"
- name: Pull latest Jellyfin Docker Image
docker_image:
name: lscr.io/linuxserver/jellyfin
tag: latest
source: pull
- name: Create Jellyfin Docker Container
docker_container:
name: jellyfin
image: lscr.io/linuxserver/jellyfin:latest
restart_policy: unless-stopped
recreate: true
networks:
- name: homelab
published_ports:
- 8096:8096
volumes:
- "{{ data_dir }}/jellyfin:/config"
- "{{ JELLYFIN_TV_PATH }}:/data/tvshows"
- "{{ JELLYFIN_MOVIE_PATH }}:/data/movies"
- "{{ JELLYFIN_MUSIC_PATH }}:/data/music"
env:
PUID: "{{ PUID }}"
PGID: "{{ PGID }}"
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"

View File

@@ -1,54 +0,0 @@
---
- name: Create folder structure
file:
path: "{{ item }}"
state: directory
with_items:
- "{{ data_dir }}/nextcloud"
- "{{ data_dir }}/nextcloud/data"
- "{{ data_dir }}/nextcloud/db"
- name: Create Nextcloud Docker Network
docker_network:
name: nextcloud
- name: Pull latest Nextcloud Docker Image
docker_image:
name: nextcloud
tag: latest
source: pull
- name: Create Nextcloud DB Docker Container
docker_container:
name: nc_postgresql
image: postgres:17-alpine
restart_policy: unless-stopped
recreate: true
networks:
- name: nextcloud
volumes:
- "{{ data_dir }}/nextcloud/db:/var/lib/postgresql/data"
env:
PGDATA: /var/lib/postgresql/data/pgdata
POSTGRES_PASSWORD: "{{ NEXTCLOUD_POSTGRES_PASSWORD }}"
POSTGRES_DATABASE: "{{ NEXTCLOUD_POSTGRES_DATABASE }}"
POSTGRES_USER: "{{ NEXTCLOUD_POSTGRES_USER }}"
POSTGRES_HOST: "{{ NEXTCLOUD_POSTGRES_HOST }}"
- name: Create Nextcloud Docker Container
docker_container:
name: nextcloud
image: nextcloud
restart_policy: unless-stopped
recreate: true
networks:
- name: "{{ docker_network_name }}"
- name: nextcloud
volumes:
- "{{ data_dir }}/nextcloud/data:/var/www/html"
labels:
traefik.enable: "true"
traefik.http.routers.nc.rule: Host(`{{ NEXTCLOUD_APP_URL }}`)
traefik.http.routers.nc.entrypoints: webSecure
traefik.http.routers.nc.tls.certresolver: letsencrypt
traefik.http.services.nc.loadbalancer.server.port: "80"

View File

@@ -1,23 +1,14 @@
--- ---
- name: Create folder structure - name: Deploy NZBGet
file: include_role:
path: "{{ item }}" name: docker
state: directory vars:
with_items:
- "{{ data_dir }}/nzbget"
- name: Pull latest NZBGet Docker Image
docker_image:
name: lscr.io/linuxserver/nzbget
tag: latest
source: pull
- name: Create NZBGet Docker Container
docker_container:
name: nzbget name: nzbget
image: lscr.io/linuxserver/nzbget:latest directories:
restart_policy: unless-stopped - "{{ data_dir }}/nzbget"
recreate: true image:
name: lscr.io/linuxserver/nzbget
tag: latest
networks: networks:
- name: homelab - name: homelab
volumes: volumes:

View File

@@ -1,25 +1,16 @@
--- ---
- name: Create folder structure - name: Deploy Obsidian
file: include_role:
path: "{{ item }}" name: docker
state: directory vars:
with_items: name: obsidian
- "{{ data_dir }}/obsidian" directories:
- "{{ data_dir }}/obsidian/data" - "{{ data_dir }}/obsidian"
- "{{ data_dir }}/obsidian/etc" - "{{ data_dir }}/obsidian/data"
- "{{ data_dir }}/obsidian/etc"
- name: Pull Docker Image image:
docker_image: name: couchdb
name: couchdb tag: latest
tag: latest
source: pull
- name: Create Docker Container
docker_container:
name: couchdb
image: couchdb:latest
recreate: true
restart_policy: unless-stopped
networks: networks:
- name: homelab - name: homelab
volumes: volumes:

View File

@@ -1,30 +1,18 @@
--- ---
- name: Create folder structure - name: Deploy Owncloud Database
file: include_role:
path: "{{ item }}" name: docker
state: directory vars:
with_items: name: owncloud_database
- "{{ data_dir }}/owncloud" image:
- "{{ data_dir }}/owncloud/data" name: mariadb
- "{{ data_dir }}/owncloud/db" tag: latest
- "{{ data_dir }}/owncloud/redis" directories:
- "{{ data_dir }}/owncloud"
- name: Create Owncloud Docker Network - "{{ data_dir }}/owncloud/data"
docker_network: - "{{ data_dir }}/owncloud/db"
name: owncloud - "{{ data_dir }}/owncloud/redis"
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: networks:
- name: owncloud - name: owncloud
volumes: volumes:
@@ -42,12 +30,14 @@
timeout: 5s timeout: 5s
retries: 5 retries: 5
- name: Create Owncloud Redis Container - name: Deploy Owncloud Redis
docker_container: include_role:
name: oc_redis name: docker
image: redis:latest vars:
restart_policy: unless-stopped name: owncloud_redis
recreate: true image:
name: redis
tag: latest
networks: networks:
- name: owncloud - name: owncloud
command: "--databases 1" command: "--databases 1"
@@ -59,12 +49,14 @@
volumes: volumes:
- "{{ data_dir }}/owncloud/redis:/data" - "{{ data_dir }}/owncloud/redis:/data"
- name: Create Owncloud Docker Container - name: Deploy Owncloud
docker_container: include_role:
name: docker
vars:
name: owncloud name: owncloud
image: owncloud/server:10.15 image:
restart_policy: unless-stopped name: owncloud/server
recreate: true tag: 10.16
networks: networks:
- name: "{{ docker_network_name }}" - name: "{{ docker_network_name }}"
- name: owncloud - name: owncloud

View File

@@ -1,28 +1,19 @@
--- ---
- name: Create folder structure - name: Deploy PiHole
file: include_role:
path: "{{ item }}" name: docker
state: directory vars:
with_items:
- "{{ data_dir }}/pihole"
- name: Pull latest PiHole Docker Image
docker_image:
name: pihole/pihole
tag: latest
source: pull
- name: Create PiHole Docker Container
docker_container:
name: pihole name: pihole
image: pihole/pihole:latest directories:
restart_policy: unless-stopped - "{{ data_dir }}/pihole"
recreate: true image:
name: pihole/pihole
tag: latest
published_ports:
- "53:53/tcp"
- "53:53/udp"
networks: networks:
- name: homelab - name: homelab
published_ports:
- "{{ TRAEFIK_HOST_IP }}:53:53/tcp"
- "{{ TRAEFIK_HOST_IP }}:53:53/udp"
volumes: volumes:
- "{{ data_dir }}/pihole:/etc/pihole" - "{{ data_dir }}/pihole:/etc/pihole"
env: env:

View File

@@ -1,23 +1,14 @@
--- ---
- name: Create Folder structure - name: Deploy PocketID
file: include_role:
path: "{{ item }}" name: docker
state: directory vars:
with_items:
- "{{ data_dir }}/pocketid"
- name: Pull latest PocketID Docker Image
docker_image:
name: ghcr.io/pocket-id/pocket-id
tag: v1
source: pull
- name: Create PocketID Docker Container
docker_container:
name: pocketid name: pocketid
image: ghcr.io/pocket-id/pocket-id:v1 directories:
restart_policy: unless-stopped - "{{ data_dir }}/pocketid"
recreate: true image:
name: ghcr.io/pocket-id/pocket-id
tag: v1
networks: networks:
- name: homelab - name: homelab
volumes: volumes:

View File

@@ -1,36 +1,17 @@
--- ---
- name: Create folder structure - name: Deploy Radarr
file: include_role:
path: "{{ item }}" name: docker
state: directory vars:
with_items:
- "{{ data_dir }}/servarr"
- "{{ data_dir }}/servarr/sonarr_config"
- "{{ data_dir }}/servarr/radarr_config"
- "{{ data_dir }}/servarr/lidarr_config"
- name: Pull latest Radarr Docker Image
docker_image:
name: lscr.io/linuxserver/radarr
tag: latest
source: pull
- name: Pull latest Sonarr Docker Image
docker_image:
name: lscr.io/linuxserver/sonarr
tag: latest
source: pull
- name: Pull latest Lidarr Docker Image
docker_image:
name: lscr.io/linuxserver/lidarr
tag: latest
source: pull
- name: Deploy Radarr Container
docker_container:
name: radarr name: radarr
image: lscr.io/linuxserver/radarr:latest directories:
restart_policy: unless-stopped - "{{ data_dir }}/servarr"
recreate: true - "{{ data_dir }}/servarr/sonarr_config"
- "{{ data_dir }}/servarr/radarr_config"
- "{{ data_dir }}/servarr/lidarr_config"
image:
name: lscr.io/linuxserver/radarr
tag: latest
volumes: volumes:
- "{{ data_dir }}/servarr/radarr_config:/config" - "{{ data_dir }}/servarr/radarr_config:/config"
- "{{ SERVARR_MEDIA_PATH }}:/media" - "{{ SERVARR_MEDIA_PATH }}:/media"
@@ -48,12 +29,14 @@
traefik.http.routers.radarr.tls.certresolver: letsencrypt traefik.http.routers.radarr.tls.certresolver: letsencrypt
traefik.http.services.radarr.loadbalancer.server.port: "7878" traefik.http.services.radarr.loadbalancer.server.port: "7878"
- name: Deploy Sonarr Container - name: Deploy Sonarr
docker_container: include_role:
name: docker
vars:
name: sonarr name: sonarr
image: lscr.io/linuxserver/sonarr:latest image:
restart_policy: unless-stopped name: lscr.io/linuxserver/sonarr
recreate: true tag: latest
volumes: volumes:
- "{{ data_dir }}/servarr/sonarr_config:/config" - "{{ data_dir }}/servarr/sonarr_config:/config"
- "{{ SERVARR_MEDIA_PATH }}:/data" - "{{ SERVARR_MEDIA_PATH }}:/data"
@@ -71,12 +54,14 @@
traefik.http.routers.sonarr.tls.certresolver: letsencrypt traefik.http.routers.sonarr.tls.certresolver: letsencrypt
traefik.http.services.sonarr.loadbalancer.server.port: "8989" traefik.http.services.sonarr.loadbalancer.server.port: "8989"
- name: Deploy Lidarr Container - name: Deploy Lidarr
docker_container: include_role:
name: docker
vars:
name: lidarr name: lidarr
image: lscr.io/linuxserver/lidarr:latest image:
restart_policy: unless-stopped name: lscr.io/linuxserver/lidarr
recreate: true tag: latest
env: env:
PUID: "{{ PUID }}" PUID: "{{ PUID }}"
PGID: "{{ PGID }}" PGID: "{{ PGID }}"

View File

@@ -1,34 +1,20 @@
--- ---
- name: "Create file structure" - name: Deploy Storage API
file: include_role:
path: "{{ item }}" name: docker
state: directory vars:
with_items:
- "{{ data_dir }}/storage-api"
- "{{ data_dir }}/storage-api/app"
- "{{ data_dir }}/storage-api/files"
- name: "Clone latest Storage API"
git:
repo: git@git.alexav.gg:alex/storage-api.git
dest: "{{ data_dir }}/storage-api/app"
- name: "Build Storage API Docker Image"
docker_image:
name: storage-api name: storage-api
tag: "latest" directories:
- "{{ data_dir }}/storage-api"
- "{{ data_dir }}/storage-api/app"
- "{{ data_dir }}/storage-api/files"
image:
name: storage-api
tag: latest
build: build:
path: "{{ data_dir }}/storage-api/app" git:
dockerfile: Dockerfile repo: git@git.alexav.gg:alex/storage-api.git
source: build dest: "{{ data_dir }}/storage-api/app"
state: present
- name: Deploy Storage API Container
docker_container:
name: storage_api
image: storage-api:latest
recreate: true
restart_policy: unless-stopped
networks: networks:
- name: "{{ docker_network_name }}" - name: "{{ docker_network_name }}"
volumes: volumes:

View File

@@ -1,23 +1,14 @@
--- ---
- name: Create folder structure - name: Deploy Tautulli
file: include_role:
path: "{{ item }}" name: docker
state: directory vars:
with_items:
- "{{ data_dir }}/tautulli"
- name: Pull latest Tautulli Docker Image
docker_image:
name: ghcr.io/tautulli/tautulli
tag: latest
source: pull
- name: Create Tautulli Docker Container
docker_container:
name: tautulli name: tautulli
image: ghcr.io/tautulli/tautulli directories:
restart_policy: unless-stopped - "{{ data_dir }}/tautulli"
recreate: true image:
name: ghcr.io/tautulli/tautulli
tag: latest
networks: networks:
- name: homelab - name: homelab
volumes: volumes:

View File

@@ -1,23 +1,14 @@
--- ---
- name: Create folder structure - name: Deploy Termix
file: include_role:
path: "{{ item }}" name: docker
state: directory vars:
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 name: termix
image: ghcr.io/lukegus/termix:latest directories:
restart_policy: unless-stopped - "{{ data_dir }}/termix"
recreate: true image:
name: ghcr.io/lukegus/termix
tag: latest
networks: networks:
- name: homelab - name: homelab
volumes: volumes:

View File

@@ -1,18 +1,16 @@
--- ---
- name: Pull latest Tinyauth Docker Image - name: Deploy Tinyauth
docker_image: include_role:
name: ghcr.io/steveiliop56/tinyauth name: docker
tag: v4 vars:
source: pull
- name: Create Tinyauth Docker Container
docker_container:
name: tinyauth name: tinyauth
image: ghcr.io/steveiliop56/tinyauth:v4 image:
restart_policy: unless-stopped name: ghcr.io/steveiliop56/tinyauth
recreate: true tag: v4
networks: networks:
- name: homelab - name: homelab
volumes:
- "/var/run/docker.sock:/var/run/docker.sock"
env: env:
USERS: "{{ TINYAUTH_USERS }}" USERS: "{{ TINYAUTH_USERS }}"
SECRET: "{{ TINYAUTH_SECRET }}" SECRET: "{{ TINYAUTH_SECRET }}"
@@ -28,8 +26,6 @@
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: labels:
traefik.enable: "true" traefik.enable: "true"
traefik.http.routers.tinyauth.rule: Host(`auth.fntz.net`) traefik.http.routers.tinyauth.rule: Host(`auth.fntz.net`)

View File

@@ -1,23 +1,14 @@
--- ---
- name: Create folder structure - name: Deploy Uptime Kuma
file: include_role:
path: "{{ item }}" name: docker
state: directory vars:
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 name: uptime-kuma
image: louislam/uptime-kuma directories:
restart_policy: unless-stopped - "{{ data_dir }}/uptime-kuma"
recreate: true image:
name: louislam/uptime-kuma
tag: latest
networks: networks:
- name: homelab - name: homelab
volumes: volumes:

View File

@@ -1,23 +1,14 @@
--- ---
- name: Create folder structure - name: Deploy Vaultwarden
file: include_role:
path: "{{ item }}" name: docker
state: directory vars:
with_items:
- "{{ data_dir }}/vaultwarden"
- name: Pull latest Vaultwarden Docker Image
docker_image:
name: vaultwarden/server
tag: latest
source: pull
- name: Create Vaultwarden Docker Container
docker_container:
name: vaultwarden name: vaultwarden
image: vaultwarden/server:latest directories:
restart_policy: unless-stopped - "{{ data_dir }}/vaultwarden"
recreate: true image:
name: vaultwarden/server
tag: latest
networks: networks:
- name: homelab - name: homelab
volumes: volumes: