Move _ansible directory into main directory
This commit is contained in:
		
							parent
							
								
									519882db43
								
							
						
					
					
						commit
						40742e3214
					
				
					 124 changed files with 246 additions and 141 deletions
				
			
		
							
								
								
									
										48
									
								
								.gitignore
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										48
									
								
								.gitignore
									
										
									
									
										vendored
									
									
								
							| 
						 | 
					@ -1,47 +1 @@
 | 
				
			||||||
*.secret.env
 | 
					inventory/group_vars/all/serguzim.net.yml
 | 
				
			||||||
 | 
					 | 
				
			||||||
.lego/
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# services already handled by ansible
 | 
					 | 
				
			||||||
/acme-dns/
 | 
					 | 
				
			||||||
/authentik/
 | 
					 | 
				
			||||||
/coder/
 | 
					 | 
				
			||||||
/forgejo/
 | 
					 | 
				
			||||||
/forgejo-runner/
 | 
					 | 
				
			||||||
/gitea/
 | 
					 | 
				
			||||||
/gitea-runner/
 | 
					 | 
				
			||||||
/harbor/
 | 
					 | 
				
			||||||
/healthcheck/
 | 
					 | 
				
			||||||
/homebox/
 | 
					 | 
				
			||||||
/influxdb/
 | 
					 | 
				
			||||||
/jellyfin/
 | 
					 | 
				
			||||||
/minecraft-2/
 | 
					 | 
				
			||||||
/minio/
 | 
					 | 
				
			||||||
/synapse/
 | 
					 | 
				
			||||||
/tandoor/
 | 
					 | 
				
			||||||
/telegraf/
 | 
					 | 
				
			||||||
/tinytinyrss/
 | 
					 | 
				
			||||||
/umami/
 | 
					 | 
				
			||||||
/uptime-kuma/
 | 
					 | 
				
			||||||
/watchtower/
 | 
					 | 
				
			||||||
/webdis/
 | 
					 | 
				
			||||||
/wiki-js/
 | 
					 | 
				
			||||||
/woodpecker/
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/caddy/config/conf.002.d/acme.serguzim.me.conf
 | 
					 | 
				
			||||||
/caddy/config/conf.002.d/auth.serguzim.me.conf
 | 
					 | 
				
			||||||
/caddy/config/conf.002.d/analytics.serguzim.me.conf
 | 
					 | 
				
			||||||
/caddy/config/conf.002.d/ci.serguzim.me.conf
 | 
					 | 
				
			||||||
/caddy/config/conf.002.d/coder.serguzim.me.conf
 | 
					 | 
				
			||||||
/caddy/config/conf.002.d/faas.serguzim.me.conf
 | 
					 | 
				
			||||||
/caddy/config/conf.002.d/git.serguzim.me.conf
 | 
					 | 
				
			||||||
/caddy/config/conf.002.d/inventory.serguzim.me.conf
 | 
					 | 
				
			||||||
/caddy/config/conf.002.d/matrix.msrg.cc.conf
 | 
					 | 
				
			||||||
/caddy/config/conf.002.d/media.serguzim.me.conf
 | 
					 | 
				
			||||||
/caddy/config/conf.002.d/recipes.serguzim.me.conf
 | 
					 | 
				
			||||||
/caddy/config/conf.002.d/registry.serguzim.me.conf
 | 
					 | 
				
			||||||
/caddy/config/conf.002.d/rss.serguzim.me.conf
 | 
					 | 
				
			||||||
/caddy/config/conf.002.d/status.serguzim.me.conf
 | 
					 | 
				
			||||||
/caddy/config/conf.002.d/tick.serguzim.me.conf
 | 
					 | 
				
			||||||
/caddy/config/conf.002.d/webdis.huck.serguzim.me.conf
 | 
					 | 
				
			||||||
