First portion of migration

freshrss, get_iplayer, gitlab, glances, gotify, guacamole, healthchecks.io
This commit is contained in:
Anarion 2023-03-08 21:47:39 +01:00
parent bcee9bf5a0
commit 4960286632
No known key found for this signature in database
GPG key ID: 6C9E149718A7D4EB
50 changed files with 818 additions and 217 deletions

View file

@ -0,0 +1,15 @@
{
"folders": [
{
"path": "."
}
],
"settings": {
"yaml.schemas": {
"https://raw.githubusercontent.com/ansible/ansible-lint/main/src/ansiblelint/schemas/ansible.json#/$defs/tasks": "file:///c%3A/Users/anarion/Documents/repos/ansible-nas/roles/immich/tasks/main.yml"
},
"files.associations": {
"*.yaml": "home-assistant"
}
},
}

View file

@ -116,12 +116,10 @@
- role: freshrss
tags:
- freshrss
when: (freshrss_enabled | default(False))
- role: get_iplayer
tags:
- get_iplayer
when: (get_iplayer_enabled | default(False))
- role: gitea
tags:
@ -130,27 +128,22 @@
- role: gitlab
tags:
- gitlab
when: (gitlab_enabled | default(False))
- role: glances
tags:
- glances
when: (glances_enabled | default(False))
- role: gotify
tags:
- gotify
when: (gotify_enabled | default(False))
- role: guacamole
tags:
- guacamole
when: (guacamole_enabled | default(False))
- role: healthchecks.io
tags:
- healthchecks.io
when: (healthchecks_enabled | default(False))
- role: heimdall
tags:

View file

@ -10,5 +10,10 @@ freshrss_extensions_directory: "{{ docker_home }}/freshrss"
freshrss_port: "8089"
freshrss_hostname: "freshrss"
# docker
freshrss_container_name: freshrss
freshrss_image_name: "freshrss/freshrss"
freshrss_image_version: latest
# specs
freshrss_memory: 1g

View file

@ -0,0 +1,21 @@
# Freshrss
Homepage: <https://freshrss.org/>
FreshRSS is a self-hosted RSS feed aggregator like Leed or Kriss Feed.
It is lightweight, easy to work with, powerful, and customizable.
It is a multi-user application with an anonymous reading mode. It supports custom tags. There is an API for (mobile) clients, and a Command-Line Interface.
Thanks to the WebSub standard (formerly PubSubHubbub), FreshRSS is able to receive instant push notifications from compatible sources, such as Mastodon, Friendica, WordPress, Blogger, FeedBurner, etc.
FreshRSS natively supports basic Web scraping, based on XPath, for Web sites not providing any RSS / Atom feed.
Finally, it supports extensions for further tuning.
## Usage
Set `freshrss_enabled: true` in your `inventories/<your_inventory>/nas.yml` file.
The FreshRSS web interface can be found at <http://ansible_nas_host_or_ip:8089>.

View file

@ -0,0 +1,6 @@
---
provisioner:
inventory:
group_vars:
all:
freshrss_enabled: true

View file

@ -0,0 +1,10 @@
---
- name: Stop
hosts: all
become: true
tasks:
- name: "Include {{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }} role"
ansible.builtin.include_role:
name: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }}"
vars:
freshrss_enabled: false

View file

@ -0,0 +1,19 @@
---
- name: Verify
hosts: all
gather_facts: false
tasks:
- name: Include vars
ansible.builtin.include_vars:
file: ../../defaults/main.yml
- name: Get freshrss container state
community.docker.docker_container:
name: "{{ freshrss_container_name }}"
register: result
- name: Check if freshrss containers are running
ansible.builtin.assert:
that:
- result.container['State']['Status'] == "running"
- result.container['State']['Restarting'] == false

View file

@ -0,0 +1,19 @@
---
- name: Verify
hosts: all
gather_facts: false
tasks:
- name: Include vars
ansible.builtin.include_vars:
file: ../../defaults/main.yml
- name: Try and stop and remove freshrss
community.docker.docker_container:
name: "{{ freshrss_container_name }}"
state: absent
register: result
- name: Check if freshrss is stopped
ansible.builtin.assert:
that:
- not result.changed

View file

