Compare commits

1 Commits

Author SHA1 Message Date
48690c04a4 Automated template extraction 2025-11-21 08:05:44 +00:00
28 changed files with 589 additions and 325 deletions

View File

@@ -1,21 +1,9 @@
ansible_user: ansible_user:
data_dir: data_dir:
docker_network_name:
TZ:
PUID: PUID:
PGID: PGID:
TZ:
docker_network_name:
media_path:
# frigate
FRIGATE_RECORDINGS_PATH:
# traefik
TRAEFIK_CF_API_EMAIL:
TRAEFIK_CF_API_KEY:
TRAEFIK_DASH_URL:
# plex
PLEX_CLAIM_TOKEN:
# api # api
API_CONTACT_WEBHOOK: API_CONTACT_WEBHOOK:
@@ -38,6 +26,11 @@ OWNCLOUD_DB_DATABASE:
OWNCLOUD_DB_HOST: OWNCLOUD_DB_HOST:
OWNCLOUD_ADMIN_USERNAME: OWNCLOUD_ADMIN_USERNAME:
OWNCLOUD_ADMIN_PASSWORD: OWNCLOUD_ADMIN_PASSWORD:
# traefik
TRAEFIK_DASH_URL:
TRAEFIK_CF_API_EMAIL:
TRAEFIK_CF_API_KEY:
TRAEFIK_HOST_IP: TRAEFIK_HOST_IP:
TRAEFIK_VIDEO_MACHINE: TRAEFIK_VIDEO_MACHINE:
TRAEFIK_ENABLE_DASH: TRAEFIK_ENABLE_DASH:
@@ -55,6 +48,17 @@ MASTODON_VAPID_PUBLIC_KEY:
MASTODON_ARE_DETERMINISTIC: MASTODON_ARE_DETERMINISTIC:
MASTODON_ARE_KEY_DERIVATION: MASTODON_ARE_KEY_DERIVATION:
MASTODON_ARE_PRIMARY: MASTODON_ARE_PRIMARY:
# wings
WINGS_URL:
WINGS_CONTAINER_DIR:
media_path:
# frigate
FRIGATE_RECORDINGS_PATH:
# plex
PLEX_CLAIM_TOKEN:
ansible_become_pass: ansible_become_pass:
# glance # glance

View File

@@ -61,6 +61,12 @@
- 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,6 +25,12 @@
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 }}"
@@ -33,18 +39,11 @@
- name: Create Docker Container - name: Create Docker Container
docker_container: docker_container:
name: "{{ name }}" name: "{{ name }}"
recreate: true
restart_policy: unless-stopped
pull: "{{ build is not defined }}"
published_ports: "{{ published_ports | default(omit) }}"
network_mode: "{{ network_mode | default(omit) }}"
image: "{{ image.name }}:{{ image.tag }}" image: "{{ image.name }}:{{ image.tag }}"
command: "{{ command | default(omit) }}" command: "{{ command | default(omit) }}"
networks: "{{ networks | default(omit) }}" recreate: true
restart_policy: unless-stopped
networks: "{{ networks }}"
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"[MAIN] Deploying {tag}...") print(f"Deploying {tag}...\n")
else: else:
print(f"[MAIN] Deploying host {host}...") print(f"Deploying {host}...\n")
res = subprocess.run(command, shell=True) res = subprocess.run(command, shell=True, stdout=subprocess.DEVNULL)
return res.returncode == 0 return res.returncode == 0
@@ -75,9 +75,8 @@ def main():
deployed = [] deployed = []
failed = [] failed = []
for task in new_diff: for task in new_diff:
deployment = deploy(tag=task.split("/")[1]) deployment = deploy(tag=task)
if not deployment: if not deployment:
failed.append(task) failed.append(task)

View File

