From 50abbf933c402a1da8b962fa0393a03dcb2752df Mon Sep 17 00:00:00 2001 From: Tuan-Dat Tran Date: Tue, 17 Sep 2024 23:44:20 +0200 Subject: [PATCH] First step towards rewrite Signed-off-by: Tuan-Dat Tran --- Homelab Diagram.drawio | 207 - Homelab Diagram.pdf | Bin 86829 -> 0 bytes aya01.yml | 29 - .../traefik/var-log/access.log => genesis | 0 group_vars/all/vars.yml | 535 +- host_vars/genesis.yml | 9 + host_vars/inko.yml | 10 - host_vars/k3s.server.yml | 9 + host_vars/mii.yml | 20 - host_vars/naruto.yml | 23 - host_vars/pi.yml | 23 - inko.yml => k3s.server.yml | 6 +- mii.yml | 20 - naruto.yml | 17 - pi.yml | 17 - production | 16 +- roles/backblaze/tasks/backup.yml | 24 - roles/backblaze/tasks/config.yml | 18 - roles/backblaze/tasks/install.yml | 13 - roles/backblaze/tasks/main.yml | 5 - roles/backblaze/templates/rclone.conf.j2 | 10 - roles/common/tasks/fstab.yml | 42 - roles/common/tasks/main.yml | 1 - roles/docker/tasks/aya01_compose.yml | 96 - roles/docker/tasks/bin.yml | 9 - roles/docker/tasks/cupsd.yml | 19 - roles/docker/tasks/ddns.yml | 16 - roles/docker/tasks/gitea-runner.yml | 11 - roles/docker/tasks/gitea.yml | 12 - roles/docker/tasks/gitlab-runner.yml | 11 - roles/docker/tasks/gitlab.yml | 14 - roles/docker/tasks/gluetun.yml | 11 - roles/docker/tasks/grafana.yml | 22 - roles/docker/tasks/homeassistant.yml | 8 - roles/docker/tasks/hugo.yml | 30 - roles/docker/tasks/install.yml | 67 - roles/docker/tasks/jellyfin.yml | 31 - roles/docker/tasks/kuma.yml | 11 - roles/docker/tasks/lidarr.yml | 13 - roles/docker/tasks/main.yml | 24 - roles/docker/tasks/mii_compose.yml | 5 - roles/docker/tasks/naruto_compose.yml | 13 - roles/docker/tasks/netdata.yaml | 14 - roles/docker/tasks/nginx-proxy-manager.yml | 13 - roles/docker/tasks/pi_compose.yml | 14 - roles/docker/tasks/pihole.yml | 14 - roles/docker/tasks/plex.yml | 22 - roles/docker/tasks/prometheus.yml | 21 - roles/docker/tasks/prowlarr.yml | 11 - roles/docker/tasks/qbit.yml | 12 - roles/docker/tasks/qbit_private.yml | 12 - roles/docker/tasks/radarr.yml | 13 - roles/docker/tasks/softserve.yml | 12 - roles/docker/tasks/sonarr.yml | 13 - roles/docker/tasks/swag.yml | 20 - roles/docker/tasks/syncthing.yml | 18 - roles/docker/tasks/tautulli.yml | 9 - roles/docker/tasks/traefik.yml | 18 - roles/docker/tasks/user_group_setup.yml | 25 - roles/docker/tasks/zoneminder.yml | 30 - roles/docker/templates/aya01/compose.yaml | 518 - roles/docker/templates/aya01/cupsd/cupsd.conf | 196 - .../aya01/ddns-updater/data/config.json | 11 - .../aya01/grafana/etc-grafana/grafana.ini.j2 | 1464 - .../exporter/mikrotik/config/config.yml | 18 - .../aya01/prometheus/prometheus.yml.j2 | 46 - .../templates/aya01/syncthing/syncthing.conf | 1 - .../common/traefik/etc-traefik/traefik.yml | 36 - .../common/traefik/var-log/traefik.log | 0 roles/docker/templates/mii/compose.yaml | 25 - .../mii/swag/site-confs/default.conf | 73 - .../mii/swag/site-confs/plex.subdomain.conf | 31 - .../mii/swag/site-confs/stub.subfolder.conf | 20 - .../swag/site-confs/tautulli.subdomain.conf | 34 - .../site-confs/uptime-kuma.subdomain.conf | 17 - roles/docker/templates/naruto/compose.yaml | 42 - roles/docker/templates/pi/compose.yaml | 68 - roles/node_exporter/vars/main.yml | 8 + roles/power_management/tasks/configure.yml | 24 - roles/power_management/tasks/install.yml | 15 - roles/power_management/tasks/main.yml | 3 - roles/power_management/templates/hdparm.conf | 18 - .../templates/powertop.service | 11 - roles/samba/tasks/config.yaml | 15 - roles/samba/tasks/install.yaml | 46 - roles/samba/tasks/main.yaml | 3 - roles/samba/templates/smb.conf | 14 - roles/shelly/tasks/init.yml | 8 - roles/shelly/tasks/main.yml | 2 - roles/smart_exporter/tasks/get_version.yml | 18 - roles/smart_exporter/tasks/install.yml | 30 - roles/smart_exporter/tasks/main.yml | 4 - roles/smart_exporter/tasks/systemd.yml | 9 - .../templates/smart_exporter.service.j2 | 19 - roles/snmp_exporter/tasks/docker.yml | 15 - roles/snmp_exporter/tasks/main.yml | 3 - roles/snmp_exporter/tasks/setup.yml | 20 - roles/snmp_exporter/templates/snmp.yml.j2 | 57345 ---------------- shelly.yml | 1 - staging | 2 - 100 files changed, 48 insertions(+), 61953 deletions(-) delete mode 100644 Homelab Diagram.drawio delete mode 100644 Homelab Diagram.pdf delete mode 100644 aya01.yml rename roles/docker/templates/common/traefik/var-log/access.log => genesis (100%) create mode 100644 host_vars/genesis.yml delete mode 100644 host_vars/inko.yml create mode 100644 host_vars/k3s.server.yml delete mode 100644 host_vars/mii.yml delete mode 100644 host_vars/naruto.yml delete mode 100644 host_vars/pi.yml rename inko.yml => k3s.server.yml (71%) delete mode 100644 mii.yml delete mode 100644 naruto.yml delete mode 100644 pi.yml delete mode 100644 roles/backblaze/tasks/backup.yml delete mode 100644 roles/backblaze/tasks/config.yml delete mode 100644 roles/backblaze/tasks/install.yml delete mode 100644 roles/backblaze/tasks/main.yml delete mode 100644 roles/backblaze/templates/rclone.conf.j2 delete mode 100644 roles/common/tasks/fstab.yml delete mode 100644 roles/docker/tasks/aya01_compose.yml delete mode 100644 roles/docker/tasks/bin.yml delete mode 100644 roles/docker/tasks/cupsd.yml delete mode 100644 roles/docker/tasks/ddns.yml delete mode 100644 roles/docker/tasks/gitea-runner.yml delete mode 100644 roles/docker/tasks/gitea.yml delete mode 100644 roles/docker/tasks/gitlab-runner.yml delete mode 100644 roles/docker/tasks/gitlab.yml delete mode 100644 roles/docker/tasks/gluetun.yml delete mode 100644 roles/docker/tasks/grafana.yml delete mode 100644 roles/docker/tasks/homeassistant.yml delete mode 100644 roles/docker/tasks/hugo.yml delete mode 100644 roles/docker/tasks/install.yml delete mode 100644 roles/docker/tasks/jellyfin.yml delete mode 100644 roles/docker/tasks/kuma.yml delete mode 100644 roles/docker/tasks/lidarr.yml delete mode 100644 roles/docker/tasks/main.yml delete mode 100644 roles/docker/tasks/mii_compose.yml delete mode 100644 roles/docker/tasks/naruto_compose.yml delete mode 100644 roles/docker/tasks/netdata.yaml delete mode 100644 roles/docker/tasks/nginx-proxy-manager.yml delete mode 100644 roles/docker/tasks/pi_compose.yml delete mode 100644 roles/docker/tasks/pihole.yml delete mode 100644 roles/docker/tasks/plex.yml delete mode 100644 roles/docker/tasks/prometheus.yml delete mode 100644 roles/docker/tasks/prowlarr.yml delete mode 100644 roles/docker/tasks/qbit.yml delete mode 100644 roles/docker/tasks/qbit_private.yml delete mode 100644 roles/docker/tasks/radarr.yml delete mode 100644 roles/docker/tasks/softserve.yml delete mode 100644 roles/docker/tasks/sonarr.yml delete mode 100644 roles/docker/tasks/swag.yml delete mode 100644 roles/docker/tasks/syncthing.yml delete mode 100644 roles/docker/tasks/tautulli.yml delete mode 100644 roles/docker/tasks/traefik.yml delete mode 100644 roles/docker/tasks/user_group_setup.yml delete mode 100644 roles/docker/tasks/zoneminder.yml delete mode 100644 roles/docker/templates/aya01/compose.yaml delete mode 100644 roles/docker/templates/aya01/cupsd/cupsd.conf delete mode 100644 roles/docker/templates/aya01/ddns-updater/data/config.json delete mode 100644 roles/docker/templates/aya01/grafana/etc-grafana/grafana.ini.j2 delete mode 100644 roles/docker/templates/aya01/prometheus/exporter/mikrotik/config/config.yml delete mode 100644 roles/docker/templates/aya01/prometheus/prometheus.yml.j2 delete mode 100644 roles/docker/templates/aya01/syncthing/syncthing.conf delete mode 100644 roles/docker/templates/common/traefik/etc-traefik/traefik.yml delete mode 100644 roles/docker/templates/common/traefik/var-log/traefik.log delete mode 100644 roles/docker/templates/mii/compose.yaml delete mode 100644 roles/docker/templates/mii/swag/site-confs/default.conf delete mode 100644 roles/docker/templates/mii/swag/site-confs/plex.subdomain.conf delete mode 100644 roles/docker/templates/mii/swag/site-confs/stub.subfolder.conf delete mode 100644 roles/docker/templates/mii/swag/site-confs/tautulli.subdomain.conf delete mode 100644 roles/docker/templates/mii/swag/site-confs/uptime-kuma.subdomain.conf delete mode 100644 roles/docker/templates/naruto/compose.yaml delete mode 100644 roles/docker/templates/pi/compose.yaml create mode 100644 roles/node_exporter/vars/main.yml delete mode 100644 roles/power_management/tasks/configure.yml delete mode 100644 roles/power_management/tasks/install.yml delete mode 100644 roles/power_management/tasks/main.yml delete mode 100644 roles/power_management/templates/hdparm.conf delete mode 100644 roles/power_management/templates/powertop.service delete mode 100644 roles/samba/tasks/config.yaml delete mode 100644 roles/samba/tasks/install.yaml delete mode 100644 roles/samba/tasks/main.yaml delete mode 100644 roles/samba/templates/smb.conf delete mode 100644 roles/shelly/tasks/init.yml delete mode 100644 roles/shelly/tasks/main.yml delete mode 100644 roles/smart_exporter/tasks/get_version.yml delete mode 100644 roles/smart_exporter/tasks/install.yml delete mode 100644 roles/smart_exporter/tasks/main.yml delete mode 100644 roles/smart_exporter/tasks/systemd.yml delete mode 100644 roles/smart_exporter/templates/smart_exporter.service.j2 delete mode 100644 roles/snmp_exporter/tasks/docker.yml delete mode 100644 roles/snmp_exporter/tasks/main.yml delete mode 100644 roles/snmp_exporter/tasks/setup.yml delete mode 100644 roles/snmp_exporter/templates/snmp.yml.j2 delete mode 100644 shelly.yml delete mode 100644 staging diff --git a/Homelab Diagram.drawio b/Homelab Diagram.drawio deleted file mode 100644 index 88303fe..0000000 --- a/Homelab Diagram.drawio +++ /dev/null @@ -1,207 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Homelab Diagram.pdf b/Homelab Diagram.pdf deleted file mode 100644 index 233446d29a2281864e0d90540d16d1e1cb22036e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 86829 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ò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 U-tnKy6(kgf0^zZ-NhnGFFK3aI0{{R3 diff --git a/aya01.yml b/aya01.yml deleted file mode 100644 index 679b200..0000000 --- a/aya01.yml +++ /dev/null @@ -1,29 +0,0 @@ ---- -- name: Set up Servers - hosts: aya01 - gather_facts: yes - roles: - - role: common - tags: - - common - - role: samba - tags: - - samba -# - role: power_management -# tags: -# - power_management - - role: backblaze - tags: - - backblaze - - role: node_exporter - tags: - - node_exporter - - role: snmp_exporter - tags: - - snmp_exporter - - role: smart_exporter - tags: - - smart_exporter - - role: docker - tags: - - docker diff --git a/roles/docker/templates/common/traefik/var-log/access.log b/genesis similarity index 100% rename from roles/docker/templates/common/traefik/var-log/access.log rename to genesis diff --git a/group_vars/all/vars.yml b/group_vars/all/vars.yml index 5094bbf..8c123bf 100644 --- a/group_vars/all/vars.yml +++ b/group_vars/all/vars.yml @@ -1,6 +1,7 @@ # # Essential # + user: tudattr timezone: Europe/Berlin rclone_config: "/root/.config/rclone/" @@ -9,537 +10,21 @@ pgid: "1000" pk_path: "/mnt/veracrypt1/genesis" pubkey: "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKqc9fnzfCz8fQDFzla+D8PBhvaMmFu2aF+TYkkZRxl9 tuan@genesis-2022-01-20" - -local_domain: tudattr.dev -local_subdomains: "local" -remote_domain: tudattr.dev -remote_subdomains: "www,plex,status,tautulli" -backup_domain: seyshiro.de -backup_subdomains: "hass,qbit,zm," - -# -# aya01 -# - -aya01_host: "aya01" -aya01_ip: "192.168.20.12" - -# -# mii -# - -mii_host: "mii" -mii_ip: "192.168.200.2" - -# -# naruto -# -naruto_host: "naruto" -naruto_ip: "192.168.20.13" - -# -# pi -# - -pi_host: "pi" -pi_ip: "192.168.20.11" - -# -# inko -# - -inko_host: "inko" -inko_ip: "192.168.20.14" - -# -# Used to download for git releases -# - -go_arch_map: - i386: '386' - x86_64: 'amd64' - aarch64: 'arm64' - armv7l: 'armv7' - armv6l: 'armv6' - -go_arch: "{{ go_arch_map[ansible_architecture] | default(ansible_architecture) }}" - -# -# aya01 - Disks -# - -fstab_entries: -- name: "config" - path: "/opt" - type: "ext4" - uuid: "cad60133-dd84-4a2a-8db4-2881c608addf" -- name: "media0" - path: "/mnt/media0" - type: "ext4" - uuid: "c4c724ec-4fe3-4665-adf4-acd31d6b7f95" -- name: "media1" - path: "/mnt/media1" - type: "ext4" - uuid: "8d66d395-1e35-4f5a-a5a7-d181d6642ebf" - -mergerfs_entries: - - name: "media" - path: "/media" - branches: - - "/mnt/media0" - - "/mnt/media1" - opts: - - "use_ino" - - "allow_other" - - "cache.files=partial" - - "dropcacheonclose=true" - - "category.create=mfs" - type: "fuse.mergerfs" +public_domain: tudattr.dev +internal_domain: seyshiro.de # # Packages # + common_packages: - - sudo + - build-essential + - curl - git - iperf3 - - git - - smartmontools - - vim - - curl - - tree + - neovim - rsync + - smartmontools + - sudo - systemd-timesyncd - - neofetch - - build-essential - - btrfs-progs - -# -# Docker -# -docker_repo_url: https://download.docker.com/linux -docker_apt_gpg_key: "{{ docker_repo_url }}/{{ ansible_distribution | lower }}/gpg" -docker_apt_release_channel: stable -docker_apt_arch: "{{ 'arm64' if ansible_architecture == 'aarch64' else 'amd64' }}" -docker_apt_repository: "deb [arch={{ docker_apt_arch }}] {{ docker_repo_url }}/{{ ansible_distribution | lower }} {{ ansible_distribution_release }} {{ docker_apt_release_channel }}" -docker_network: "172.16.69.0/24" - -docker_compose_dir: /opt/docker/compose -docker_dir: /opt/docker/config -docker_data_dir: /media/docker/data # only available on aya01 - -mysql_user: user - -# -# ZoneMinder -# - -zoneminder_host: "zm" -zoneminder_port: "8081" -zoneminder_network: "172.16.42.0/24" - -zoneminder_root: "{{ docker_dir }}/zm" -zoneminder_config: "{{ zoneminder_root }}/config" -zoneminder_log: "{{ zoneminder_root}}/log" -zoneminder_db: "{{ zoneminder_root}}/db" - -zoneminder_data: "{{ docker_data_dir }}/zm/data" - -# -# Syncthing -# - -syncthing_host: "syncthing" -syncthing_port: "8384" -syncthing_data: "{{docker_data_dir}}/syncthing/" - -# -# Softserve -# - -softserve_data: "{{docker_dir}}/softserve/data" - -# -# cupsd -# - -cupsd_host: "cupsd" -cupsd_port: "631" -cupsd_config: "{{ docker_dir }}/cupsd/" - -# -# Uptime Kuma -# - -kuma_host: "status" -kuma_port: "3001" -kuma_config: "{{ docker_dir }}/kuma/" - -# -# Traefik -# - -traefik: - host: "traefik" - admin: - port: "8080" - config: "{{ docker_dir }}/traefik/etc-traefik/" - data: "{{ docker_dir }}/traefik/var-log/" - letsencrypt: "{{ docker_dir }}/traefik/letsencrypt/" - user: - web: "80" - websecure: "443" - -# -# DynDns Updater -# - -ddns_host: "ddns" -ddns_port: "8000" -ddns_data: "{{ docker_dir }}/ddns-updater/data/" - -# -# Home Assistant -# - -ha_host: "hass" -ha_port: "8123" -ha_config: "{{ docker_dir }}/home-assistant/config/" - -# -# pihole -# - -pihole_host: "pihole" -pihole_port: "8089" -pihole_config: "{{ docker_dir }}/pihole/etc-pihole/" -pihole_dnsmasq: "{{ docker_dir }}/pihole/etc-dnsmasq.d/" - -# -# backblaze -# - -# Directories that will be backupped to backblaze -# MOVED TO HOSTVARS -# backblaze_paths: -# aya01: -# - "{{ docker_compose_dir }}" -# - "{{ docker_dir }}" -# pi: -# - "{{ docker_compose_dir }}" -# - "{{ docker_dir }}" - -# -# samba -# -samba: - dependencies: - - "samba" - - "smbclient" - - "cifs-utils" - user: "smbuser" - group: "smbshare" - config: "templates/smb.conf" - shares: - media: - name: "media" - path: "/media" - paperless: - name: "paperless" - path: "{{ paperless.data.consume }}" - - -# -# netdata -# - -netdata_port: "19999" -netdata_config: "{{ docker_dir }}/netdata/" -netdata_lib: "{{ docker_data_dir }}/netdata/lib/" -netdata_cache: "{{ docker_data_dir }}/netdata/cache" - -# -# Plex -# - -plex_host: "plex" -# plex_ip: "172.16.69.12" -plex_port: "32400" -plex_config: "{{docker_data_dir}}/{{ plex_host }}/config" -plex_tv: "/media/series" -plex_movies: "/media/movies" -plex_music: "/media/songs" - -# -# WireGuard -# - -wg_config: "templates/wg0.conf" -wg_remote_config: "/etc/wireguard/wg0.conf" -wg_service: "wg-quick@wg0.service" -wg_deps: "wireguard" - -wg_ip: "192.168.200.2" -wg_pubkey: "+LaPESyBF6Sb1lqkk4UcestFpXNaKYyyX99tkqwLQhU=" -wg_endpoint: "{{ local_subdomains }}.{{ local_domain }}:51820" -wg_allowed_ips: "192.168.20.0/24,192.168.200.1/32" -wg_dns: "{{ aya01_ip }},{{ pi_ip }},1.1.1.1" - -arr_downloads: "{{ docker_data_dir }}/arr_downloads" -# -# Sonarr -# - -sonarr_port: "8989" -sonarr_host: "sonarr" -sonarr_config: "{{ docker_dir }}/{{ sonarr_host }}/config" -sonarr_media: "{{ plex_tv }}" -sonarr_downloads: "{{ arr_downloads }}/{{ sonarr_host }}" - -# -# Radarr -# - -radarr_port: "7878" -radarr_host: "radarr" -radarr_config: "{{ docker_dir }}/{{ radarr_host }}/config" -radarr_media: "{{ plex_movies }}" -radarr_downloads: "{{ arr_downloads }}/{{ radarr_host }}" - -# -# Lidarr -# - -lidarr_port: "8686" -lidarr_host: "lidarr" -lidarr_config: "{{ docker_dir }}/{{ lidarr_host }}/config" -lidarr_media: "{{ plex_music }}" -lidarr_downloads: "{{ arr_downloads }}/{{ lidarr_host }}" - -# -# Prowlarr -# - -prowlarr_port: "9696" -prowlarr_host: "prowlarr" -prowlarr_config: "{{ docker_dir }}/{{ prowlarr_host }}/config" - -# -# bin -# - -bin_port: "6162" -bin_host: "bin" -bin_upload: "{{ docker_data_dir }}/{{bin_host}}/upload" - -# -# qbittorrentvpn -# - -qbit_port: "8082" -qbit_host: "qbit" -qbit_config: "templates/aya01/qbittorrentvpn/config" - -qbit_remote_config: "{{ docker_dir }}/{{ qbit_host }}/config" -qbit_downloads: "{{ arr_downloads }}" -qbit_type: "openvpn" -qbit_ssl: "no" -qbit_lan: "192.168.20.0/24, 192.168.30.0/24, {{ docker_network }}" -qbit_dns: "{{ aya01_ip }}, {{ pi_ip }}, 1.1.1.1" - -# -# qbittorrentvpn - torrentleech -# - -torrentleech_port: "8083" -torrentleech_host: "torrentleech" -torrentleech_remote_config: "{{ docker_dir }}/{{ torrentleech_host }}/config" - -# -# Home Assistant -# - -hass_port: "" -hass_host: "hass" - -# -# Tautulli -# - -tautulli_port: "8181" -tautulli_host: "tautulli" -tautulli_config: "{{ docker_dir }}/{{ tautulli_host }}/config" - -# -# Code Server -# - -code_port: "8443" -code_host: "code" -code_config: "{{ docker_dir }}/{{ code_host }}/config" - -# -# GlueTun -# - -gluetun_port: "" -gluetun_host: "gluetun" -gluetun_country: "Hungary" -gluetun_config: "{{ docker_dir }}/{{ gluetun_host }}/config" - -# -# NodeExporter -# - -node_exporter: - port: 9100 - host: 'node' - version: 'latest' - serve: 'localhost' - options: '' - bin_path: /usr/local/bin/node_exporter - -# -# Prometheus -# - -prometheus_puid: "65534" -prometheus_pgid: "65534" -prometheus_host: "prometheus" -prometheus_data: "{{docker_data_dir}}/prometheus/" -prometheus_config: "{{docker_dir}}/prometheus/" -prometheus_port: "9090" - -# -# Grafana -# - -grafana_host: "grafana" -grafana_port: "3000" -grafana_data: "{{docker_data_dir}}/grafana/" -grafana_config: "{{docker_dir}}/grafana/config/" -grafana_logs: "{{docker_dir}}/grafana/logs/" -grafana_puid: "472" -grafana_pgid: "472" - -# -# SNMP Exporter -# - -snmp_exporter_port: "9116" -snmp_exporter_target: "192.168.20.1" -snmp_exporter_config: "{{ docker_dir }}/snmp_exporter/" -snmp_exporter_host: "snmp_exporter" - -# -# SMART Exporter -# - -smart_exporter: - port: 9633 - version: 'latest' - options: '--web.listen-address=9633' - bin_path: /usr/local/bin/smart_exporter - -# -# Stirling-pdf -# - -stirling: - host: "stirling" - dns: "pdf" - port: 8084 - -# -# nginx proxy manager -# - -nginx: - host: "nginx" - endpoints: - http: 80 - https: 443 - admin: 8080 - paths: - letsencrypt: "{{docker_dir}}/nginx/letsencrypt" - data: "{{docker_dir}}/nginx/data" - -# -# Jellyfin -# - -jellyfin: - host: "jellyfin" - port: "8096" - config: "{{docker_dir}}/jellyfin/config" - cache: "{{docker_dir}}/jellyfin/cache" - media: - tv: "{{ plex_tv }}" - movies: "{{ plex_movies }}" - music: "{{ plex_music }}" - -# -# paperless-ngx -# - -paperless: - host: "paperless" - port: "8000" - data: - data: "{{ docker_dir }}/paperless/data/data" - media: "{{ docker_dir }}/paperless/data/media" - export: "{{ docker_dir }}/paperless/data/export" - consume: "{{ docker_dir }}/paperless/data/consume" - db: - host: "paperless-sqlite" - db: "paperless" - user: "paperless" - password: "{{ host.paperless.db.password }}" - data: "{{ docker_dir }}/paperless/db/data" - redis: - host: "paperless-redis" - data: "{{ docker_dir }}/paperless/redis/data" - -# -# Homarr -# - -homarr: - host: "homarr" - volumes: - configs: "{{docker_dir}}/homarr/configs" - data: "{{ docker_data_dir }}/homarr/data/" - icons: "{{docker_dir}}/homarr/icons" - -# -# gitea -# - -gitea: - host: "git" - url: "https://git.tudattr.dev" - volumes: - data: "{{ docker_data_dir }}/gitea/data" - config: "{{ docker_dir }}/gitea/config" - ports: - http: "3000" - ssh: "2222" - runner: - host: "gitea-runner-{{ host.hostname }}" - token: "{{ host.gitea.runner.token }}" - name: "{{ host.hostname }}" - volumes: - data: "{{ docker_data_dir }}/gitea/runner/data/" - config: "{{ docker_dir }}/gitea/runner/config/" - config_file: "{{ docker_dir }}/gitea/runner/config/config.yml" - -# -# Jellyseer -# - -jellyseer: - host: "jellyseer" - ports: - http: "5055" - volumes: - config: "{{ docker_dir }}/jellyseer/config" + - tree diff --git a/host_vars/genesis.yml b/host_vars/genesis.yml new file mode 100644 index 0000000..c2afc30 --- /dev/null +++ b/host_vars/genesis.yml @@ -0,0 +1,9 @@ +ansible_user: "{{ user }}" +ansible_host: 192.168.20.12 +ansible_port: 22 +ansible_ssh_private_key_file: "{{ pk_path }}" +ansible_become_pass: "{{ vault.aya01.sudo }}" + +host: + hostname: "k3s.server" + ip: "{{ ansible_host }}" diff --git a/host_vars/inko.yml b/host_vars/inko.yml deleted file mode 100644 index c98d838..0000000 --- a/host_vars/inko.yml +++ /dev/null @@ -1,10 +0,0 @@ -ansible_user: "{{ user }}" -ansible_host: 192.168.20.14 -ansible_port: 22 -ansible_ssh_private_key_file: '{{ pk_path }}' -ansible_become_pass: '{{ vault.inko.sudo }}' - -host: - ip: "{{ ansible_host }}" - fstab: - mergerfs: diff --git a/host_vars/k3s.server.yml b/host_vars/k3s.server.yml new file mode 100644 index 0000000..f3d22d1 --- /dev/null +++ b/host_vars/k3s.server.yml @@ -0,0 +1,9 @@ +ansible_user: "{{ user }}" +ansible_host: 192.168.20.21 +ansible_port: 22 +ansible_ssh_private_key_file: "{{ pk_path }}" +ansible_become_pass: "{{ vault.k3s-server.sudo }}" + +host: + hostname: "k3s.server" + ip: "{{ ansible_host }}" diff --git a/host_vars/mii.yml b/host_vars/mii.yml deleted file mode 100644 index 980ff27..0000000 --- a/host_vars/mii.yml +++ /dev/null @@ -1,20 +0,0 @@ -ansible_user: "{{ user }}" -ansible_host: 202.61.207.139 -ansible_port: 22 -ansible_ssh_private_key_file: '{{ pk_path }}' -ansible_become_pass: '{{ vault.mii.sudo }}' - -host: - hostname: "mii" - ip: "192.168.200.2" - backblaze: - account: "{{ vault.mii.backblaze.account }}" - key: "{{ vault.mii.backblaze.key }}" - remote: "remote:mii-tudattr-dev" - password: "{{ vault.mii.rclone.password }}" - password2: "{{ vault.mii.rclone.password2 }}" - paths: - - "{{ docker_compose_dir }}" - - "{{ docker_dir }}" - fstab: - mergerfs: diff --git a/host_vars/naruto.yml b/host_vars/naruto.yml deleted file mode 100644 index 45a7740..0000000 --- a/host_vars/naruto.yml +++ /dev/null @@ -1,23 +0,0 @@ -ansible_user: "{{ user }}" -ansible_host: 192.168.20.13 -ansible_port: 22 -ansible_ssh_private_key_file: '{{ pk_path }}' -ansible_become_pass: '{{ vault.naruto.sudo }}' - -host: - hostname: "naruto" - ip: "{{ ansible_host }}" - backblaze: - account: "{{ vault.naruto.backblaze.account }}" - key: "{{ vault.naruto.backblaze.key }}" - remote: "remote:naruto-tudattr-dev" - password: "{{ vault.naruto.rclone.password }}" - password2: "{{ vault.naruto.rclone.password2 }}" - paths: - - "{{ docker_compose_dir }}" - - "{{ docker_dir }}" - fstab: - mergerfs: - gitea: - runner: - token: "{{ vault.naruto.gitea.runner.token }}" diff --git a/host_vars/pi.yml b/host_vars/pi.yml deleted file mode 100644 index 1fa6010..0000000 --- a/host_vars/pi.yml +++ /dev/null @@ -1,23 +0,0 @@ -ansible_user: "{{ user }}" -ansible_host: 192.168.20.11 -ansible_port: 22 -ansible_ssh_private_key_file: '{{ pk_path }}' -ansible_become_pass: '{{ vault.pi.sudo }}' - -host: - hostname: "pi" - ip: "{{ ansible_host }}" - backblaze: - account: "{{ vault.pi.backblaze.account }}" - key: "{{ vault.pi.backblaze.key }}" - remote: "remote:pi-tudattr-dev" - password: "{{ vault.pi.rclone.password }}" - password2: "{{ vault.pi.rclone.password2 }}" - paths: - - "{{ docker_compose_dir }}" - - "{{ docker_dir }}" - fstab: - mergerfs: - gitea: - runner: - token: "{{ vault.pi.gitea.runner.token }}" diff --git a/inko.yml b/k3s.server.yml similarity index 71% rename from inko.yml rename to k3s.server.yml index b45da19..eb293c6 100644 --- a/inko.yml +++ b/k3s.server.yml @@ -1,14 +1,14 @@ --- - name: Set up Servers - hosts: inko + hosts: aya01 gather_facts: yes roles: - role: common tags: - common - - role: power_management + - role: k3s-server tags: - - power_management + - k3s-server - role: node_exporter tags: - node_exporter diff --git a/mii.yml b/mii.yml deleted file mode 100644 index 120f012..0000000 --- a/mii.yml +++ /dev/null @@ -1,20 +0,0 @@ ---- -- name: Set up Servers - hosts: mii - gather_facts: yes - roles: - - role: common - tags: - - common - - role: backblaze - tags: - - backblaze - - role: node_exporter - tags: - - node_exporter - - role: docker - tags: - - docker - - role: wireguard - tags: - - wireguard diff --git a/naruto.yml b/naruto.yml deleted file mode 100644 index 766ff49..0000000 --- a/naruto.yml +++ /dev/null @@ -1,17 +0,0 @@ ---- -- name: Set up Servers - hosts: naruto - gather_facts: yes - roles: - - role: common - tags: - - common - - role: samba - tags: - - samba - - role: node_exporter - tags: - - node_exporter - - role: smart_exporter - tags: - - smart_exporter diff --git a/pi.yml b/pi.yml deleted file mode 100644 index 5e6f9d6..0000000 --- a/pi.yml +++ /dev/null @@ -1,17 +0,0 @@ ---- -- name: Set up Raspberry Pis - hosts: pi - gather_facts: yes - roles: - - role: common - tags: - - common - - role: backblaze - tags: - - backblaze - - role: node_exporter - tags: - - node_exporter - - role: docker - tags: - - docker diff --git a/production b/production index cebafff..292ccd9 100644 --- a/production +++ b/production @@ -1,9 +1,11 @@ -[server] -aya01 - -[raspberry] -pi -naruto - [vps] mii + +[k3s] +k3s.server + +[vm] +k3s.server + +[controller] +genesis diff --git a/roles/backblaze/tasks/backup.yml b/roles/backblaze/tasks/backup.yml deleted file mode 100644 index 595492b..0000000 --- a/roles/backblaze/tasks/backup.yml +++ /dev/null @@ -1,24 +0,0 @@ ---- -- name: Shut down docker - systemd: - name: docker - state: stopped - become: true - - # - name: Backing up for "{{ inventory_hostname }}" - # shell: - # cmd: "rclone sync {{ item }} secret:{{ item }} --transfers 16" - # loop: "{{ host.backblaze.paths }}" - # become: true - -- name: Backing up for "{{ inventory_hostname }}" - shell: - cmd: "rclone sync {{ item }} secret:{{ item }} --skip-links" - loop: "{{ host.backblaze.paths }}" - become: true - -- name: Restart docker - systemd: - name: docker - state: started - become: true diff --git a/roles/backblaze/tasks/config.yml b/roles/backblaze/tasks/config.yml deleted file mode 100644 index 4021211..0000000 --- a/roles/backblaze/tasks/config.yml +++ /dev/null @@ -1,18 +0,0 @@ ---- -- name: Create rclone config folder - file: - path: "{{ rclone_config }}" - owner: '0' - group: '0' - mode: '700' - state: directory - become: true - -- name: Copy "rclone.conf" - template: - src: "rclone.conf.j2" - dest: "{{ rclone_config }}/rclone.conf" - owner: '0' - group: '0' - mode: '400' - become: true diff --git a/roles/backblaze/tasks/install.yml b/roles/backblaze/tasks/install.yml deleted file mode 100644 index e47bb27..0000000 --- a/roles/backblaze/tasks/install.yml +++ /dev/null @@ -1,13 +0,0 @@ ---- -- name: Update and upgrade packages - apt: - update_cache: true - upgrade: true - autoremove: true - become: true - -- name: Install rclone - apt: - name: "rclone" - state: present - become: true diff --git a/roles/backblaze/tasks/main.yml b/roles/backblaze/tasks/main.yml deleted file mode 100644 index 9e7df93..0000000 --- a/roles/backblaze/tasks/main.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- - -- include_tasks: install.yml -- include_tasks: config.yml -- include_tasks: backup.yml diff --git a/roles/backblaze/templates/rclone.conf.j2 b/roles/backblaze/templates/rclone.conf.j2 deleted file mode 100644 index 4c535f0..0000000 --- a/roles/backblaze/templates/rclone.conf.j2 +++ /dev/null @@ -1,10 +0,0 @@ -[remote] -type = b2 -account = {{ host.backblaze.account }} -key = {{ host.backblaze.key }} - -[secret] -type = crypt -remote = {{ host.backblaze.remote }} -password = {{ host.backblaze.password }} -password2 = {{ host.backblaze.password2 }} diff --git a/roles/common/tasks/fstab.yml b/roles/common/tasks/fstab.yml deleted file mode 100644 index fee2997..0000000 --- a/roles/common/tasks/fstab.yml +++ /dev/null @@ -1,42 +0,0 @@ ---- -- name: Install dependencies - apt: - name: "mergerfs" - state: present - become: yes - -- name: Create mount folders - file: - path: "{{ item.path }}" - state: directory - loop: "{{ host.fstab if host.fstab is iterable else []}}" - become: true - -- name: Create fstab entries - mount: - src: "UUID={{ item.uuid }}" - path: "{{ item.path }}" - fstype: "{{ item.type }}" - state: present - backup: true - loop: "{{ host.fstab if host.fstab is iterable else []}}" - become: true - register: fstab - -- name: Create/mount mergerfs - mount: - src: "{{ item.branches | join(':') }}" - path: "{{ item.path }}" - fstype: "{{ item.type }}" - opts: "{{ item.opts | join(',') }}" - state: present - backup: true - become: true - loop: "{{ host.mergerfs if host.mergerfs is iterable else []}}" - register: fstab - -- name: Mount all disks - command: mount -a - become: true - when: fstab.changed - diff --git a/roles/common/tasks/main.yml b/roles/common/tasks/main.yml index 3ae9583..f8f1218 100644 --- a/roles/common/tasks/main.yml +++ b/roles/common/tasks/main.yml @@ -3,4 +3,3 @@ - include_tasks: essential.yml - include_tasks: bash.yml - include_tasks: sshd.yml -- include_tasks: fstab.yml diff --git a/roles/docker/tasks/aya01_compose.yml b/roles/docker/tasks/aya01_compose.yml deleted file mode 100644 index 8da47e5..0000000 --- a/roles/docker/tasks/aya01_compose.yml +++ /dev/null @@ -1,96 +0,0 @@ ---- - -# - include_tasks: zoneminder.yml -# tags: -# - zoneminder - -- include_tasks: pihole.yml - tags: - - pihole - -- include_tasks: syncthing.yml - tags: - - syncthing - -# - include_tasks: softserve.yml -# tags: -# - softserve - -- include_tasks: cupsd.yml - tags: - - cupsd - -- include_tasks: kuma.yml - tags: - - kuma - -# - include_tasks: traefik.yml -# tags: -# - traefik - -- include_tasks: plex.yml - tags: - - plex -- include_tasks: ddns.yml - tags: - - ddns - -- include_tasks: homeassistant.yml - tags: - - homeassistant - -- include_tasks: tautulli.yml - tags: - - tautulli - -- include_tasks: sonarr.yml - tags: - - sonarr - -- include_tasks: radarr.yml - tags: - - radarr - -- include_tasks: lidarr.yml - tags: - - lidarr - -- include_tasks: prowlarr.yml - tags: - - prowlarr - -- include_tasks: bin.yml - tags: - - bin - -- include_tasks: gluetun.yml - tags: - - gluetun - -- include_tasks: qbit.yml - tags: - - qbit - -- include_tasks: qbit_private.yml - tags: - - qbit_priv - -- include_tasks: prometheus.yml - tags: - - prometheus - -- include_tasks: grafana.yml - tags: - - grafana - -- include_tasks: jellyfin.yml - tags: - - jellyfin - -- include_tasks: gitea.yml - tags: - - gitea - -- include_tasks: gitea-runner.yml - tags: - - gitea-runner diff --git a/roles/docker/tasks/bin.yml b/roles/docker/tasks/bin.yml deleted file mode 100644 index 17cf85a..0000000 --- a/roles/docker/tasks/bin.yml +++ /dev/null @@ -1,9 +0,0 @@ ---- -- name: Create bin-config directory - file: - path: "{{ bin_upload }}" - owner: "{{ puid }}" - group: "{{ pgid }}" - mode: '755' - state: directory - become: yes diff --git a/roles/docker/tasks/cupsd.yml b/roles/docker/tasks/cupsd.yml deleted file mode 100644 index 07dc746..0000000 --- a/roles/docker/tasks/cupsd.yml +++ /dev/null @@ -1,19 +0,0 @@ ---- -- name: Create cupsd-config directory - file: - path: "{{ item }}" - owner: "{{ puid }}" - group: "{{ pgid }}" - mode: '755' - state: directory - loop: - - "{{ cupsd_config }}" - become: true - -- name: Copy cupsd config - template: - owner: "{{ puid }}" - src: "templates/aya01/cupsd/cupsd.conf" - dest: "{{ cupsd_config }}/cupsd.conf" - mode: '660' - become: true diff --git a/roles/docker/tasks/ddns.yml b/roles/docker/tasks/ddns.yml deleted file mode 100644 index af16be3..0000000 --- a/roles/docker/tasks/ddns.yml +++ /dev/null @@ -1,16 +0,0 @@ ---- -- name: Create ddns-config directory - file: - path: "{{ docker_dir }}/ddns-updater/data/" - owner: 1000 - group: 1000 - mode: '700' - state: directory - -- name: Copy ddns-config - template: - owner: 1000 - src: "templates/{{host.hostname}}/ddns-updater/data/config.json" - dest: "{{ docker_dir }}/ddns-updater/data/config.json" - mode: '400' - diff --git a/roles/docker/tasks/gitea-runner.yml b/roles/docker/tasks/gitea-runner.yml deleted file mode 100644 index 93e2349..0000000 --- a/roles/docker/tasks/gitea-runner.yml +++ /dev/null @@ -1,11 +0,0 @@ ---- -- name: Create gitea-runner directories - file: - path: "{{ item }}" - owner: "{{ puid }}" - group: "{{ pgid }}" - mode: '755' - state: directory - become: yes - loop: - - "{{ gitea.runner.volumes.data }}" diff --git a/roles/docker/tasks/gitea.yml b/roles/docker/tasks/gitea.yml deleted file mode 100644 index 8aa2c06..0000000 --- a/roles/docker/tasks/gitea.yml +++ /dev/null @@ -1,12 +0,0 @@ ---- -- name: Create gitea directories - file: - path: "{{ item }}" - owner: "{{ puid }}" - group: "{{ pgid }}" - mode: '755' - state: directory - become: yes - loop: - - "{{ gitea.volumes.data }}" - - "{{ gitea.volumes.config }}" diff --git a/roles/docker/tasks/gitlab-runner.yml b/roles/docker/tasks/gitlab-runner.yml deleted file mode 100644 index 3d73190..0000000 --- a/roles/docker/tasks/gitlab-runner.yml +++ /dev/null @@ -1,11 +0,0 @@ ---- -- name: Create gitlab-runner directories - file: - path: "{{ item }}" - owner: "{{ puid }}" - group: "{{ pgid }}" - mode: '755' - state: directory - become: yes - loop: - - "{{ gitlab.runner.volumes.config }}" diff --git a/roles/docker/tasks/gitlab.yml b/roles/docker/tasks/gitlab.yml deleted file mode 100644 index 0351ed8..0000000 --- a/roles/docker/tasks/gitlab.yml +++ /dev/null @@ -1,14 +0,0 @@ ---- - -- name: Create gitlab-config - file: - path: "{{ item }}" - owner: "{{ gitlab.puid }}" - group: "{{ gitlab.pgid }}" - mode: '755' - state: directory - become: yes - loop: - - "{{ gitlab.paths.config }}" - - "{{ gitlab.paths.logs }}" - - "{{ gitlab.paths.data }}" diff --git a/roles/docker/tasks/gluetun.yml b/roles/docker/tasks/gluetun.yml deleted file mode 100644 index a56704b..0000000 --- a/roles/docker/tasks/gluetun.yml +++ /dev/null @@ -1,11 +0,0 @@ ---- -- name: Create gluetun-config directory - file: - path: "{{ item }}" - owner: "{{ puid }}" - group: "{{ pgid }}" - mode: '775' - state: directory - loop: - - "{{ gluetun_config}}" - become: true diff --git a/roles/docker/tasks/grafana.yml b/roles/docker/tasks/grafana.yml deleted file mode 100644 index 260e0f3..0000000 --- a/roles/docker/tasks/grafana.yml +++ /dev/null @@ -1,22 +0,0 @@ ---- -- name: Create grafana data directory - file: - path: "{{ item }}" - owner: "{{ grafana_puid }}" - group: "{{ grafana_pgid }}" - mode: '755' - state: directory - loop: - - "{{ grafana_data }}" - - "{{ grafana_config }}" - become: true - -- name: Copy grafana config - template: - owner: "{{ grafana_puid }}" - group: "{{ grafana_pgid }}" - src: "templates/aya01/grafana/etc-grafana/grafana.ini.j2" - dest: "{{ grafana_config }}/grafana.ini" - mode: '644' - become: true - diff --git a/roles/docker/tasks/homeassistant.yml b/roles/docker/tasks/homeassistant.yml deleted file mode 100644 index 766d37d..0000000 --- a/roles/docker/tasks/homeassistant.yml +++ /dev/null @@ -1,8 +0,0 @@ ---- - -- name: Create homeassistant-config directory - file: - path: "{{ ha_config }}" - mode: '755' - state: directory - become: true diff --git a/roles/docker/tasks/hugo.yml b/roles/docker/tasks/hugo.yml deleted file mode 100644 index 84ca038..0000000 --- a/roles/docker/tasks/hugo.yml +++ /dev/null @@ -1,30 +0,0 @@ ---- -- name: Create zoneminder user - user: - name: zm - uid: 911 - shell: /bin/false - become: true - -- name: Create Zoneminder config directory - file: - path: "{{ item }}" - owner: 911 - group: 911 - mode: '700' - state: directory - loop: - - "{{ zoneminder_config }}" - become: true - -- name: Create Zoneminder data directory - file: - path: "{{ item }}" - owner: 911 - group: 911 - mode: '755' - state: directory - loop: - - "{{ zoneminder_data }}" - become: true - diff --git a/roles/docker/tasks/install.yml b/roles/docker/tasks/install.yml deleted file mode 100644 index e0d2504..0000000 --- a/roles/docker/tasks/install.yml +++ /dev/null @@ -1,67 +0,0 @@ ---- -- name: Uninstall old versions - apt: - name: "{{ item }}" - state: absent - purge: true - loop: - - docker - - docker-engine - - docker.io - - containerd - - runc - become: true - -- name: Update cache - apt: - update_cache: true - become: true - -- name: Install dependencies for apt to use repositories over HTTPS - apt: - name: "{{ item }}" - state: present - loop: - - ca-certificates - - curl - - gnupg - - lsb-release - become: true - -- name: Create keyrings direcoty - ansible.builtin.file: - path: /etc/apt/keyrings - state: directory - mode: '0755' - become: true - -- name: Add Docker apt key. - ansible.builtin.get_url: - url: "{{ docker_apt_gpg_key }}" - dest: /etc/apt/trusted.gpg.d/docker.asc - mode: '0664' - force: true - become: true - -- name: Add Docker repository. - apt_repository: - repo: "{{ docker_apt_repository }}" - state: present - become: true - -- name: Update cache - apt: - update_cache: true - become: true - -- name: Install Docker Engine, containerd, and Docker Compose. - apt: - name: "{{ item }}" - state: present - loop: - - docker-ce - - docker-ce-cli - - docker-compose-plugin - - containerd.io - become: true - diff --git a/roles/docker/tasks/jellyfin.yml b/roles/docker/tasks/jellyfin.yml deleted file mode 100644 index 8399c84..0000000 --- a/roles/docker/tasks/jellyfin.yml +++ /dev/null @@ -1,31 +0,0 @@ ---- -- name: Create jellyfin-config directory - file: - path: "{{ jellyfin.config }}" - owner: "{{ puid }}" - group: "{{ pgid }}" - mode: '755' - state: directory - become: yes - -- name: Create jellyfin-cache directory - file: - path: "{{ jellyfin.cache }}" - owner: "{{ puid }}" - group: "{{ pgid }}" - mode: '755' - state: directory - become: yes - -- name: Create jellyfin media directories - file: - path: "{{ item }}" - owner: "{{ puid }}" - group: "{{ pgid }}" - mode: '755' - state: directory - become: yes - loop: - - "{{ jellyfin.media.tv }}" - - "{{ jellyfin.media.movies }}" - - "{{ jellyfin.media.music }}" diff --git a/roles/docker/tasks/kuma.yml b/roles/docker/tasks/kuma.yml deleted file mode 100644 index 6b24c06..0000000 --- a/roles/docker/tasks/kuma.yml +++ /dev/null @@ -1,11 +0,0 @@ ---- -- name: Create kuma-config directory - file: - path: "{{ item }}" - owner: "{{ puid }}" - group: "{{ pgid }}" - mode: '755' - state: directory - loop: - - "{{ kuma_config }}" - become: true diff --git a/roles/docker/tasks/lidarr.yml b/roles/docker/tasks/lidarr.yml deleted file mode 100644 index 58c0afa..0000000 --- a/roles/docker/tasks/lidarr.yml +++ /dev/null @@ -1,13 +0,0 @@ ---- -- name: Create lidarr directories - file: - path: "{{ item }}" - owner: "{{ puid }}" - group: "{{ pgid }}" - mode: '755' - state: directory - become: yes - loop: - - "{{ lidarr_config }}" - - "{{ lidarr_media }}" - - "{{ lidarr_downloads }}" diff --git a/roles/docker/tasks/main.yml b/roles/docker/tasks/main.yml deleted file mode 100644 index 0600542..0000000 --- a/roles/docker/tasks/main.yml +++ /dev/null @@ -1,24 +0,0 @@ ---- -- include_tasks: install.yml - -- include_tasks: user_group_setup.yml - -- name: Copy the compose file - template: - src: templates/{{ inventory_hostname }}/compose.yaml - dest: "{{ docker_compose_dir }}/compose.yaml" - register: compose - -- include_tasks: "{{ inventory_hostname }}_compose.yml" - tags: - - reload_compose - -- name: Update docker Images - shell: - cmd: "docker compose pull" - chdir: "{{ docker_compose_dir }}" - -- name: Rebuilding docker images - shell: - cmd: "docker compose up -d --build" - chdir: "{{ docker_compose_dir }}" diff --git a/roles/docker/tasks/mii_compose.yml b/roles/docker/tasks/mii_compose.yml deleted file mode 100644 index bb640a9..0000000 --- a/roles/docker/tasks/mii_compose.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- - -- include_tasks: nginx-proxy-manager.yml - tags: - - nginx diff --git a/roles/docker/tasks/naruto_compose.yml b/roles/docker/tasks/naruto_compose.yml deleted file mode 100644 index 8ead74f..0000000 --- a/roles/docker/tasks/naruto_compose.yml +++ /dev/null @@ -1,13 +0,0 @@ ---- - -- include_tasks: nginx-proxy-manager.yml - tags: - - nginx - -- include_tasks: pihole.yml - tags: - - pihole - -- include_tasks: gitea-runner.yml - tags: - - gitea-runner diff --git a/roles/docker/tasks/netdata.yaml b/roles/docker/tasks/netdata.yaml deleted file mode 100644 index 3e9da3f..0000000 --- a/roles/docker/tasks/netdata.yaml +++ /dev/null @@ -1,14 +0,0 @@ ---- - -- name: Create netdata dirs - file: - path: "{{ item }}" - owner: 1000 - group: 1000 - mode: '777' - state: directory - loop: - - "{{ netdata_config }}" - - "{{ netdata_cache }}" - - "{{ netdata_lib }}" - become: true diff --git a/roles/docker/tasks/nginx-proxy-manager.yml b/roles/docker/tasks/nginx-proxy-manager.yml deleted file mode 100644 index c6a7328..0000000 --- a/roles/docker/tasks/nginx-proxy-manager.yml +++ /dev/null @@ -1,13 +0,0 @@ ---- - -- name: Create nginx-data directory - file: - path: "{{ item }}" - owner: "{{ puid }}" - group: "{{ pgid }}" - mode: '755' - state: directory - loop: - - "{{ nginx.paths.letsencrypt }}" - - "{{ nginx.paths.data }}" - become: yes diff --git a/roles/docker/tasks/pi_compose.yml b/roles/docker/tasks/pi_compose.yml deleted file mode 100644 index a70772e..0000000 --- a/roles/docker/tasks/pi_compose.yml +++ /dev/null @@ -1,14 +0,0 @@ ---- - -- include_tasks: nginx-proxy-manager.yml - tags: - - nginx - -- include_tasks: pihole.yml - tags: - - pihole - -- include_tasks: gitea-runner.yml - tags: - - gitea-runner - diff --git a/roles/docker/tasks/pihole.yml b/roles/docker/tasks/pihole.yml deleted file mode 100644 index a7ca11a..0000000 --- a/roles/docker/tasks/pihole.yml +++ /dev/null @@ -1,14 +0,0 @@ ---- -- name: Create pihole-config directory - file: - path: "{{ item }}" - owner: "{{ puid }}" - group: "{{ pgid }}" - mode: '755' - state: directory - loop: - - "{{ docker_dir }}/pihole/etc-pihole/" - - "{{ docker_dir }}/pihole/etc-dnsmasq.d/" - become: true - - diff --git a/roles/docker/tasks/plex.yml b/roles/docker/tasks/plex.yml deleted file mode 100644 index 8ce9ad5..0000000 --- a/roles/docker/tasks/plex.yml +++ /dev/null @@ -1,22 +0,0 @@ ---- -- name: Create plex-config directory - file: - path: "{{ plex_config }}" - owner: "{{ puid }}" - group: "{{ pgid }}" - mode: '755' - state: directory - become: yes - -- name: Create plex media directories - file: - path: "{{ item }}" - owner: "{{ puid }}" - group: "{{ pgid }}" - mode: '755' - state: directory - become: yes - loop: - - "{{ plex_tv }}" - - "{{ plex_movies }}" - - "{{ plex_music }}" diff --git a/roles/docker/tasks/prometheus.yml b/roles/docker/tasks/prometheus.yml deleted file mode 100644 index 0545ab3..0000000 --- a/roles/docker/tasks/prometheus.yml +++ /dev/null @@ -1,21 +0,0 @@ ---- -- name: Create prometheus dirs - file: - path: "{{ item }}" - owner: "{{ prometheus_puid }}" - group: "{{ prometheus_pgid }}" - mode: '755' - state: directory - loop: - - "{{ prometheus_config }}" - - "{{ prometheus_data }}" - become: true - -- name: Place prometheus config - template: - owner: "{{ prometheus_puid }}" - group: "{{ prometheus_pgid}}" - src: "templates/aya01/prometheus/prometheus.yml.j2" - dest: "{{ prometheus_config }}/prometheus.yml" - mode: '644' - become: true diff --git a/roles/docker/tasks/prowlarr.yml b/roles/docker/tasks/prowlarr.yml deleted file mode 100644 index 01a2daa..0000000 --- a/roles/docker/tasks/prowlarr.yml +++ /dev/null @@ -1,11 +0,0 @@ ---- -- name: Create prowlarr directories - file: - path: "{{ item }}" - owner: "{{ puid }}" - group: "{{ pgid }}" - mode: '755' - state: directory - become: yes - loop: - - "{{ prowlarr_config }}" diff --git a/roles/docker/tasks/qbit.yml b/roles/docker/tasks/qbit.yml deleted file mode 100644 index be331c0..0000000 --- a/roles/docker/tasks/qbit.yml +++ /dev/null @@ -1,12 +0,0 @@ ---- -- name: Create qbit-config directory - file: - path: "{{ item }}" - owner: "{{ puid }}" - group: "{{ pgid }}" - mode: '775' - state: directory - loop: - - "{{ qbit_remote_config }}" - - "{{ qbit_downloads }}" - become: true diff --git a/roles/docker/tasks/qbit_private.yml b/roles/docker/tasks/qbit_private.yml deleted file mode 100644 index f0c617a..0000000 --- a/roles/docker/tasks/qbit_private.yml +++ /dev/null @@ -1,12 +0,0 @@ ---- -- name: Create qbit_torrentleech-config directory - file: - path: "{{ item }}" - owner: "{{ puid }}" - group: "{{ pgid }}" - mode: '775' - state: directory - loop: - - "{{ torrentleech_remote_config }}" - - "{{ qbit_downloads }}" - become: true diff --git a/roles/docker/tasks/radarr.yml b/roles/docker/tasks/radarr.yml deleted file mode 100644 index 812e3a6..0000000 --- a/roles/docker/tasks/radarr.yml +++ /dev/null @@ -1,13 +0,0 @@ ---- -- name: Create radarr directories - file: - path: "{{ item }}" - owner: "{{ puid }}" - group: "{{ pgid }}" - mode: '755' - state: directory - become: yes - loop: - - "{{ radarr_config }}" - - "{{ radarr_media }}" - - "{{ radarr_downloads }}" diff --git a/roles/docker/tasks/softserve.yml b/roles/docker/tasks/softserve.yml deleted file mode 100644 index c8483d6..0000000 --- a/roles/docker/tasks/softserve.yml +++ /dev/null @@ -1,12 +0,0 @@ ---- - -- name: Create soft-serve directory - file: - path: "{{ item }}" - owner: "{{ puid }}" - group: "{{ pgid }}" - mode: '755' - state: directory - loop: - - "{{ softserve_data }}" - become: true diff --git a/roles/docker/tasks/sonarr.yml b/roles/docker/tasks/sonarr.yml deleted file mode 100644 index 6eeaaee..0000000 --- a/roles/docker/tasks/sonarr.yml +++ /dev/null @@ -1,13 +0,0 @@ ---- -- name: Create sonarr directories - file: - path: "{{ item }}" - owner: "{{ puid }}" - group: "{{ pgid }}" - mode: '755' - state: directory - become: yes - loop: - - "{{ sonarr_config }}" - - "{{ sonarr_media }}" - - "{{ sonarr_downloads }}" diff --git a/roles/docker/tasks/swag.yml b/roles/docker/tasks/swag.yml deleted file mode 100644 index b43efb4..0000000 --- a/roles/docker/tasks/swag.yml +++ /dev/null @@ -1,20 +0,0 @@ ---- - -- name: Create swag-config directory - file: - path: "{{ item }}" - owner: "{{ puid }}" - group: "{{ pgid }}" - state: directory - loop: - - "{{ swag_config }}" - -- name: Copy site-confs - template: - owner: "{{ puid }}" - group: "{{ pgid }}" - src: "{{ item }}" - dest: "{{ swag_remote_site_confs }}" - mode: '664' - loop: "{{ swag_site_confs }}" - become: true diff --git a/roles/docker/tasks/syncthing.yml b/roles/docker/tasks/syncthing.yml deleted file mode 100644 index 9a897b8..0000000 --- a/roles/docker/tasks/syncthing.yml +++ /dev/null @@ -1,18 +0,0 @@ ---- -- name: Create syncthing directory - file: - path: "{{ item }}" - owner: "{{ puid }}" - group: "{{ pgid }}" - mode: '755' - state: directory - loop: - - "{{ syncthing_data }}" - become: true - -- name: Resolve inotify error for syncthing - template: - src: "templates/aya01/syncthing/syncthing.conf" - dest: "/etc/sysctl.d/syncthing.conf" - mode: "660" - become: true diff --git a/roles/docker/tasks/tautulli.yml b/roles/docker/tasks/tautulli.yml deleted file mode 100644 index 48fa4d0..0000000 --- a/roles/docker/tasks/tautulli.yml +++ /dev/null @@ -1,9 +0,0 @@ ---- -- name: Create tautulli-config directory - file: - path: "{{ tautulli_config }}" - owner: "{{ puid }}" - group: "{{ pgid }}" - mode: '755' - state: directory - become: yes diff --git a/roles/docker/tasks/traefik.yml b/roles/docker/tasks/traefik.yml deleted file mode 100644 index d69ceaa..0000000 --- a/roles/docker/tasks/traefik.yml +++ /dev/null @@ -1,18 +0,0 @@ ---- - -- name: Create traefik-config directory - file: - path: "{{ item }}" - owner: "{{ puid }}" - group: "{{ pgid }}" - state: directory - loop: - - "{{ docker_dir }}/traefik/etc-traefik/" - - "{{ docker_dir }}/traefik/var-log/" - -- name: Copy traefik-config - template: - owner: 1000 - src: "templates/common/traefik/etc-traefik/traefik.yml" - dest: "{{ traefik.config }}" - mode: '400' diff --git a/roles/docker/tasks/user_group_setup.yml b/roles/docker/tasks/user_group_setup.yml deleted file mode 100644 index e0cab68..0000000 --- a/roles/docker/tasks/user_group_setup.yml +++ /dev/null @@ -1,25 +0,0 @@ ---- -- name: Ensure group "docker" exists - group: - name: docker - state: present - become: yes - -- name: Append the group "docker" to "{{ user }}" groups - ansible.builtin.user: - name: "{{ user }}" - shell: /bin/bash - groups: docker - append: yes - become: yes - -- name: Make sure that the docker folders exists - ansible.builtin.file: - path: "{{ item }}" - owner: "{{ user }}" - group: "{{ user }}" - state: directory - loop: - - "{{docker_compose_dir}}" - - "{{docker_dir}}" - become: yes diff --git a/roles/docker/tasks/zoneminder.yml b/roles/docker/tasks/zoneminder.yml deleted file mode 100644 index f15e0d3..0000000 --- a/roles/docker/tasks/zoneminder.yml +++ /dev/null @@ -1,30 +0,0 @@ ---- -- name: Create zoneminder user - user: - name: zm - uid: '911' - shell: /bin/false - become: true - -- name: Create Zoneminder config directory - file: - path: "{{ item }}" - owner: '911' - group: '911' - mode: '755' - state: directory - loop: - - "{{ zoneminder_config }}" - become: true - -- name: Create Zoneminder data directory - file: - path: "{{ item }}" - owner: '911' - group: '911' - mode: '755' - state: directory - loop: - - "{{ zoneminder_data }}" - become: true - diff --git a/roles/docker/templates/aya01/compose.yaml b/roles/docker/templates/aya01/compose.yaml deleted file mode 100644 index dae8d37..0000000 --- a/roles/docker/templates/aya01/compose.yaml +++ /dev/null @@ -1,518 +0,0 @@ -version: '3' -services: - nginx: - container_name: "{{nginx.host}}" - image: 'jc21/nginx-proxy-manager:latest' - restart: unless-stopped - networks: - net: {} - ports: - - '{{nginx.endpoints.http}}:80' - - '{{nginx.endpoints.https}}:443' - - '{{nginx.endpoints.admin}}:81' - volumes: - - "{{nginx.paths.data}}:/data" - - "{{nginx.paths.letsencrypt}}:/etc/letsencrypt" - - '/var/run/docker.sock:/var/run/docker.sock' - - pihole: - container_name: pihole - image: pihole/pihole:latest - restart: unless-stopped - depends_on: - - nginx - networks: - - net - ports: - - "53:53/tcp" - - "53:53/udp" - volumes: - - "/etc/localtime:/etc/localtime:ro" - - "{{ pihole_config }}:/etc/pihole/" - - "{{ pihole_dnsmasq }}:/etc/dnsmasq.d/" - environment: - - PUID={{puid}} - - PGID={{pgid}} - - TZ={{timezone}} - - "WEBPASSWORD={{ vault_aya01_pihole_password }}" - - "ServerIP={{ host.ip }}" - - "INTERFACE=eth0" - - "DNS1=1.1.1.1" - - "DNS1=1.0.0.1" - dns: - - 127.0.0.1 - - 1.1.1.1 - cap_add: - - NET_ADMIN - - syncthing: - image: syncthing/syncthing - container_name: syncthing - restart: unless-stopped - depends_on: - - pihole - networks: - - net - ports: - - 22000:22000/tcp # TCP file transfers - - 22000:22000/udp # QUIC file transfers - - 21027:21027/udp # Receive local discovery broadcasts - volumes: - - "{{syncthing_data}}:/var/syncthing" - environment: - - PUID={{puid}} - - PGID={{pgid}} - - TZ={{timezone}} - hostname: syncthing - - cupsd: - container_name: cupsd - image: olbat/cupsd - restart: unless-stopped - depends_on: - - pihole - networks: - - net - environment: - - PUID={{puid}} - - PGID={{pgid}} - - TZ={{timezone}} - volumes: - - /var/run/dbus:/var/run/dbus - - "{{cupsd_config}}:/etc/cups" - - kuma: - container_name: kuma - image: louislam/uptime-kuma:1 - restart: unless-stopped - depends_on: - - pihole - networks: - - net - environment: - - PUID={{puid}} - - PGID={{pgid}} - - TZ={{timezone}} - ports: - - "{{kuma_port}}:3001" - volumes: - - "{{ kuma_config }}:/app/data" - - plex: - image: lscr.io/linuxserver/plex:latest - container_name: plex - restart: unless-stopped - depends_on: - - pihole - networks: - - net - devices: - - /dev/dri:/dev/dri - ports: - - "{{ plex_port }}:32400" - - "1900:1900" - - "3005:3005" - - "5353:5353" - - "32410:32410" - - "8324:8324" - - "32412:32412" - - "32469:32469" - environment: - - PUID={{puid}} - - PGID={{pgid}} - - TZ={{timezone}} - - VERSION=docker - volumes: - - "{{ plex_config }}:/config" - - "{{ plex_tv }}:/tv:ro" - - "{{ plex_movies }}:/movies:ro" - - "{{ plex_music }}:/music:ro" - - sonarr: - image: lscr.io/linuxserver/sonarr:latest - container_name: sonarr - restart: unless-stopped - depends_on: - - prowlarr - networks: - - net - environment: - - PUID={{ puid }} - - PGID={{ pgid }} - - TZ={{ timezone }} - volumes: - - {{ sonarr_config }}:/config - - {{ sonarr_media }}:/tv #optional - - {{ sonarr_downloads }}:/downloads #optional - - radarr: - image: lscr.io/linuxserver/radarr:latest - container_name: radarr - restart: unless-stopped - depends_on: - - prowlarr - networks: - - net - environment: - - PUID={{ puid }} - - PGID={{ pgid }} - - TZ={{ timezone }} - volumes: - - {{ radarr_config }}:/config - - {{ radarr_media }}:/movies #optional - - {{ radarr_downloads }}:/downloads #optional - - lidarr: - image: lscr.io/linuxserver/lidarr:latest - container_name: lidarr - restart: unless-stopped - depends_on: - - prowlarr - networks: - - net - environment: - - PUID={{ puid }} - - PGID={{ pgid }} - - TZ={{ timezone }} - volumes: - - {{ lidarr_config }}:/config - - {{ lidarr_media }}:/music #optional - - {{ lidarr_downloads }}:/downloads #optional - - prowlarr: - image: lscr.io/linuxserver/prowlarr:latest - container_name: prowlarr - restart: unless-stopped - depends_on: - - pihole - networks: - - net - environment: - - PUID={{ puid }} - - PGID={{ pgid }} - - TZ={{ timezone }} - volumes: - - {{ prowlarr_config }}:/config - - pastebin: - image: wantguns/bin - container_name: pastebin - restart: unless-stopped - depends_on: - - pihole - networks: - - net - environment: - - PUID={{ puid }} - - PGID={{ pgid }} - - TZ={{ timezone }} - - ROCKET_PORT={{ bin_port }} - - HOST_URL={{ bin_host }}.{{ aya01_host }}.{{ local_domain }} - volumes: - - {{ bin_upload }}:/app/upload - - tautulli: - image: lscr.io/linuxserver/tautulli:latest - container_name: tautulli - restart: unless-stopped - depends_on: - - plex - networks: - - net - environment: - - PUID={{ puid }} - - PGID={{ pgid}} - - TZ={{ timezone }} - ports: - - "{{ tautulli_port }}:8181" - volumes: - - {{ tautulli_config}}:/config - - {{ gluetun_host }}: - image: qmcgaw/gluetun - container_name: {{ gluetun_host }} - restart: unless-stopped - networks: - - net - cap_add: - - NET_ADMIN - devices: - - /dev/net/tun:/dev/net/tun - volumes: - - {{ gluetun_config }}:/gluetun - environment: - - PUID={{puid}} - - PGID={{pgid}} - - TZ={{ timezone }} - - VPN_SERVICE_PROVIDER=protonvpn - - UPDATER_VPN_SERVICE_PROVIDERS=protonvpn - - UPDATER_PERIOD=24h - - SERVER_COUNTRIES={{ gluetun_country }} - - OPENVPN_USER={{ vault_qbit_vpn_user }}+pmp - - OPENVPN_PASSWORD={{ vault_qbit_vpn_password }} - - {{ torrentleech_host }}: - image: qbittorrentofficial/qbittorrent-nox - container_name: {{ torrentleech_host }} - restart: unless-stopped - depends_on: - - gluetun - - sonarr - - radarr - - lidarr - network_mode: "container:{{ gluetun_host }}" - environment: - - PUID={{ puid }} - - PGID={{ pgid }} - - TZ={{ timezone }} - - QBT_EULA="accept" - - QBT_WEBUI_PORT="{{ torrentleech_port }}" - volumes: - - {{ torrentleech_remote_config }}:/config - - {{ qbit_downloads }}:/downloads - - {{qbit_host}}: - image: qbittorrentofficial/qbittorrent-nox - container_name: {{ qbit_host }} - restart: unless-stopped - depends_on: - - gluetun - - sonarr - - radarr - - lidarr - network_mode: "container:{{ gluetun_host }}" - environment: - - PUID={{ puid }} - - PGID={{ pgid }} - - TZ={{ timezone }} - - QBT_EULA="accept" - - QBT_WEBUI_PORT="{{ qbit_port }}" - volumes: - - {{ qbit_remote_config }}:/config - - {{ qbit_downloads }}:/downloads - - {{ prometheus_host }}: - image: prom/prometheus - container_name: {{ prometheus_host }} - restart: unless-stopped - depends_on: - - pihole - networks: - - net - environment: - - PUID={{ prometheus_puid }} - - PGID={{ prometheus_pgid}} - - TZ={{ timezone }} - volumes: - - {{ prometheus_config }}:/etc/prometheus/ - - prometheus_data:/prometheus/ - - {{ grafana_host }}: - image: grafana/grafana-oss - container_name: {{ grafana_host }} - restart: unless-stopped - user: "0:0" - depends_on: - - {{ prometheus_host }} - networks: - - net - environment: - - PUID={{ grafana_puid }} - - PGID={{ grafana_pgid }} - - TZ={{ timezone }} - volumes: - - {{ grafana_data }}:/var/lib/grafana/ - - {{ grafana_config }}:/etc/grafana/ - - ddns-updater: - container_name: ddns-updater - image: "ghcr.io/qdm12/ddns-updater" - restart: unless-stopped - depends_on: - - pihole - networks: - net: {} - volumes: - - "{{ ddns_data }}:/updater/data/" - - homeassistant: - container_name: homeassistant - image: "ghcr.io/home-assistant/home-assistant:stable" - restart: unless-stopped - depends_on: - - pihole - networks: - net: {} - volumes: - - "/etc/localtime:/etc/localtime:ro" - - "{{ ha_config }}:/config/" - privileged: true - ports: - - "{{ ha_port }}:8123" - - 4357:4357 - - 5683:5683 - - 5683:5683/udp - - {{stirling.host}}: - container_name: {{stirling.host}} - image: frooodle/s-pdf:latest - restart: unless-stopped - depends_on: - - pihole - networks: - net: {} - - {{ jellyfin.host }}: - container_name: {{ jellyfin.host }} - image: jellyfin/jellyfin - restart: 'unless-stopped' - depends_on: - - pihole - networks: - net: {} - devices: - - /dev/dri:/dev/dri - volumes: - - {{ jellyfin.config }}:/config - - {{ jellyfin.cache }}:/cache - - {{ jellyfin.media.tv }}:/tv:ro - - {{ jellyfin.media.movies }}:/movies:ro - - {{ jellyfin.media.music }}:/music:ro - ports: - - "{{ jellyfin.port }}:{{ jellyfin.port }}" - - broker: - container_name: {{ paperless.redis.host }} - image: docker.io/library/redis:7 - restart: unless-stopped - depends_on: - - pihole - networks: - - net - volumes: - - {{paperless.redis.data}}:/data - - db: - container_name: {{ paperless.db.host }} - image: docker.io/library/postgres:15 - restart: unless-stopped - depends_on: - - pihole - networks: - - net - volumes: - - {{paperless.db.data}}:/var/lib/postgresql/data - environment: - POSTGRES_DB: {{ paperless.db.db }} - POSTGRES_USER: {{ paperless.db.user }} - POSTGRES_PASSWORD: {{ paperless.db.password }} - - paperless: - container_name: {{ paperless.host }} - image: ghcr.io/paperless-ngx/paperless-ngx:latest - restart: unless-stopped - depends_on: - - db - - broker - networks: - - net - healthcheck: - test: ["CMD", "curl", "-fs", "-S", "--max-time", "2", "http://localhost:{{ paperless.port }}"] - interval: 30s - timeout: 10s - retries: 5 - volumes: - - {{ paperless.data.data }}:/usr/src/paperless/data - - {{ paperless.data.media }}:/usr/src/paperless/media - - {{ paperless.data.export }}:/usr/src/paperless/export - - {{ paperless.data.consume }}:/usr/src/paperless/consume - environment: - - "PAPERLESS_REDIS=redis://broker:6379" - - "PAPERLESS_DBHOST=db" - - "PAPERLESS_DBUSER={{paperless.db.user}}" - - "PAPERLESS_DBPASS={{paperless.db.password}}" - - "USERMAP_UID={{ puid }}" - - "USERMAP_GID={{ pgid}}" - - "PAPERLESS_URL=https://{{paperless.host}}.{{ host.hostname }}.{{ backup_domain }}" - - "PAPERLESS_TIME_ZONE={{ timezone }}" - - "PAPERLESS_OCR_LANGUAGE=deu" - - {{ homarr.host }}: - container_name: {{ homarr.host }} - image: ghcr.io/ajnart/homarr:latest - restart: unless-stopped - depends_on: - - pihole - networks: - - net - volumes: - - {{ homarr.volumes.configs }}:/app/data/configs - - {{ homarr.volumes.data }}:/data - - {{ homarr.volumes.icons }}:/app/public/icons - - - {{ gitea.host }}: - container_name: {{ gitea.host }} - image: gitea/gitea:1.20.5-rootless - restart: unless-stopped - depends_on: - - pihole - networks: - - net - volumes: - - {{ gitea.volumes.data }}:/var/lib/gitea - - {{ gitea.volumes.config }}:/etc/gitea - - /etc/timezone:/etc/timezone:ro - - /etc/localtime:/etc/localtime:ro - ports: - - "{{ gitea.ports.http }}:3000" - - "{{ gitea.ports.ssh }}:2222" - - - {{ gitea.runner.host }}: - container_name: {{ gitea.runner.host }} - image: gitea/act_runner:nightly - restart: unless-stopped - depends_on: - - {{ gitea.host }} - networks: - - net - volumes: - - "{{ gitea.runner.config_file }}:/config.yaml" - - "{{ gitea.runner.volumes.data }}:/data" - - "/var/run/docker.sock:/var/run/docker.sock" - environment: - - "GITEA_INSTANCE_URL={{ gitea.url }}" - - "GITEA_RUNNER_REGISTRATION_TOKEN={{ gitea.runner.token }}" - - "GITEA_RUNNER_NAME: {{ gitea.runner.name }}" - - "CONFIG_FILE: /config.yaml" - - {{ jellyseer.host }}: - container_name: {{ jellyseer.host }} - image: fallenbagel/jellyseerr:latest - restart: unless-stopped - environment: - - LOG_LEVEL=info - - TZ={{ timezone }} - depends_on: - - {{ jellyfin.host }} - networks: - - net - volumes: - - {{ jellyseer.volumes.config }}:/app/config - -networks: - zoneminder: - driver: bridge - ipam: - driver: default - config: - - subnet: {{ zoneminder_network }} - net: - driver: bridge - ipam: - driver: default - config: - - subnet: {{ docker_network }} -volumes: - prometheus_data: {} diff --git a/roles/docker/templates/aya01/cupsd/cupsd.conf b/roles/docker/templates/aya01/cupsd/cupsd.conf deleted file mode 100644 index eee1089..0000000 --- a/roles/docker/templates/aya01/cupsd/cupsd.conf +++ /dev/null @@ -1,196 +0,0 @@ -# -# Configuration file for the CUPS scheduler. See "man cupsd.conf" for a -# complete description of this file. -# - -# Log general information in error_log - change "warn" to "debug" -# for troubleshooting... -LogLevel warn -PageLogFormat -ServerAlias * - -# Specifies the maximum size of the log files before they are rotated. The value "0" disables log rotation. -MaxLogSize 0 - -# Default error policy for printers -ErrorPolicy retry-job - -# Allow remote access -Listen *:631 - -# Show shared printers on the local network. -Browsing Yes -BrowseLocalProtocols dnssd - -# Default authentication type, when authentication is required... -DefaultAuthType Basic -DefaultEncryption IfRequested - -# Web interface setting... -WebInterface Yes - -# Timeout after cupsd exits if idle (applied only if cupsd runs on-demand - with -l) -IdleExitTimeout 60 - -# Restrict access to the server... - - Order allow,deny - Allow all - - -# Restrict access to the admin pages... - - Order allow,deny - Allow all - - -# Restrict access to configuration files... - - AuthType Default - Require user @SYSTEM - Order allow,deny - Allow all - - -# Restrict access to log files... - - AuthType Default - Require user @SYSTEM - Order allow,deny - Allow all - - -# Set the default printer/job policies... - - # Job/subscription privacy... - JobPrivateAccess default - JobPrivateValues default - SubscriptionPrivateAccess default - SubscriptionPrivateValues default - - # Job-related operations must be done by the owner or an administrator... - - Order deny,allow - - - - Require user @OWNER @SYSTEM - Order deny,allow - - - # All administration operations require an administrator to authenticate... - - AuthType Default - Require user @SYSTEM - Order deny,allow - - - # All printer operations require a printer operator to authenticate... - - AuthType Default - Require user @SYSTEM - Order deny,allow - - - # Only the owner or an administrator can cancel or authenticate a job... - - Require user @OWNER @SYSTEM - Order deny,allow - - - - Order deny,allow - - - -# Set the authenticated printer/job policies... - - # Job/subscription privacy... - JobPrivateAccess default - JobPrivateValues default - SubscriptionPrivateAccess default - SubscriptionPrivateValues default - - # Job-related operations must be done by the owner or an administrator... - - AuthType Default - Order deny,allow - - - - AuthType Default - Require user @OWNER @SYSTEM - Order deny,allow - - - # All administration operations require an administrator to authenticate... - - AuthType Default - Require user @SYSTEM - Order deny,allow - - - # All printer operations require a printer operator to authenticate... - - AuthType Default - Require user @SYSTEM - Order deny,allow - - - # Only the owner or an administrator can cancel or authenticate a job... - - AuthType Default - Require user @OWNER @SYSTEM - Order deny,allow - - - - Order deny,allow - - - -# Set the kerberized printer/job policies... - - # Job/subscription privacy... - JobPrivateAccess default - JobPrivateValues default - SubscriptionPrivateAccess default - SubscriptionPrivateValues default - - # Job-related operations must be done by the owner or an administrator... - - AuthType Negotiate - Order deny,allow - - - - AuthType Negotiate - Require user @OWNER @SYSTEM - Order deny,allow - - - # All administration operations require an administrator to authenticate... - - AuthType Default - Require user @SYSTEM - Order deny,allow - - - # All printer operations require a printer operator to authenticate... - - AuthType Default - Require user @SYSTEM - Order deny,allow - - - # Only the owner or an administrator can cancel or authenticate a job... - - AuthType Negotiate - Require user @OWNER @SYSTEM - Order deny,allow - - - - Order deny,allow - - diff --git a/roles/docker/templates/aya01/ddns-updater/data/config.json b/roles/docker/templates/aya01/ddns-updater/data/config.json deleted file mode 100644 index ec03c69..0000000 --- a/roles/docker/templates/aya01/ddns-updater/data/config.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "settings": [ - { - "provider": "namecheap", - "domain": "{{ local_domain }}", - "host": "{{ local_subdomains }}", - "password": "{{ vault_ddns_local_password }}", - "provider_ip": true - } - ] -} diff --git a/roles/docker/templates/aya01/grafana/etc-grafana/grafana.ini.j2 b/roles/docker/templates/aya01/grafana/etc-grafana/grafana.ini.j2 deleted file mode 100644 index dc1b7a0..0000000 --- a/roles/docker/templates/aya01/grafana/etc-grafana/grafana.ini.j2 +++ /dev/null @@ -1,1464 +0,0 @@ -##################### Grafana Configuration Example ##################### -# -# Everything has defaults so you only need to uncomment things you want to -# change - -# possible values : production, development -;app_mode = production - -# instance name, defaults to HOSTNAME environment variable value or hostname if HOSTNAME var is empty -;instance_name = ${HOSTNAME} - -# force migration will run migrations that might cause dataloss -;force_migration = false - -#################################### Paths #################################### -[paths] -# Path to where grafana can store temp files, sessions, and the sqlite3 db (if that is used) -;data = /var/lib/grafana - -# Temporary files in `data` directory older than given duration will be removed -;temp_data_lifetime = 24h - -# Directory where grafana can store logs -;logs = /var/log/grafana - -# Directory where grafana will automatically scan and look for plugins -;plugins = /var/lib/grafana/plugins - -# folder that contains provisioning config files that grafana will apply on startup and while running. -;provisioning = conf/provisioning - -#################################### Server #################################### -[server] -# Protocol (http, https, h2, socket) -;protocol = http - -# This is the minimum TLS version allowed. By default, this value is empty. Accepted values are: TLS1.2, TLS1.3. If nothing is set TLS1.2 would be taken -;min_tls_version = "" - -# The ip address to bind to, empty will bind to all interfaces -;http_addr = - -# The http port to use -;http_port = 3000 - -# The public facing domain name used to access grafana from a browser -;domain = localhost - -# Redirect to correct domain if host header does not match domain -# Prevents DNS rebinding attacks -;enforce_domain = false - -# The full public facing url you use in browser, used for redirects and emails -# If you use reverse proxy and sub path specify full url (with sub path) -;root_url = %(protocol)s://%(domain)s:%(http_port)s/ - -# Serve Grafana from subpath specified in `root_url` setting. By default it is set to `false` for compatibility reasons. -;serve_from_sub_path = false - -# Log web requests -;router_logging = false - -# the path relative working path -;static_root_path = public - -# enable gzip -;enable_gzip = false - -# https certs & key file -;cert_file = -;cert_key = - -# Unix socket gid -# Changing the gid of a file without privileges requires that the target group is in the group of the process and that the process is the file owner -# It is recommended to set the gid as http server user gid -# Not set when the value is -1 -;socket_gid = - -# Unix socket mode -;socket_mode = - -# Unix socket path -;socket = - -# CDN Url -;cdn_url = - -# Sets the maximum time using a duration format (5s/5m/5ms) before timing out read of an incoming request and closing idle connections. -# `0` means there is no timeout for reading the request. -;read_timeout = 0 - -# This setting enables you to specify additional headers that the server adds to HTTP(S) responses. -[server.custom_response_headers] -#exampleHeader1 = exampleValue1 -#exampleHeader2 = exampleValue2 - -#################################### GRPC Server ######################### -;[grpc_server] -;network = "tcp" -;address = "127.0.0.1:10000" -;use_tls = false -;cert_file = -;key_file = - -#################################### Database #################################### -[database] -# You can configure the database connection by specifying type, host, name, user and password -# as separate properties or as on string using the url properties. - -# Either "mysql", "postgres" or "sqlite3", it's your choice -;type = sqlite3 -;host = 127.0.0.1:3306 -;name = grafana -;user = root -# If the password contains # or ; you have to wrap it with triple quotes. Ex """#password;""" -;password = - -# Use either URL or the previous fields to configure the database -# Example: mysql://user:secret@host:port/database -;url = - -# For "postgres", use either "disable", "require" or "verify-full" -# For "mysql", use either "true", "false", or "skip-verify". -;ssl_mode = disable - -# Database drivers may support different transaction isolation levels. -# Currently, only "mysql" driver supports isolation levels. -# If the value is empty - driver's default isolation level is applied. -# For "mysql" use "READ-UNCOMMITTED", "READ-COMMITTED", "REPEATABLE-READ" or "SERIALIZABLE". -;isolation_level = - -;ca_cert_path = -;client_key_path = -;client_cert_path = -;server_cert_name = - -# For "sqlite3" only, path relative to data_path setting -;path = grafana.db - -# Max idle conn setting default is 2 -;max_idle_conn = 2 - -# Max conn setting default is 0 (mean not set) -;max_open_conn = - -# Connection Max Lifetime default is 14400 (means 14400 seconds or 4 hours) -;conn_max_lifetime = 14400 - -# Set to true to log the sql calls and execution times. -;log_queries = - -# For "sqlite3" only. cache mode setting used for connecting to the database. (private, shared) -;cache_mode = private - -# For "sqlite3" only. Enable/disable Write-Ahead Logging, https://sqlite.org/wal.html. Default is false. -;wal = false - -# For "mysql" only if migrationLocking feature toggle is set. How many seconds to wait before failing to lock the database for the migrations, default is 0. -;locking_attempt_timeout_sec = 0 - -# For "sqlite" only. How many times to retry query in case of database is locked failures. Default is 0 (disabled). -;query_retries = 0 - -# For "sqlite" only. How many times to retry transaction in case of database is locked failures. Default is 5. -;transaction_retries = 5 - -# Set to true to add metrics and tracing for database queries. -;instrument_queries = false - -################################### Data sources ######################### -[datasources] -# Upper limit of data sources that Grafana will return. This limit is a temporary configuration and it will be deprecated when pagination will be introduced on the list data sources API. -;datasource_limit = 5000 - -#################################### Cache server ############################# -[remote_cache] -# Either "redis", "memcached" or "database" default is "database" -;type = database - -# cache connectionstring options -# database: will use Grafana primary database. -# redis: config like redis server e.g. `addr=127.0.0.1:6379,pool_size=100,db=0,ssl=false`. Only addr is required. ssl may be 'true', 'false', or 'insecure'. -# memcache: 127.0.0.1:11211 -;connstr = - -# prefix prepended to all the keys in the remote cache -; prefix = - -# This enables encryption of values stored in the remote cache -;encryption = - -#################################### Data proxy ########################### -[dataproxy] - -# This enables data proxy logging, default is false -;logging = false - -# How long the data proxy waits to read the headers of the response before timing out, default is 30 seconds. -# This setting also applies to core backend HTTP data sources where query requests use an HTTP client with timeout set. -;timeout = 30 - -# How long the data proxy waits to establish a TCP connection before timing out, default is 10 seconds. -;dialTimeout = 10 - -# How many seconds the data proxy waits before sending a keepalive probe request. -;keep_alive_seconds = 30 - -# How many seconds the data proxy waits for a successful TLS Handshake before timing out. -;tls_handshake_timeout_seconds = 10 - -# How many seconds the data proxy will wait for a server's first response headers after -# fully writing the request headers if the request has an "Expect: 100-continue" -# header. A value of 0 will result in the body being sent immediately, without -# waiting for the server to approve. -;expect_continue_timeout_seconds = 1 - -# Optionally limits the total number of connections per host, including connections in the dialing, -# active, and idle states. On limit violation, dials will block. -# A value of zero (0) means no limit. -;max_conns_per_host = 0 - -# The maximum number of idle connections that Grafana will keep alive. -;max_idle_connections = 100 - -# How many seconds the data proxy keeps an idle connection open before timing out. -;idle_conn_timeout_seconds = 90 - -# If enabled and user is not anonymous, data proxy will add X-Grafana-User header with username into the request, default is false. -;send_user_header = false - -# Limit the amount of bytes that will be read/accepted from responses of outgoing HTTP requests. -;response_limit = 0 - -# Limits the number of rows that Grafana will process from SQL data sources. -;row_limit = 1000000 - -# Sets a custom value for the `User-Agent` header for outgoing data proxy requests. If empty, the default value is `Grafana/` (for example `Grafana/9.0.0`). -;user_agent = - -#################################### Analytics #################################### -[analytics] -# Server reporting, sends usage counters to stats.grafana.org every 24 hours. -# No ip addresses are being tracked, only simple counters to track -# running instances, dashboard and error counts. It is very helpful to us. -# Change this option to false to disable reporting. -;reporting_enabled = true - -# The name of the distributor of the Grafana instance. Ex hosted-grafana, grafana-labs -;reporting_distributor = grafana-labs - -# Set to false to disable all checks to https://grafana.com -# for new versions of grafana. The check is used -# in some UI views to notify that a grafana update exists. -# This option does not cause any auto updates, nor send any information -# only a GET request to https://raw.githubusercontent.com/grafana/grafana/main/latest.json to get the latest version. -;check_for_updates = true - -# Set to false to disable all checks to https://grafana.com -# for new versions of plugins. The check is used -# in some UI views to notify that a plugin update exists. -# This option does not cause any auto updates, nor send any information -# only a GET request to https://grafana.com to get the latest versions. -;check_for_plugin_updates = true - -# Google Analytics universal tracking code, only enabled if you specify an id here -;google_analytics_ua_id = - -# Google Analytics 4 tracking code, only enabled if you specify an id here -;google_analytics_4_id = - -# When Google Analytics 4 Enhanced event measurement is enabled, we will try to avoid sending duplicate events and let Google Analytics 4 detect navigation changes, etc. -;google_analytics_4_send_manual_page_views = false - -# Google Tag Manager ID, only enabled if you specify an id here -;google_tag_manager_id = - -# Rudderstack write key, enabled only if rudderstack_data_plane_url is also set -;rudderstack_write_key = - -# Rudderstack data plane url, enabled only if rudderstack_write_key is also set -;rudderstack_data_plane_url = - -# Rudderstack SDK url, optional, only valid if rudderstack_write_key and rudderstack_data_plane_url is also set -;rudderstack_sdk_url = - -# Rudderstack Config url, optional, used by Rudderstack SDK to fetch source config -;rudderstack_config_url = - -# Intercom secret, optional, used to hash user_id before passing to Intercom via Rudderstack -;intercom_secret = - -# Controls if the UI contains any links to user feedback forms -;feedback_links_enabled = true - -#################################### Security #################################### -[security] -# disable creation of admin user on first start of grafana -;disable_initial_admin_creation = false - -# default admin user, created on startup -;admin_user = admin - -# default admin password, can be changed before first start of grafana, or in profile settings -;admin_password = admin - -# default admin email, created on startup -;admin_email = admin@localhost - -# used for signing -;secret_key = SW2YcwTIb9zpOOhoPsMm - -# current key provider used for envelope encryption, default to static value specified by secret_key -;encryption_provider = secretKey.v1 - -# list of configured key providers, space separated (Enterprise only): e.g., awskms.v1 azurekv.v1 -;available_encryption_providers = - -# disable gravatar profile images -;disable_gravatar = false - -# data source proxy whitelist (ip_or_domain:port separated by spaces) -;data_source_proxy_whitelist = - -# disable protection against brute force login attempts -;disable_brute_force_login_protection = false - -# set to true if you host Grafana behind HTTPS. default is false. -;cookie_secure = false - -# set cookie SameSite attribute. defaults to `lax`. can be set to "lax", "strict", "none" and "disabled" -;cookie_samesite = lax - -# set to true if you want to allow browsers to render Grafana in a ,