@ -1,32 +1,44 @@
---
- name: Create FreshRSS Directories
file:
path: "{{ item }}"
state: directory
# mode: 0755
with_items:
- "{{ freshrss_data_directory }}/data"
- "{{ freshrss_extensions_directory }}/extensions"
- name: Start FreshRSS
block:
- name: Create FreshRSS Directories
ansible.builtin.file:
path: "{{ item }}"
state: directory
with_items:
- "{{ freshrss_data_directory }}/data"
- "{{ freshrss_extensions_directory }}/extensions"
- name: FreshRSS Docker Container
docker_container:
name: freshrss
image: freshrss/freshrss
pull: true
volumes:
- "{{ freshrss_data_directory }}/data:/var/www/FreshRSS/data:rw"
- "{{ freshrss_extensions_directory }}/extensions:/var/www/FreshRSS/extensions:rw"
ports:
- "{{ freshrss_port }}:80"
env:
TZ: "{{ ansible_nas_timezone }}"
CRON_MIN: "1,31"
restart_policy: unless-stopped
memory: "{{ freshrss_memory }}"
labels:
traefik.enable: "{{ freshrss_available_externally | string }}"
traefik.http.routers.freshrss.rule: "Host(`{{ freshrss_hostname }}.{{ ansible_nas_domain }}`)"
traefik.http.routers.freshrss.tls.certresolver: "letsencrypt"
traefik.http.routers.freshrss.tls.domains[0].main: "{{ ansible_nas_domain }}"
traefik.http.routers.freshrss.tls.domains[0].sans: "*.{{ ansible_nas_domain }}"
traefik.http.services.freshrss.loadbalancer.server.port: "80"
- name: FreshRSS Docker Container
community.docker.docker_container:
container_default_behavior: no_defaults
name: "{{ freshrss_container_name }}"
image: "{{ freshrss_image_name }}:{{ freshrss_image_version }}"
pull: true
volumes:
- "{{ freshrss_data_directory }}/data:/var/www/FreshRSS/data:rw"
- "{{ freshrss_extensions_directory }}/extensions:/var/www/FreshRSS/extensions:rw"
ports:
- "{{ freshrss_port }}:80"
env:
TZ: "{{ ansible_nas_timezone }}"
CRON_MIN: "1,31"
restart_policy: unless-stopped
memory: "{{ freshrss_memory }}"
labels:
traefik.enable: "{{ freshrss_available_externally | string }}"
traefik.http.routers.freshrss.rule: "Host(`{{ freshrss_hostname }}.{{ ansible_nas_domain }}`)"
traefik.http.routers.freshrss.tls.certresolver: "letsencrypt"
traefik.http.routers.freshrss.tls.domains[0].main: "{{ ansible_nas_domain }}"
traefik.http.routers.freshrss.tls.domains[0].sans: "*.{{ ansible_nas_domain }}"
traefik.http.services.freshrss.loadbalancer.server.port: "80"
when: freshrss_enabled is true
- name: Stop FreshRSS
block:
- name: Stop FreshRSS
community.docker.docker_container:
name: "{{ freshrss_container_name }}"
state: absent
when: freshrss_enabled is false

View file

@ -8,5 +8,10 @@ get_iplayer_download_directory: "{{ tv_root }}/iplayer_downloads"
# network
get_iplayer_port: "8182"
# docker
get_iplayer_container_name: "get_iplayer"
get_iplayer_image_name: "kolonuk/get_iplayer"
get_iplayer_image_version: "latest"
# specs
get_iplayer_memory: "1g"

View file

@ -0,0 +1,11 @@
# Get_iPlayer
Homepage: <https://github.com/get-iplayer/get_iplayer>
Downloads TV and radio programmes from BBC iPlayer.
## Usage
Set `get_iplayer_enabled: true` in your `inventories/<your_inventory>/nas.yml` file.
The get_iplayer web interface can be found at <http://ansible_nas_host_or_ip:8182>.

View file

@ -0,0 +1,6 @@
---
provisioner:
inventory:
group_vars:
all:
get_iplayer_enabled: true

View file

@ -0,0 +1,10 @@
---
- name: Stop
hosts: all
become: true
tasks:
- name: "Include {{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }} role"
ansible.builtin.include_role:
name: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }}"
vars:
get_iplayer_enabled: false

View file

@ -0,0 +1,19 @@
---
- name: Verify
hosts: all
gather_facts: false
tasks:
- name: Include vars
ansible.builtin.include_vars:
file: ../../defaults/main.yml
- name: Get get_iplayer container state
community.docker.docker_container:
name: "{{ get_iplayer_container_name }}"
register: result
- name: Check if get_iplayer containers are running
ansible.builtin.assert:
that:
- result.container['State']['Status'] == "running"
- result.container['State']['Restarting'] == false

View file

@ -0,0 +1,19 @@
---
- name: Verify
hosts: all
gather_facts: false
tasks:
- name: Include vars
ansible.builtin.include_vars:
file: ../../defaults/main.yml
- name: Try and stop and remove get_iplayer
community.docker.docker_container:
name: "{{ get_iplayer_container_name }}"
state: absent
register: result
- name: Check if get_iplayer is stopped
ansible.builtin.assert:
that:
- not result.changed