@@ -10,39 +10,21 @@ 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("#"): if line.startswith("#") and line not in file_contents:
break file_contents += f"\n{line}\n"
elif line.split(":")[0] not in file_contents:
file_contents += f"{line.split(":")[0]}:\n"
# 2nd run - extract service-specific variables
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()
has_found_start = False if ":" in line:
for line in stdout: if line.split(":")[0] not in file_contents:
if has_found_start or line.startswith("#"): file_contents += f'{line.split(":")[0]}:\n'
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: with open(os.path.join(host_vars_path, 'all.template.yml'), 'w', encoding="utf8") as template_file:
if line.split(":")[0] not in file_contents: template_file.write(file_contents)
file_contents += f'{line.split(":")[0]}:\n' template_file.close()
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 "vars" in key: if "docker_image" in key:
if image_name in key["vars"]["image"]["name"] or image_name == key["vars"]["image"]["name"]: if image_name in key["docker_image"]["name"]:
return f"{task.split(".")[0]}_deploy" return f"{task.split(".")[0]}_deploy"
def main(): def main():
@@ -29,36 +29,24 @@ 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:
already_deployed = [] print("No images to update!")
actually_updatable = [] else:
blacklist = [] print(f"Updating {update_list["metrics"]["updates_available"]} image(s)..\n")
for image in update_list["images"]: for image in update_list["images"]:
if image['result']['has_update']: if image['result']['has_update']:
if image in blacklist: if "remote_digest" in image["result"]["info"]:
print(f"[UPDATE] Ignoring '{image}' due to its blacklist") image_name = image["parts"]["repository"]
elif 'version_update_type' in image['result']['info'] and image['result']['info']['version_update_type'] != "major": ansible_tag = search_for_image(image_name)
actually_updatable.append({ 'reference': image['reference'], 'repository': image['parts']['repository'] })
elif 'type' in image['result']['info'] and image['result']['info']['type'] == "digest": if ansible_tag and ansible_tag in deployable_tags:
actually_updatable.append({ 'reference': image['reference'], 'repository': image['parts']['repository'] }) print(f"Updating '{image_name}' ({ansible_tag})..")
subprocess.run(f'docker image pull {image_name}', shell=True)
print(f"Redeploying {len(actually_updatable)} container(s)..") subprocess.run(f'ANSIBLE_CONFIG=ansible.cfg ansible-playbook main.yml --tags {ansible_tag} --vault-password-file=~/.vault_pass.txt', shell=True)
for image in actually_updatable:
ansible_tag = search_for_image(image['repository'])
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: "17" tag: latest
networks: networks:
- name: api - name: api
volumes: volumes:

View File

@@ -1,16 +1,29 @@
--- ---
- name: Deploy Drop Database - name: Create folder structure
include_role: file:
name: docker path: "{{ item }}"
vars: state: directory
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
directories: image: postgres:14-alpine
- "{{ data_dir }}/drop" recreate: true
- "{{ data_dir }}/drop/db" restart_policy: unless-stopped
image:
name: postgres
tag: 14-alpine
network_name: drop
networks: networks:
- name: drop - name: drop
healthcheck: healthcheck:
@@ -26,16 +39,12 @@
POSTGRES_USER: "drop" POSTGRES_USER: "drop"
POSTGRES_DB: "drop" POSTGRES_DB: "drop"
- name: Deploy Drop - name: Create Drop Container
include_role: docker_container:
name: docker
vars:
name: drop name: drop
directories: image: ghcr.io/drop-oss/drop:latest
- "{{ data_dir }}/drop/app" recreate: true
image: restart_policy: unless-stopped
name: ghcr.io/drop-oss/drop
tag: latest
networks: networks:
- name: homelab - name: homelab
- name: drop - name: drop

View File

@@ -1,14 +1,23 @@
--- ---
- name: Deploy Ersatz - name: Create folder structure
include_role: file:
name: docker path: "{{ item }}"
vars: 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 name: ersatztv
directories: image: ghcr.io/ersatztv/ersatztv:latest
- "{{ data_dir }}/ersatz" recreate: true
image: restart_policy: unless-stopped
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,15 +1,24 @@
--- ---
- name: Deploy Frigate - name: Create folder structure
include_role: file:
name: docker path: "{{ item }}"
vars: 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 name: frigate
directories: image: ghcr.io/blakeblackshear/frigate:stable
- "{{ data_dir }}/frigate" recreate: true
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,14 +1,23 @@
--- ---
- name: Deploy Gitea - name: Create folder structure
include_role: file:
name: docker path: "{{ item }}"
vars: state: directory
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
directories: image: docker.gitea.com/gitea:latest
- "{{ data_dir }}/gitea" restart_policy: unless-stopped
image: recreate: true
name: docker.gitea.com/gitea
tag: latest
networks: networks:
- name: "{{ docker_network_name }}" - name: "{{ docker_network_name }}"
volumes: volumes:

31
tasks/home-assistant.yml Normal file
View File

@@ -0,0 +1,31 @@
---
- 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,15 +1,24 @@
--- ---
- name: Deploy Homebridge - name: Create Folder structure
include_role: file:
name: docker path: "{{ item }}"
vars: state: directory
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
directories: image: homebridge/homebridge:latest
- "{{ data_dir }}/homebridge:/homebridge" restart_policy: unless-stopped
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,16 +1,34 @@
--- ---
- name: Deploy Immich DB - name: Create folder structure
include_role: file:
name: docker path: "{{ item }}"
vars: state: directory
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
directories: image: ghcr.io/immich-app/postgres:14-vectorchord0.4.3-pgvectors0.2.0@sha256:bcf63357191b76a916ae5eb93464d65c07511da41e3bf7a8416db519b40b1c23
- "{{ data_dir }}/immich" restart_policy: unless-stopped
- "{{ data_dir }}/immich/model-cache" recreate: true
- "{{ 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:
@@ -20,27 +38,13 @@
POSTGRES_INITDB_ARGS: "--data-checksums" POSTGRES_INITDB_ARGS: "--data-checksums"
networks: networks:
- name: immich - name: immich
network_name: immich
- name: Deploy Immich Redis - name: Create Immich Server Docker Container
include_role: docker_container:
name: docker name: immich_server
vars: image: ghcr.io/immich-app/immich-server:v2.1.0
name: immich_redis restart_policy: unless-stopped
image: recreate: true
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