/caddy/config/conf.002.d/wiki.serguzim.me.conf
 | 
					 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -4,4 +4,4 @@ repos:
 | 
				
			||||||
    hooks:
 | 
					    hooks:
 | 
				
			||||||
      - id: ansible-lint
 | 
					      - id: ansible-lint
 | 
				
			||||||
        args:
 | 
					        args:
 | 
				
			||||||
          - _ansible/serguzim.net.yml
 | 
					          - serguzim.net.yml
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										2
									
								
								_ansible/.gitignore
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								_ansible/.gitignore
									
										
									
									
										vendored
									
									
								
							| 
						 | 
					@ -1,2 +0,0 @@
 | 
				
			||||||
.vault_pass
 | 
					 | 
				
			||||||
inventory/group_vars/all/serguzim.net.yml
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1,2 +0,0 @@
 | 
				
			||||||
ansible_port: "{{ vault_node002.ansible_port }}"
 | 
					 | 
				
			||||||
ansible_user: "{{ vault_node002.ansible_user }}"
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1,6 +1,6 @@
 | 
				
			||||||
#!/usr/bin/env sh
 | 
					#!/usr/bin/env sh
 | 
				
			||||||
 | 
					
 | 
				
			||||||
LEGO_WORKING_PATH="/opt/services/.lego/"
 | 
					export LEGO_WORKING_PATH="/opt/lego/"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
set -e
 | 
					set -e
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,8 +0,0 @@
 | 
				
			||||||
HC_UID=
 | 
					 | 
				
			||||||
UPTIME_KUMA_TOKEN=
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
RESTIC_REPOSITORY=
 | 
					 | 
				
			||||||
RESTIC_PASSWORD=
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
AWS_ACCESS_KEY_ID=
 | 
					 | 
				
			||||||
AWS_SECRET_ACCESS_KEY=
 | 
					 | 
				
			||||||
							
								
								
									
										2
									
								
								backup/.gitignore
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								backup/.gitignore
									
										
									
									
										vendored
									
									
								
							| 
						 | 
					@ -1,2 +0,0 @@
 | 
				
			||||||
/mailcheck.mail
 | 
					 | 
				
			||||||
/msmtprc
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1,4 +0,0 @@
 | 
				
			||||||
[Service]
 | 
					 | 
				
			||||||
Type=oneshot
 | 
					 | 
				
			||||||
ExecStart=/opt/services/backup/backup.sh
 | 
					 | 
				
			||||||
WorkingDirectory=/opt/services/backup/
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1,65 +0,0 @@
 | 
				
			||||||
#!/usr/bin/env sh
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
set -e
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
set -a
 | 
					 | 
				
			||||||
. "/opt/services/backup/.env"
 | 
					 | 
				
			||||||
. "/opt/services/backup/.secret.env"
 | 
					 | 
				
			||||||
set +a
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
hc_url="https://hc-ping.com/$HC_UID"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
curl -fsSL --retry 3 "$hc_url/start" >/dev/null
 | 
					 | 
				
			||||||
duration_start=$(date +%s)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
BACKUP_LOCATION="/tmp/backup-misc"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
rm -rf "$BACKUP_LOCATION"
 | 
					 | 
				
			||||||
mkdir -p "$BACKUP_LOCATION"
 | 
					 | 
				
			||||||