View file

@ -1,21 +1,33 @@
---
- name: Create get_iplayer Directories
file:
path: "{{ item }}"
state: directory
with_items:
- "{{ get_iplayer_config_directory }}"
- "{{ get_iplayer_download_directory }}"
- name: Start get_iplayer
block:
- name: Create get_iplayer Directories
ansible.builtin.file:
path: "{{ item }}"
state: directory
with_items:
- "{{ get_iplayer_config_directory }}"
- "{{ get_iplayer_download_directory }}"
- name: Get_iplayer Docker Container
docker_container:
name: get_iplayer
image: kolonuk/get_iplayer
pull: true
volumes:
- "{{ get_iplayer_config_directory }}:/root/.get_iplayer:rw"
- "{{ get_iplayer_download_directory }}:/root/output:rw"
ports:
- "{{ get_iplayer_port }}:8181"
restart_policy: unless-stopped
memory: "{{ get_iplayer_memory }}"
- name: Create get_iplayer Docker Container
community.docker.docker_container:
container_default_behavior: no_defaults
name: "{{ get_iplayer_container_name }}"
image: "{{ get_iplayer_image_name }}:{{ get_iplayer_image_version }}"
pull: true
volumes:
- "{{ get_iplayer_config_directory }}:/root/.get_iplayer:rw"
- "{{ get_iplayer_download_directory }}:/root/output:rw"
ports:
- "{{ get_iplayer_port }}:8181"
restart_policy: unless-stopped
memory: "{{ get_iplayer_memory }}"
when: get_iplayer_enabled is true
- name: Stop get_iplayer
block:
- name: Stop get_iplayer
community.docker.docker_container:
name: "{{ get_iplayer_container_name }}"
state: absent
when: get_iplayer_enabled is false

View file

@ -12,5 +12,12 @@ gitlab_port_http: "4080"
gitlab_port_https: "4443"
gitlab_port_ssh: "422"
# docker
gitlab_container_name: "gitlab"
gitlab_image_name: "gitlab/gitlab-ce"
gitlab_image_version: "latest"
gitlab_user_id: "1000"
gitlab_group_id: "1000"
# specs
gitlab_memory: "4g"

View file

@ -0,0 +1,13 @@
# GitLab
Homepage: <https://docs.gitlab.com/omnibus/docker/>
If Gitea isn't powerful enough for you then consider GitLab. It's a much more powerful (and consequently bigger) Git repository solution that includes a suite of code analytics. On the other hand it requires more RAM.
## Usage
Set `gitlab_enabled: true` in your `inventories/<your_inventory>/nas.yml` file.
To make GitLab available externally via Traefik set `gitlab_available_externally: true` in your `inventories/<your_inventory>/nas.yml` file.
The first time you run GitLab you'll be prompted for an account's password. The password is for GitLab's `root` administrator account. From there you can log in to create additional users and further configure the application.

View file

@ -0,0 +1,6 @@
---
provisioner:
inventory:
group_vars:
all:
gitlab_enabled: true

View file

@ -0,0 +1,10 @@
---
- name: Stop
hosts: all
become: true
tasks:
- name: "Include {{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }} role"
ansible.builtin.include_role:
name: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }}"
vars:
gitlab_enabled: false

View file

@ -0,0 +1,19 @@
---
- name: Verify
hosts: all
gather_facts: false
tasks:
- name: Include vars
ansible.builtin.include_vars:
file: ../../defaults/main.yml
- name: Get gitlab container state
community.docker.docker_container:
name: "{{ gitlab_container_name }}"
register: result
- name: Check if gitlab containers are running
ansible.builtin.assert:
that:
- result.container['State']['Status'] == "running"
- result.container['State']['Restarting'] == false

View file

@ -0,0 +1,19 @@
---
- name: Verify
hosts: all
gather_facts: false
tasks:
- name: Include vars
ansible.builtin.include_vars:
file: ../../defaults/main.yml
- name: Try and stop and remove gitlab
community.docker.docker_container:
name: "{{ gitlab_container_name }}"
state: absent
register: result
- name: Check if gitlab is stopped
ansible.builtin.assert:
that:
- not result.changed

View file