39
tasks/jellyfin.yml Normal file
View File

@@ -0,0 +1,39 @@
---
- 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"

54
tasks/nextcloud.yml Normal file
View File

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

View File

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

View File

@@ -1,19 +1,28 @@
--- ---
- name: Deploy PiHole - name: Create folder structure
include_role: file:
name: docker path: "{{ item }}"
vars: state: directory
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
directories: image: pihole/pihole:latest
- "{{ data_dir }}/pihole" restart_policy: unless-stopped
image: recreate: true
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,14 +1,23 @@
--- ---
- name: Deploy PocketID - name: Create Folder structure
include_role: file:
name: docker path: "{{ item }}"
vars: state: directory
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
directories: image: ghcr.io/pocket-id/pocket-id:v1
- "{{ data_dir }}/pocketid" restart_policy: unless-stopped
image: recreate: true
name: ghcr.io/pocket-id/pocket-id
tag: v1
networks: networks:
- name: homelab - name: homelab
volumes: volumes:

View File

@@ -1,17 +1,36 @@
--- ---
- name: Deploy Radarr - name: Create folder structure
include_role: file:
name: docker path: "{{ item }}"
vars: state: directory
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
directories: image: lscr.io/linuxserver/radarr:latest
- "{{ data_dir }}/servarr" restart_policy: unless-stopped
- "{{ data_dir }}/servarr/sonarr_config" recreate: true
- "{{ 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"
@@ -29,14 +48,12 @@
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 - name: Deploy Sonarr Container
include_role: docker_container:
name: docker
vars:
name: sonarr name: sonarr
image: image: lscr.io/linuxserver/sonarr:latest
name: lscr.io/linuxserver/sonarr restart_policy: unless-stopped
tag: latest recreate: true
volumes: volumes:
- "{{ data_dir }}/servarr/sonarr_config:/config" - "{{ data_dir }}/servarr/sonarr_config:/config"
- "{{ SERVARR_MEDIA_PATH }}:/data" - "{{ SERVARR_MEDIA_PATH }}:/data"
@@ -54,14 +71,12 @@
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 - name: Deploy Lidarr Container
include_role: docker_container:
name: docker
vars:
name: lidarr name: lidarr
image: image: lscr.io/linuxserver/lidarr:latest
name: lscr.io/linuxserver/lidarr restart_policy: unless-stopped
tag: latest recreate: true
env: env:
PUID: "{{ PUID }}" PUID: "{{ PUID }}"
PGID: "{{ PGID }}" PGID: "{{ PGID }}"

View File

@@ -1,20 +1,34 @@
--- ---
- name: Deploy Storage API - name: "Create file structure"
include_role: file:
name: docker path: "{{ item }}"
vars: state: directory
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
directories: tag: "latest"
- "{{ data_dir }}/storage-api"
- "{{ data_dir }}/storage-api/app"
- "{{ data_dir }}/storage-api/files"
image:
name: storage-api
tag: latest
build: build:
git: path: "{{ data_dir }}/storage-api/app"
repo: git@git.alexav.gg:alex/storage-api.git dockerfile: Dockerfile
dest: "{{ data_dir }}/storage-api/app" source: build
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,14 +1,23 @@
--- ---
- name: Deploy Tautulli - name: Create folder structure
include_role: file:
name: docker path: "{{ item }}"
vars: state: directory
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
directories: image: ghcr.io/tautulli/tautulli
- "{{ data_dir }}/tautulli" restart_policy: unless-stopped
image: recreate: true
name: ghcr.io/tautulli/tautulli
tag: latest
networks: networks:
- name: homelab - name: homelab
volumes: volumes:

View File

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

View File

@@ -1,16 +1,18 @@
--- ---
- name: Deploy Tinyauth - name: Pull latest Tinyauth Docker Image
include_role: docker_image:
name: docker name: ghcr.io/steveiliop56/tinyauth
vars: tag: v4
source: pull
- name: Create Tinyauth Docker Container
docker_container:
name: tinyauth name: tinyauth
image: image: ghcr.io/steveiliop56/tinyauth:v4
name: ghcr.io/steveiliop56/tinyauth restart_policy: unless-stopped
tag: v4 recreate: true
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 }}"
@@ -26,6 +28,8 @@
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,14 +1,23 @@
--- ---
- name: Deploy Uptime Kuma - name: Create folder structure
include_role: file:
name: docker path: "{{ item }}"
vars: 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 name: uptime-kuma
directories: image: louislam/uptime-kuma
- "{{ data_dir }}/uptime-kuma" restart_policy: unless-stopped
image: recreate: true
name: louislam/uptime-kuma
tag: latest
networks: networks:
- name: homelab - name: homelab
volumes: volumes:

View File

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