Compare commits
33 Commits
d2c632616a
...
docker-ref
| Author | SHA1 | Date | |
|---|---|---|---|
| 6ca0b7b5d3 | |||
| 8d8b40f2e6 | |||
| 21109f160e | |||
| cd077517a0 | |||
| d3a8cc66ad | |||
| b12b1fa924 | |||
| 7919919d23 | |||
| f590fc777f | |||
| 742fc0d421 | |||
| 44104a9a57 | |||
| 1609167399 | |||
| 24861aaa70 | |||
| ab9059374e | |||
| 8c285e2682 | |||
| dd546bc033 | |||
| 8391a77535 | |||
| 2a091a6f21 | |||
| 11e1b9b89f | |||
| 8c239b0dc9 | |||
| 6ba8ee4d79 | |||
| b6a9e5912f | |||
| a3c6d0c0d6 | |||
| 88f8edcd0d | |||
| d904f10434 | |||
| d54ef85c48 | |||
| a2cc1eafb6 | |||
| 3b68e15bb9 | |||
| 71e8d19574 | |||
| 8ba2e93e77 | |||
| a3d9c54ba0 | |||
| 95e8475baf | |||
| 96fd1e13b2 | |||
| 71edcd698c |
1
.gitignore
vendored
1
.gitignore
vendored
@@ -1,3 +1,2 @@
|
|||||||
.vscode/
|
.vscode/
|
||||||
Ansible/secrets.yml
|
Ansible/secrets.yml
|
||||||
Ansible/inventory/hosts.ini
|
|
||||||
@@ -4,10 +4,10 @@ This Ansible setup is designed to automate the configuration and maintenance of
|
|||||||
|
|
||||||
## Directory Structure
|
## Directory Structure
|
||||||
|
|
||||||
- `inventory/`: Contains the inventory files that define the hosts and groups of hosts managed by Ansible. The `hosts.ini` file should be updated with your server details, and `example_hosts.ini` serves as a template.
|
- `inventory/`: Contains the inventory files that define the hosts and groups of hosts managed by Ansible.
|
||||||
- `group_vars/`: This directory can be used to store variables that apply to specific groups of hosts defined in the inventory.
|
- `playbooks/`: Contains the Ansible playbooks for various automation tasks.
|
||||||
- `*.yml` files: These are the Ansible playbooks that define the automation tasks.
|
- `secrets.yml`: This file is intended to store sensitive data like passwords and API keys. It is recommended to encrypt this file using Ansible Vault.
|
||||||
- `secrets.yml`: This file is intended to store sensitive data like passwords and API keys. It is recommended to encrypt this file using Ansible Vault. An `example_secrets.yml` is provided as a template.
|
- `example_secrets.yml`: An example secrets file.
|
||||||
- `vars.yml`: This file can be used to store non-sensitive variables that are used across multiple playbooks.
|
- `vars.yml`: This file can be used to store non-sensitive variables that are used across multiple playbooks.
|
||||||
|
|
||||||
## Getting Started
|
## Getting Started
|
||||||
@@ -17,5 +17,5 @@ This Ansible setup is designed to automate the configuration and maintenance of
|
|||||||
3. **Secrets:** Create a `secrets.yml` file based on the `example_secrets.yml` template and encrypt it using Ansible Vault for security.
|
3. **Secrets:** Create a `secrets.yml` file based on the `example_secrets.yml` template and encrypt it using Ansible Vault for security.
|
||||||
4. **Run a Playbook:** You can run a playbook using the `ansible-playbook` command. For example:
|
4. **Run a Playbook:** You can run a playbook using the `ansible-playbook` command. For example:
|
||||||
```bash
|
```bash
|
||||||
ansible-playbook -i inventory/hosts.ini apt_upgrade.yml
|
ansible-playbook -i inventory/hosts.ini playbooks/apt_upgrade.yml
|
||||||
```
|
```
|
||||||
@@ -1,2 +1,7 @@
|
|||||||
# Copy this into secrets.yml and replate with a real values
|
# Copy this into secrets.yml and replate with a real values
|
||||||
ansible_password: 'REPLACE_WITH_ROOT_PASSWORD'
|
ansible_password: 'REPLACE_WITH_ROOT_PASSWORD'
|
||||||
|
# Zabbix proxy parameters for connecting to Zabbix server
|
||||||
|
zabbix_server_address: 'x.x.x.x'
|
||||||
|
zabbix_psk_identity: '<zabbix_psk_identity'
|
||||||
|
zabbix_proxy_hostname: '<zabbix_proxy_hostname>' # if needed, in the actual playbook it is set to the hostname of the target
|
||||||
|
zabbix_proxy_psk: 'REPLACE_WITH_ZABBIX_PSK'
|
||||||
@@ -1,30 +0,0 @@
|
|||||||
[all:vars]
|
|
||||||
ansible_user = mbuz
|
|
||||||
ansible_ssh_private_key_file = /home/mbuz/.ssh/id_rsa
|
|
||||||
|
|
||||||
[proxmox]
|
|
||||||
proxmox-host ansible_host=x.x.x.x
|
|
||||||
|
|
||||||
[docker]
|
|
||||||
docker-apps ansible_host=x.x.x.x
|
|
||||||
docker-cloud ansible_host=x.x.x.x
|
|
||||||
|
|
||||||
#[truenas]
|
|
||||||
#truenas ansible_host=x.x.x.x
|
|
||||||
|
|
||||||
[raspberry_pi]
|
|
||||||
raspberry-pi ansible_host=x.x.x.x
|
|
||||||
|
|
||||||
[lxc]
|
|
||||||
ansible ansible_host=x.x.x.x
|
|
||||||
zabbix-proxy ansible_host=x.x.x.x
|
|
||||||
pi-hole ansible_host=x.x.x.x
|
|
||||||
|
|
||||||
[proxmox_backup]
|
|
||||||
proxmox-backup ansible_host=x.x.x.x
|
|
||||||
|
|
||||||
# This is a group of groups. It includes all hosts in the 'docker' and 'raspberry_pi' groups.
|
|
||||||
[ubuntu:children]
|
|
||||||
docker
|
|
||||||
raspberry_pi
|
|
||||||
lxc
|
|
||||||
34
Ansible/inventory/hosts.ini
Normal file
34
Ansible/inventory/hosts.ini
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
[all:vars]
|
||||||
|
ansible_user = mbuz
|
||||||
|
ansible_ssh_private_key_file = /home/mbuz/.ssh/id_ed25519
|
||||||
|
|
||||||
|
[proxmox]
|
||||||
|
proxmox_host ansible_host=10.0.0.1
|
||||||
|
|
||||||
|
[ubuntu_servers]
|
||||||
|
raspberry-pi ansible_host=10.0.0.5
|
||||||
|
oracle-arm ansible_host=130.61.76.209 ansible_user=ubuntu
|
||||||
|
|
||||||
|
[docker]
|
||||||
|
docker-apps ansible_host=10.0.0.101
|
||||||
|
docker-cloud ansible_host=10.0.0.102
|
||||||
|
|
||||||
|
[filestorage]
|
||||||
|
truenas ansible_host=10.0.0.200
|
||||||
|
|
||||||
|
[lxc]
|
||||||
|
gitea ansible_host=10.0.0.108
|
||||||
|
zabbix-proxy ansible_host=10.0.0.110
|
||||||
|
pi-hole ansible_host=10.0.0.104
|
||||||
|
ansible ansible_host=10.0.0.111
|
||||||
|
#localhost ansible_connection=local # for testing playbooks on the control node
|
||||||
|
|
||||||
|
|
||||||
|
[pbs]
|
||||||
|
proxmox-backup ansible_host=10.0.0.201
|
||||||
|
|
||||||
|
# This is a group of groups. It includes all Ubuntu based systems.
|
||||||
|
[ubuntu:children]
|
||||||
|
docker
|
||||||
|
ubuntu_servers
|
||||||
|
lxc
|
||||||
@@ -1,14 +1,29 @@
|
|||||||
- name: Upgrade packages
|
---
|
||||||
|
- name: Upgrade all apt packages
|
||||||
hosts: ubuntu
|
hosts: ubuntu
|
||||||
become: true
|
become: yes
|
||||||
|
|
||||||
tasks:
|
tasks:
|
||||||
- name: Update cache
|
- name: Update apt cache
|
||||||
ansible.builtin.apt:
|
ansible.builtin.apt:
|
||||||
update_cache: true
|
update_cache: yes
|
||||||
register: cache_updated
|
cache_valid_time: 3600
|
||||||
|
|
||||||
- name: Upgrade packages if something is changed
|
- name: Upgrade all apt packages
|
||||||
ansible.builtin.apt:
|
ansible.builtin.apt:
|
||||||
upgrade: "yes"
|
upgrade: dist
|
||||||
when: cache_updated.changed
|
# environment:
|
||||||
|
# DEBIAN_FRONTEND: noninteractive
|
||||||
|
|
||||||
|
- name: Autoremove unused packages
|
||||||
|
ansible.builtin.apt:
|
||||||
|
autoremove: yes
|
||||||
|
|
||||||
|
- name: Check if a reboot is required
|
||||||
|
ansible.builtin.stat:
|
||||||
|
path: /var/run/reboot-required
|
||||||
|
register: reboot_required_file
|
||||||
|
|
||||||
|
- name: Display reboot message
|
||||||
|
ansible.builtin.debug:
|
||||||
|
msg: "A reboot is required to apply the latest updates."
|
||||||
|
when: reboot_required_file.stat.exists
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
---
|
---
|
||||||
- name: Install and Configure Zabbix Proxy
|
- name: Install and Configure Zabbix Proxy and Agent
|
||||||
hosts: zabbix-proxy # Assuming you have a group for zabbix proxy in your inventory
|
hosts: zabbix-proxy # Assuming you have a group for zabbix proxy in your inventory
|
||||||
become: yes
|
become: yes
|
||||||
vars_files:
|
vars_files:
|
||||||
@@ -14,9 +14,11 @@
|
|||||||
ansible.builtin.apt:
|
ansible.builtin.apt:
|
||||||
deb: /tmp/zabbix-release.deb
|
deb: /tmp/zabbix-release.deb
|
||||||
|
|
||||||
- name: Install Zabbix proxy
|
- name: Install Zabbix proxy and agent
|
||||||
ansible.builtin.apt:
|
ansible.builtin.apt:
|
||||||
name: zabbix-proxy-sqlite3
|
name:
|
||||||
|
- zabbix-proxy-sqlite3
|
||||||
|
- zabbix-agent2
|
||||||
state: present
|
state: present
|
||||||
update_cache: yes
|
update_cache: yes
|
||||||
|
|
||||||
@@ -24,6 +26,8 @@
|
|||||||
ansible.builtin.copy:
|
ansible.builtin.copy:
|
||||||
dest: /etc/zabbix/zabbix_proxy.d/custom.conf
|
dest: /etc/zabbix/zabbix_proxy.d/custom.conf
|
||||||
content: |
|
content: |
|
||||||
|
## Managed by Ansible - do not edit manually ##
|
||||||
|
## Changes will be overwritten ##
|
||||||
DBName=/tmp/zabbix_proxy
|
DBName=/tmp/zabbix_proxy
|
||||||
StartPollers=2
|
StartPollers=2
|
||||||
StartPreprocessors=1
|
StartPreprocessors=1
|
||||||
@@ -40,6 +44,8 @@
|
|||||||
ansible.builtin.copy:
|
ansible.builtin.copy:
|
||||||
dest: /etc/zabbix/zabbix_proxy.d/connection.conf
|
dest: /etc/zabbix/zabbix_proxy.d/connection.conf
|
||||||
content: |
|
content: |
|
||||||
|
## Managed by Ansible - do not edit manually ##
|
||||||
|
## Changes will be overwritten ##
|
||||||
Server={{ zabbix_server_address }}:10051
|
Server={{ zabbix_server_address }}:10051
|
||||||
Hostname={{ ansible_facts.hostname }}
|
Hostname={{ ansible_facts.hostname }}
|
||||||
TLSPSKFile=/etc/zabbix/{{ ansible_facts.hostname }}.psk
|
TLSPSKFile=/etc/zabbix/{{ ansible_facts.hostname }}.psk
|
||||||
@@ -55,18 +61,43 @@
|
|||||||
mode: '0600'
|
mode: '0600'
|
||||||
notify: restart zabbix-proxy
|
notify: restart zabbix-proxy
|
||||||
|
|
||||||
|
- name: Create Zabbix agent custom configuration file
|
||||||
|
ansible.builtin.copy:
|
||||||
|
dest: /etc/zabbix/zabbix_agent2.d/custom.conf
|
||||||
|
content: |
|
||||||
|
## Managed by Ansible - do not edit manually ##
|
||||||
|
## Changes will be overwritten ##
|
||||||
|
Hostname={{ ansible_facts.hostname }}
|
||||||
|
Server={{ hostvars['zabbix-proxy']['ansible_host'] }},{{ hostvars['raspberry-pi']['ansible_host'] }}
|
||||||
|
ServerActive={{ hostvars['zabbix-proxy']['ansible_host'] }};{{ hostvars['raspberry-pi']['ansible_host'] }}
|
||||||
|
notify: restart zabbix-agent2
|
||||||
|
|
||||||
|
- name: Create Zabbix agent user parameters file
|
||||||
|
ansible.builtin.copy:
|
||||||
|
dest: /etc/zabbix/zabbix_agent2.d/userparams.conf
|
||||||
|
content: |
|
||||||
|
## Managed by Ansible - do not edit manually ##
|
||||||
|
## Changes will be overwritten ##
|
||||||
|
AllowKey=system.run[*]
|
||||||
|
notify: restart zabbix-agent2
|
||||||
|
|
||||||
handlers:
|
handlers:
|
||||||
- name: restart zabbix-proxy
|
- name: restart zabbix-proxy
|
||||||
ansible.builtin.service:
|
ansible.builtin.service:
|
||||||
name: zabbix-proxy
|
name: zabbix-proxy
|
||||||
state: restarted
|
state: restarted
|
||||||
enabled: yes
|
enabled: yes
|
||||||
|
- name: restart zabbix-agent2
|
||||||
|
ansible.builtin.service:
|
||||||
|
name: zabbix-agent2
|
||||||
|
state: restarted
|
||||||
|
enabled: yes
|
||||||
|
|
||||||
- name: Verify Zabbix Proxy Service
|
- name: Verify Zabbix Services
|
||||||
hosts: zabbix-proxy
|
hosts: zabbix-proxy
|
||||||
become: yes
|
become: yes
|
||||||
tasks:
|
tasks:
|
||||||
- name: Check if Zabbix proxy service is running
|
- name: Check if Zabbix services are running
|
||||||
ansible.builtin.service_facts:
|
ansible.builtin.service_facts:
|
||||||
|
|
||||||
- name: Assert that Zabbix proxy is running
|
- name: Assert that Zabbix proxy is running
|
||||||
@@ -75,3 +106,10 @@
|
|||||||
- "ansible_facts.services['zabbix-proxy.service'].state == 'running'"
|
- "ansible_facts.services['zabbix-proxy.service'].state == 'running'"
|
||||||
fail_msg: "Zabbix proxy is not running"
|
fail_msg: "Zabbix proxy is not running"
|
||||||
success_msg: "Zabbix proxy is running"
|
success_msg: "Zabbix proxy is running"
|
||||||
|
|
||||||
|
- name: Assert that Zabbix agent is running
|
||||||
|
ansible.builtin.assert:
|
||||||
|
that:
|
||||||
|
- "ansible_facts.services['zabbix-agent2.service'].state == 'running'"
|
||||||
|
fail_msg: "Zabbix agent 2 is not running"
|
||||||
|
success_msg: "Zabbix agent 2 is running"
|
||||||
@@ -14,10 +14,13 @@ services:
|
|||||||
volumes:
|
volumes:
|
||||||
- ${PATH_TO_CONFIG}:/config
|
- ${PATH_TO_CONFIG}:/config
|
||||||
ports:
|
ports:
|
||||||
- 6875:80
|
- "6875:80"
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
depends_on:
|
depends_on:
|
||||||
- bookstack_database
|
bookstack_database:
|
||||||
|
condition: service_healthy
|
||||||
|
networks:
|
||||||
|
- bookstack-net
|
||||||
|
|
||||||
bookstack_database:
|
bookstack_database:
|
||||||
image: lscr.io/linuxserver/mariadb
|
image: lscr.io/linuxserver/mariadb
|
||||||
@@ -33,3 +36,14 @@ services:
|
|||||||
volumes:
|
volumes:
|
||||||
- ${PATH_TO_DB}:/config
|
- ${PATH_TO_DB}:/config
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
|
healthcheck:
|
||||||
|
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
|
||||||
|
interval: 10s
|
||||||
|
timeout: 5s
|
||||||
|
retries: 5
|
||||||
|
networks:
|
||||||
|
- bookstack-net
|
||||||
|
|
||||||
|
networks:
|
||||||
|
bookstack-net:
|
||||||
|
driver: bridge
|
||||||
|
|||||||
@@ -3,35 +3,13 @@ services:
|
|||||||
image: favonia/cloudflare-ddns:latest
|
image: favonia/cloudflare-ddns:latest
|
||||||
container_name: cloudflare-ddns
|
container_name: cloudflare-ddns
|
||||||
env_file: .env
|
env_file: .env
|
||||||
# Choose the appropriate tag based on your need:
|
|
||||||
# - "latest" for the latest stable version (which could become 2.x.y
|
|
||||||
# in the future and break things)
|
|
||||||
# - "1" for the latest stable version whose major version is 1
|
|
||||||
# - "1.x.y" to pin the specific version 1.x.y
|
|
||||||
network_mode: host
|
network_mode: host
|
||||||
# This bypasses network isolation and makes IPv6 easier (optional; see below)
|
|
||||||
restart: always
|
restart: always
|
||||||
# Restart the updater after reboot
|
|
||||||
user: "1000:1000"
|
user: "1000:1000"
|
||||||
# Run the updater with specific user and group IDs (in that order).
|
|
||||||
# You can change the two numbers based on your need.
|
|
||||||
read_only: true
|
read_only: true
|
||||||
# Make the container filesystem read-only (optional but recommended)
|
|
||||||
cap_drop: [all]
|
cap_drop: [all]
|
||||||
# Drop all Linux capabilities (optional but recommended)
|
|
||||||
security_opt: [no-new-privileges:true]
|
security_opt: [no-new-privileges:true]
|
||||||
# Another protection to restrict superuser privileges (optional but recommended)
|
|
||||||
environment:
|
environment:
|
||||||
- CLOUDFLARE_API_TOKEN=${CLOUDFLARE_API_TOKEN}
|
- CLOUDFLARE_API_TOKEN=${CLOUDFLARE_API_TOKEN}
|
||||||
# Your Cloudflare API token
|
|
||||||
- DOMAINS=${DOMAINS}
|
- DOMAINS=${DOMAINS}
|
||||||
# Your domains (separated by commas)
|
|
||||||
- PROXIED=true
|
- PROXIED=true
|
||||||
# Tell Cloudflare to cache webpages and hide your IP (optional)
|
|
||||||
#networks:
|
|
||||||
# LAN0:
|
|
||||||
# external: true
|
|
||||||
# name: LAN0
|
|
||||||
# Introduce custom Docker networks to the 'services' in this file. A common use case
|
|
||||||
# for this is binding one of the 'services' to a specific network interface available at
|
|
||||||
# Docker's host. This section is required for the 'networks' section of each 'services'.
|
|
||||||
15
Docker/garmin-grafana/.env.example
Normal file
15
Docker/garmin-grafana/.env.example
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
# InfluxDB credentials
|
||||||
|
INFLUXDB_PASSWORD=influxdb_secret_password
|
||||||
|
|
||||||
|
# Grafana credentials
|
||||||
|
GF_SECURITY_ADMIN_USER=admin
|
||||||
|
GF_SECURITY_ADMIN_PASSWORD=admin
|
||||||
|
|
||||||
|
# Garmin Connect credentials
|
||||||
|
GARMINCONNECT_EMAIL=your_garmin_email@example.com
|
||||||
|
GARMINCONNECT_PASSWORD=your_garmin_password_base64_encoded
|
||||||
|
|
||||||
|
# Paths for persistent data
|
||||||
|
GARMINCONNECT_TOKENS=./garminconnect-tokens
|
||||||
|
PATH_TO_INFLUXDB_DATA=./influxdb_data
|
||||||
|
PATH_TO_GRAFANA_DATA=./grafana_data
|
||||||
@@ -4,49 +4,65 @@ services:
|
|||||||
image: thisisarpanghosh/garmin-fetch-data:latest
|
image: thisisarpanghosh/garmin-fetch-data:latest
|
||||||
container_name: garmin-fetch-data
|
container_name: garmin-fetch-data
|
||||||
depends_on:
|
depends_on:
|
||||||
- influxdb
|
influxdb:
|
||||||
|
condition: service_healthy
|
||||||
volumes:
|
volumes:
|
||||||
- ${GARMINCONNECT_TOKENS}:/home/appuser/.garminconnect # (persistant tokens storage - garminconnect-tokens folder must be owned by 1000:1000)
|
- ${GARMINCONNECT_TOKENS}:/home/appuser/.garminconnect # (persistant tokens storage - garminconnect-tokens folder must be owned by 1000:1000)
|
||||||
environment:
|
environment:
|
||||||
- INFLUXDB_HOST=influxdb
|
- INFLUXDB_HOST=influxdb
|
||||||
- INFLUXDB_PORT=8086
|
- INFLUXDB_PORT=8086
|
||||||
- INFLUXDB_USERNAME=influxdb_user
|
- INFLUXDB_USERNAME=influxdb_user
|
||||||
- INFLUXDB_PASSWORD=influxdb_secret_password
|
- INFLUXDB_PASSWORD=${INFLUXDB_PASSWORD}
|
||||||
- INFLUXDB_DATABASE=GarminStats
|
- INFLUXDB_DATABASE=GarminStats
|
||||||
- UPDATE_INTERVAL_SECONDS=300
|
- UPDATE_INTERVAL_SECONDS=300
|
||||||
- LOG_LEVEL=INFO
|
- LOG_LEVEL=INFO
|
||||||
- GARMINCONNECT_EMAIL=${GARMINCONNECT_EMAIL}
|
- GARMINCONNECT_EMAIL=${GARMINCONNECT_EMAIL}
|
||||||
- GARMINCONNECT_BASE64_PASSWORD=${GARMINCONNECT_PASSWORD} # (must be base64 encoded)
|
- GARMINCONNECT_BASE64_PASSWORD=${GARMINCONNECT_PASSWORD} # (must be base64 encoded)
|
||||||
|
networks:
|
||||||
|
- garmin-grafana-net
|
||||||
|
|
||||||
influxdb:
|
influxdb:
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
container_name: influxdb
|
container_name: influxdb
|
||||||
hostname: influxdb
|
hostname: influxdb
|
||||||
|
image: influxdb:latest
|
||||||
environment:
|
environment:
|
||||||
- INFLUXDB_DB=GarminStats
|
- INFLUXDB_DB=GarminStats
|
||||||
- INFLUXDB_USER=influxdb_user
|
- INFLUXDB_USER=influxdb_user
|
||||||
- INFLUXDB_USER_PASSWORD=influxdb_secret_password
|
- INFLUXDB_USER_PASSWORD=${INFLUXDB_PASSWORD}
|
||||||
- INFLUXDB_DATA_INDEX_VERSION=tsi1
|
- INFLUXDB_DATA_INDEX_VERSION=tsi1
|
||||||
ports:
|
ports:
|
||||||
- '8086:8086'
|
- '8086:8086'
|
||||||
volumes:
|
volumes:
|
||||||
- influxdb_data:/var/lib/influxdb
|
- ${PATH_TO_INFLUXDB_DATA}:/var/lib/influxdb
|
||||||
image: 'influxdb:1.11'
|
healthcheck:
|
||||||
|
test: ["CMD", "curl", "-f", "http://localhost:8086/ping"]
|
||||||
|
interval: 10s
|
||||||
|
timeout: 5s
|
||||||
|
retries: 5
|
||||||
|
networks:
|
||||||
|
- garmin-grafana-net
|
||||||
|
|
||||||
grafana:
|
grafana:
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
container_name: grafana
|
container_name: grafana
|
||||||
hostname: grafana
|
hostname: grafana
|
||||||
|
image: grafana/grafana:latest
|
||||||
environment:
|
environment:
|
||||||
- GF_SECURITY_ADMIN_USER=admin
|
- GF_SECURITY_ADMIN_USER=${GF_SECURITY_ADMIN_USER}
|
||||||
- GF_SECURITY_ADMIN_PASSWORD=admin
|
- GF_SECURITY_ADMIN_PASSWORD=${GF_SECURITY_ADMIN_PASSWORD}
|
||||||
volumes:
|
volumes:
|
||||||
- grafana_data:/var/lib/grafana
|
- ${PATH_TO_GRAFANA_DATA}:/var/lib/grafana
|
||||||
ports:
|
ports:
|
||||||
- '3000:3000'
|
- '3000:3000'
|
||||||
image: 'grafana/grafana:latest'
|
healthcheck:
|
||||||
|
test: ["CMD", "curl", "-f", "http://localhost:3000/api/health"]
|
||||||
|
interval: 10s
|
||||||
|
timeout: 5s
|
||||||
|
retries: 5
|
||||||
|
networks:
|
||||||
|
- garmin-grafana-net
|
||||||
|
|
||||||
volumes:
|
networks:
|
||||||
influxdb_data:
|
garmin-grafana-net:
|
||||||
grafana_data:
|
driver: bridge
|
||||||
|
|||||||
@@ -10,3 +10,14 @@ services:
|
|||||||
- ${PATH_TO_CONFIG}:/config
|
- ${PATH_TO_CONFIG}:/config
|
||||||
ports:
|
ports:
|
||||||
- 8080:8080
|
- 8080:8080
|
||||||
|
healthcheck:
|
||||||
|
test: ["CMD", "curl", "-f", "http://localhost:8080/"]
|
||||||
|
interval: 30s
|
||||||
|
timeout: 10s
|
||||||
|
retries: 3
|
||||||
|
networks:
|
||||||
|
- guacamole-net
|
||||||
|
|
||||||
|
networks:
|
||||||
|
guacamole-net:
|
||||||
|
driver: bridge
|
||||||
2
Docker/heimdall/.env.example
Normal file
2
Docker/heimdall/.env.example
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
# Path to the Heimdall config folder
|
||||||
|
PATH_TO_CONFIG=/home/mbuz/docker/heimdall/config
|
||||||
@@ -1,5 +1,3 @@
|
|||||||
version: "2.1"
|
|
||||||
|
|
||||||
services:
|
services:
|
||||||
heimdall:
|
heimdall:
|
||||||
image: lscr.io/linuxserver/heimdall:latest
|
image: lscr.io/linuxserver/heimdall:latest
|
||||||
@@ -9,8 +7,19 @@ services:
|
|||||||
- PGID=1000
|
- PGID=1000
|
||||||
- TZ=Europe/Warsaw
|
- TZ=Europe/Warsaw
|
||||||
volumes:
|
volumes:
|
||||||
- /home/mbuz/docker/heimdall/config:/config
|
- ${PATH_TO_CONFIG}:/config
|
||||||
ports:
|
ports:
|
||||||
- 80:80
|
- "80:80"
|
||||||
- 443:443
|
- "443:443"
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
|
healthcheck:
|
||||||
|
test: ["CMD", "curl", "-f", "http://localhost/"]
|
||||||
|
interval: 30s
|
||||||
|
timeout: 10s
|
||||||
|
retries: 3
|
||||||
|
networks:
|
||||||
|
- heimdall-net
|
||||||
|
|
||||||
|
networks:
|
||||||
|
heimdall-net:
|
||||||
|
driver: bridge
|
||||||
|
|||||||
@@ -3,10 +3,21 @@ services:
|
|||||||
image: ghcr.io/gethomepage/homepage:latest
|
image: ghcr.io/gethomepage/homepage:latest
|
||||||
container_name: homepage
|
container_name: homepage
|
||||||
ports:
|
ports:
|
||||||
- 3001:3000
|
- "3001:3000"
|
||||||
volumes:
|
volumes:
|
||||||
- ${PATH_TO_CONFIG}:/app/config # Make sure your local config directory exists
|
- ${PATH_TO_CONFIG}:/app/config # Make sure your local config directory exists
|
||||||
- /var/run/docker.sock:/var/run/docker.sock # (optional) For docker integrations
|
- /var/run/docker.sock:/var/run/docker.sock # (optional) For docker integrations
|
||||||
env_file:
|
env_file:
|
||||||
- .env
|
- .env
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
|
healthcheck:
|
||||||
|
test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:3000"]
|
||||||
|
interval: 30s
|
||||||
|
timeout: 10s
|
||||||
|
retries: 3
|
||||||
|
networks:
|
||||||
|
- homepage-net
|
||||||
|
|
||||||
|
networks:
|
||||||
|
homepage-net:
|
||||||
|
driver: bridge
|
||||||
|
|||||||
@@ -1,21 +1,22 @@
|
|||||||
# You can find documentation for all the supported env variables at https://immich.app/docs/install/environment-variables
|
# You can find documentation for all the supported env variables at https://immich.app/docs/install/environment-variables
|
||||||
|
|
||||||
# The location where your uploaded files are stored
|
# The location where your uploaded files are stored
|
||||||
UPLOAD_LOCATION=${UPLOAD_LOCATION}
|
UPLOAD_LOCATION=./library
|
||||||
# The location where your database files are stored
|
|
||||||
DB_DATA_LOCATION=${DB_DATA_LOCATION}
|
# The location where your database files are stored. Network shares are not supported for the database
|
||||||
|
DB_DATA_LOCATION=./postgres
|
||||||
|
|
||||||
# To set a timezone, uncomment the next line and change Etc/UTC to a TZ identifier from this list: https://en.wikipedia.org/wiki/List_of_tz_database_time_zones#List
|
# To set a timezone, uncomment the next line and change Etc/UTC to a TZ identifier from this list: https://en.wikipedia.org/wiki/List_of_tz_database_time_zones#List
|
||||||
# TZ=Etc/UTC
|
# TZ=Etc/UTC
|
||||||
|
|
||||||
# The Immich version to use. You can pin this to a specific version like "v1.71.0"
|
# The Immich version to use. You can pin this to a specific version like "v1.71.0"
|
||||||
IMMICH_VERSION=${IMMICH_VERSION:-release}
|
IMMICH_VERSION=release
|
||||||
|
|
||||||
# Connection secret for postgres. You should change it to a random password
|
# Connection secret for postgres. You should change it to a random password
|
||||||
# Please use only the characters `A-Za-z0-9`, without special characters or spaces
|
# Please use only the characters `A-Za-z0-9`, without special characters or spaces
|
||||||
DB_PASSWORD=${DB_PASSWORD}
|
DB_PASSWORD=postgres
|
||||||
|
|
||||||
# The values below this line do not need to be changed
|
# The values below this line do not need to be changed
|
||||||
###################################################################################
|
###################################################################################
|
||||||
DB_USERNAME=${DB_USERNAME}
|
DB_USERNAME=postgres
|
||||||
DB_DATABASE_NAME=${DB_DATABASE_NAME}
|
DB_DATABASE_NAME=immich
|
||||||
@@ -30,6 +30,8 @@ services:
|
|||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
healthcheck:
|
healthcheck:
|
||||||
disable: false
|
disable: false
|
||||||
|
networks:
|
||||||
|
- immich-net
|
||||||
|
|
||||||
immich-machine-learning:
|
immich-machine-learning:
|
||||||
container_name: immich_machine_learning
|
container_name: immich_machine_learning
|
||||||
@@ -46,6 +48,8 @@ services:
|
|||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
healthcheck:
|
healthcheck:
|
||||||
disable: false
|
disable: false
|
||||||
|
networks:
|
||||||
|
- immich-net
|
||||||
|
|
||||||
redis:
|
redis:
|
||||||
container_name: immich_redis
|
container_name: immich_redis
|
||||||
@@ -53,6 +57,8 @@ services:
|
|||||||
healthcheck:
|
healthcheck:
|
||||||
test: redis-cli ping || exit 1
|
test: redis-cli ping || exit 1
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
|
networks:
|
||||||
|
- immich-net
|
||||||
|
|
||||||
database:
|
database:
|
||||||
container_name: immich_postgres
|
container_name: immich_postgres
|
||||||
@@ -84,6 +90,12 @@ services:
|
|||||||
-c shared_buffers=512MB
|
-c shared_buffers=512MB
|
||||||
-c wal_compression=on
|
-c wal_compression=on
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
|
networks:
|
||||||
|
- immich-net
|
||||||
|
|
||||||
volumes:
|
volumes:
|
||||||
model-cache:
|
model-cache:
|
||||||
|
|
||||||
|
networks:
|
||||||
|
immich-net:
|
||||||
|
driver: bridge
|
||||||
Binary file not shown.
|
Before Width: | Height: | Size: 29 KiB |
@@ -5,3 +5,14 @@ services:
|
|||||||
- '8182:80' # change if needed
|
- '8182:80' # change if needed
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
container_name: it-tools
|
container_name: it-tools
|
||||||
|
healthcheck:
|
||||||
|
test: ["CMD", "curl", "-f", "http://localhost/"]
|
||||||
|
interval: 30s
|
||||||
|
timeout: 10s
|
||||||
|
retries: 3
|
||||||
|
networks:
|
||||||
|
- it-tools-net
|
||||||
|
|
||||||
|
networks:
|
||||||
|
it-tools-net:
|
||||||
|
driver: bridge
|
||||||
|
|||||||
@@ -20,3 +20,14 @@ services:
|
|||||||
PGID: 1000
|
PGID: 1000
|
||||||
TZ: Europe/Warsaw
|
TZ: Europe/Warsaw
|
||||||
BASE_URL: ${YOUR_DOMAIN:-https://mealie.yourdomain.com}
|
BASE_URL: ${YOUR_DOMAIN:-https://mealie.yourdomain.com}
|
||||||
|
healthcheck:
|
||||||
|
test: ["CMD", "curl", "-f", "http://localhost:9000"]
|
||||||
|
interval: 30s
|
||||||
|
timeout: 10s
|
||||||
|
retries: 3
|
||||||
|
networks:
|
||||||
|
- mealie-net
|
||||||
|
|
||||||
|
networks:
|
||||||
|
mealie-net:
|
||||||
|
driver: bridge
|
||||||
8
Docker/n8n/.env.example
Normal file
8
Docker/n8n/.env.example
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
# Domain for n8n
|
||||||
|
DOMAIN=n8n.example.com
|
||||||
|
|
||||||
|
# Your timezone
|
||||||
|
GENERIC_TIMEZONE=Europe/Warsaw
|
||||||
|
|
||||||
|
# Directory where n8n will store files
|
||||||
|
PATH_TO_FILES=/path/to/n8n/files
|
||||||
24
Docker/n8n/docker-compose.yml
Normal file
24
Docker/n8n/docker-compose.yml
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
services:
|
||||||
|
n8n:
|
||||||
|
image: docker.n8n.io/n8nio/n8n
|
||||||
|
container_name: n8n
|
||||||
|
restart: unless-stopped
|
||||||
|
ports:
|
||||||
|
- 5678:5678
|
||||||
|
environment:
|
||||||
|
- N8N_HOST=${DOMAIN}
|
||||||
|
- N8N_PORT=5678
|
||||||
|
- N8N_PROTOCOL=https
|
||||||
|
- NODE_ENV=production
|
||||||
|
- WEBHOOK_URL=https://${DOMAIN}/
|
||||||
|
- GENERIC_TIMEZONE=${GENERIC_TIMEZONE}
|
||||||
|
volumes:
|
||||||
|
- n8n_data:/home/node/.n8n
|
||||||
|
- ${PATH_TO_FILES}:/files
|
||||||
|
healthcheck:
|
||||||
|
test: ["CMD-SHELL", "wget --no-verbose --tries=1 --spider http://localhost:5678/healthz || exit 1"]
|
||||||
|
interval: 1m
|
||||||
|
timeout: 10s
|
||||||
|
retries: 3
|
||||||
|
volumes:
|
||||||
|
n8n_data:
|
||||||
@@ -1,31 +1,35 @@
|
|||||||
version: '3.3'
|
|
||||||
services:
|
services:
|
||||||
nextcloud:
|
nextcloud:
|
||||||
image: lscr.io/linuxserver/nextcloud:latest
|
image: lscr.io/linuxserver/nextcloud:latest
|
||||||
container_name: nextcloud
|
container_name: nextcloud
|
||||||
env_file:
|
env_file:
|
||||||
- stack.env
|
- .env
|
||||||
environment:
|
environment:
|
||||||
- PUID=1000
|
- PUID=1000
|
||||||
- PGID=1000
|
- PGID=1000
|
||||||
- PHP_MEMORY_LIMIT=${PHP_MEMORY_LIMIT}
|
- PHP_MEMORY_LIMIT=${PHP_MEMORY_LIMIT}
|
||||||
- PHP_UPLOAD_LIMIT=${PHP_UPLOAD_LIMIT}
|
- PHP_UPLOAD_LIMIT=${PHP_UPLOAD_LIMIT}
|
||||||
- TZ=${TZ}
|
- TZ=${TZ}
|
||||||
|
|
||||||
volumes:
|
volumes:
|
||||||
- ${CONFIG}:/config
|
- ${CONFIG}:/config
|
||||||
- ${DATA}:/data
|
- ${DATA}:/data
|
||||||
ports:
|
ports:
|
||||||
- 5443:443
|
- "5443:443"
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
links:
|
|
||||||
- nextcloud-mariadb
|
|
||||||
depends_on:
|
depends_on:
|
||||||
- nextcloud-mariadb
|
nextcloud-mariadb:
|
||||||
|
condition: service_healthy
|
||||||
|
networks:
|
||||||
|
- nextcloud
|
||||||
|
healthcheck:
|
||||||
|
test: ["CMD", "curl", "-f", "http://localhost/status.php"]
|
||||||
|
interval: 30s
|
||||||
|
timeout: 10s
|
||||||
|
retries: 3
|
||||||
|
|
||||||
nextcloud-mariadb:
|
nextcloud-mariadb:
|
||||||
image: lscr.io/linuxserver/mariadb:latest
|
image: lscr.io/linuxserver/mariadb:latest
|
||||||
container_name: nextloud-mariadb
|
container_name: nextcloud-mariadb
|
||||||
environment:
|
environment:
|
||||||
- PUID=1000
|
- PUID=1000
|
||||||
- PGID=1000
|
- PGID=1000
|
||||||
@@ -34,15 +38,20 @@ services:
|
|||||||
- MYSQL_DATABASE=nextcloud
|
- MYSQL_DATABASE=nextcloud
|
||||||
- MYSQL_USER=nextcloud
|
- MYSQL_USER=nextcloud
|
||||||
- MYSQL_PASSWORD=${MYSQL_PASSWORD}
|
- MYSQL_PASSWORD=${MYSQL_PASSWORD}
|
||||||
|
|
||||||
volumes:
|
volumes:
|
||||||
- ${MARIADB}:/config
|
- ${MARIADB}:/config
|
||||||
ports:
|
ports:
|
||||||
- 5306:3306
|
- "5306:3306"
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
|
networks:
|
||||||
|
- nextcloud
|
||||||
|
healthcheck:
|
||||||
|
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
|
||||||
|
interval: 10s
|
||||||
|
timeout: 5s
|
||||||
|
retries: 5
|
||||||
|
|
||||||
networks:
|
networks:
|
||||||
default:
|
nextcloud:
|
||||||
name: nextcloud
|
name: nextcloud
|
||||||
driver: bridge
|
driver: bridge
|
||||||
@@ -12,3 +12,8 @@ services:
|
|||||||
- ${PGADMIN_DATA}:/var/lib/pgadmin
|
- ${PGADMIN_DATA}:/var/lib/pgadmin
|
||||||
extra_hosts:
|
extra_hosts:
|
||||||
- "host.docker.internal:host-gateway"
|
- "host.docker.internal:host-gateway"
|
||||||
|
healthcheck:
|
||||||
|
test: ["CMD-SHELL", "wget --no-verbose --tries=1 --spider http://localhost/misc/ping || exit 1"]
|
||||||
|
interval: 1m
|
||||||
|
timeout: 10s
|
||||||
|
retries: 3
|
||||||
@@ -9,3 +9,8 @@ services:
|
|||||||
- ${PORTAINER_DATA}:/data
|
- ${PORTAINER_DATA}:/data
|
||||||
- /var/run/docker.sock:/var/run/docker.sock
|
- /var/run/docker.sock:/var/run/docker.sock
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
|
healthcheck:
|
||||||
|
test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:9000/api/status"]
|
||||||
|
interval: 1m
|
||||||
|
timeout: 10s
|
||||||
|
retries: 3
|
||||||
4
Docker/semaphore-ui/.env.example
Normal file
4
Docker/semaphore-ui/.env.example
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
SEMAPHORE_ADMIN=admin
|
||||||
|
SEMAPHORE_ADMIN_PASSWORD=changeme
|
||||||
|
SEMAPHORE_ADMIN_NAME=Admin
|
||||||
|
SEMAPHORE_ADMIN_EMAIL=admin@example.com
|
||||||
33
Docker/semaphore-ui/docker-compose.yml
Normal file
33
Docker/semaphore-ui/docker-compose.yml
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
services:
|
||||||
|
semaphore:
|
||||||
|
container_name: semaphore-ui
|
||||||
|
image: semaphoreui/semaphore:latest
|
||||||
|
restart: unless-stopped
|
||||||
|
ports:
|
||||||
|
- "3030:3000"
|
||||||
|
environment:
|
||||||
|
SEMAPHORE_DB_DIALECT: sqlite
|
||||||
|
SEMAPHORE_ADMIN: ${ADMIN_USER}
|
||||||
|
SEMAPHORE_ADMIN_PASSWORD: ${ADMIN_PASS}
|
||||||
|
SEMAPHORE_ADMIN_NAME: ${ADMIN_NAME}
|
||||||
|
SEMAPHORE_ADMIN_EMAIL: ${ADMIN_EMAIL}
|
||||||
|
volumes:
|
||||||
|
- semaphore-data:/var/lib/semaphore
|
||||||
|
- semaphore-config:/etc/semaphore
|
||||||
|
healthcheck:
|
||||||
|
test: ["CMD", "curl", "-f", "http://localhost:3000/api/health"]
|
||||||
|
interval: 30s
|
||||||
|
timeout: 10s
|
||||||
|
retries: 3
|
||||||
|
networks:
|
||||||
|
- semaphore-net
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
semaphore-data:
|
||||||
|
driver: local
|
||||||
|
semaphore-config:
|
||||||
|
driver: local
|
||||||
|
|
||||||
|
networks:
|
||||||
|
semaphore-net:
|
||||||
|
driver: bridge
|
||||||
9
Docker/semaphore-ui/docker-run.sh
Normal file
9
Docker/semaphore-ui/docker-run.sh
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
docker run -d \
|
||||||
|
--restart unless-stopped \
|
||||||
|
--name semaphore \
|
||||||
|
-p 3030:3000 \
|
||||||
|
--env-file .env \
|
||||||
|
-e SEMAPHORE_DB_DIALECT=sqlite \
|
||||||
|
-v semaphore-data:/var/lib/semaphore \
|
||||||
|
-v semaphore-config:/etc/semaphore \
|
||||||
|
semaphoreui/semaphore:latest
|
||||||
@@ -32,6 +32,11 @@ services:
|
|||||||
max-size: 10m
|
max-size: 10m
|
||||||
ports:
|
ports:
|
||||||
- '9091:9091'
|
- '9091:9091'
|
||||||
|
healthcheck:
|
||||||
|
test: ["CMD-SHELL", "wget --no-verbose --tries=1 --spider http://localhost:9091 && ls /data || exit 1"]
|
||||||
|
interval: 1m
|
||||||
|
timeout: 10s
|
||||||
|
retries: 3
|
||||||
|
|
||||||
# Not all the countries and servers are supporting p2p, so you need to choose the right server. Here's the hint:
|
# Not all the countries and servers are supporting p2p, so you need to choose the right server. Here's the hint:
|
||||||
# https://support.nordvpn.com/hc/en-us/articles/20465085067665-NordVPN-proxy-setup-for-BitTorrent
|
# https://support.nordvpn.com/hc/en-us/articles/20465085067665-NordVPN-proxy-setup-for-BitTorrent
|
||||||
@@ -1,4 +1,3 @@
|
|||||||
---
|
|
||||||
services:
|
services:
|
||||||
transmission:
|
transmission:
|
||||||
image: lscr.io/linuxserver/transmission:latest
|
image: lscr.io/linuxserver/transmission:latest
|
||||||
@@ -22,3 +21,8 @@ services:
|
|||||||
- 51413:51413
|
- 51413:51413
|
||||||
- 51413:51413/udp
|
- 51413:51413/udp
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
|
healthcheck:
|
||||||
|
test: ["CMD-SHELL", "wget --no-verbose --tries=1 --spider http://localhost:9091 || exit 1"]
|
||||||
|
interval: 1m
|
||||||
|
timeout: 10s
|
||||||
|
retries: 3
|
||||||
|
|||||||
@@ -9,3 +9,8 @@ services:
|
|||||||
- ${PATH_TO_DATA}:/data
|
- ${PATH_TO_DATA}:/data
|
||||||
ports:
|
ports:
|
||||||
- 8033:80
|
- 8033:80
|
||||||
|
healthcheck:
|
||||||
|
test: ["CMD-SHELL", "wget --no-verbose --tries=1 --spider http://localhost/ || exit 1"]
|
||||||
|
interval: 1m
|
||||||
|
timeout: 10s
|
||||||
|
retries: 3
|
||||||
6
Docker/watchtower/.env.example
Normal file
6
Docker/watchtower/.env.example
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
# Timezone for watchtower
|
||||||
|
TZ=Europe/Warsaw
|
||||||
|
|
||||||
|
# A space-separated list of container names for Watchtower to monitor.
|
||||||
|
# For example: WATCHTOWER_CONTAINERS="nginx-proxy-manager bookstack"
|
||||||
|
WATCHTOWER_CONTAINERS=""
|
||||||
13
Docker/watchtower/docker-compose.yaml
Normal file
13
Docker/watchtower/docker-compose.yaml
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
services:
|
||||||
|
watchtower:
|
||||||
|
image: containrrr/watchtower
|
||||||
|
container_name: watchtower
|
||||||
|
volumes:
|
||||||
|
- /var/run/docker.sock:/var/run/docker.sock
|
||||||
|
environment:
|
||||||
|
- WATCHTOWER_CLEANUP=true
|
||||||
|
- WATCHTOWER_INCLUDE_STOPPED=true
|
||||||
|
- WATCHTOWER_POLL_INTERVAL=3600
|
||||||
|
- TZ=${TZ}
|
||||||
|
command: ${WATCHTOWER_CONTAINERS}
|
||||||
|
restart: unless-stopped
|
||||||
@@ -14,3 +14,8 @@ services:
|
|||||||
# - /dev/dri:/dev/dri #optional
|
# - /dev/dri:/dev/dri #optional
|
||||||
shm_size: "2gb" #optional
|
shm_size: "2gb" #optional
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
|
healthcheck:
|
||||||
|
test: ["CMD-SHELL", "wget --no-verbose --tries=1 --spider http://localhost:3000/ || exit 1"]
|
||||||
|
interval: 1m
|
||||||
|
timeout: 10s
|
||||||
|
retries: 3
|
||||||
Reference in New Issue
Block a user