@ -1,57 +1,69 @@
---
# The gitlab uid/gid matches 'git:git' in the Gitlab Docker image.
- name: Create Gitlab group account
group:
name: gitlab
gid: 998
state: present
- name: Start Gitlab
block:
# The gitlab uid/gid matches 'git:git' in the Gitlab Docker image.
- name: Create Gitlab group account
group:
name: gitlab
gid: 998
state: present
- name: Create Gitlab user account
user:
name: gitlab
uid: 998
state: present
system: yes
update_password: on_create
create_home: no
group: gitlab
- name: Create Gitlab user account
user:
name: gitlab
uid: 998
state: present
system: yes
update_password: on_create
create_home: no
group: gitlab
- name: Create Gitlab Directories
file:
path: "{{ item }}"
state: directory
owner: gitlab
group: gitlab
with_items:
- "{{ gitlab_data_directory }}/config"
- "{{ gitlab_data_directory }}/log"
- "{{ gitlab_data_directory }}/data"
- name: Create Gitlab Directories
file:
path: "{{ item }}"
state: directory
owner: gitlab
group: gitlab
with_items:
- "{{ gitlab_data_directory }}/config"
- "{{ gitlab_data_directory }}/log"
- "{{ gitlab_data_directory }}/data"
- name: Create Gitlab Docker Container
docker_container:
name: gitlab
image: gitlab/gitlab-ce:latest
pull: true
volumes:
- "{{ gitlab_data_directory }}/config:/etc/gitlab:rw"
- "{{ gitlab_data_directory }}/log:/var/log/gitlab:rw"
- "{{ gitlab_data_directory }}/data:/var/opt/gitlab:rw"
network_mode: "bridge"
ports:
- "{{ gitlab_port_http }}:80"
- "{{ gitlab_port_https }}:443"
- "{{ gitlab_port_ssh }}:22"
env:
TZ: "{{ ansible_nas_timezone }}"
PUID: "{{ gitlab_user_id }}"
PGID: "{{ gitlab_group_id }}"
restart_policy: unless-stopped
hostname: "{{ gitlab_hostname }}.{{ ansible_nas_domain }}"
memory: "{{ gitlab_memory }}"
labels:
traefik.enable: "{{ gitlab_available_externally | string }}"
traefik.http.routers.gitlab.rule: "Host(`{{ gitlab_hostname }}.{{ ansible_nas_domain }}`)"
traefik.http.routers.gitlab.tls.certresolver: "letsencrypt"
traefik.http.routers.gitlab.tls.domains[0].main: "{{ ansible_nas_domain }}"
traefik.http.routers.gitlab.tls.domains[0].sans: "*.{{ ansible_nas_domain }}"
traefik.http.services.gitlab.loadbalancer.server.port: "80"
- name: Create Gitlab Docker Container
community.docker.docker_container:
container_default_behavior: no_defaults
name: "{{ gitlab_container_name }}"
image: "{{ gitlab_image_name }}:{{ gitlab_image_version }}"
pull: true
volumes:
- "{{ gitlab_data_directory }}/config:/etc/gitlab:rw"
- "{{ gitlab_data_directory }}/log:/var/log/gitlab:rw"
- "{{ gitlab_data_directory }}/data:/var/opt/gitlab:rw"
network_mode: "bridge"
ports:
- "{{ gitlab_port_http }}:80"
- "{{ gitlab_port_https }}:443"
- "{{ gitlab_port_ssh }}:22"
env:
TZ: "{{ ansible_nas_timezone }}"
PUID: "{{ gitlab_user_id }}"
PGID: "{{ gitlab_group_id }}"
restart_policy: unless-stopped
hostname: "{{ gitlab_hostname }}.{{ ansible_nas_domain }}"
memory: "{{ gitlab_memory }}"
labels:
traefik.enable: "{{ gitlab_available_externally | string }}"
traefik.http.routers.gitlab.rule: "Host(`{{ gitlab_hostname }}.{{ ansible_nas_domain }}`)"
traefik.http.routers.gitlab.tls.certresolver: "letsencrypt"
traefik.http.routers.gitlab.tls.domains[0].main: "{{ ansible_nas_domain }}"
traefik.http.routers.gitlab.tls.domains[0].sans: "*.{{ ansible_nas_domain }}"
traefik.http.services.gitlab.loadbalancer.server.port: "80"
when: gitlab_enabled is true
- name: Stop Gitlab
block:
- name: Stop Gitlab
community.docker.docker_container:
name: "{{ gitlab_container_name }}"
state: absent
when: gitlab_enabled is false

View file

@ -12,5 +12,10 @@ glances_port_two: "61209"
glances_security_options:
- "apparmor=unconfined"
# docker
glances_container_name: "glances"
glances_image_name: "nicolargo/glances"
glances_image_version: "latest"
# specs
glances_memory: 1g

View file