cd "$BACKUP_LOCATION" || exit
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
_hc_fail () {
 | 
					 | 
				
			||||||
	curl -fsSL --retry 3 "$hc_url/fail"
 | 
					 | 
				
			||||||
	exit 1
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
_backup_prepare_postgres () {
 | 
					 | 
				
			||||||
	mkdir -p "$BACKUP_LOCATION/postgres"
 | 
					 | 
				
			||||||
	cd "$BACKUP_LOCATION/postgres" || exit
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	postgres_tables=$(sudo -u postgres psql -Atc "SELECT datname FROM pg_database WHERE datistemplate = false;")
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	for i in $postgres_tables
 | 
					 | 
				
			||||||
	do
 | 
					 | 
				
			||||||
		echo "dumping $i"
 | 
					 | 
				
			||||||
		sudo -u postgres pg_dump "$i" | gzip >"pg_dump_$i.gz"
 | 
					 | 
				
			||||||
		echo "done with $i"
 | 
					 | 
				
			||||||
		echo ""
 | 
					 | 
				
			||||||
	done
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	echo "dumping all"
 | 
					 | 
				
			||||||
	sudo -u postgres pg_dumpall | gzip >"pg_dumpall.gz"
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
_backup_prepare_mailcow () {
 | 
					 | 
				
			||||||
	export MAILCOW_BACKUP_LOCATION="$BACKUP_LOCATION/mailcow"
 | 
					 | 
				
			||||||
	mkdir -p "$MAILCOW_BACKUP_LOCATION"
 | 
					 | 
				
			||||||
	/opt/mailcow-dockerized/helper-scripts/backup_and_restore.sh \
 | 
					 | 
				
			||||||
		backup all --delete-days 3
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
echo ""
 | 
					 | 
				
			||||||
echo "preparing postgres"
 | 
					 | 
				
			||||||
time _backup_prepare_postgres >/tmp/backup-postgres.log || _hc_fail
 | 
					 | 
				
			||||||
echo ""
 | 
					 | 
				
			||||||
echo "preparing mailcow"
 | 
					 | 
				
			||||||
time _backup_prepare_mailcow >/tmp/backup-mailcow.log || _hc_fail
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
cd /opt/services/backup/
 | 
					 | 
				
			||||||
docker compose run --rm backup || _hc_fail
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
duration_end=$(date +%s)
 | 
					 | 
				
			||||||
curl -fsSL --retry 3 "$hc_url"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
duration=$((duration_end - duration_start))
 | 
					 | 
				
			||||||
curl -fsSL --retry 3 "https://status.serguzim.me/api/push/$UPTIME_KUMA_TOKEN?status=up&msg=OK&ping=${duration}000"
 | 
					 | 
				
			||||||
							
								
								
									
										24
									
								
								filter_plugins/map_backup_volumes.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								filter_plugins/map_backup_volumes.py
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,24 @@
 | 
				
			||||||
 | 
					class FilterModule(object):
 | 
				
			||||||
 | 
					    def filters(self):
 | 
				
			||||||
 | 
					        return {
 | 
				
			||||||
 | 
					            'map_backup_volumes': self.map_backup_volumes,
 | 
				
			||||||
 | 
					            'map_backup_volumes_service': self.map_backup_volumes_service
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def map_backup_volumes(self, volumes):
 | 
				
			||||||
 | 
					        result = {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        for volume in volumes:
 | 
				
			||||||
 | 
					            result[volume] = {
 | 
				
			||||||
 | 
					                "external": True,
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return result
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def map_backup_volumes_service(self, volumes):
 | 
				
			||||||
 | 
					        result = []
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        for volume in volumes:
 | 
				
			||||||
 | 
					            result.append("{volume_name}:/backup/volumes/{volume_name}".format(volume_name=volume))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return result
 | 
				
			||||||
							
								
								
									
										13
									
								
								inventory/host_vars/node002/main.yml
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								inventory/host_vars/node002/main.yml
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,13 @@
 | 
				
			||||||
 | 
					ansible_port: "{{ vault_node002.ansible_port }}"
 | 
				
			||||||
 | 
					ansible_user: "{{ vault_node002.ansible_user }}"
 | 
				
			||||||
 | 
					host_backup:
 | 
				
			||||||
 | 
					  backup:
 | 
				
			||||||
 | 
					    hc_uid: "{{ vault_node002.backup.hc_uid }}"
 | 
				
			||||||
 | 
					    uptime_kuma_token: "{{ vault_node002.backup.uptime_kuma_token }}"
 | 
				
			||||||
 | 
					    volumes:
 | 
				
			||||||
 | 
					      - gitea_data
 | 
				
			||||||
 | 
					      - influxdb_data
 | 
				
			||||||
 | 
					      - reitanlage-oranienburg_data
 | 
				
			||||||
 | 
					      - synapse_media_store
 | 
				
			||||||
 | 
					      - tandoor_mediafiles
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,8 +1,9 @@
 | 
				
			||||||
---
 | 
					---
 | 
				
			||||||
- name: Run roles for local-dev
 | 
					- name: Run roles for local-dev
 | 
				
			||||||
  vars:
 | 
					  vars:
 | 
				
			||||||
    # Remove _ansible and inventory
 | 
					    # Remove inventory
 | 
				
			||||||
    services_path: "{{ inventory_dir.split('/')[0:-2] | join('/') }}"
 | 
					    base_path: "{{ inventory_dir.split('/')[0:-1] | join('/') }}"
 | 
				
			||||||
 | 
					    services_path: "{{ (base_path, '_services') | path_join }}"
 | 
				
			||||||
    caddy_config_path: "{{ (services_path, 'caddy', 'config', 'conf.d') | path_join }}"
 | 
					    caddy_config_path: "{{ (services_path, 'caddy', 'config', 'conf.d') | path_join }}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  hosts: local-dev
 | 
					  hosts: local-dev
 | 
				
			||||||
| 
						 | 
					@ -4,6 +4,8 @@
 | 
				
			||||||
  roles:
 | 
					  roles:
 | 
				
			||||||
    - role: common
 | 
					    - role: common
 | 
				
			||||||
      tags: [always]
 | 
					      tags: [always]
 | 
				
			||||||
 | 
					    - role: backup
 | 
				
			||||||
 | 
					      tags: [backup]
 | 
				
			||||||
    - role: caddy
 | 
					    - role: caddy
 | 
				
			||||||
      tags: [caddy, reverse-proxy, webserver]
 | 
					      tags: [caddy, reverse-proxy, webserver]
 | 
				
			||||||
      vars:
 | 
					      vars:
 | 
				
			||||||
| 
						 | 
					@ -7,8 +7,7 @@ services:
 | 
				
			||||||
    image: backup
 | 
					    image: backup
 | 
				
			||||||
    restart: never
 | 
					    restart: never
 | 
				
			||||||
    env_file:
 | 
					    env_file:
 | 
				
			||||||
      - .env
 | 
					      - service.env
 | 
				
			||||||
      - .secret.env
 | 
					 | 
				
			||||||
    volumes:
 | 
					    volumes:
 | 
				
			||||||
      - /tmp/backup-misc:/backup/misc
 | 
					      - /tmp/backup-misc:/backup/misc
 | 
				
			||||||
      - gitea_data:/backup/volumes/gitea_data
 | 
					      - gitea_data:/backup/volumes/gitea_data
 | 
				
			||||||
							
								
								
									
										3
									
								
								roles/backup/files/node001/mailcow.sh
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										3
									
								
								roles/backup/files/node001/mailcow.sh
									
										
									
									
									
										Executable file
									
								
							| 
						 | 
					@ -0,0 +1,3 @@
 | 
				
			||||||
 | 
					export MAILCOW_BACKUP_LOCATION="$BACKUP_LOCATION/mailcow"
 | 
				
			||||||
 | 
					mkdir -p "$MAILCOW_BACKUP_LOCATION"
 | 
				
			||||||
 | 
					/opt/mailcow-dockerized/helper-scripts/backup_and_restore.sh backup all
 | 
				
			||||||
							
								
								
									
										14
									
								
								roles/backup/files/node002/postgres.sh
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										14
									
								
								roles/backup/files/node002/postgres.sh
									
										
									
									
									
										Executable file
									
								
							| 
						 | 
					@ -0,0 +1,14 @@
 | 
				
			||||||
 | 
					mkdir -p "$BACKUP_LOCATION/postgres"
 | 
				
			||||||
 | 
					cd "$BACKUP_LOCATION/postgres" || exit
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					postgres_tables=$(sudo -u postgres psql -Atc "SELECT datname FROM pg_database WHERE datistemplate = false;")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					for i in $postgres_tables
 | 
				
			||||||
 | 
					do
 | 
				
			||||||
 | 
						printf "dumping %s ..." "$i"
 | 
				
			||||||
 | 
						sudo -u postgres pg_dump "$i" | gzip >"pg_dump_$i.gz"
 | 
				
			||||||
 | 
						echo " done"
 | 
				
			||||||
 | 
					done
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					echo "dumping all"
 | 
				
			||||||
 | 
					sudo -u postgres pg_dumpall | gzip >"pg_dumpall.gz"
 | 
				
			||||||
							
								
								
									
										84
									
								
								roles/backup/tasks/main.yml
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										84
									
								
								roles/backup/tasks/main.yml
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,84 @@
 | 
				
			||||||
 | 
					---
 | 
				
			||||||
 | 
					- name: Set common facts
 | 
				
			||||||
 | 
					  ansible.builtin.import_tasks: tasks/set-default-facts.yml
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- name: Deploy {{ svc.name }}
 | 
				
			||||||
 | 
					  vars:
 | 
				
			||||||
 | 
					    svc: "{{ backup_svc }}"
 | 
				
			||||||
 | 
					    env: "{{ backup_env }}"
 | 
				
			||||||
 | 
					    compose: "{{ backup_compose }}"
 | 
				
			||||||
 | 
					  block:
 | 
				
			||||||
 | 
					    - name: Import prepare tasks for common service
 | 
				
			||||||
 | 
					      ansible.builtin.import_tasks: tasks/prepare-common-service.yml
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    - name: Copy the Dockerfile
 | 
				
			||||||
 | 
					      ansible.builtin.copy:
 | 
				
			||||||
 | 
					        src: Dockerfile
 | 
				
			||||||
 | 
					        dest: "{{ (service_path, 'Dockerfile') | path_join }}"
 | 
				
			||||||
 | 
					        mode: "0644"
 | 
				
			||||||
 | 
					      register: cmd_result
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    - name: Set the docker rebuild flag
 | 
				
			||||||
 | 
					      ansible.builtin.set_fact:
 | 
				
			||||||
 | 
					        docker_rebuild: true
 | 
				
			||||||
 | 
					      when: cmd_result.changed # noqa: no-handler We need to handle the restart per service. Handlers don't support variables.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    - name: Set backup.d path
 | 
				
			||||||
 | 
					      ansible.builtin.set_fact:
 | 
				
			||||||
 | 
					        backup_d_path: "{{ (service_path, 'backup.d') | path_join }}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    - name: Create backup.d directory
 | 
				
			||||||
 | 
					      ansible.builtin.file:
 | 
				
			||||||
 | 
					        path: "{{ backup_d_path }}"
 | 
				
			||||||
 | 
					        state: directory
 | 
				
			||||||
 | 
					        mode: "0755"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    - name: Copy the additional backup scripts
 | 
				
			||||||
 | 
					      ansible.builtin.copy:
 | 
				
			||||||
 | 
					        src: "{{ item }}"
 | 
				
			||||||
 | 
					        dest: "{{ backup_d_path }}"
 | 
				
			||||||
 | 
					        mode: "0755"
 | 
				
			||||||
 | 
					      with_fileglob:
 | 
				
			||||||
 | 
					        - "{{ ansible_facts.hostname }}/*"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    - name: Copy the main backup scripts
 | 
				
			||||||
 | 
					      ansible.builtin.template:
 | 
				
			||||||
 | 
					        src: "backup.sh.j2"
 | 
				
			||||||
 | 
					        dest: "{{ (service_path, 'backup.sh') | path_join }}"
 | 
				
			||||||
 | 
					        mode: "0755"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    - name: Copy the system service
 | 
				
			||||||
 | 
					      ansible.builtin.template:
 | 
				
			||||||
 | 
					        src: backup.service.j2
 | 
				
			||||||
 | 
					        dest: /etc/systemd/system/backup.service
 | 
				
			||||||
 | 
					        mode: "0644"
 | 
				
			||||||
 | 
					      become: true
 | 
				
			||||||
 | 
					    - name: Copy the system timer
 | 
				
			||||||
 | 
					      ansible.builtin.copy:
 | 
				
			||||||
 | 
					        src: backup.timer
 | 
				
			||||||
 | 
					        dest: /etc/systemd/system/backup.timer
 | 
				
			||||||
 | 
					        mode: "0644"
 | 
				
			||||||
 | 
					      become: true
 | 
				
			||||||
 | 
					    - name: Enable the system timer
 | 
				
			||||||
 | 
					      ansible.builtin.systemd_service:
 | 
				
			||||||
 | 
					        name: backup.timer
 | 
				
			||||||
 | 
					        state: started
 | 
				
			||||||
 | 
					        enabled: true
 | 
				
			||||||
 | 
					        daemon_reload: true
 | 
				
			||||||
 | 
					      become: true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    - name: Import tasks create a service.env file
 | 
				
			||||||
 | 
					      ansible.builtin.import_tasks: tasks/steps/template-service-env.yml
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    - name: Build service
 | 
				
			||||||
 | 
					      ansible.builtin.command:
 | 
				
			||||||
 | 
					        cmd: docker compose build --pull
 | 
				
			||||||
 | 
					        chdir: "{{ service_path }}"
 | 
				
			||||||
 | 
					      register: cmd_result
 | 
				
			||||||
 | 
					      changed_when: true # TODO
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    - name: Verify service
 | 
				
			||||||
 | 
					      ansible.builtin.command:
 | 
				
			||||||
 | 
					        cmd: docker compose run --rm app check
 | 
				
			||||||
 | 
					        chdir: "{{ service_path }}"
 | 
				
			||||||
 | 
					      changed_when: false
 | 
				
			||||||
							
								
								
									
										4
									
								
								roles/backup/templates/backup.service.j2
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								roles/backup/templates/backup.service.j2
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,4 @@
 | 
				
			||||||
 | 
					[Service]
 | 
				
			||||||
 | 
					Type=oneshot
 | 
				
			||||||
 | 
					ExecStart={{ service_path }}/backup.sh
 | 
				
			||||||
 | 
					WorkingDirectory={{ service_path }}
 | 
				
			||||||
							
								
								
									
										50
									
								
								roles/backup/templates/backup.sh.j2
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										50
									
								
								roles/backup/templates/backup.sh.j2
									
										
									
									
									
										Executable file
									
								
							| 
						 | 
					@ -0,0 +1,50 @@
 | 
				
			||||||
 | 
					#!/usr/bin/env bash
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					set -e
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					set -a
 | 
				
			||||||
 | 
					. "{{ service_path }}/service.env"
 | 
				
			||||||
 | 
					set +a
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					hc_url="https://hc-ping.com/$HC_UID"
 | 
				
			||||||
 | 
					_hc_ping () {
 | 
				
			||||||
 | 
						curl -fsSL --retry 3 "$hc_url$1" >/dev/null
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					_hc_fail () {
 | 
				
			||||||
 | 
						_hc_ping "/fail"
 | 
				
			||||||
 | 
						exit 1
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					_hc_ping "/start"
 | 
				
			||||||
 | 
					duration_start=$(date +%s)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					BACKUP_LOCATION="$(mktemp -d)"
 | 
				
			||||||
 | 
					export BACKUP_LOCATION
 | 
				
			||||||
 | 
					cd "$BACKUP_LOCATION" || exit
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					shopt -s nullglob
 | 
				
			||||||
 | 
					for file in "{{ service_path }}/backup.d/"*
 | 
				
			||||||
 | 
					do
 | 
				
			||||||
 | 
						echo ""
 | 
				
			||||||
 | 
						echo "running $file"
 | 
				
			||||||
 | 
						time "$file" || _hc_fail
 | 
				
			||||||
 | 
					done || true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					cd "{{ service_path }}"
 | 
				
			||||||
 | 
					docker compose run --rm -v "$BACKUP_LOCATION:/backup/misc" app backup /backup || _hc_fail
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					duration_end=$(date +%s)
 | 
				
			||||||
 | 
					_hc_ping
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					duration=$((duration_end - duration_start))
 | 
				
			||||||
 | 
					curl -fsSL --retry 3 "https://status.serguzim.me/api/push/$UPTIME_KUMA_TOKEN?status=up&msg=OK&ping=${duration}000"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					rm -rf "$BACKUP_LOCATION"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					echo "forgetting old backups for $(hostname)"
 | 
				
			||||||
 | 
					docker compose run --rm app forget --host "$(hostname)" --prune \
 | 
				
			||||||
 | 
						--keep-daily 14 \
 | 
				
			||||||
 | 
						--keep-weekly 28 \
 | 
				
			||||||
 | 
						--keep-monthly 12 \
 | 
				
			||||||
 | 
						--keep-yearly 2 
 | 
				
			||||||
							
								
								
									
										28
									
								
								roles/backup/vars/main.yml
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								roles/backup/vars/main.yml
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,28 @@
 | 
				
			||||||
 | 
					---
 | 
				
			||||||
 | 
					backup_svc:
 | 
				
			||||||
 | 
					  name: backup
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					backup_volumes_service: "{{ host_backup.backup.volumes | map_backup_volumes_service }}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					backup_env:
 | 
				
			||||||
 | 
					  HC_UID: "{{ host_backup.backup.hc_uid }}"
 | 
				
			||||||
 | 
					  UPTIME_KUMA_TOKEN: "{{ host_backup.backup.uptime_kuma_token }}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  RESTIC_REPOSITORY: "{{ vault_backup.restic.repository }}"
 | 
				
			||||||
 | 
					  RESTIC_PASSWORD: "{{ vault_backup.restic.password }}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  AWS_ACCESS_KEY_ID: "{{ vault_backup.aws_secret.key_id }}"
 | 
				
			||||||
 | 
					  AWS_SECRET_ACCESS_KEY: "{{ vault_backup.aws_secret.access_key }}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					backup_compose:
 | 
				
			||||||
 | 
					  watchtower: false
 | 
				
			||||||
 | 
					  image: backup
 | 
				
			||||||
 | 
					  volumes: "{{ backup_volumes_service }}"
 | 
				
			||||||
 | 
					  file:
 | 
				
			||||||
 | 
					    services:
 | 
				
			||||||
 | 
					      app:
 | 
				
			||||||
 | 
					        build:
 | 
				
			||||||
 | 
					          context: .
 | 
				
			||||||
 | 
					        restart: never
 | 
				
			||||||
 | 
					        hostname: "{{ ansible_facts.hostname }}"
 | 
				
			||||||
 | 
					    volumes: "{{ host_backup.backup.volumes | map_backup_volumes }}"
 | 
				
			||||||
| 
						 | 
					@ -36,8 +36,8 @@ harbor_yml:
 | 
				
			||||||
    port: "{{ harbor_port_http }}"
 | 
					    port: "{{ harbor_port_http }}"
 | 
				
			||||||
  https:
 | 
					  https:
 | 
				
			||||||
    port: "{{ harbor_port_https }}"
 | 
					    port: "{{ harbor_port_https }}"
 | 
				
			||||||
    certificate: /opt/services/.lego/certificates/registry.serguzim.me.crt
 | 
					    certificate: /opt/services/.lego/certificates/registry.serguzim.me.crt # TODO
 | 
				
			||||||
    private_key: /opt/services/.lego/certificates/registry.serguzim.me.key
 | 
					    private_key: /opt/services/.lego/certificates/registry.serguzim.me.key # TODO
 | 
				
			||||||
  external_url: https://registry.serguzim.me
 | 
					  external_url: https://registry.serguzim.me
 | 
				
			||||||
  harbor_admin_password: "{{ vault_harbor.admin_password }}"
 | 
					  harbor_admin_password: "{{ vault_harbor.admin_password }}"
 | 
				
			||||||
  data_volume: "{{ (service_path, 'data') | path_join }}"
 | 
					  data_volume: "{{ (service_path, 'data') | path_join }}"
 | 
				
			||||||
| 
						 | 
					@ -14,7 +14,7 @@ check_url ()
 | 
				
			||||||
    printf "checking url %s ." "$url"
 | 
					    printf "checking url %s ." "$url"
 | 
				
			||||||
    dig A "$1" >/dev/null
 | 
					    dig A "$1" >/dev/null
 | 
				
			||||||
	printf "."
 | 
						printf "."
 | 
				
			||||||
	result=$(curl -LsSfv "$url" 2>&1)
 | 
						result=$(curl -LsSfv --retry 3 "$url" 2>&1)
 | 
				
			||||||
	code="$?"
 | 
						code="$?"
 | 
				
			||||||
	printf ".\n"
 | 
						printf ".\n"
 | 
				
			||||||
	#shellcheck disable=SC2181
 | 
						#shellcheck disable=SC2181
 | 
				
			||||||
| 
						 | 
					@ -1,4 +1,4 @@
 | 
				
			||||||
[Service]
 | 
					[Service]
 | 
				
			||||||
Type=oneshot
 | 
					Type=oneshot
 | 
				
			||||||
ExecStart=/usr/bin/docker compose run --rm %i
 | 
					ExecStart=/usr/bin/docker compose run --rm %i
 | 
				
			||||||
WorkingDirectory=/opt/services/healthcheck/
 | 
					WorkingDirectory={{ service_path }}
 | 
				
			||||||
| 
						 | 
					@ -39,6 +39,14 @@
 | 
				
			||||||
        dest: /etc/systemd/system/healthcheck@.timer
 | 
					        dest: /etc/systemd/system/healthcheck@.timer
 | 
				
			||||||
        mode: "0644"
 | 
					        mode: "0644"
 | 
				
			||||||
      become: true
 | 
					      become: true
 | 
				
			||||||
 | 
					    - name: Enable the system timer
 | 
				
			||||||
 | 
					      ansible.builtin.systemd_service:
 | 
				
			||||||
 | 
					        name: healthcheck@{{ item }}.timer
 | 
				
			||||||
 | 
					        state: started
 | 
				
			||||||
 | 
					        enabled: true
 | 
				
			||||||
 | 
					        daemon_reload: true
 | 
				
			||||||
 | 
					      loop: "{{ healthcheck_svc.checks }}"
 | 
				
			||||||
 | 
					      become: true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    - name: Import tasks create a service.env file
 | 
					    - name: Import tasks create a service.env file
 | 
				
			||||||
      ansible.builtin.import_tasks: tasks/steps/template-service-env.yml
 | 
					      ansible.builtin.import_tasks: tasks/steps/template-service-env.yml
 | 
				
			||||||
| 
						 | 
					@ -1,6 +1,10 @@
 | 
				
			||||||
---
 | 
					---
 | 
				
			||||||
healthcheck_svc:
 | 
					healthcheck_svc:
 | 
				
			||||||
  name: healthcheck
 | 
					  name: healthcheck
 | 
				
			||||||
 | 
					  checks:
 | 
				
			||||||
 | 
					    - http
 | 
				
			||||||
 | 
					    - mail
 | 
				
			||||||
 | 
					    - matrix
 | 
				
			||||||
 | 
					
 | 
				
			||||||
healthcheck_env:
 | 
					healthcheck_env:
 | 
				
			||||||
  USER_AGENT: healthcheck-bot for serguzim.net
 | 
					  USER_AGENT: healthcheck-bot for serguzim.net
 | 
				
			||||||
Some files were not shown because too many files have changed in this diff Show more
		Reference in a new issue