Compare commits
1 Commits
2ab47a4085
...
template-e
| Author | SHA1 | Date | |
|---|---|---|---|
| 48690c04a4 |
@@ -4,8 +4,6 @@ docker_network_name:
|
||||
TZ:
|
||||
PUID:
|
||||
PGID:
|
||||
ansible_become_pass:
|
||||
media_path:
|
||||
|
||||
# api
|
||||
API_CONTACT_WEBHOOK:
|
||||
@@ -54,6 +52,14 @@ MASTODON_ARE_PRIMARY:
|
||||
# wings
|
||||
WINGS_URL:
|
||||
WINGS_CONTAINER_DIR:
|
||||
media_path:
|
||||
|
||||
# frigate
|
||||
FRIGATE_RECORDINGS_PATH:
|
||||
|
||||
# plex
|
||||
PLEX_CLAIM_TOKEN:
|
||||
ansible_become_pass:
|
||||
|
||||
# glance
|
||||
GLANCE_PIHOLE_TOKEN:
|
||||
@@ -168,9 +174,3 @@ HELIUM_EXT_HMAC_SECRET:
|
||||
PTERODACTYL_APP_URL:
|
||||
PTERODACTYL_MYSQL_PASSWORD:
|
||||
PTERODACTYL_MYSQL_ROOT_PASSWORD:
|
||||
|
||||
# frigate
|
||||
FRIGATE_RECORDINGS_PATH:
|
||||
|
||||
# plex
|
||||
PLEX_CLAIM_TOKEN:
|
||||
|
||||
6
main.yml
6
main.yml
@@ -61,6 +61,12 @@
|
||||
- name: Deploy Drop
|
||||
import_tasks: tasks/drop.yml
|
||||
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
|
||||
import_tasks: tasks/jackett.yml
|
||||
tags: jackett_deploy
|
||||
|
||||
@@ -25,6 +25,12 @@
|
||||
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 }}"
|
||||
@@ -33,18 +39,11 @@
|
||||
- name: Create Docker Container
|
||||
docker_container:
|
||||
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 }}"
|
||||
command: "{{ command | default(omit) }}"
|
||||
networks: "{{ networks | default(omit) }}"
|
||||
recreate: true
|
||||
restart_policy: unless-stopped
|
||||
networks: "{{ networks }}"
|
||||
volumes: "{{ volumes | default(omit) }}"
|
||||
env: "{{ env | default(omit) }}"
|
||||
labels: "{{ labels | default(omit) }}"
|
||||
healthcheck: "{{ healthcheck | default(omit) }}"
|
||||
devices: "{{ devices | default(omit) }}"
|
||||
mounts: "{{ mounts | default(omit) }}"
|
||||
privileged: "{{ privileged | default(omit) }}"
|
||||
|
||||
@@ -21,10 +21,10 @@ def deploy(tag = None, host = None):
|
||||
command = construct_command(tag, host)
|
||||
|
||||
if tag:
|
||||
print(f"[MAIN] Deploying {tag}...")
|
||||
print(f"Deploying {tag}...\n")
|
||||
else:
|
||||
print(f"[MAIN] Deploying host {host}...")
|
||||
res = subprocess.run(command, shell=True)
|
||||
print(f"Deploying {host}...\n")
|
||||
res = subprocess.run(command, shell=True, stdout=subprocess.DEVNULL)
|
||||
|
||||
return res.returncode == 0
|
||||
|
||||
@@ -75,9 +75,8 @@ def main():
|
||||
|
||||
deployed = []
|
||||
failed = []
|
||||
|
||||
for task in new_diff:
|
||||
deployment = deploy(tag=task.split("/")[1])
|
||||
deployment = deploy(tag=task)
|
||||
|
||||
if not deployment:
|
||||
failed.append(task)
|
||||
|
||||
@@ -10,39 +10,21 @@ if os.path.exists(host_vars_path):
|
||||
|
||||
vaults = os.listdir(host_vars_path)
|
||||
|
||||
# 1st run - extract ungrouped, global 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()
|
||||
|
||||
for line in stdout:
|
||||
if line.startswith("#"):
|
||||
break
|
||||
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()
|
||||
if line.startswith("#") and line not in file_contents:
|
||||
file_contents += f"\n{line}\n"
|
||||
|
||||
has_found_start = False
|
||||
for line in stdout:
|
||||
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'
|
||||
|
||||
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()
|
||||
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!")
|
||||
@@ -13,8 +13,8 @@ def search_for_image(image_name):
|
||||
data = yaml.safe_load(file)
|
||||
|
||||
for key in data:
|
||||
if "vars" in key:
|
||||
if image_name in key["vars"]["image"]["name"] or image_name == key["vars"]["image"]["name"]:
|
||||
if "docker_image" in key:
|
||||
if image_name in key["docker_image"]["name"]:
|
||||
return f"{task.split(".")[0]}_deploy"
|
||||
|
||||
def main():
|
||||
@@ -29,36 +29,24 @@ def main():
|
||||
for task in host['tasks']:
|
||||
deployable_tags.append(task['tags'])
|
||||
|
||||
if len(update_list["images"]) > 0:
|
||||
already_deployed = []
|
||||
actually_updatable = []
|
||||
blacklist = []
|
||||
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 image in blacklist:
|
||||
print(f"[UPDATE] Ignoring '{image}' due to its blacklist")
|
||||
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'] })
|
||||
|
||||
print(f"Redeploying {len(actually_updatable)} container(s)..")
|
||||
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)
|
||||
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")
|
||||
else:
|
||||
print("No images to update!")
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
- "{{ data_dir }}/api/db"
|
||||
image:
|
||||
name: postgres
|
||||
tag: "17"
|
||||
tag: latest
|
||||
networks:
|
||||
- name: api
|
||||
volumes:
|
||||
|
||||
@@ -1,16 +1,29 @@
|
||||
---
|
||||
- name: Deploy Drop Database
|
||||
include_role:
|
||||
name: docker
|
||||
vars:
|
||||
- name: Create folder structure
|
||||
file:
|
||||
path: "{{ item }}"
|
||||
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
|
||||
directories:
|
||||
- "{{ data_dir }}/drop"
|
||||
- "{{ data_dir }}/drop/db"
|
||||
image:
|
||||
name: postgres
|
||||
tag: 14-alpine
|
||||
network_name: drop
|
||||
image: postgres:14-alpine
|
||||
recreate: true
|
||||
restart_policy: unless-stopped
|
||||
networks:
|
||||
- name: drop
|
||||
healthcheck:
|
||||
@@ -26,16 +39,12 @@
|
||||
POSTGRES_USER: "drop"
|
||||
POSTGRES_DB: "drop"
|
||||
|
||||
- name: Deploy Drop
|
||||
include_role:
|
||||
name: docker
|
||||
vars:
|
||||
- name: Create Drop Container
|
||||
docker_container:
|
||||
name: drop
|
||||
directories:
|
||||
- "{{ data_dir }}/drop/app"
|
||||
image:
|
||||
name: ghcr.io/drop-oss/drop
|
||||
tag: latest
|
||||
image: ghcr.io/drop-oss/drop:latest
|
||||
recreate: true
|
||||
restart_policy: unless-stopped
|
||||
networks:
|
||||
- name: homelab
|
||||
- name: drop
|
||||
|
||||
@@ -1,14 +1,23 @@
|
||||
---
|
||||
- name: Deploy Ersatz
|
||||
include_role:
|
||||
name: docker
|
||||
vars:
|
||||
- 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
|
||||
directories:
|
||||
- "{{ data_dir }}/ersatz"
|
||||
image:
|
||||
name: ghcr.io/ersatztv/ersatztv
|
||||
tag: latest
|
||||
image: ghcr.io/ersatztv/ersatztv:latest
|
||||
recreate: true
|
||||
restart_policy: unless-stopped
|
||||
devices:
|
||||
- /dev/dri/renderD128:/dev/dri/renderD128
|
||||
mounts:
|
||||
|
||||
@@ -1,15 +1,24 @@
|
||||
---
|
||||
- name: Deploy Frigate
|
||||
include_role:
|
||||
name: docker
|
||||
vars:
|
||||
- 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
|
||||
directories:
|
||||
- "{{ data_dir }}/frigate"
|
||||
image:
|
||||
name: ghcr.io/blakeblackshear/frigate
|
||||
tag: stable
|
||||
image: ghcr.io/blakeblackshear/frigate:stable
|
||||
recreate: true
|
||||
privileged: true
|
||||
restart_policy: unless-stopped
|
||||
published_ports:
|
||||
- "5000:5000"
|
||||
- "8555:8555/tcp"
|
||||
|
||||
@@ -1,14 +1,23 @@
|
||||
---
|
||||
- name: Deploy Gitea
|
||||
include_role:
|
||||
name: docker
|
||||
vars:
|
||||
- name: Create folder structure
|
||||
file:
|
||||
path: "{{ item }}"
|
||||
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
|
||||
directories:
|
||||
- "{{ data_dir }}/gitea"
|
||||
image:
|
||||
name: docker.gitea.com/gitea
|
||||
tag: latest
|
||||
image: docker.gitea.com/gitea:latest
|
||||
restart_policy: unless-stopped
|
||||
recreate: true
|
||||
networks:
|
||||
- name: "{{ docker_network_name }}"
|
||||
volumes:
|
||||
|
||||
31
tasks/home-assistant.yml
Normal file
31
tasks/home-assistant.yml
Normal 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"
|
||||
@@ -1,15 +1,24 @@
|
||||
---
|
||||
- name: Deploy Homebridge
|
||||
include_role:
|
||||
name: docker
|
||||
vars:
|
||||
- name: Create Folder structure
|
||||
file:
|
||||
path: "{{ item }}"
|
||||
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
|
||||
directories:
|
||||
- "{{ data_dir }}/homebridge:/homebridge"
|
||||
image:
|
||||
name: homebridge/homebridge
|
||||
tag: latest
|
||||
image: homebridge/homebridge:latest
|
||||
restart_policy: unless-stopped
|
||||
network_mode: host
|
||||
recreate: true
|
||||
volumes:
|
||||
- "{{ data_dir }}/homebridge:/homebridge"
|
||||
labels:
|
||||
|
||||
@@ -1,16 +1,34 @@
|
||||
---
|
||||
- name: Deploy Immich DB
|
||||
include_role:
|
||||
name: docker
|
||||
vars:
|
||||
- name: Create folder structure
|
||||
file:
|
||||
path: "{{ item }}"
|
||||
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
|
||||
directories:
|
||||
- "{{ data_dir }}/immich"
|
||||
- "{{ data_dir }}/immich/model-cache"
|
||||
- "{{ data_dir }}/immich/db"
|
||||
image:
|
||||
name: ghcr.io/immich-app/postgres
|
||||
tag: 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
|
||||
recreate: true
|
||||
volumes:
|
||||
- "{{ data_dir }}/immich/db:/var/lib/postgresql/data"
|
||||
env:
|
||||
@@ -20,27 +38,13 @@
|
||||
POSTGRES_INITDB_ARGS: "--data-checksums"
|
||||
networks:
|
||||
- name: immich
|
||||
network_name: immich
|
||||
|
||||
- name: Deploy Immich Redis
|
||||
include_role:
|
||||
name: docker
|
||||
vars:
|
||||
name: immich_redis
|
||||
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
|
||||
- name: Create Immich Server Docker Container
|
||||
docker_container:
|
||||
name: immich_server
|
||||
image: ghcr.io/immich-app/immich-server:v2.1.0
|
||||
restart_policy: unless-stopped
|
||||
recreate: true
|
||||
networks:
|
||||
- name: homelab
|
||||
- name: immich
|
||||
|
||||
39
tasks/jellyfin.yml
Normal file
39
tasks/jellyfin.yml
Normal 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
54
tasks/nextcloud.yml
Normal 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"
|
||||
@@ -1,14 +1,23 @@
|
||||
---
|
||||
- name: Deploy NZBGet
|
||||
include_role:
|
||||
name: docker
|
||||
vars:
|
||||
- name: Create folder structure
|
||||
file:
|
||||
path: "{{ item }}"
|
||||
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
|
||||
directories:
|
||||
- "{{ data_dir }}/nzbget"
|
||||
image:
|
||||
name: lscr.io/linuxserver/nzbget
|
||||
tag: latest
|
||||
image: lscr.io/linuxserver/nzbget:latest
|
||||
restart_policy: unless-stopped
|
||||
recreate: true
|
||||
networks:
|
||||
- name: homelab
|
||||
volumes:
|
||||
|
||||
@@ -1,16 +1,25 @@
|
||||
---
|
||||
- name: Deploy Obsidian
|
||||
include_role:
|
||||
name: docker
|
||||
vars:
|
||||
name: obsidian
|
||||
directories:
|
||||
- "{{ data_dir }}/obsidian"
|
||||
- "{{ data_dir }}/obsidian/data"
|
||||
- "{{ data_dir }}/obsidian/etc"
|
||||
image:
|
||||
name: couchdb
|
||||
tag: latest
|
||||
- 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:
|
||||
|
||||
@@ -1,18 +1,30 @@
|
||||
---
|
||||
- name: Deploy Owncloud Database
|
||||
include_role:
|
||||
name: docker
|
||||
vars:
|
||||
name: owncloud_database
|
||||
image:
|
||||
name: mariadb
|
||||
tag: latest
|
||||
directories:
|
||||
- "{{ data_dir }}/owncloud"
|
||||
- "{{ data_dir }}/owncloud/data"
|
||||
- "{{ data_dir }}/owncloud/db"
|
||||
- "{{ data_dir }}/owncloud/redis"
|
||||
network_name: "owncloud"
|
||||
- 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:
|
||||
@@ -30,14 +42,12 @@
|
||||
timeout: 5s
|
||||
retries: 5
|
||||
|
||||
- name: Deploy Owncloud Redis
|
||||
include_role:
|
||||
name: docker
|
||||
vars:
|
||||
name: owncloud_redis
|
||||
image:
|
||||
name: redis
|
||||
tag: latest
|
||||
- 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"
|
||||
@@ -49,14 +59,12 @@
|
||||
volumes:
|
||||
- "{{ data_dir }}/owncloud/redis:/data"
|
||||
|
||||
- name: Deploy Owncloud
|
||||
include_role:
|
||||
name: docker
|
||||
vars:
|
||||
- name: Create Owncloud Docker Container
|
||||
docker_container:
|
||||
name: owncloud
|
||||
image:
|
||||
name: owncloud/server
|
||||
tag: 10.16
|
||||
image: owncloud/server:10.15
|
||||
restart_policy: unless-stopped
|
||||
recreate: true
|
||||
networks:
|
||||
- name: "{{ docker_network_name }}"
|
||||
- name: owncloud
|
||||
|
||||
@@ -1,19 +1,28 @@
|
||||
---
|
||||
- name: Deploy PiHole
|
||||
include_role:
|
||||
name: docker
|
||||
vars:
|
||||
- name: Create folder structure
|
||||
file:
|
||||
path: "{{ item }}"
|
||||
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
|
||||
directories:
|
||||
- "{{ data_dir }}/pihole"
|
||||
image:
|
||||
name: pihole/pihole
|
||||
tag: latest
|
||||
published_ports:
|
||||
- "53:53/tcp"
|
||||
- "53:53/udp"
|
||||
image: pihole/pihole:latest
|
||||
restart_policy: unless-stopped
|
||||
recreate: true
|
||||
networks:
|
||||
- name: homelab
|
||||
published_ports:
|
||||
- "{{ TRAEFIK_HOST_IP }}:53:53/tcp"
|
||||
- "{{ TRAEFIK_HOST_IP }}:53:53/udp"
|
||||
volumes:
|
||||
- "{{ data_dir }}/pihole:/etc/pihole"
|
||||
env:
|
||||
|
||||
@@ -1,14 +1,23 @@
|
||||
---
|
||||
- name: Deploy PocketID
|
||||
include_role:
|
||||
name: docker
|
||||
vars:
|
||||
- name: Create Folder structure
|
||||
file:
|
||||
path: "{{ item }}"
|
||||
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
|
||||
directories:
|
||||
- "{{ data_dir }}/pocketid"
|
||||
image:
|
||||
name: ghcr.io/pocket-id/pocket-id
|
||||
tag: v1
|
||||
image: ghcr.io/pocket-id/pocket-id:v1
|
||||
restart_policy: unless-stopped
|
||||
recreate: true
|
||||
networks:
|
||||
- name: homelab
|
||||
volumes:
|
||||
|
||||
@@ -1,17 +1,36 @@
|
||||
---
|
||||
- name: Deploy Radarr
|
||||
include_role:
|
||||
name: docker
|
||||
vars:
|
||||
- name: Create folder structure
|
||||
file:
|
||||
path: "{{ item }}"
|
||||
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
|
||||
directories:
|
||||
- "{{ data_dir }}/servarr"
|
||||
- "{{ data_dir }}/servarr/sonarr_config"
|
||||
- "{{ data_dir }}/servarr/radarr_config"
|
||||
- "{{ data_dir }}/servarr/lidarr_config"
|
||||
image:
|
||||
name: lscr.io/linuxserver/radarr
|
||||
tag: latest
|
||||
image: lscr.io/linuxserver/radarr:latest
|
||||
restart_policy: unless-stopped
|
||||
recreate: true
|
||||
volumes:
|
||||
- "{{ data_dir }}/servarr/radarr_config:/config"
|
||||
- "{{ SERVARR_MEDIA_PATH }}:/media"
|
||||
@@ -29,14 +48,12 @@
|
||||
traefik.http.routers.radarr.tls.certresolver: letsencrypt
|
||||
traefik.http.services.radarr.loadbalancer.server.port: "7878"
|
||||
|
||||
- name: Deploy Sonarr
|
||||
include_role:
|
||||
name: docker
|
||||
vars:
|
||||
- name: Deploy Sonarr Container
|
||||
docker_container:
|
||||
name: sonarr
|
||||
image:
|
||||
name: lscr.io/linuxserver/sonarr
|
||||
tag: latest
|
||||
image: lscr.io/linuxserver/sonarr:latest
|
||||
restart_policy: unless-stopped
|
||||
recreate: true
|
||||
volumes:
|
||||
- "{{ data_dir }}/servarr/sonarr_config:/config"
|
||||
- "{{ SERVARR_MEDIA_PATH }}:/data"
|
||||
@@ -54,14 +71,12 @@
|
||||
traefik.http.routers.sonarr.tls.certresolver: letsencrypt
|
||||
traefik.http.services.sonarr.loadbalancer.server.port: "8989"
|
||||
|
||||
- name: Deploy Lidarr
|
||||
include_role:
|
||||
name: docker
|
||||
vars:
|
||||
- name: Deploy Lidarr Container
|
||||
docker_container:
|
||||
name: lidarr
|
||||
image:
|
||||
name: lscr.io/linuxserver/lidarr
|
||||
tag: latest
|
||||
image: lscr.io/linuxserver/lidarr:latest
|
||||
restart_policy: unless-stopped
|
||||
recreate: true
|
||||
env:
|
||||
PUID: "{{ PUID }}"
|
||||
PGID: "{{ PGID }}"
|
||||
|
||||
@@ -1,20 +1,34 @@
|
||||
---
|
||||
- name: Deploy Storage API
|
||||
include_role:
|
||||
name: docker
|
||||
vars:
|
||||
- name: "Create file structure"
|
||||
file:
|
||||
path: "{{ item }}"
|
||||
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
|
||||
directories:
|
||||
- "{{ data_dir }}/storage-api"
|
||||
- "{{ data_dir }}/storage-api/app"
|
||||
- "{{ data_dir }}/storage-api/files"
|
||||
image:
|
||||
name: storage-api
|
||||
tag: latest
|
||||
tag: "latest"
|
||||
build:
|
||||
git:
|
||||
repo: git@git.alexav.gg:alex/storage-api.git
|
||||
dest: "{{ data_dir }}/storage-api/app"
|
||||
path: "{{ data_dir }}/storage-api/app"
|
||||
dockerfile: Dockerfile
|
||||
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:
|
||||
- name: "{{ docker_network_name }}"
|
||||
volumes:
|
||||
|
||||
@@ -1,14 +1,23 @@
|
||||
---
|
||||
- name: Deploy Tautulli
|
||||
include_role:
|
||||
name: docker
|
||||
vars:
|
||||
- name: Create folder structure
|
||||
file:
|
||||
path: "{{ item }}"
|
||||
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
|
||||
directories:
|
||||
- "{{ data_dir }}/tautulli"
|
||||
image:
|
||||
name: ghcr.io/tautulli/tautulli
|
||||
tag: latest
|
||||
image: ghcr.io/tautulli/tautulli
|
||||
restart_policy: unless-stopped
|
||||
recreate: true
|
||||
networks:
|
||||
- name: homelab
|
||||
volumes:
|
||||
|
||||
@@ -1,14 +1,23 @@
|
||||
---
|
||||
- name: Deploy Termix
|
||||
include_role:
|
||||
name: docker
|
||||
vars:
|
||||
- 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
|
||||
directories:
|
||||
- "{{ data_dir }}/termix"
|
||||
image:
|
||||
name: ghcr.io/lukegus/termix
|
||||
tag: latest
|
||||
image: ghcr.io/lukegus/termix:latest
|
||||
restart_policy: unless-stopped
|
||||
recreate: true
|
||||
networks:
|
||||
- name: homelab
|
||||
volumes:
|
||||
|
||||
@@ -1,16 +1,18 @@
|
||||
---
|
||||
- name: Deploy Tinyauth
|
||||
include_role:
|
||||
name: docker
|
||||
vars:
|
||||
- name: Pull latest Tinyauth Docker Image
|
||||
docker_image:
|
||||
name: ghcr.io/steveiliop56/tinyauth
|
||||
tag: v4
|
||||
source: pull
|
||||
|
||||
- name: Create Tinyauth Docker Container
|
||||
docker_container:
|
||||
name: tinyauth
|
||||
image:
|
||||
name: ghcr.io/steveiliop56/tinyauth
|
||||
tag: v4
|
||||
image: ghcr.io/steveiliop56/tinyauth:v4
|
||||
restart_policy: unless-stopped
|
||||
recreate: true
|
||||
networks:
|
||||
- name: homelab
|
||||
volumes:
|
||||
- "/var/run/docker.sock:/var/run/docker.sock"
|
||||
env:
|
||||
USERS: "{{ TINYAUTH_USERS }}"
|
||||
SECRET: "{{ TINYAUTH_SECRET }}"
|
||||
@@ -26,6 +28,8 @@
|
||||
OAUTH_WHITELIST: "{{ TINYAUTH_OAUTH_WHITELIST }}"
|
||||
APP_TITLE: "{{ TINYAUTH_APP_TITLE }}"
|
||||
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`)
|
||||
|
||||
@@ -1,14 +1,23 @@
|
||||
---
|
||||
- name: Deploy Uptime Kuma
|
||||
include_role:
|
||||
name: docker
|
||||
vars:
|
||||
- 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
|
||||
directories:
|
||||
- "{{ data_dir }}/uptime-kuma"
|
||||
image:
|
||||
name: louislam/uptime-kuma
|
||||
tag: latest
|
||||
image: louislam/uptime-kuma
|
||||
restart_policy: unless-stopped
|
||||
recreate: true
|
||||
networks:
|
||||
- name: homelab
|
||||
volumes:
|
||||
|
||||
@@ -1,14 +1,23 @@
|
||||
---
|
||||
- name: Deploy Vaultwarden
|
||||
include_role:
|
||||
name: docker
|
||||
vars:
|
||||
- name: Create folder structure
|
||||
file:
|
||||
path: "{{ item }}"
|
||||
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
|
||||
directories:
|
||||
- "{{ data_dir }}/vaultwarden"
|
||||
image:
|
||||
name: vaultwarden/server
|
||||
tag: latest
|
||||
image: vaultwarden/server:latest
|
||||
restart_policy: unless-stopped
|
||||
recreate: true
|
||||
networks:
|
||||
- name: homelab
|
||||
volumes:
|
||||
|
||||
Reference in New Issue
Block a user