@ -0,0 +1,15 @@
# Glances
Homepage: <https://nicolargo.github.io/glances/>
Glances is a cross-platform system monitoring tool written in Python.
## Usage
Set `glances_enabled: true` in your `inventories/<your_inventory>/nas.yml` file.
The Glances web interface can be found at <http://ansible_nas_host_or_ip:61208>.
## Specific Configuration
Glances can be integrated with InfluxDB and Grafana.

View file

@ -0,0 +1,6 @@
---
provisioner:
inventory:
group_vars:
all:
glances_enabled: true

View file

@ -0,0 +1,10 @@
---
- name: Stop
hosts: all
become: true
tasks:
- name: "Include {{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }} role"
ansible.builtin.include_role:
name: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }}"
vars:
glances_enabled: false

View file

@ -0,0 +1,19 @@
---
- name: Verify
hosts: all
gather_facts: false
tasks:
- name: Include vars
ansible.builtin.include_vars:
file: ../../defaults/main.yml
- name: Get glances container state
community.docker.docker_container:
name: "{{ glances_container_name }}"
register: result
- name: Check if glances containers are running
ansible.builtin.assert:
that:
- result.container['State']['Status'] == "running"
- result.container['State']['Restarting'] == false

View file

@ -0,0 +1,19 @@
---
- name: Verify
hosts: all
gather_facts: false
tasks:
- name: Include vars
ansible.builtin.include_vars:
file: ../../defaults/main.yml
- name: Try and stop and remove glances
community.docker.docker_container:
name: "{{ glances_container_name }}"
state: absent
register: result
- name: Check if glances is stopped
ansible.builtin.assert:
that:
- not result.changed

View file

@ -1,25 +1,37 @@
---
- name: Create Glances Docker Container
docker_container:
name: glances
image: nicolargo/glances
pull: true
volumes:
- "/var/run/docker.sock:/var/run/docker.sock:ro"
- "/etc/timezone:/etc/timezone:ro"
pid_mode: host
ports:
- "{{ glances_port_one }}:61208"
- "{{ glances_port_two }}:61209"
env:
GLANCES_OPT: "-w"
restart_policy: unless-stopped
security_opts: "{{ glances_security_options }}"
memory: "{{ glances_memory }}"
labels:
traefik.enable: "{{ glances_available_externally | string }}"
traefik.http.routers.glances.rule: "Host(`{{ glances_hostname }}.{{ ansible_nas_domain }}`)"
traefik.http.routers.glances.tls.certresolver: "letsencrypt"
traefik.http.routers.glances.tls.domains[0].main: "{{ ansible_nas_domain }}"
traefik.http.routers.glances.tls.domains[0].sans: "*.{{ ansible_nas_domain }}"
traefik.http.services.glances.loadbalancer.server.port: "61208"
- name: Start Glances
block:
- name: Create Glances Docker Container
community.docker.docker_container:
container_default_behavior: no_defaults
name: "{{ glances_container_name }}"
image: "{{ glances_image_name }}:{{ glances_image_version }}"
pull: true
volumes:
- "/var/run/docker.sock:/var/run/docker.sock:ro"
- "/etc/timezone:/etc/timezone:ro"
pid_mode: host
ports:
- "{{ glances_port_one }}:61208"
- "{{ glances_port_two }}:61209"
env:
GLANCES_OPT: "-w"
restart_policy: unless-stopped
security_opts: "{{ glances_security_options }}"
memory: "{{ glances_memory }}"
labels:
traefik.enable: "{{ glances_available_externally | string }}"
traefik.http.routers.glances.rule: "Host(`{{ glances_hostname }}.{{ ansible_nas_domain }}`)"
traefik.http.routers.glances.tls.certresolver: "letsencrypt"
traefik.http.routers.glances.tls.domains[0].main: "{{ ansible_nas_domain }}"
traefik.http.routers.glances.tls.domains[0].sans: "*.{{ ansible_nas_domain }}"
traefik.http.services.glances.loadbalancer.server.port: "61208"
when: glances_enabled is true
- name: Stop Glances
block:
- name: Stop Glances
community.docker.docker_container:
name: "{{ glances_container_name }}"
state: absent
when: glances_enabled is false

View file

@ -5,14 +5,14 @@ gotify_available_externally: false
# data directory
gotify_data_directory: "{{ docker_home }}/gotify"
# docker image to use
gotify_docker_image: gotify/server:latest
# network
gotify_port: "2346"
gotify_hostname: "gotify"
# user to run container with
# docker
gotify_container_name: "gotify"
gotify_image_name: "gotify/server"
gotify_image_version: "latest"
gotify_user_id: "0"
gotify_group_id: "0"

View file

@ -0,0 +1,16 @@
# Gotify
Homepage: <https://gotify.net/>
A simple server for sending and receiving messages in real-time per WebSocket. (Includes a sleek web-ui)
## Usage
Set `gotify_enabled: true` in your `inventories/<your_inventory>/nas.yml` file.
The Gotify web interface can be found at <http://ansible_nas_host_or_ip:2346>.
Android client: [https://play.google.com/store/apps/details?id=com.github.gotify](https://play.google.com/store/apps/details?id=com.github.gotify)
iOS client: n/a
Chrome extension: n/a
Firefox extension: <https://addons.mozilla.org/en-US/firefox/addon/gotify-for-firefox/>

View file

@ -0,0 +1,6 @@
---
provisioner:
inventory:
group_vars:
all:
gotify_enabled: true

View file

@ -0,0 +1,10 @@
---
- name: Stop
hosts: all
become: true
tasks:
- name: "Include {{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }} role"
ansible.builtin.include_role:
name: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }}"
vars:
gotify_enabled: false

View file

@ -0,0 +1,19 @@
---
- name: Verify
hosts: all
gather_facts: false
tasks:
- name: Include vars
ansible.builtin.include_vars:
file: ../../defaults/main.yml
- name: Get gotify container state
community.docker.docker_container:
name: "{{ gotify_container_name }}"
register: result
- name: Check if gotify containers are running
ansible.builtin.assert:
that:
- result.container['State']['Status'] == "running"
- result.container['State']['Restarting'] == false

View file

@ -0,0 +1,19 @@
---
- name: Verify
hosts: all
gather_facts: false
tasks:
- name: Include vars
ansible.builtin.include_vars:
file: ../../defaults/main.yml
- name: Try and stop and remove gotify
community.docker.docker_container:
name: "{{ gotify_container_name }}"
state: absent
register: result
- name: Check if gotify is stopped
ansible.builtin.assert:
that:
- not result.changed

View file

@ -1,31 +1,43 @@
---
- name: Create Gotify Data Directory
file:
path: "{{ item }}"
state: directory
with_items:
- "{{ gotify_data_directory }}"
- name: Start Gotify
block:
- name: Create Gotify Data Directory
ansible.builtin.file:
path: "{{ item }}"
state: directory
with_items:
- "{{ gotify_data_directory }}"
- name: Gotify Docker Container
docker_container:
name: gotify
image: "{{ gotify_docker_image }}"
pull: true
ports:
- "{{ gotify_port }}:80"
volumes:
- "/var/run/docker.sock:/var/run/docker.sock"
- "{{ gotify_data_directory }}:/app/data:rw"
env:
TZ: "{{ ansible_nas_timezone }}"
PUID: "{{ gotify_user_id }}"
PGID: "{{ gotify_group_id }}"
restart_policy: unless-stopped
memory: "{{ gotify_memory }}"
labels:
traefik.enable: "{{ gotify_available_externally | string }}"
traefik.http.routers.gotify.rule: "Host(`{{ gotify_hostname }}.{{ ansible_nas_domain }}`)"
traefik.http.routers.gotify.tls.certresolver: "letsencrypt"
traefik.http.routers.gotify.tls.domains[0].main: "{{ ansible_nas_domain }}"
traefik.http.routers.gotify.tls.domains[0].sans: "*.{{ ansible_nas_domain }}"
traefik.http.services.gotify.loadbalancer.server.port: "80"
- name: Gotify Docker Container
community.docker.docker_container:
container_default_behavior: no_defaults
name: "{{ gotify_container_name }}"
image: "{{ gotify_image_name }}:{{ gotify_image_version }}"
pull: true
ports:
- "{{ gotify_port }}:80"
volumes:
- "/var/run/docker.sock:/var/run/docker.sock"
- "{{ gotify_data_directory }}:/app/data:rw"
env:
TZ: "{{ ansible_nas_timezone }}"
PUID: "{{ gotify_user_id }}"
PGID: "{{ gotify_group_id }}"
restart_policy: unless-stopped
memory: "{{ gotify_memory }}"
labels:
traefik.enable: "{{ gotify_available_externally | string }}"
traefik.http.routers.gotify.rule: "Host(`{{ gotify_hostname }}.{{ ansible_nas_domain }}`)"
traefik.http.routers.gotify.tls.certresolver: "letsencrypt"
traefik.http.routers.gotify.tls.domains[0].main: "{{ ansible_nas_domain }}"
traefik.http.routers.gotify.tls.domains[0].sans: "*.{{ ansible_nas_domain }}"
traefik.http.services.gotify.loadbalancer.server.port: "80"
when: gotify_enabled is true
- name: Stop Gotify
block:
- name: Stop Gotify
community.docker.docker_container:
name: "{{ gotify_container_name }}"
state: absent
when: gotify_enabled is false

View file

@ -9,5 +9,10 @@ guacamole_data_directory: "{{ docker_home }}/guacamole"
guacamole_port: "8090"
guacamole_hostname: "guacamole"
# docker
guacamole_container_name: "guacamole"
guacamole_image_name: "oznu/guacamole"
guacamole_image_version: "latest"
# specs
guacamole_memory: 1g

View file

@ -0,0 +1,17 @@
# Guacamole
Homepage: <https://guacamole.apache.org/>
Apache Guacamole is a clientless remote desktop gateway. It supports standard protocols like VNC, RDP, and SSH.
## Usage
Set `guacamole_enabled: true` in your `inventories/<your_inventory>/nas.yml` file.
## Specific Configuration
The default username and password is `guacadmin`. Change it!
## What to connect to?
You can run a virtual desktop from your Ansible-NAS box, check out the [Virtual Desktop docs](virtual_desktop.md).

View file

@ -0,0 +1,6 @@
---
provisioner:
inventory:
group_vars:
all:
guacamole_enabled: true

View file

@ -0,0 +1,10 @@
---
- name: Stop
hosts: all
become: true
tasks:
- name: "Include {{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }} role"
ansible.builtin.include_role:
name: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }}"
vars:
guacamole_enabled: false

View file

@ -0,0 +1,19 @@
---
- name: Verify
hosts: all
gather_facts: false
tasks:
- name: Include vars
ansible.builtin.include_vars:
file: ../../defaults/main.yml
- name: Get guacamole container state
community.docker.docker_container:
name: "{{ guacamole_container_name }}"
register: result
- name: Check if guacamole containers are running
ansible.builtin.assert:
that:
- result.container['State']['Status'] == "running"
- result.container['State']['Restarting'] == false

View file

@ -0,0 +1,19 @@
---
- name: Verify
hosts: all
gather_facts: false
tasks:
- name: Include vars
ansible.builtin.include_vars:
file: ../../defaults/main.yml
- name: Try and stop and remove guacamole
community.docker.docker_container:
name: "{{ guacamole_container_name }}"
state: absent
register: result
- name: Check if guacamole is stopped
ansible.builtin.assert:
that:
- not result.changed

View file

@ -1,51 +1,63 @@
---
- name: Create Guacamole directories
file:
path: "{{ item }}"
state: directory
with_items:
- "{{ guacamole_data_directory }}/config"
- name: Start Guacamole
block:
- name: Create Guacamole directories
ansible.builtin.file:
path: "{{ item }}"
state: directory
with_items:
- "{{ guacamole_data_directory }}/config"
- name: Remove Old Guacamole Mysql Docker Container
docker_container:
name: guacamole-mysql
state: absent
keep_volumes: true
- name: Remove Old Guacamole Mysql Docker Container
docker_container:
name: guacamole-mysql
state: absent
keep_volumes: true
- name: Remove Old Guacamole guacd Docker Container
docker_container:
name: guacamole-guacd
state: absent
keep_volumes: true
- name: Remove Old Guacamole guacd Docker Container
docker_container:
name: guacamole-guacd
state: absent
keep_volumes: true
- name: Remove old Guacamole directories
file:
path: "{{ item }}"
state: absent
with_items:
- "{{ guacamole_data_directory }}/mysql"
- name: Remove old Guacamole directories
file:
path: "{{ item }}"
state: absent
with_items:
- "{{ guacamole_data_directory }}/mysql"
- name: Guacamole Container
docker_container:
name: guacamole
image: "oznu/guacamole"
pull: true
volumes:
- "{{ guacamole_data_directory }}/config:/config:rw"
ports:
- "{{ guacamole_port }}:8080"
restart_policy: unless-stopped
memory: "{{ guacamole_memory }}"
labels:
traefik.enable: "{{ guacamole_available_externally | string }}"
traefik.http.routers.guacamole.rule: "Host(`{{ guacamole_hostname }}.{{ ansible_nas_domain }}`)"
traefik.http.routers.guacamole.tls.certresolver: "letsencrypt"
traefik.http.routers.guacamole.tls.domains[0].main: "{{ ansible_nas_domain }}"
traefik.http.routers.guacamole.tls.domains[0].sans: "*.{{ ansible_nas_domain }}"
traefik.http.services.guacamole.loadbalancer.server.port: "8080"
- name: Guacamole Container
community.docker.docker_container:
container_default_behavior: no_defaults
name: "{{ guacamole_container_name }}"
image: "{{ guacamole_image_name }}:{{ guacamole_image_version }}"
pull: true
volumes:
- "{{ guacamole_data_directory }}/config:/config:rw"
ports:
- "{{ guacamole_port }}:8080"
restart_policy: unless-stopped
memory: "{{ guacamole_memory }}"
labels:
traefik.enable: "{{ guacamole_available_externally | string }}"
traefik.http.routers.guacamole.rule: "Host(`{{ guacamole_hostname }}.{{ ansible_nas_domain }}`)"
traefik.http.routers.guacamole.tls.certresolver: "letsencrypt"
traefik.http.routers.guacamole.tls.domains[0].main: "{{ ansible_nas_domain }}"
traefik.http.routers.guacamole.tls.domains[0].sans: "*.{{ ansible_nas_domain }}"
traefik.http.services.guacamole.loadbalancer.server.port: "8080"
- name: Restart Guacamole Container
docker_container:
name: guacamole
image: "oznu/guacamole"
restart: true
- name: Restart Guacamole Container
community.docker.docker_container:
name: "{{ guacamole_container_name }}"
image: "{{ guacamole_image_name }}:{{ guacamole_image_version }}"
restart: true
when: guacamole_enabled is true
- name: Stop Guacamole
block:
- name: Stop Guacamole
community.docker.docker_container:
name: "{{ guacamole_container_name }}"
state: absent
when: guacamole_enabled is false

View file

@ -0,0 +1,11 @@
# Healthchecks.io
Homepage: <https://healthchecks.io/>
A simple cronjob that uses `curl` to ping a given endpoint on the `healthchecks.io` servers. You can choose how often it should ping the endpoint, and what happens when it doesn't. Email/Slack/Telegram and many more services can be integrated.
## Usage
Create your own project on <https://healthchecks.io/>, and set both the time between pings and the grace time. Set your prefered integration such as email.
Set `healthchecks_enabled: true` in your `inventories/<your_inventory>/nas.yml` file, and if your time between pings is different than the default `healthchecks_ping_minutes`, change it. Finally, set your ping url in the `healthchecks_url` variable.

View file

@ -0,0 +1,6 @@
---
provisioner:
inventory:
group_vars:
all:
healthchecks_enabled: true

View file

@ -0,0 +1,10 @@
---
- name: Stop
hosts: all
become: true
tasks:
- name: "Include {{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }} role"
ansible.builtin.include_role:
name: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }}"
vars:
healthchecks_enabled: false

View file

@ -0,0 +1,19 @@
---
- name: Verify
hosts: all
gather_facts: false
tasks:
- name: Include vars
ansible.builtin.include_vars:
file: ../../defaults/main.yml
- name: Check cron job file
ansible.builtin.fetch:
src: /var/spool/cron/crontabs/root
dest: /tmp/fetched
- name: Check if cron job does exist
ansible.builtin.assert:
that: "lookup('file', '/tmp/fetched/instance/var/spool/cron/crontabs/root') is search('healthchecks.io')"
fail_msg: "Cron job 'healthchecks.io' does not exist!"
success_msg: "Cron job 'healthchecks.io' does exist!"

View file

@ -0,0 +1,19 @@
---
- name: Verify
hosts: all
gather_facts: false
tasks:
- name: Include vars
ansible.builtin.include_vars:
file: ../../defaults/main.yml
- name: Check cron job file
ansible.builtin.fetch:
src: /var/spool/cron/crontabs/root
dest: /tmp/fetched
- name: Check if cron job does not exist
ansible.builtin.assert:
that: "not lookup('file', '/tmp/fetched/instance/var/spool/cron/crontabs/root') is search('healthchecks.io')"
fail_msg: "Cron job 'healthchecks.io' still exists!"
success_msg: "Cron job 'healthchecks.io' does not exist!"

View file

@ -1,7 +1,19 @@
---
- name: Add healthchecks.io cronjob
cron:
name: healthchecks.io
minute: "*/{{ healthchecks_ping_minutes }}"
user: root
job: "curl -m 10 --retry 5 {{ healthchecks_url }}"
- name: Start Healthchecks
block:
- name: Add healthchecks.io cronjob
ansible.builtin.cron:
name: healthchecks.io
minute: "*/{{ healthchecks_ping_minutes }}"
user: root
job: "curl -m 10 --retry 5 {{ healthchecks_url }}"
when: healthchecks_enabled is true
- name: Stop Healthchecks
block:
- name: Remove healthchecks.io cronjob
ansible.builtin.cron:
name: healthchecks.io
user: root
state: absent
when: healthchecks_enabled is false