Added Apprise, Healthchecks, and some more tweaks

This commit is contained in:
Brian Zalewski 2023-12-24 22:36:54 +00:00
parent 4d53b7185b
commit 189f7c11eb
84 changed files with 1039 additions and 150 deletions

View file

@ -20,8 +20,8 @@
<a href="https://app.slack.com/client/T01ABCG4NK1/C01NN74H0LW/details/" title="Chat with us on Slack" target="_blank"> <a href="https://app.slack.com/client/T01ABCG4NK1/C01NN74H0LW/details/" title="Chat with us on Slack" target="_blank">
<img alt="Slack" src="https://img.shields.io/badge/Slack-Chat-e01e5a?logo=slack&logoColor=white&style=for-the-badge" /> <img alt="Slack" src="https://img.shields.io/badge/Slack-Chat-e01e5a?logo=slack&logoColor=white&style=for-the-badge" />
</a> </a>
<a href="https://gitter.im/megabyte-labs/community" title="Chat with the community on Gitter" target="_blank"> <a href="https://app.element.io/#/room/#install.doctor:matrix.org" title="Chat with the community via Matrix.org" target="_blank">
<img alt="Gitter" src="https://img.shields.io/gitter/room/megabyte-labs/community?logo=gitter&logoColor=white&style=for-the-badge" /> <img alt="Matrix" src="https://img.shields.io/matrix/install.doctor:matrix.org?logo=matrix&logoColor=white&style=for-the-badge" />
</a> </a>
<a href="https://github.com/megabyte-labs/install.doctor" title="GitHub mirror" target="_blank"> <a href="https://github.com/megabyte-labs/install.doctor" title="GitHub mirror" target="_blank">
<img alt="GitHub" src="https://img.shields.io/badge/Mirror-GitHub-333333?logo=github&style=for-the-badge" /> <img alt="GitHub" src="https://img.shields.io/badge/Mirror-GitHub-333333?logo=github&style=for-the-badge" />

View file

@ -13,6 +13,7 @@ adobe-creative-cloud curl: (18) HTTP/2 stream 1 was reset
- https://github.com/linuxserver/docker-webtop - https://github.com/linuxserver/docker-webtop
- https://app.warp.dev/referral/7PMXRV - https://app.warp.dev/referral/7PMXRV
- https://github.com/chocolatey/boxstarter - https://github.com/chocolatey/boxstarter
- https://nginxui.com/
# Create the $HOME/opt destination folder # Create the $HOME/opt destination folder
mkdir -p ~/opt mkdir -p ~/opt
# Download the AppImage inside it # Download the AppImage inside it

View file

@ -171,6 +171,7 @@ Unless otherwise specified in the description column, all of the variables in th
| `AWS_ACCESS_KEY_ID` | AWS access key ID (used for storing / retrieving from AWS Secret Manager which is used for headless Xcode installations / developer account authentications) | | `AWS_ACCESS_KEY_ID` | AWS access key ID (used for storing / retrieving from AWS Secret Manager which is used for headless Xcode installations / developer account authentications) |
| `AWS_DEFAULT_REGION` | Default AWS region to use when region is not passed in via commands (e.g. `us-east-1`) | | `AWS_DEFAULT_REGION` | Default AWS region to use when region is not passed in via commands (e.g. `us-east-1`) |
| `AWS_SECRET_ACCESS_KEY` | AWS access key secret (used in conjunction with the `AWS_ACCESS_KEY_ID`) | | `AWS_SECRET_ACCESS_KEY` | AWS access key secret (used in conjunction with the `AWS_ACCESS_KEY_ID`) |
| `CELL_PHONE_NUMBER` | Cell phone number you would like to receive [Twilio notifications from via Apprise](https://github.com/caronc/apprise/wiki/Notify_twilio). The number should follow the format of `13332224444` where the 10-digit phone number is prefixed by the country code. |
| `CLOUDFLARE_API_KEY` | CloudFlare administration API key. Used by CloudFlare CLI. | | `CLOUDFLARE_API_KEY` | CloudFlare administration API key. Used by CloudFlare CLI. |
| `CLOUDFLARE_ACCOUNT_ID` | The CloudFlare account ID | | `CLOUDFLARE_ACCOUNT_ID` | The CloudFlare account ID |
| `CLOUDFLARE_ORIGIN_CA_KEY` | The CloudFlare origin CA key (currently unused) | | `CLOUDFLARE_ORIGIN_CA_KEY` | The CloudFlare origin CA key (currently unused) |
@ -203,8 +204,11 @@ Unless otherwise specified in the description column, all of the variables in th
| `HISHTORY_USER_SECRET` | User secret for synchronizing entries cataloged by [Hishtory](https://github.com/ddworken/hishtory). | | `HISHTORY_USER_SECRET` | User secret for synchronizing entries cataloged by [Hishtory](https://github.com/ddworken/hishtory). |
| `HOARD_API_TOKEN` | The API token for [Hoard]https://github.com/Hyde46/hoard). | | `HOARD_API_TOKEN` | The API token for [Hoard]https://github.com/Hyde46/hoard). |
| `HOST` | The hostname of the device. Used for a FQDN that resolves to the device when combined with the \_ `PUBLIC_SERVICES_DOMAIN`. | | `HOST` | The hostname of the device. Used for a FQDN that resolves to the device when combined with the \_ `PUBLIC_SERVICES_DOMAIN`. |
| `IFTTT_WEBHOOK_ID` | Webhook ID from the [Maker webhook on IFTTT](https://ifttt.com/maker_webhooks/settings). This is used to integrate [Apprise with IFTTT integration](https://github.com/caronc/apprise/wiki/Notify_ifttt). |
| `JUMPCLOUD_CONNECT_KEY` | JumpCloud device enrollment key. | | `JUMPCLOUD_CONNECT_KEY` | JumpCloud device enrollment key. |
| `KEYID` | Your GPG key ID available on the MIT or Ubuntu servers. During provisioning, the key will be imported and trusted with an elevated trust level. This can only be passed in as an environment variable or be hardcoded into the `home/.chezmoi.yaml.tmpl` file. | | `KEYID` | Your GPG key ID available on the MIT or Ubuntu servers. During provisioning, the key will be imported and trusted with an elevated trust level. This can only be passed in as an environment variable or be hardcoded into the `home/.chezmoi.yaml.tmpl` file. |
| `MATRIX_PASSWORD` | Password for user account for matrix.org through [Element](https://app.element.io/). Used to integrate [Matrix chatting with Apprise](https://github.com/caronc/apprise/wiki/Notify_matrix). |
| `MATRIX_USERNAME` | Username for user account for matrix.org through [Element](https://app.element.io/). Used to integrate [Matrix chatting with Apprise](https://github.com/caronc/apprise/wiki/Notify_matrix). |
| `NETDATA_ROOM` | [Netdata](https://www.netdata.cloud/) Cloud room ID to assign the device to. Requires `NETDATA_TOKEN` to also be defined. | | `NETDATA_ROOM` | [Netdata](https://www.netdata.cloud/) Cloud room ID to assign the device to. Requires `NETDATA_TOKEN` to also be defined. |
| `NETDATA_TOKEN` | [Netdata](https://www.netdata.cloud/) Cloud API token to use when enrolling. Requires `NETDATA_ROOM` to also be defined. | | `NETDATA_TOKEN` | [Netdata](https://www.netdata.cloud/) Cloud API token to use when enrolling. Requires `NETDATA_ROOM` to also be defined. |
| `NGINX_AMPLIFY_API_KEY` | If NGINX is installed on the system, then this key will be used to join the NGINX Amplify cloud service. | | `NGINX_AMPLIFY_API_KEY` | If NGINX is installed on the system, then this key will be used to join the NGINX Amplify cloud service. |
@ -219,7 +223,13 @@ Unless otherwise specified in the description column, all of the variables in th
| `PRIMARY_EMAIL` | Your primary e-mail address used in things like the Git config and NPM config. You must pass this as an environment variable or hardcode it into the `home/.chezmoi.yaml.tmpl` file. | | `PRIMARY_EMAIL` | Your primary e-mail address used in things like the Git config and NPM config. You must pass this as an environment variable or hardcode it into the `home/.chezmoi.yaml.tmpl` file. |
| `PUBLIC_SERVICES_DOMAIN` | The CloudFlare domain that you would like to use for CloudFlare DNS integration features. _Can only be passed in as an environment variable._ | | `PUBLIC_SERVICES_DOMAIN` | The CloudFlare domain that you would like to use for CloudFlare DNS integration features. _Can only be passed in as an environment variable._ |
| `PYPI_TOKEN` | PyPi.org API token stored in `~/.config/shell/private.sh` | | `PYPI_TOKEN` | PyPi.org API token stored in `~/.config/shell/private.sh` |
| `REDDIT_APP_ID` | Application ID for Reddit app created according to the [Apprise integration documentation](https://github.com/caronc/apprise/wiki/Notify_reddit). |
| `REDDIT_APP_SECRET` | Application secret for Reddit app created according to the [Apprise integration documentation](https://github.com/caronc/apprise/wiki/Notify_reddit). |
| `REDDIT_PASSWORD` | Password for the Reddit developer account linked to the Reddit app created according to the [Apprise integration documentation](https://github.com/caronc/apprise/wiki/Notify_reddit). |
| `REDDIT_USERNAME` | Username for the Reddit developer account linked to the Reddit app created according to the [Apprise integration documentation](https://github.com/caronc/apprise/wiki/Notify_reddit). |
| `REPLICATE_API_KEY` | [Replicate API key](https://replicate.com/account/api-tokens) (used for [AgentGPT](https://github.com/reworkd/AgentGPT)) | | `REPLICATE_API_KEY` | [Replicate API key](https://replicate.com/account/api-tokens) (used for [AgentGPT](https://github.com/reworkd/AgentGPT)) |
| `RESTIC_PASSWORD` | Password used to encrypt user-level Restic backups (leveraged by `autorestic`). This includes `$HOME` directory backups and application data backups. |
| `RESTIC_SYSTEM_PASSWORD` | Password used to encrypt system-level Restic backups (leveraged by `autorestic`). This includes Docker volume backups and any other types of backups that might require sudo privileges. |
| `RESTRICTED_ENVIRONMENT` | Set to `true` if you are setting up a device that should not use sudo / administrator privileges. _This can only be specified as an environment variable._ **This feature is a WIP.** Pull requests welcome. | | `RESTRICTED_ENVIRONMENT` | Set to `true` if you are setting up a device that should not use sudo / administrator privileges. _This can only be specified as an environment variable._ **This feature is a WIP.** Pull requests welcome. |
| `SAMBA_NETBIOS_NAME` | NetBIOS name to use with Samba. Default value is the same value as the `HOSTNAME` variable. _Can only be specified as an environment variable._ | | `SAMBA_NETBIOS_NAME` | NetBIOS name to use with Samba. Default value is the same value as the `HOSTNAME` variable. _Can only be specified as an environment variable._ |
| `SAMBA_WORKGROUP` | Samba workgroup name. Default value is `BETELGEUSE`. _Can only be specified as an environment variable._ | | `SAMBA_WORKGROUP` | Samba workgroup name. Default value is `BETELGEUSE`. _Can only be specified as an environment variable._ |
@ -228,6 +238,7 @@ Unless otherwise specified in the description column, all of the variables in th
| `SFTPGO_DEFAULT_ADMIN_PASSWORD` | Password for default admin user that can login to the [SFTPGo](https://github.com/drakkan/sftpgo) web interface. | | `SFTPGO_DEFAULT_ADMIN_PASSWORD` | Password for default admin user that can login to the [SFTPGo](https://github.com/drakkan/sftpgo) web interface. |
| `SFTPGO_DEFAULT_ADMIN_USERNAME` | Username for default admin user that can login to the [SFTPGo](https://github.com/drakkan/sftpgo) web interface. | | `SFTPGO_DEFAULT_ADMIN_USERNAME` | Username for default admin user that can login to the [SFTPGo](https://github.com/drakkan/sftpgo) web interface. |
| `SLACK_API_TOKEN` | Slack API personal access token that populates `~/.config/slack-term/config` so that you can use Slack from your terminal with [slack-term](https://github.com/jpbruinsslot/slack-term). | | `SLACK_API_TOKEN` | Slack API personal access token that populates `~/.config/slack-term/config` so that you can use Slack from your terminal with [slack-term](https://github.com/jpbruinsslot/slack-term). |
| `SLACK_BOT_USER_OAUTH_TOKEN` | Slack bot OAuth token. Used by Apprise Slack integration so that user can post to Slack (with support for attachments) from the CLI. |
| `SNAPCRAFT_EMAIL` | Snapcraft.io e-mail address associated with the `SNAPCRAFT_MACAROON` and `SNAPCRAFT_UNBOUND_DISCHARGE` (detailed below). Stored in `~/.config/shell/private.sh` so developer API credentials can be loaded by running `source "~/.config/shell/private.sh"`. \*Can only be included as an environment variable or hardcoded into `home/.chezmoi.yaml.tmpl`. | | | `SNAPCRAFT_EMAIL` | Snapcraft.io e-mail address associated with the `SNAPCRAFT_MACAROON` and `SNAPCRAFT_UNBOUND_DISCHARGE` (detailed below). Stored in `~/.config/shell/private.sh` so developer API credentials can be loaded by running `source "~/.config/shell/private.sh"`. \*Can only be included as an environment variable or hardcoded into `home/.chezmoi.yaml.tmpl`. | |
| `SNAPCRAFT_MACAROON` | Snapcraft.io authentication variable stored in `~/.config/shell/private.sh` so developer API keys can be loaded by running `source "~/.config/shell/private.sh"`. | | `SNAPCRAFT_MACAROON` | Snapcraft.io authentication variable stored in `~/.config/shell/private.sh` so developer API keys can be loaded by running `source "~/.config/shell/private.sh"`. |
| `SNAPCRAFT_UNBOUND_DISCHARGE` | Snapcraft.io authentication variable stored in `~/.config/shell/private.sh` so developer API keys can be loaded by running `source "~/.config/shell/private.sh"`. | | `SNAPCRAFT_UNBOUND_DISCHARGE` | Snapcraft.io authentication variable stored in `~/.config/shell/private.sh` so developer API keys can be loaded by running `source "~/.config/shell/private.sh"`. |
@ -237,6 +248,10 @@ Unless otherwise specified in the description column, all of the variables in th
| `SURGE_LOGIN` | The e-mail address associated with your [surge.sh](https://surge.sh/) account. | | `SURGE_LOGIN` | The e-mail address associated with your [surge.sh](https://surge.sh/) account. |
| `SURGE_TOKEN` | The [surge.sh](https://surge.sh/) authentication token acquired by logging in and running `surge token`. | | `SURGE_TOKEN` | The [surge.sh](https://surge.sh/) authentication token acquired by logging in and running `surge token`. |
| `TIMEZONE` | Your timezone in the `America/New_York` format. It should be available in the TZ database. If not passed in as an environment variable, then the device's current timezone will be assumed to be correct. | | `TIMEZONE` | Your timezone in the `America/New_York` format. It should be available in the TZ database. If not passed in as an environment variable, then the device's current timezone will be assumed to be correct. |
| `TWILIO_ACCOUNT_SID` | The account SID for Twilio which can be acquired on the bottom of the homepage of the [Twilio console](https://console.twilio.com/). Used for [Apprise integration of Twilio](https://github.com/caronc/apprise/wiki/Notify_twilio). |
| `TWILIO_AUTH_TOKEN` | The Twilio auth token found on the bottom of the homepage of the [Twilio console](https://console.twilio.com/). Used for [Apprise integration of Twilio](https://github.com/caronc/apprise/wiki/Notify_twilio). |
| `TWILIO_FROM_NUMBER` | The number to send out Twilio messages from. Should be registered in your Twilio account and be in the form `13332224444` with the country code included (e.g. `1` for the US in the sample phone number). |
| `TWITTER_ACCESS_TOKEN`, `TWITTER_ACCESS_TOKEN_SECRET`, `TWITTER_API_KEY`, `TWITTER_API_KEY_SECRET` | Various secrets you can generate using the Twitter Developer portal. Integrated into Apprise to allow tweeting from the command-line. Apprise provides [details](https://github.com/caronc/apprise/wiki/Notify_twitter). |
| `VAGRANT_CLOUD_TOKEN` | VagrantUp API token stored in `~/.config/shell/private.sh` so developer API keys can be loaded by running `source "~/.config/shell/private.sh"`. | | `VAGRANT_CLOUD_TOKEN` | VagrantUp API token stored in `~/.config/shell/private.sh` so developer API keys can be loaded by running `source "~/.config/shell/private.sh"`. |
| `VMWARE_WORKSTATION_LICENSE_KEY` | License key used for pre-registering VMWare Pro or VMWare Fusion | | `VMWARE_WORKSTATION_LICENSE_KEY` | License key used for pre-registering VMWare Pro or VMWare Fusion |
| `VNC_PASSWORD` | VNC password used by macOS VNC system utility or TigerVNC on Linux. Default if not passed in is `vncpass`. | | `VNC_PASSWORD` | VNC password used by macOS VNC system utility or TigerVNC on Linux. Default if not passed in is `vncpass`. |

View file

@ -137,6 +137,7 @@ gpg:
data: data:
host: host:
arch: "{{ .chezmoi.arch }}" arch: "{{ .chezmoi.arch }}"
autoresticHealthcheckUuid: "AddInFromHealthchecksDashboard"
cloudflare: cloudflare:
teamsOrg: "{{ $cloudflareTeamsOrg }}" teamsOrg: "{{ $cloudflareTeamsOrg }}"
cpu: cpu:
@ -165,6 +166,7 @@ data:
home: "{{ .chezmoi.homeDir }}" home: "{{ .chezmoi.homeDir }}"
homeParentFolder: "{{ if eq .chezmoi.os "linux" }}/home{{ else if eq .chezmoi.os "darwin" }}/Users{{ else }}C:\Users{{ end }}" homeParentFolder: "{{ if eq .chezmoi.os "linux" }}/home{{ else if eq .chezmoi.os "darwin" }}/Users{{ else }}C:\Users{{ end }}"
hostname: "{{ $hostname }}" hostname: "{{ $hostname }}"
noReplyEmail: no-reply@megabyte.space
samba: samba:
netbiosName: "{{ $sambaNetBiosName }}" netbiosName: "{{ $sambaNetBiosName }}"
workgroup: "{{ $sambaWorkGroupName }}" workgroup: "{{ $sambaWorkGroupName }}"

View file

@ -25,15 +25,15 @@ docker:
healthchecks: healthchecks:
allowedHosts: '*' allowedHosts: '*'
defaultFromEmail: no-reply@megabyte.space defaultFromEmail: no-reply@megabyte.space
siteLogoUrl: https://gitlab.com/megabyte-labs/misc/assets/-/raw/master/logo/color3@10x.png siteLogoUrl: https://raw.githubusercontent.com/megabyte-labs/install.doctor/master/home/dot_local/etc/branding/black-icon-128x128.png
siteName: Megabyte Labs Healthchecks siteName: CombineOS Healthchecks
siteRoot: '/' siteRoot: '/'
portainer: portainer:
siteLogoUrl: https://gitlab.com/megabyte-labs/misc/assets/-/raw/master/logo/color3@10x.png siteLogoUrl: https://gitlab.com/megabyte-labs/misc/assets/-/raw/master/logo/color3@10x.png
templatesUrl: '' templatesUrl: ''
statping: statping:
description: Uptime monitoring for Megabyte Labs managed web services description: Uptime monitoring for Megabyte Labs managed web services
name: Megabyte Labs Uptime Monitoring name: CombineOS Uptime Monitoring
wireguard: wireguard:
serverUrl: megabyte.space serverUrl: megabyte.space
internalSubnet: 10.93.92.0 internalSubnet: 10.93.92.0
@ -462,6 +462,7 @@ softwareGroups:
- p7zip - p7zip
- pigz - pigz
Communication: &Communication Communication: &Communication
- apprise
- irssi - irssi
Communication-Desktop: &Communication-Desktop Communication-Desktop: &Communication-Desktop
- *Communication - *Communication
@ -719,6 +720,8 @@ softwareGroups:
Logging: &Logging Logging: &Logging
- fuego - fuego
- papertrail - papertrail
- rsyslog
- runitor
- sentry-cli - sentry-cli
- unbuffer - unbuffer
Media: &Media Media: &Media
@ -882,6 +885,7 @@ softwareGroups:
- tailscale - tailscale
- warp - warp
Orchestration: &Orchestration Orchestration: &Orchestration
- dagu
- nomad - nomad
- pm2 - pm2
- robotframework - robotframework

View file

@ -132,12 +132,17 @@ applyRootConfig() {
logg warn 'Unable to find root user folder location' logg warn 'Unable to find root user folder location'
fi fi
### Copy minimal set of profile configuration files
if [ -n "$ROOT_FOLDER" ]; then if [ -n "$ROOT_FOLDER" ]; then
### Copy minimal set of profile configuration files
logg info "Copying ~/.bashrc to $ROOT_FOLDER/.bashrc" && sudo cp -f "$HOME/.bashrc" "$ROOT_FOLDER/.bashrc" logg info "Copying ~/.bashrc to $ROOT_FOLDER/.bashrc" && sudo cp -f "$HOME/.bashrc" "$ROOT_FOLDER/.bashrc"
logg info "Copying ~/.zshrc to $ROOT_FOLDER/.zshrc" && sudo cp -f "$HOME/.zshrc" "$ROOT_FOLDER/.zshrc" logg info "Copying ~/.zshrc to $ROOT_FOLDER/.zshrc" && sudo cp -f "$HOME/.zshrc" "$ROOT_FOLDER/.zshrc"
logg info "Ensuring ~/.config folder exists" && sudo mkdir -p "$ROOT_FOLDER/.config" logg info "Ensuring ~/.config folder exists" && sudo mkdir -p "$ROOT_FOLDER/.config"
logg info "Copying ~/.config/shell to $ROOT_FOLDER/.config/shell" && sudo mkdir -p "$ROOT_FOLDER/.config" && sudo rm -rf "$ROOT_FOLDER/.config/shell" && sudo cp -rf "$HOME/.config/shell" "$ROOT_FOLDER/.config/shell" logg info "Copying ~/.config/shell to $ROOT_FOLDER/.config/shell" && sudo mkdir -p "$ROOT_FOLDER/.config" && sudo rm -rf "$ROOT_FOLDER/.config/shell" && sudo cp -rf "$HOME/.config/shell" "$ROOT_FOLDER/.config/shell"
### Copy Autorestic configurations
logg info "Copying ${XDG_CONFIG_HOME:-$HOME/.config}/autorestic/autorestic-system.yml file to $ROOT_FOLDER/.autorestic.yml" && sudo cp -f "${XDG_CONFIG_HOME:-$HOME/.config}/autorestic/autorestic-system.yml" "$ROOT_FOLDER/.autorestic.yml"
logg info "Removing ${XDG_CONFIG_HOME:-$HOME/.config}/autorestic/autorestic-system.yml" && sudo rm -f "${XDG_CONFIG_HOME:-$HOME/.config}/autorestic/autorestic-system.yml"
logg info "Applying proper permissions to $ROOT_FOLDER/.autorestic.yml" && sudo chmod 600 "$ROOT_FOLDER/.autorestic.yml"
fi fi
} }
@ -832,10 +837,16 @@ installDockerRclonePlugin() {
# @description # @description
# This script loads crontab jobs that are defined and housed in your Install Doctor fork. # This script loads crontab jobs that are defined and housed in your Install Doctor fork.
loadCronjobs() { loadCronjobs() {
logg 'Installing crontab jobs' logg info 'Installing user crontab jobs'
crontab < "${XDG_CONFIG_HOME:-$HOME/.config}/crontab/config" || EXIT_CODE=$? crontab < "${XDG_CONFIG_HOME:-$HOME/.config}/crontab/config-user" || EXIT_CODE=$?
if [ -n "$EXIT_CODE" ]; then if [ -n "$EXIT_CODE" ]; then
logg error 'Failed to load cronjobs' logg error 'Failed to load cronjobs for user'
fi
logg info 'Installing system crontab jobs'
sudo crontab < "${XDG_CONFIG_HOME:-$HOME/.config}/crontab/config-system" || EXIT_CODE=$?
if [ -n "$EXIT_CODE" ]; then
logg error 'Failed to load cronjobs for system'
fi fi
} }

View file

@ -1,3 +1,10 @@
#!/usr/bin/env bash
# @file Prepare
# @brief Ensures commonly used system packages that are common dependencies of other packages are installed
# @description
# This script installs required system packages. Each system's required packages are defined in `home/.chezmoitemplates/$DISTRO_ID`,
# where `$DISTRO_ID` is equal to the Linux distribution ID found in `/etc/os-release`.
# @description # @description
# This script pipes environment variables and a logger function to a temporary file that is included by other scripts. # This script pipes environment variables and a logger function to a temporary file that is included by other scripts.
# It is included as a temporary external file to aid in debugging since if the included files were inlined in scripts # It is included as a temporary external file to aid in debugging since if the included files were inlined in scripts

View file

@ -1,4 +1,3 @@
{{- if (ne .host.distro.family "windows") -}}
#!/usr/bin/env bash #!/usr/bin/env bash
# @file Homebrew / Xcode Tools Installation # @file Homebrew / Xcode Tools Installation
# @brief Ensures Xcode tools are installed on macOS and ensures Homebrew is installed on either Linux or macOS # @brief Ensures Xcode tools are installed on macOS and ensures Homebrew is installed on either Linux or macOS
@ -171,4 +170,3 @@ fixHomebrewPermissions
if [ -f "$HOME/.viminfo" ]; then if [ -f "$HOME/.viminfo" ]; then
logg info 'Removing ~/.viminfo' && sudo rm -f "$HOME/.vimino" logg info 'Removing ~/.viminfo' && sudo rm -f "$HOME/.vimino"
fi fi
{{ end -}}

View file

@ -0,0 +1,7 @@
-----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBFekx0S0JqbkhtSUpldWRW
QUFPa21iS2JBYWVqUlpyUW1INThoR0h1NUJzCi9CWmJPNFpQdEhwNzlGMlFtRnkr
Z3RyVFAwTkdIZ1UrcVRjTmlIc2ZYT1EKLS0tIGxrWCtWS3RVeHkrcUZVZmM4cVo1
R1VTTk1LUUtZNGZ0MGs3akc0OEtBanMK+kyTXeqIqF4qPwv+Fc9OphknufvRv2B8
6Jho0+ICC1Bxubwy
-----END AGE ENCRYPTED FILE-----

View file

@ -0,0 +1,8 @@
-----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBjMkdRVy91R1crTWlDekJi
VmhXWU9va3JqaGYxVjFnQk9Dck1zVzVZQWlzCjVxc0pLYjJDQmt4ZUl0Y0FUZE9w
OHZuUHpuRGpNUkpCSFp4djlRWmlVRXMKLS0tICtpL2dpS2lHNHJ3UXkxMS9INmt6
TStScWFBRTlYWE1OWTNIL1g3eE9hRncKAjplPmFrrLt7oBZ3f+ar4kOTj35vPE72
icxVzmsyzU4EZaFwA7TZjSWYFHqP6djsWGtoId0l/ljuMJjcMqWpTeQXijzvRQKh
0Jg9jQ==
-----END AGE ENCRYPTED FILE-----

View file

@ -0,0 +1,7 @@
-----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSB6SHBMSVBHWlJTWXo2eTFm
bnJYa0NYWW42V0VOWE52MDdwK0N3Q2VZMzNjCmVsWk5mQUlNbWhPanpLU04xQmNS
YlZnVTd5OGNybEUwMFNoZ3NjZWVzTncKLS0tIHFVbFIzV0s3MmY2S3ViRUsxTmI3
cVpjRjVIMmVLSDJkZ1cwcEZ2SFZGemsKYrXMDabkAh02NX85ZL7U29AGgpaecSir
2oDXDv/BEdI3vzLivguQmw==
-----END AGE ENCRYPTED FILE-----

View file

@ -0,0 +1,9 @@
-----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBvN0Rka3I0b0ZhTHJhUnpL
NnhFT2pCSHVic3hZOHBXTDBhV3o1SzRPbG0wCitTTlRnVktrSTJramo2WEtBb0Jl
cHlOZmhiZlo4MGx5R1hMWDg3M3hXQ1UKLS0tIElNbWt3VXd5RU9ZNVVLYStzOS9W
dFlGWkdPRzFaNzVIQ1ZDbzVQV241aDgKSCr0DeHoJSoGXJXpOBaf7QhTjAaX7V+o
gjSPxmuiQnd06it4h67xd8hVK83b67x49jGJH3cJMMgzblOKZsjPCju7ENnBeVBi
zDsvBDQ0OWsS5yEmHdAajnriva/Qd3ToTizux5JiUkONqn5FvZVDmCk+idrSeyQL
8AHz6fa0ouUg55SENYb1kc3Ja/XmJ1YDHD4=
-----END AGE ENCRYPTED FILE-----

View file

@ -0,0 +1,8 @@
-----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSB3bDQwUCtFN3hmaVlKemlZ
Y0FwNmRMaHgyYWJxYk5zV0xLSjZlVXUyVG0wClhYdk9MdHFkbGtzZ0h0Ynh2cTRh
OWwzRDMwYUtZL1VocjFGenZ2djVhNlkKLS0tIGtka1B6QXlQTnRlYkxJUk5OLzNa
UmtzclBQTWtoWjZydkFJTW12SFFyNzQKc86JTlBUx1wMUEcNrjBl+hNEdXgg9mNe
yr+EhPOqRvgsT7LePNwWSaOx2L66RIkl36/WADWRXRGchHS0O2cgsIb6P2KfOwd9
9geM1rwWyk3XfQm3yqMKHO+nv6iLJ4jI2hf4+io=
-----END AGE ENCRYPTED FILE-----

View file

@ -0,0 +1,7 @@
-----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBCR0N1VjhvWE9PcDB5blJT
MXBuZ2pIWW9QZDNrSC9iNUd1RStOTk4xdTJ3CkdBUWlaRFoxeW8wVUdhRzhZWFpQ
UmRmSmttR2c4dmlBQkk5SmNKYVZhMDQKLS0tIFJwdzFqODRyd1lJV3NoeDFaWity
dXpDMXZTOGx1ODJBb284VUxJb3hPeFUKzAmx6mexxKONr+2uA43AtqhU3NdQwCRX
frZ4nbux4q5QHsU9hrXdx5OtPFmDYY9EBDkJa1OhVTH/kbo=
-----END AGE ENCRYPTED FILE-----

View file

@ -0,0 +1,7 @@
-----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSAySk50RGJiM01LV0NpSjlV
M3ZzTXRVbG1FZE5LQXk2U1BTWThOQ0NZaVN3CjhOR2VleEdoNHAwZVBTYWwwZ2xq
ZGVFMG53U2l4dkVrSWRDTEw5SXBLbEEKLS0tIEQvcWh2Ymk4S28vSk1ubDhFSnha
cDNmMDUvUk1UUXVCTDJuQUxacmllVkEK4IfrDpJPTFwronieSnmVMhSNK8hdNU/V
ko2wuWY4T08HrHBSHPKFxI8p2fbHpZxMXhanvNs9WBCxjm2Ia7hWxA==
-----END AGE ENCRYPTED FILE-----

View file

@ -0,0 +1,7 @@
-----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBrOThqUUEyUjFEUTBkUElQ
ZDlkcldTWDZGc2wyaldMbkgvcGdlUTdvMjM4CnEvTGlSZVVYSCt2dWZGb3Y1bWM0
NStPOS8rcytUWGtFUGczaVNQQUFQY2MKLS0tIFB6OFNJYlEyNTE5alZXeW5TSkpO
REJ1NFVXSzRTU1RHc3dRSlZWMkdlS1EKqcmK27xpMAMnzLW+JEhQipSll/0vT59q
XoHH/cBJFknH9QQX1cRvlJh8Pjd7+bHaSZRnog==
-----END AGE ENCRYPTED FILE-----

View file

@ -0,0 +1,7 @@
-----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSB5bFJPVmY3RUtMUUk0U2FJ
SEJMWmZyVGNtK2YrWnl3QjJQV09UK3N6TmdZCmhDS2FaZ09FcnRVZStCSGF0UHoz
K2MvcVpQUkpRVWFiNDlJc0dxZ2RjcXMKLS0tIHAyajRmeldoSFZQdWVRajZuRG5l
YWJEYUF4eUdtWWhmTExSREZqV2VqcnMKAULLETSutkcRJzewCsg/1FTskyNHao22
H4TYScxA+Fj2LwsyzHMJ7/VHAHbvgA==
-----END AGE ENCRYPTED FILE-----

View file

@ -0,0 +1,34 @@
-----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBXL0hNNUNTUmhSK0xkMUVS
a2lOUkREeXRuMkxUSTZHSHVQMHViT1Vhb3gwClB1Vjh6TVNiUGZOa1ViWjMwNHR6
Q01Scys4UVMzVUhMSTZHYWdMWFNQZzAKLS0tIE4rVnowSE5Zakt5M1AxYVVhRVdI
eHhoRGNiKzZiQ3hRblZQTkpMY28yNWMKx2RQ/t17kNrlfipe9EkGzh2mP5YarEUc
haLGfJ+9aTWDqPTuCqA0F/WFUdi3WgZ5T9Ku5PMC/71TNyBEucjTu+99NhwUFad7
Fs9iRdsvx2ridXTc6czRSjvY3WwAMQofI6y7Sw4zVV8mQIWh/t4AdCrIzlgG+tVx
COWqmO9VC1+S2Are1SBXoR4D9oMTUvoGpolBr0yzJtMDlE17Z+qwqARDXxJxdlnd
nmZr6EZNlWKpdM11+koJ9f1pHvKDM0W+u8j41hTwkhj85GAtCxRBH+ovP4jz07li
y+YqdJEykQOmbvhDNsPoi2j90NUS9zf/0ts9s4P4tF5q45BFJwb+RswIHRfh5zz9
5/eb0BBQDz10WoQcKzzjkAeXa5YvOOM1IVA8KY/8/BIJ6hr2HPnJmzNqlO1IbvI0
WgwGBVgGQmILveTn/cpQjdFlzpezJ+f70ltZ8IVfA9HUuMkaFjr3W9+wAGeeWpu7
fpQuXdhHvJMi9lOLlo9sRPDtFWSJ8mS2lG5mJRzEjTdn5M7m7N72wKJeID9ECHM3
zRdRvZOJ/uZeS4XAVHS+EGT2YX8eMaKHXv+r+uBiNJ3WIRV5q9H4qs6XA4EFxNC8
sI4LkEcKyct+UTxvGtG4bG/s2kuj+U2Tf37jtzo5d7UV/X8B4ZAGyYXo0AX7iyLG
EWZ469zc8JCmhSQ3MH3lLd6nT9V0G+eyQmkH+loYPOCsavggv38Up7R1J1NY9/fW
pX/+sWoTj6dnS6d5RUGtfyRVSvb/yL1CxpDmE7fi8WZMrBQCwXyhfiTWLl5hX4mV
EnfMA9Q10XM1zOy0YSrmc0H37rOaGBL8sqKat5FWvfgG2XIHgvgdQ5mdSvVSj0t4
C9A7f1E8QJSESn5SxSwSw2VH3qbEx4H2qx8F3n8jdTMEhaX8k0XLBmn0qeXTyT0q
k2bmMRrTxLtVn/KMMdD6D6vboZSmnP7sczroGSHZ7rdWbhoHeVQV9TXBNf3op02p
HQd2nk2OcNHwlpizABtglFE/4PwJ5qoisK+be11OgBDCXVTFv1v8IxAMPLd+PPuO
0vKLkwaFqBqvZfkEIr7hTjYouVlkRlLvpfTPROXeFfJdMf3ITnk0LLpS5FW9ZyhV
8RvDFfAlAeMC8aL1+BvMRDHRJ28mwaQiG4xEWA+NcQeVRcDyfzzwQh0Vm3hNvKcW
0dI8Qjr2kZX+f9niTQj3+h72fylhItCyMEJ556G5x8O8fra/21xLXf7IQzhd6hn8
6V4tuFB2RrLS1HqYcK/Cy/E0FlSQ4LrTghRTq3b8aEQoaofBJgdimorVclDGyDh/
pjaWvoVVbHi/VC3KdwuOCfcSL0rKn6Cwy+y0cPFSX9aMs2dxu5mIK5E8hQKEM77M
EeQjehj72PRrbKOVRYJJvtegVCRimDIxz5FMz60WEGD0jPrffPV/m7Hjvipsxlke
o4HPDZ3tEMZVW9FftaNnKGqeU76FOgByRh4w+uTeMfo0lXm6yYYrQ1WyHa4+V6F7
dibkHMDy7n4r+nUZk2GR2DWHR0kqJV9BVSVBTz465F/qvPu1Z/amfxhrhUKywI+J
y1P01cjnke4tNQIx7RheAYxUxDRR/A65y/VVWFCKLhfnnJpqhGwnXetjUHmbxgms
Z5K0XJojJ1DG4F9mxUUQpg+2jRPekopmq9YddMW/nSiCjdr/ZjJmIrlX/YIgCk1N
05Ydb1T2NlC8HQhdGo1X647tqNsfYtB+XXCUYkIeEzkTluy9J62XN82cCIjbBP2g
T2RN9GgOUjFzAsw2LiRJWo22KUVFjcCclyLkww==
-----END AGE ENCRYPTED FILE-----

View file

@ -0,0 +1,7 @@
-----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBPTDRzSHB4eTFnV2E2WU8v
Y0I1bFhjTzI0OWcvRVJ6N08zYmRsbWlwZVhzCnhoNmpoSFNUbzI5M2ExNVdPM1h6
Q2ZTRTNxSjZycHMzSjQzNlNqSGJzR1EKLS0tIDN1U29NT1lkT2JBNnN2VndiK3Jz
clRkT3RJSnByeHFGbUVOSGFsVWR2cmsKa6RVel4xTm7C+DfmsLl1JR3RFRr4AYBy
1HF0EGUH9N3Jz4D0R30rI5EteA==
-----END AGE ENCRYPTED FILE-----

View file

@ -0,0 +1,7 @@
-----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSA3dDlwKytlbUZSWjE0MTJn
QXNGSXE5cnFEMXZkZHFscnJGT2RIelA2YnhjCmpISXljSDdua2pTNmRQUk16MmEx
eHJLZkpjMnU3WklJd0lEMHVlVlU3NWMKLS0tIGdib1lGMlZtVE4xQ2ZIZi9iS1d1
UlBoRTRrUVpnYm1Zd3ZzbDRHdkh0MUEKaklKnKjGhUo+hvJhalpKMm3VxhYkxll3
6sk6KRuLGFs4vZDm2eomgZs0cnUTjZY0
-----END AGE ENCRYPTED FILE-----

View file

@ -0,0 +1,8 @@
-----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBHUDhKYUJZOCt5OXFjZDVZ
NWJjdllHUlBkNEk1Q0dpdGtJYW0vdi9hOFM0CkMrVFVjS2lRdHgrLzVFZHByMVFL
WXRyNFZFaDNsNnRtWlVwREJueWdHbTQKLS0tIHJTdHJqSVlMM3g4M05hM0VjQkc3
MTUrdFRFS1FlSjBMVmlYamc5QjFkd0UK+yLbeYrnauc25H7yJm3ZBtzOVp2PMuxA
YvcxRJA+zsARG5ch79l26tXGiWVz8QSzhr/GURpg8Y+Yl5xSRxXq7Lxc7PmOWDw9
xEuE
-----END AGE ENCRYPTED FILE-----

View file

@ -0,0 +1,7 @@
-----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSB4V0JURmtMRVVvQnhpVEtN
RGRJeFlHMjFpOVZscTluUmpXbXFQNmlvMkVVCjQ2TGpnYjdHRjNhMTg2dUJQaHBO
VDhOWk40THZZME9yV2dzU1BmblhsV28KLS0tIGVPTUxHWC9iMmgrUHFDSitNT1Jy
ZVdGM3BheWlLQWNNSGFJMEoyTlMvU0EKE3tWM+XaBySV8JwyXTpzJz6F4pBRfq0T
PAp1VDDe8ns1r+xm/yhzEWyqSgTLJQPFSA==
-----END AGE ENCRYPTED FILE-----

View file

@ -0,0 +1,7 @@
-----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBSZlAzd0g2NkhuTzdESVJR
Ly9BZHZVaWVjVFA5SmlzdGMrRmI2NXdPU3hZCk0vLzFrTDlqK2FiY0haMmY3d1pY
b1kwNTA1czgvMDZ0d1gwZEtBWC9TQlEKLS0tIExpN3JENXlNWXlqRmMxK2NYcTFn
dm1KK25lZHE4MjZoQWk4QXFndUNRU28KHoUpywjuPxX5foF7F6qy0Ve6LNKA5/SQ
TDEDz8i5CDB8gu2GijTFoNhxQEOCGtoF
-----END AGE ENCRYPTED FILE-----

View file

@ -0,0 +1,7 @@
-----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSAvZTc4cGNyRDZCQ2hPdmF1
dUxzQmp0ZElycFdKVXliSTNiL1RRTHBYK0VjClhQdm1lOFBIK2xPYWg4L3JPZTlI
aTlxaEZMOFVRSE13U3lMTjFVUXlxa28KLS0tIE96RHFhZ0lLMWg5b004NGFUZXNZ
YWVEUE9GQU9jNWkyTDl0dURhSWlNYW8KZYCJ9ABfOQb4p5MoMT0RzXq3/BEqcL9f
iZ0L5U3qol8IHI+9+GbZrLGWC/L0y/8IbmZ8oKs6
-----END AGE ENCRYPTED FILE-----

View file

@ -0,0 +1,7 @@
-----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBiSGlpQzRwTWMxVXhxMHRH
ZWFHeDJZbExZUlJUaGRiVHl4NGVsTHdvd0NJCm11TWREYWdsOGRwTlJKeGlCdWE5
STZ2UlhjRWtUYnZkdmdUeDk1cmpKWXMKLS0tIE8vekh6YTVhRVZDM203bXBwVmVS
Q0JsRXY3SDV3RUw4RTdHcFE2WFhWSk0KEm2bieswbpQG9fDMn85azz/cHV6fK//R
qjoViUBBqKyuZM4ci8GfaHew15MszDA0lVTOoEyjpNf1dSp/+ORc
-----END AGE ENCRYPTED FILE-----

View file

@ -0,0 +1,7 @@
-----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSB4YkMzS1p5RUFZV0VGZmJ3
YVlxVWNGdytjTHRUYXBvbFZvM2crS2d0RVhjCjdUWmU1ZHNObnhjUFVrTHBBbWkz
M0NWc01tanRKRVl3VEFJeDZnUUFxc28KLS0tIEhQTW55ZEEvdXN5RmhocGVKL2Rp
dy9HTjVqYUhHWEhiZlVBbEVUQWE1Mk0KnGRbcxe+Spdyo63ZZQ8JMNp0PFDqb/wy
H8V31CsS4V4YzH4AvDWh1a/hF8+/uqEXvg==
-----END AGE ENCRYPTED FILE-----

View file

@ -0,0 +1,7 @@
-----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBwTGMzWUxheDRKOEVRWUVs
LzRtZzdscFVpUTdqWVg5TE1nQkZmMXlNMmprCmNCQm5keHA3VnV4TGtZVGxuVEI3
dDJjclA3RmQ4WnVSUWkxN3lrcTNiOEEKLS0tIExjT0cwMVZJOUZSKzN4RHlMNXR1
UGFaK2lZaVNHMFgwRWxUUXc1ZEk1RVEKl3POH0I3o+xEaFsiPWW0Coo+hbtCOcjT
vBrafnhG0opqW53cMer4P0D6Y3U=
-----END AGE ENCRYPTED FILE-----

View file

@ -0,0 +1,7 @@
-----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBmWGpvWXp3aXlvTVpFSkhr
YkM4UWNpMkk0LytEQXBkZ2NQMVRkZmxXS0drCktWYTc5M1ZLSzZzV3ZkQlFWN3Q4
ekZ6ZmZHR3h0N2x5alJobmE4cWVaNlUKLS0tIFljODhFSi9RV0piNU5ub09ITi80
SmNVTjZBN1NEU2EyZnZyZGhLVVUvNkEK+bYhZ6OulkCFT1uR6nCp6uvlKwoxT0xu
kavzeRXrGUPGpCiBvRUvrk7in9iW7A==
-----END AGE ENCRYPTED FILE-----

View file

@ -0,0 +1,7 @@
-----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBYNmJ6dGZwU1U0dE9RSDQr
dUphTTRNejE1ZGp2dEdXSmRSOGxmdDZESWxvCkowYnczZEwrMzZJeDV2Q21kWDBM
YTdCY3dMQy9FZTc0dERSOVBEY3gwdkkKLS0tIFQ3WTE5TzlVbFNpK3VCQkRiWk1I
WlNGeWZMeVNOMWQwR2RtZ2NDZkYvUXcKtmvvZzqqVtbAIindRUBOzNqIPYHHde6p
MKSyiRANtAxWgQOtuwc/hKx4XLPlxA==
-----END AGE ENCRYPTED FILE-----

View file

@ -0,0 +1,8 @@
-----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBrelZWL0l3bGE3eDB0NUR6
bW5wM25SL25EOWxTc3JhbHZOL0UrVUF6ZkE0ClB0S3dvdWFaOFlRZWczOEcrZmND
VWEvUzV0ci8xWVl0NUJWK1ViNHA3M2sKLS0tIDVXUDdyNlc1TjVxSEVqM0d2N1VN
UitQMWJzdkVMdlpha2gvdUY2dFpraTgK2om7IQr4V1ggJH7Ls+H+k1zQ93QvEnvc
V6je1Y4w09FKKLb6smK4jKj6ZFZ7f/RgvGyxkcpvJqAGA7pUyAGRh8Bu9cviFexE
lxcfxLBgVlVPHUQUA+jcl50=
-----END AGE ENCRYPTED FILE-----

View file

@ -0,0 +1,7 @@
-----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBEMFpBa3dseXhISTdKR0ZN
Z21RQ3NLV1lSRW8wVzlSMmhIZ3lpY3JRVnkwCk1IdmNERlcyWVV6MXJhV29MWWtU
N1cybzg3Q0JVTC9oMUV1YTFqL2djZ1EKLS0tIEErZm5KTkJOZmFqWXNoVDVhYVY5
MWNiMEp6aG9FdU5rMWJQZUw1eDBLM1UKfa30TyUR2HmpczeYILq8MWWi2ahDpuJ9
IQSLbfV/UVWVFJXwZu3Mb/ejm1MTIBddjHQ5OL/ih7v9ui9YF1LEPRhs
-----END AGE ENCRYPTED FILE-----

View file

@ -0,0 +1,7 @@
-----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBCSWp0cmlkU3RLbTZ0SXJ2
MVNneGtTRlptVlVqeTZWSFcxZTlxT1V5cncwCmpKZjBlL3k2clVzSnY3QnBzRmtk
b2hBMGIvWE5CM0d4YjBoUFNmWmJubmcKLS0tIE14MjI5aTFGdTVJRmdEMFlNbExn
R0R0aEw3MWdnUWJJN1pQVzlwQmdTazAKtbAuEbU1/iZA7taqVgA4LUA2V2dZzGHD
/FrljRaDQm9yrnS52Q5/m8+4uT+6xJI8ZU+8Hu4u1gtv7v8JFiZCpg==
-----END AGE ENCRYPTED FILE-----

View file

@ -0,0 +1,7 @@
-----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBHckxIemV1bUNhbkxKK2Zl
bXQxRENjVEYyR3lIcS93Q1RIV3dQOXJlL1dBCmxkVG13UHF4cS9uaU1QcHl3MjB0
U2hLUDZMeGQ3cS9NZnBHQWZVZGJ3aFUKLS0tIDBGejhsclZlUUtxSmNNclAyeTIz
dHNiR0l4NlE4VHRkQTMzcS9RditXcUUKGuxENmh8UAAaz9W43p8kxJ8alJbTPXLG
3fQGzdbva6hvfAAFbpZA9tdYlQ==
-----END AGE ENCRYPTED FILE-----

View file

@ -0,0 +1,8 @@
-----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBzTGFCZ0QwTFJRcUhFc2wx
ZWJxR2t2S21wUlI1TmhFZ3R0dHJGbGRoaUdFCm9IQnIwaGkrZE9CUEVjUklFTzJB
ZzVTY0xPT1FwKy9hRkdDQjM4Qzd3b1UKLS0tIEdkL0xSd2UyUXkyR2JMclBtV1VB
WXF3cjVCNjBiTmh2N05aSzZ6Tlc2eVUKZlVovnodDQlnYfM7KdQcmwz+CiKgP+KB
jNbuIB9nAcM1Yck7+2mERWIgyT7/ETx+8mF54W6b17mSN6fxS3p0vaOepMd3H72d
ozuPIBUZis9h5w==
-----END AGE ENCRYPTED FILE-----

View file

@ -0,0 +1,8 @@
-----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBzS0dYVjBQcmswS3pEcDZS
eHc2SkpNNWFZZnpnVEVTc1hOQUxFOHZUL3djCkVHZmZaUkxUYVVoYnVHbHgwT0hv
VXJGWEYwaGNQRjB5ODlXZy9VdkcxRFEKLS0tIHcyNko0V3dMOTF4K3BtUXlEcVlT
V2pORHBEUWgxU0x4U1dZMXAvaVAxVWMKHst99kXcZkum3O4fve5xcwZe1Z46gGhM
fdieq8+35iz0zrjdoaFRoKiDizbvQYr8czukq3wv1fX908xvEtTMvlOyr9v53rNI
Qwr7Oq8=
-----END AGE ENCRYPTED FILE-----

View file

@ -0,0 +1,7 @@
-----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBYejFwYzdLZExRVFk2dTVW
OXZSS0FLaTdpWW9oT0dhVDRyOW0rc0U2T1VFClg2bkpmN0ZnT2JiQjl0MEFidXVv
Z3J6MG8yYnljMGZuL2pJWUlXL0RzUTgKLS0tIEVmbEdZTEVOd1J5L0dNbk95TUZM
dS9oMXRKb0M5bHErY3lLSnp4Nnd4Y0EK8ZZZOUbKShL0zD2mZH4tmdSgZjQkbmhL
BTZuqb0oyXVmRJveHs3tK1Nb2Nzbd50bqaB6fFSIjAT1
-----END AGE ENCRYPTED FILE-----

View file

@ -0,0 +1,8 @@
-----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBhTjFYOEtQUWV2VFNvZHJi
dXVncmFzNExFUFNvSXZ1YWhyM2VDeHF0OXljClpMM3ZwSnJXTnd5cy9CanFBSkph
S1lOS2x4dUJESFVlRUZZcUsvN1Z1d1kKLS0tIHpmb0kvT0tUMXBJcnVBT0ZSSUdj
eXF0U1JQZU1iNWVPQmZUNjFTdmM3TVEKmAHM+qRlaynlvlbmkLYM/+MOtzW1xRoV
EwwyxdTUVSOcCsQ/64mPhBCKHE3cOeWm501B/cb+9Nl5yAsiuKqHCafo99JCZdhd
smrFB76MXqfyIw==
-----END AGE ENCRYPTED FILE-----

View file

@ -0,0 +1,190 @@
---
version: 1
{{- if and (stat (joinPath .host.home ".config" "age" "chezmoi.txt")) (stat (joinPath .chezmoi.sourceDir ".chezmoitemplates" "files" "apprise-custom")) -}}
include:
- custom.yml
{{ end }}
# Define an Asset object if you wish (Optional)
# asset:
# app_id: AppriseTest
# app_desc: Apprise Test Notifications
# app_url: http://nuxref.com
groups:
- chat: matrix
- developer: slack
- social: reddit, twitter
- owner: sendgrid, twilio, rsyslog, system
tag: all
urls:
{{- $gmailAppPassword := (default "" (env "GMAIL_PASSWORD")) -}}
{{- if and (stat (joinPath .host.home ".config" "age" "chezmoi.txt")) (stat (joinPath .chezmoi.sourceDir ".chezmoitemplates" "secrets" "GMAIL_PASSWORD")) -}}
{{- $gmailAppPassword = includeTemplate "secrets/GMAIL_PASSWORD" | decrypt | trim -}}
{{- end -}}
{{- if ne $gmailAppPassword "" -}}
### E-mail
# Source: https://github.com/caronc/apprise/wiki/Notify_email
# Sends an e-mail with GMail SMTP using GMail username provided in .chezmoi.yaml.tmpl and uses `GMAIL_PASSWORD` (which can be an app password instead of your normal password)
- mailto://{{ .user.gmail.username }}:{{- $gmailAppPassword -}}@gmail.com:587?smtp=smtp.gmail.com&from={{ .user.gmail.username }}:
- to: "{{ .user.email }}"
tag: email, gmail
{{ end }}
{{- $iftttWebhookId := (default "" (env "IFTTT_WEBHOOK_ID")) -}}
{{- if and (stat (joinPath .host.home ".config" "age" "chezmoi.txt")) (stat (joinPath .chezmoi.sourceDir ".chezmoitemplates" "secrets" "IFTTT_WEBHOOK_ID")) -}}
{{- $iftttWebhookId = includeTemplate "secrets/IFTTT_WEBHOOK_ID" | decrypt | trim -}}
{{- end -}}
{{- if ne $iftttWebhookId "" -}}
### IFTTT
# Source: https://github.com/caronc/apprise/wiki/Notify_ifttt
# Triggers an IFTTT webhook
- ifttt://{{- $iftttWebhookId -}}:
- tag: ifttt
{{ end }}
{{- $matrixPassword := (default "" (env "MATRIX_PASSWORD")) -}}
{{- if and (stat (joinPath .host.home ".config" "age" "chezmoi.txt")) (stat (joinPath .chezmoi.sourceDir ".chezmoitemplates" "secrets" "MATRIX_PASSWORD")) -}}
{{- $matrixPassword = includeTemplate "secrets/MATRIX_PASSWORD" | decrypt | trim -}}
{{- end -}}
{{- $matrixUsername := (default "" (env "MATRIX_USERNAME")) -}}
{{- if and (stat (joinPath .host.home ".config" "age" "chezmoi.txt")) (stat (joinPath .chezmoi.sourceDir ".chezmoitemplates" "secrets" "MATRIX_USERNAME")) -}}
{{- $matrixUsername = includeTemplate "secrets/MATRIX_USERNAME" | decrypt | trim -}}
{{- end -}}
{{- if and (ne $matrixPassword "") (ne $matrixUsername "") -}}
### Matrix
# Source: https://github.com/caronc/apprise/wiki/Notify_matrix
# https://app.element.io/#/room/#megabyte.space:matrix.org
# Posts a message in a Matrix chatroom
- matrix://{{- $matrixUsername -}}:{{- $matrixPassword -}}@matrix.org/#megabyte.space:
- tag: chat, matrix, megabyte-labs
# https://app.element.io/#/room/#install.doctor:matrix.org
- matrix://{{- $matrixUsername -}}:{{- $matrixPassword -}}@matrix.org/#install.doctor:
- tag: chat, matrix, install-doctor
{{ end }}
### Microsoft Teams
# Source: https://github.com/caronc/apprise/wiki/Notify_msteams
# Note: Microsoft Teams currently requires paid subscriptions of Office 365 for a custom organization
{{- $redditAppId := (default "" (env "REDDIT_APP_ID")) -}}
{{- if and (stat (joinPath .host.home ".config" "age" "chezmoi.txt")) (stat (joinPath .chezmoi.sourceDir ".chezmoitemplates" "secrets" "REDDIT_APP_ID")) -}}
{{- $redditAppId = includeTemplate "secrets/REDDIT_APP_ID" | decrypt | trim -}}
{{- end -}}
{{- $redditAppSecret := (default "" (env "REDDIT_APP_SECRET")) -}}
{{- if and (stat (joinPath .host.home ".config" "age" "chezmoi.txt")) (stat (joinPath .chezmoi.sourceDir ".chezmoitemplates" "secrets" "REDDIT_APP_SECRET")) -}}
{{- $redditAppSecret = includeTemplate "secrets/REDDIT_APP_SECRET" | decrypt | trim -}}
{{- end -}}
{{- $redditPassword := (default "" (env "REDDIT_PASSWORD")) -}}
{{- if and (stat (joinPath .host.home ".config" "age" "chezmoi.txt")) (stat (joinPath .chezmoi.sourceDir ".chezmoitemplates" "secrets" "REDDIT_PASSWORD")) -}}
{{- $redditPassword = includeTemplate "secrets/REDDIT_PASSWORD" | decrypt | trim -}}
{{- end -}}
{{- $redditUsername := (default "" (env "REDDIT_USERNAME")) -}}
{{- if and (stat (joinPath .host.home ".config" "age" "chezmoi.txt")) (stat (joinPath .chezmoi.sourceDir ".chezmoitemplates" "secrets" "REDDIT_USERNAME")) -}}
{{- $redditUsername = includeTemplate "secrets/REDDIT_USERNAME" | decrypt | trim -}}
{{- end -}}
{{- if and (ne $redditAppId "") (ne $redditAppSecret "") (ne $redditPassword "") (ne $redditUsername "") -}}
### Reddit
# Source: https://github.com/caronc/apprise/wiki/Notify_reddit
# TODO - Replace opensource below with appropriate sub-reddit
- reddit://{{- $redditUsername -}}:{{- $redditPassword -}}@{{- $redditAppId -}}/{{- $redditAppSecret -}}/{subreddit}:
- tag: reddit, post, megabyte-labs
{{ end }}
### RSyslog
# Source: https://github.com/caronc/apprise/wiki/Notify_rsyslog
- rsyslog://localhost:
- tag: rsyslog, log
{{- $sendGridApiKey := (default "" (env "SENDGRID_API_KEY")) -}}
{{- if and (stat (joinPath .host.home ".config" "age" "chezmoi.txt")) (stat (joinPath .chezmoi.sourceDir ".chezmoitemplates" "secrets" "SENDGRID_API_KEY")) -}}
{{- $sendGridApiKey = includeTemplate "secrets/SENDGRID_API_KEY" | decrypt | trim -}}
{{- end -}}
{{- if ne $sendGridApiKey "" -}}
### SendGrid
# Source: https://github.com/caronc/apprise/wiki/Notify_sendgrid
# Sends an e-mail using SendGrid (with templating options)
- sendgrid://{{- $sendGridApiKey -}}:{{ .host.noReplyEmail }}:
- to: "{{ .user.email }}"
tag: email, sendgrid
{{ end }}
{{- $slackBotToken := (default "" (env "SLACK_BOT_USER_OAUTH_TOKEN")) -}}
{{- if and (stat (joinPath .host.home ".config" "age" "chezmoi.txt")) (stat (joinPath .chezmoi.sourceDir ".chezmoitemplates" "secrets" "SLACK_BOT_USER_OAUTH_TOKEN")) -}}
{{- $slackBotToken = includeTemplate "secrets/SLACK_BOT_USER_OAUTH_TOKEN" | decrypt | trim -}}
{{- end -}}
{{- if ne $slackBotToken "" -}}
### Slack
# Source: https://github.com/caronc/apprise/wiki/Notify_slack
# Posts in Slack chatroom
- slack://{{ $slackBotToken }}:
- tag: chat, slack
{{ end }}
{{- $twilioAccountSid := (default "" (env "TWILIO_ACCOUNT_SID")) -}}
{{- if and (stat (joinPath .host.home ".config" "age" "chezmoi.txt")) (stat (joinPath .chezmoi.sourceDir ".chezmoitemplates" "secrets" "TWILIO_ACCOUNT_SID")) -}}
{{- $twilioAccountSid = includeTemplate "secrets/TWILIO_ACCOUNT_SID" | decrypt | trim -}}
{{- end -}}
{{- $twilioAuthToken := (default "" (env "TWILIO_AUTH_TOKEN")) -}}
{{- if and (stat (joinPath .host.home ".config" "age" "chezmoi.txt")) (stat (joinPath .chezmoi.sourceDir ".chezmoitemplates" "secrets" "TWILIO_AUTH_TOKEN")) -}}
{{- $twilioAuthToken = includeTemplate "secrets/TWILIO_AUTH_TOKEN" | decrypt | trim -}}
{{- end -}}
{{- $twilioFromNumber := (default "" (env "TWILIO_FROM_NUMBER")) -}}
{{- if and (stat (joinPath .host.home ".config" "age" "chezmoi.txt")) (stat (joinPath .chezmoi.sourceDir ".chezmoitemplates" "secrets" "TWILIO_FROM_NUMBER")) -}}
{{- $twilioFromNumber = includeTemplate "secrets/TWILIO_FROM_NUMBER" | decrypt | trim -}}
{{- end -}}
{{- $cellPhoneNumber := (default "" (env "CELL_PHONE_NUMBER")) -}}
{{- if and (stat (joinPath .host.home ".config" "age" "chezmoi.txt")) (stat (joinPath .chezmoi.sourceDir ".chezmoitemplates" "secrets" "CELL_PHONE_NUMBER")) -}}
{{- $cellPhoneNumber = includeTemplate "secrets/CELL_PHONE_NUMBER" | decrypt | trim -}}
{{- end -}}
{{- if and (ne $twilioAccountSid "") (ne $twilioAuthToken "") (ne $twilioFromNumber "") (ne $cellPhoneNumber "") -}}
### Twilio
# Source: https://github.com/caronc/apprise/wiki/Notify_twilio
# Sends a text message from Twilio to the `CELL_PHONE_NUMBER`
- twilio://{{- $twilioAccountSid -}}:{{- $twilioAuthToken -}}@{{- $twilioFromNumber -}}/{{- $cellPhoneNumber -}}
- tag: text, twilio
{{ end }}
{{- $twitterApiKey := (default "" (env "TWITTER_API_KEY")) -}}
{{- if and (stat (joinPath .host.home ".config" "age" "chezmoi.txt")) (stat (joinPath .chezmoi.sourceDir ".chezmoitemplates" "secrets" "TWITTER_API_KEY")) -}}
{{- $twitterApiKey = includeTemplate "secrets/TWITTER_API_KEY" | decrypt | trim -}}
{{- end -}}
{{- $twitterApiKeySecret := (default "" (env "TWITTER_API_KEY_SECRET")) -}}
{{- if and (stat (joinPath .host.home ".config" "age" "chezmoi.txt")) (stat (joinPath .chezmoi.sourceDir ".chezmoitemplates" "secrets" "TWITTER_API_KEY_SECRET")) -}}
{{- $twitterApiKeySecret = includeTemplate "secrets/TWITTER_API_KEY_SECRET" | decrypt | trim -}}
{{- end -}}
{{- $twitterAccessToken := (default "" (env "TWITTER_ACCESS_TOKEN")) -}}
{{- if and (stat (joinPath .host.home ".config" "age" "chezmoi.txt")) (stat (joinPath .chezmoi.sourceDir ".chezmoitemplates" "secrets" "TWITTER_ACCESS_TOKEN")) -}}
{{- $twitterAccessToken = includeTemplate "secrets/TWITTER_ACCESS_TOKEN" | decrypt | trim -}}
{{- end -}}
{{- $twitterAccessTokenSecret := (default "" (env "TWITTER_ACCESS_TOKEN_SECRET")) -}}
{{- if and (stat (joinPath .host.home ".config" "age" "chezmoi.txt")) (stat (joinPath .chezmoi.sourceDir ".chezmoitemplates" "secrets" "TWITTER_ACCESS_TOKEN_SECRET")) -}}
{{- $twitterAccessTokenSecret = includeTemplate "secrets/TWITTER_ACCESS_TOKEN_SECRET" | decrypt | trim -}}
{{- end -}}
{{- if and (ne $twitterApiKey "") (ne $twitterApiKeySecret "") (ne $twitterAccessToken "") (ne $twitterAccessTokenSecret "") -}}
### Twitter
# Posts a tweet
- twitter://{{- $twitterApiKey -}}/{{- $twitterApiKeySecret -}}/{{- $twitterAccessToken -}}/{{- $twitterAccessTokenSecret -}}?mode=tweet:
- tag: post, tweet, megabyte-labs
{{ end }}
### dbus
# Source: https://github.com/caronc/apprise/wiki/Notify_dbus
- dbus://:
- tag: dbus, system
### GNOME
# Source: https://github.com/caronc/apprise/wiki/Notify_gnome
- gnome://:
- tag: gnome, system
### macOS
# Source: https://github.com/caronc/apprise/wiki/Notify_macosx
- macosx://:
- tag: macos, system
### Windows
# Source:

View file

@ -0,0 +1,3 @@
{{- if and (stat (joinPath .host.home ".config" "age" "chezmoi.txt")) (stat (joinPath .chezmoi.sourceDir ".chezmoitemplates" "files" "apprise-custom")) -}}
{{- includeTemplate "files/apprise-custom" | decrypt -}}
{{- end -}}

View file

@ -0,0 +1,64 @@
---
version: 2
extras:
docker: &docker
type: volume
to:
- docker-local
- docker-s3
cron: '0 * * * *'
hooks:
before:
- 'curl -m 10 --retry 5 -X POST -H "Content-Type: text/plain" --data "Autorestic Docker Volume ${AUTORESTIC_LOCATION} BEFORE / Host: ${HOST} / User: ${USER} / Home: ${HOME}" https://healthchecks.{{ .host.domain }}/ping/TODO_UUID/start'
failure:
- 'curl -m 10 --retry 5 -X POST -H "Content-Type: text/plain" --data "Autorestic Docker Volume ${AUTORESTIC_LOCATION} BEFORE / Host: ${HOST} / User: ${USER} / Home: ${HOME}" https://healthchecks.{{ .host.domain }}/ping/TODO_UUID/fail'
success:
- 'curl -m 10 --retry 5 -X POST -H "Content-Type: text/plain" --data "Autorestic Docker Volume ${AUTORESTIC_LOCATION} BEFORE / Host: ${HOST} / User: ${USER} / Home: ${HOME}" https://healthchecks.{{ .host.domain }}/ping/TODO_UUID'
options:
backup:
exclude:
- .venv
- node_modules
- venv
tag:
- docker
forget:
keep-hourly: 24
keep-daily: 7
keep-weekly: 12
keep-monthly: 8
keep-yearly: 1
locations:
healthchecks_config:
from: healthchecks_config
<<: *docker
healthchecks_postgres:
from: healthchecks_postgres
<<: *docker
rundeck_data:
from: rundeck_data
<<: *docker
portainer_manager_data:
from: portainer_manager_data
<<: *docker
statping_app:
from: statping_app
<<: *docker
statping_postgres:
from: statping_postgres
<<: *docker
backends:
docker-local:
type: local
path: /var/local/backups/docker
key: {{- if and (stat (joinPath .host.home ".config" "age" "chezmoi.txt")) (stat (joinPath .chezmoi.sourceDir ".chezmoitemplates" "secrets" "RESTIC_SYSTEM_PASSWORD")) }}{{ includeTemplate "secrets/RESTIC_SYSTEM_PASSWORD" | decrypt | trim }}{{ else }}{{ default "" (env "RESTIC_SYSTEM_PASSWORD") }}{{ end }}
docker-s3:
type: s3
path: {{ .user.cloudflare.r2 }}.r2.cloudflarestorage.com/docker
key: {{- if and (stat (joinPath .host.home ".config" "age" "chezmoi.txt")) (stat (joinPath .chezmoi.sourceDir ".chezmoitemplates" "secrets" "RESTIC_SYSTEM_PASSWORD")) }}{{ includeTemplate "secrets/RESTIC_SYSTEM_PASSWORD" | decrypt | trim }}{{ else }}{{ default "" (env "RESTIC_SYSTEM_PASSWORD") }}{{ end }}
env:
AWS_ACCESS_KEY_ID: {{- if and (stat (joinPath .host.home ".config" "age" "chezmoi.txt")) (stat (joinPath .chezmoi.sourceDir ".chezmoitemplates" "secrets" "CLOUDFLARE_R2_ID")) }}{{ includeTemplate "secrets/CLOUDFLARE_R2_ID" | decrypt | trim }}{{ else }}{{ default "" (env "CLOUDFLARE_R2_ID") }}{{ end }}
AWS_SECRET_ACCESS_KEY: {{- if and (stat (joinPath .host.home ".config" "age" "chezmoi.txt")) (stat (joinPath .chezmoi.sourceDir ".chezmoitemplates" "secrets" "CLOUDFLARE_R2_SECRET")) }}{{ includeTemplate "secrets/CLOUDFLARE_R2_SECRET" | decrypt | trim }}{{ else }}{{ default "" (env "CLOUDFLARE_R2_SECRET") }}{{ end }}

View file

@ -0,0 +1,135 @@
---
version: 2
extras:
app: &app
to:
- apps-local
- apps-s3
hooks:
before:
- 'curl -m 10 --retry 5 -X POST -H "Content-Type: text/plain" --data "Autorestic App Backup ${AUTORESTIC_LOCATION} BEFORE / Host: ${HOST} / User: ${USER} / Home: ${HOME}" https://healthchecks.{{ .host.domain }}/ping/TODO_UUID/start'
failure:
- 'curl -m 10 --retry 5 -X POST -H "Content-Type: text/plain" --data "Autorestic App Backup ${AUTORESTIC_LOCATION} BEFORE / Host: ${HOST} / User: ${USER} / Home: ${HOME}" https://healthchecks.{{ .host.domain }}/ping/TODO_UUID/fail'
success:
- 'curl -m 10 --retry 5 -X POST -H "Content-Type: text/plain" --data "Autorestic App Backup ${AUTORESTIC_LOCATION} BEFORE / Host: ${HOST} / User: ${USER} / Home: ${HOME}" https://healthchecks.{{ .host.domain }}/ping/TODO_UUID'
options:
backup:
exclude:
- .local
- .venv
- node_modules
- venv
tag:
- app
forget:
keep-hourly: 24
keep-daily: 7
keep-weekly: 14
keep-monthly: 3
keep-yearly: 2
user: &user
hooks:
before:
- 'curl -m 10 --retry 5 -X POST -H "Content-Type: text/plain" --data "Autorestic User Home Folder ${AUTORESTIC_LOCATION} BEFORE / Host: ${HOST} / User: ${USER} / Home: ${HOME}" https://healthchecks.{{ .host.domain }}/ping/{{ .host.autoresticHealthcheckUuid }}/start'
failure:
- 'curl -m 10 --retry 5 -X POST -H "Content-Type: text/plain" --data "Autorestic User Home Folder ${AUTORESTIC_LOCATION} BEFORE / Host: ${HOST} / User: ${USER} / Home: ${HOME}" https://healthchecks.{{ .host.domain }}/ping/{{ .host.autoresticHealthcheckUuid }}/fail'
success:
- 'curl -m 10 --retry 5 -X POST -H "Content-Type: text/plain" --data "Autorestic User Home Folder ${AUTORESTIC_LOCATION} BEFORE / Host: ${HOST} / User: ${USER} / Home: ${HOME}" https://healthchecks.{{ .host.domain }}/ping/{{ .host.autoresticHealthcheckUuid }}'
options:
backup:
exclude:
- .local
- .venv
- node_modules
- venv
- Library
tag:
- user
forget:
keep-hourly: 24
keep-daily: 7
keep-weekly: 14
keep-monthly: 3
keep-yearly: 2
locations:
altair:
from: "$ALTAIR_APPDATA"
<<: *app
android-studio:
from: "$ANDROID_STUDIO_APPDATA"
<<: *app
brave-browser:
from: "$BRAVE_BROWSER_APPDATA"
<<: *app
ferdium:
from: "$FERDIUM_APPDATA"
<<: *app
firefox:
from: "$FIREFOX_APPDATA"
<<: *app
google-chrome:
from: "$GOOGLE_CHROME_APPDATA"
<<: *app
logi-options-plus:
from: "$LOGI_OPTIONS_PLUS_APPDATA"
<<: *app
mailspring:
from: "$MAILSPRING_APPDATA"
<<: *app
mark-text:
from: "$MARK_TEXT_APPDATA"
<<: *app
microsoft-edge:
from: "$MICROSOFT_EDGE_APPDATA"
<<: *app
notion:
from: "$NOTION_APPDATA"
<<: *app
pieces-os:
from: "$PIECES_OS_APPDATA"
<<: *app
remmina:
from: "$REMMINA_APPDATA"
<<: *app
tor-browser:
from: "$TOR_BROWSER_APPDATA"
<<: *app
warp-terminal:
from: "$WARP_TERMINAL_APPDATA"
<<: *app
home-local:
from: ~/
to: home-local
cron: '0/15 * * * *'
<<: *user
home-s3:
from: ~/
to: home-s3
cron: '0 * * * *'
<<: *user
backends:
apps-local:
type: local
path: /var/local/backups/user/{{ .user.username }}/apps
key: {{- if and (stat (joinPath .host.home ".config" "age" "chezmoi.txt")) (stat (joinPath .chezmoi.sourceDir ".chezmoitemplates" "secrets" "RESTIC_PASSWORD")) }}{{ includeTemplate "secrets/RESTIC_PASSWORD" | decrypt | trim }}{{ else }}{{ default "" (env "RESTIC_PASSWORD") }}{{ end }}
apps-s3:
type: s3
path: {{ .user.cloudflare.r2 }}.r2.cloudflarestorage.com/user/{{ .user.username }}/Backups/apps
key: {{- if and (stat (joinPath .host.home ".config" "age" "chezmoi.txt")) (stat (joinPath .chezmoi.sourceDir ".chezmoitemplates" "secrets" "RESTIC_PASSWORD")) }}{{ includeTemplate "secrets/RESTIC_PASSWORD" | decrypt | trim }}{{ else }}{{ default "" (env "RESTIC_PASSWORD") }}{{ end }}
env:
AWS_ACCESS_KEY_ID: {{- if and (stat (joinPath .host.home ".config" "age" "chezmoi.txt")) (stat (joinPath .chezmoi.sourceDir ".chezmoitemplates" "secrets" "CLOUDFLARE_R2_ID_USER")) }}{{ includeTemplate "secrets/CLOUDFLARE_R2_ID_USER" | decrypt | trim }}{{ else }}{{ default "" (env "CLOUDFLARE_R2_ID_USER") }}{{ end }}
AWS_SECRET_ACCESS_KEY: {{- if and (stat (joinPath .host.home ".config" "age" "chezmoi.txt")) (stat (joinPath .chezmoi.sourceDir ".chezmoitemplates" "secrets" "CLOUDFLARE_R2_SECRET_USER")) }}{{ includeTemplate "secrets/CLOUDFLARE_R2_SECRET_USER" | decrypt | trim }}{{ else }}{{ default "" (env "CLOUDFLARE_R2_SECRET_USER") }}{{ end }}
home-local:
type: local
path: /var/local/backups/user/{{ .user.username }}/home
key: {{- if and (stat (joinPath .host.home ".config" "age" "chezmoi.txt")) (stat (joinPath .chezmoi.sourceDir ".chezmoitemplates" "secrets" "RESTIC_PASSWORD")) }}{{ includeTemplate "secrets/RESTIC_PASSWORD" | decrypt | trim }}{{ else }}{{ default "" (env "RESTIC_PASSWORD") }}{{ end }}
home-s3:
type: s3
path: {{ .user.cloudflare.r2 }}.r2.cloudflarestorage.com/user/{{ .user.username }}/Backups/home
key: {{- if and (stat (joinPath .host.home ".config" "age" "chezmoi.txt")) (stat (joinPath .chezmoi.sourceDir ".chezmoitemplates" "secrets" "RESTIC_PASSWORD")) }}{{ includeTemplate "secrets/RESTIC_PASSWORD" | decrypt | trim }}{{ else }}{{ default "" (env "RESTIC_PASSWORD") }}{{ end }}
env:
AWS_ACCESS_KEY_ID: {{- if and (stat (joinPath .host.home ".config" "age" "chezmoi.txt")) (stat (joinPath .chezmoi.sourceDir ".chezmoitemplates" "secrets" "CLOUDFLARE_R2_ID_USER")) }}{{ includeTemplate "secrets/CLOUDFLARE_R2_ID_USER" | decrypt | trim }}{{ else }}{{ default "" (env "CLOUDFLARE_R2_ID_USER") }}{{ end }}
AWS_SECRET_ACCESS_KEY: {{- if and (stat (joinPath .host.home ".config" "age" "chezmoi.txt")) (stat (joinPath .chezmoi.sourceDir ".chezmoitemplates" "secrets" "CLOUDFLARE_R2_SECRET_USER")) }}{{ includeTemplate "secrets/CLOUDFLARE_R2_SECRET_USER" | decrypt | trim }}{{ else }}{{ default "" (env "CLOUDFLARE_R2_SECRET_USER") }}{{ end }}

View file

@ -1,8 +1,6 @@
PATH=/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/sbin:/opt/homebrew/bin
*/5 * * * * command -v autorestic > /dev/null && autorestic --ci cron > /tmp/autorestic-system.log 2>&1
PATH=/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/sbin
# 0 8 * * 0 $HOME/.scripts/domingobot.sh 2>&1 >> $HOME/.log/cron.log
# * * * * * command to be executed # * * * * * command to be executed
# ┯ ┯ ┯ ┯ ┯ # ┯ ┯ ┯ ┯ ┯

View file

@ -0,0 +1,14 @@
PATH=/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/sbin:/opt/homebrew/bin:$HOME/.local/bin
*/5 * * * * command -v autorestic > /dev/null && . "$HOME/.config/shell/apps.sh" && autorestic -c "$HOME/.config/autorestic/autorestic-user.yml" --ci cron > /tmp/autorestic.log 2>&1
* * * * * command -v dagu-cron > /dev/null && dagu-cron
* * * * * command -v ghorg > /dev/null && ghorg reclone
# * * * * * command to be executed
# ┯ ┯ ┯ ┯ ┯
# │ │ │ │ │
# │ │ │ │ ╰───── day of week (0 - 6) (Sunday=0)
# │ │ │ ╰─────── month (1 - 12)
# │ │ ╰───────── day of month (1 - 31)
# │ ╰─────────── hour (0 - 23)
# ╰───────────── min (0 - 59)

View file

@ -0,0 +1,26 @@
---
host: 127.0.0.1 # default: 127.0.0.1
port: 8321 # default: 8080
### Path to the DAGs directory
# dags: <the location of DAG configuration files> # default: ${DAGU_HOME}/dags
### Web UI Color & Title
navbarColor: "#119eff" # header color for web UI (e.g. "#ff0000")
navbarTitle: CombineOS Dagu # header title for web UI (e.g. "PROD")
### Basic Auth
isBasicAuth: false # enables basic auth
# basicAuthUsername: <username for basic auth of web UI> # basic auth user
# basicAuthPassword: <password for basic auth of web UI> # basic auth password
### Base Config
# baseConfig: <base DAG config path> # default: ${DAGU_HOME}/config.yaml
### Working Directory
# workDir: <working directory for DAGs> # default: DAG location
### SSL Configuration
# tls:
# certFile: <path to SSL certificate file>
# keyFile: <path to SSL key file>

View file

@ -0,0 +1,32 @@
---
### Directory path to save logs from standard output
logDir: /var/log/dagu
### History retention days (default: 30)
histRetentionDays: 30
### Email notification settings
mailOn:
failure: true
success: false
### SMTP server settings
smtp:
host: smtp.sendgrid.net
port: 587
username: apikey
password: "{{ if (stat (joinPath .chezmoi.sourceDir ".chezmoitemplates" "secrets" "SENDGRID_API_KEY")) }}{{ includeTemplate "secrets/SENDGRID_API_KEY" | decrypt | trim }}{{ else }}{{ env "SENDGRID_API_KEY" }}{{ end }}"
### Error mail configuration
errorMail:
from: "{{ .host.noReplyEmail }}"
to: "{{ .user.email }}"
prefix: "[Error]"
attachLogs: true
### Info mail configuration
infoMail:
from: "{{ .host.noReplyEmail }}"
to: "{{ .user.email }}"
prefix: "[Info]"
attachLogs: true

View file

@ -23,4 +23,5 @@ services:
- seccomp:unconfined - seccomp:unconfined
volumes: volumes:
filestash: {} filestash:
name: filestash

View file

@ -9,7 +9,7 @@ services:
PGID: 1000 PGID: 1000
TZ: America/New_York TZ: America/New_York
volumes: volumes:
- ./config/nextcloud:/config - nextcloud_config:/config
- /mnt/auxilary/NextCloud:/data - /mnt/auxilary/NextCloud:/data
ports: ports:
- 26777:443 - 26777:443
@ -31,3 +31,7 @@ services:
expose: expose:
- 3306 - 3306
restart: unless-stopped restart: unless-stopped
volumes:
nextcloud_config:
name: nextcloud_config

View file

@ -12,7 +12,7 @@ services:
- nginx_network - nginx_network
environment: environment:
ALLOWED_HOSTS: "{{ .docker.healthchecks.allowedHosts }}" ALLOWED_HOSTS: "{{ .docker.healthchecks.allowedHosts }}"
APPRISE_ENABLED: 'False' APPRISE_ENABLED: 'True'
DB_HOST: postgres DB_HOST: postgres
DB_NAME_FILE: /run/secrets/healthchecks_db_name DB_NAME_FILE: /run/secrets/healthchecks_db_name
DB_PASSWORD_FILE: /run/secrets/healthchecks_db_password DB_PASSWORD_FILE: /run/secrets/healthchecks_db_password
@ -38,6 +38,7 @@ services:
SLACK_ENABLED: 'True' SLACK_ENABLED: 'True'
SUPERUSER_EMAIL_FILE: /run/secrets/healthchecks_superuser_email SUPERUSER_EMAIL_FILE: /run/secrets/healthchecks_superuser_email
SUPERUSER_PASSWORD_FILE: /run/secrets/healthchecks_superuser_password SUPERUSER_PASSWORD_FILE: /run/secrets/healthchecks_superuser_password
TZ: "{{ .user.timezone }}"
WEBHOOKS_ENABLED: 'True' WEBHOOKS_ENABLED: 'True'
deploy: deploy:
mode: replicated mode: replicated
@ -46,6 +47,7 @@ services:
- healthchecks_config:/config - healthchecks_config:/config
expose: expose:
- 8000 - 8000
- 2525
restart: unless-stopped restart: unless-stopped
secrets: secrets:
- healthchecks_db_name - healthchecks_db_name
@ -53,6 +55,8 @@ services:
- healthchecks_db_user - healthchecks_db_user
- healthchecks_secret_key - healthchecks_secret_key
- healthchecks_sendgrid_api_key - healthchecks_sendgrid_api_key
- healthchecks_slack_client_id
- healthchecks_slack_client_secret
- healthchecks_superuser_email - healthchecks_superuser_email
- healthchecks_superuser_password - healthchecks_superuser_password
@ -95,6 +99,10 @@ secrets:
external: true external: true
healthchecks_sendgrid_api_key: healthchecks_sendgrid_api_key:
external: true external: true
healthchecks_slack_client_id:
external: true
healthchecks_slack_client_secret:
external: true
healthchecks_superuser_email: healthchecks_superuser_email:
external: true external: true
healthchecks_superuser_password: healthchecks_superuser_password:
@ -102,4 +110,6 @@ secrets:
volumes: volumes:
healthchecks_config: healthchecks_config:
name: healthchecks_config
healthchecks_postgres: healthchecks_postgres:
name: healthchecks_postgres

View file

@ -1,10 +0,0 @@
# https://github.com/usememos/memos
version: "3.0"
services:
memos:
image: neosmemo/memos:latest
container_name: memos
volumes:
- ~/.memos/:/var/opt/memos
ports:
- 5230:5230

View file

@ -48,3 +48,4 @@ secrets:
volumes: volumes:
portainer_manager_data: portainer_manager_data:
name: portainer_manager_data

View file

@ -10,7 +10,7 @@ services:
MENU_VERSION: 2.0.19 #optional MENU_VERSION: 2.0.19 #optional
volumes: volumes:
- $HOME/.ssh:/home/rundeck/.ssh - $HOME/.ssh:/home/rundeck/.ssh
- rundeck-data:/home/rundeck/server/data - rundeck_data:/home/rundeck/server/data
ports: ports:
- 3000:3000 - 3000:3000
- 69:69/udp - 69:69/udp
@ -18,4 +18,5 @@ services:
restart: unless-stopped restart: unless-stopped
volumes: volumes:
rundeck-data: rundeck_data:
name: rundeck_data

View file

@ -72,4 +72,6 @@ secrets:
volumes: volumes:
statping_app: statping_app:
name: statping_app
statping_postgres: statping_postgres:
name: statping_postgres

View file

@ -2,7 +2,10 @@
<service> <service>
<short>Plex</short> <short>Plex</short>
<description>Plex media center</description> <description>Plex media center</description>
<port protocol="udp" port="1900"/> # Plex DLNA Server <port protocol="udp" port="1900"/>
<port protocol="tcp" port="32469"/> # Plex DLNA Server <port protocol="tcp" port="3005"/>
<port protocol="udp" port="32410-32414"/> # GDM Network Discovery <port protocol="udp" port="5353"/>
</service> <port protocol="tcp" port="8324"/>
<port protocol="tcp" port="32400"/>
<port protocol="udp" port="32410-32414"/>
</service>

View file

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<service> <service>
<short>xRDP</short> <short>RDP</short>
<description>Remote Desktop server</description> <description>Remote Desktop server</description>
<port protocol="tcp" port="3389"/> <port protocol="tcp" port="3389"/>
</service> </service>

View file

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<service>
<short>rsyslog</short>
<description>rsyslog - enhanced, multi-threaded syslogd</description>
<port protocol="tcp" port="514"/>
</service>

View file

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<service> <service>
<short>TigerVNC</short> <short>VNC</short>
<description>High performance, multi-platform VNC server</description> <description>VNC server</description>
<port protocol="tcp" port="5900-5904"/> <port protocol="tcp" port="5900-5904"/>
</service> </service>

View file

@ -0,0 +1,4 @@
[FTP]
title=FTP
description=FTP server
ports=21/tcp

View file

@ -0,0 +1,4 @@
[Jellyfin]
title=Jellyfin
description=Jellyfin media server
ports=8096/tcp|8920/tcp|1900/udp|7359/udp

View file

@ -3,11 +3,6 @@ title=Plex Media Server (Standard)
description=The Plex Media Server description=The Plex Media Server
ports=32400/tcp|3005/tcp|5353/udp|8324/tcp|32410:32414/udp ports=32400/tcp|3005/tcp|5353/udp|8324/tcp|32410:32414/udp
[PlexMediaServer DLNA]
title=Plex Media Server (DLNA)
description=The Plex Media Server (additional DLNA capability only)
ports=1900/udp|32469/tcp
[PlexMediaServer Full] [PlexMediaServer Full]
title=Plex Media Server (Standard + DLNA) title=Plex Media Server (Standard + DLNA)
description=The Plex Media Server (with additional DLNA capability) description=The Plex Media Server (with additional DLNA capability)

View file

@ -0,0 +1,4 @@
[rsyslog]
title=rsyslog
description=Enhanced, multi-threaded syslogd
ports=514/tcp

View file

@ -0,0 +1,4 @@
[VNC]
title=VNC
description=VNC server
ports=5900:5904/tcp

View file

@ -6,7 +6,7 @@
# Which provider to clone from (github, gitlab, gitea or bitbucket) # Which provider to clone from (github, gitlab, gitea or bitbucket)
# default: github # default: github
# flag (--scm, -s) eg: --scm=gitlab # flag (--scm, -s) eg: --scm=gitlab
GHORG_SCM_TYPE: gitlab GHORG_SCM_TYPE: github
# How you'd like to clone the repos (https or ssh) # How you'd like to clone the repos (https or ssh)
# default: https # default: https
@ -18,7 +18,7 @@ GHORG_CLONE_PROTOCOL: https
# See https://github.com/gabrie30/ghorg#changing-clone-directories for example # See https://github.com/gabrie30/ghorg#changing-clone-directories for example
# default: YOUR_HOME_DIR/ghorg # default: YOUR_HOME_DIR/ghorg
# flag (--path, -p) eg: --path=/tmp/ghorg # flag (--path, -p) eg: --path=/tmp/ghorg
GHORG_ABSOLUTE_PATH_TO_CLONE_TO: ~/.local/ghorg GHORG_ABSOLUTE_PATH_TO_CLONE_TO: ~/Projects
# Folder ghorg will clone all repos into. Cloning will result in: GHORG_ABSOLUTE_PATH_TO_CLONE_TO/GHORG_OUTPUT_DIR/repo # Folder ghorg will clone all repos into. Cloning will result in: GHORG_ABSOLUTE_PATH_TO_CLONE_TO/GHORG_OUTPUT_DIR/repo
# See https://github.com/gabrie30/ghorg#changing-clone-directories for example # See https://github.com/gabrie30/ghorg#changing-clone-directories for example
@ -58,7 +58,7 @@ GHORG_PRUNE_NO_CONFIRM: true
# Color output (enabled, disabled) # Color output (enabled, disabled)
# flag (--color) eg: --color=disabled # flag (--color) eg: --color=disabled
GHORG_COLOR: enabled GHORG_COLOR: disabled
# Skip archived repos, currently github/gitlab/gitea only # Skip archived repos, currently github/gitlab/gitea only
# flag (--skip-archived) # flag (--skip-archived)
@ -70,7 +70,7 @@ GHORG_SKIP_FORKS: false
# Backup mode, clone as mirror, no working copy (ignores branch parameter) # Backup mode, clone as mirror, no working copy (ignores branch parameter)
# flag (--backup) # flag (--backup)
GHORG_BACKUP: true # GHORG_BACKUP: false
# Max goroutines created while cloning # Max goroutines created while cloning
# flag (--concurrency) # flag (--concurrency)
@ -99,7 +99,7 @@ GHORG_CONCURRENCY: 25
# Only clones new repos and does not perform a git clean on existing repos. Useful if you don't want to lose changes made to repos in the org/user directory. # Only clones new repos and does not perform a git clean on existing repos. Useful if you don't want to lose changes made to repos in the org/user directory.
# flag (--no-clean) # flag (--no-clean)
GHORG_NO_CLEAN: false GHORG_NO_CLEAN: true
# Additionally clone the wiki page for repo # Additionally clone the wiki page for repo
# flag (--clone-wiki) # flag (--clone-wiki)
@ -107,7 +107,7 @@ GHORG_CLONE_WIKI: false
# Fetches all remote branches for each repo by running a git fetch --all # Fetches all remote branches for each repo by running a git fetch --all
# flag (--fetch-all) # flag (--fetch-all)
GHORG_FETCH_ALL: false GHORG_FETCH_ALL: true
# If you want to set a path other than $HOME/.config/ghorg/ghorgignore for your ghorgignore # If you want to set a path other than $HOME/.config/ghorg/ghorgignore for your ghorgignore
# flag (--ghorgignore-path) # flag (--ghorgignore-path)
@ -115,7 +115,7 @@ GHORG_FETCH_ALL: false
# Only emit critical output. # Only emit critical output.
# flag (--quiet) # flag (--quiet)
GHORG_QUIET: false GHORG_QUIET: true
# Perform a dry run of the clone; fetches repos but does not clone them. # Perform a dry run of the clone; fetches repos but does not clone them.
# flag (--dry-run) # flag (--dry-run)

View file

@ -0,0 +1,7 @@
---
github:
cmd: "ghorg clone megabyte-labs -s github -p ~/GitHub"
description: "Clones the GitHub megabyte-labs organization repositories"
gitlab:
cmd: "ghorg clone megabyte-labs -s gitlab -p ~/GitLab"
description: "Clones the GitLab megabyte-labs organization repositories"

View file

@ -0,0 +1,42 @@
#!/usr/bin/env sh
# @file App Backup Variables
# @brief Stores variables that instruct various utilities what location to use for private application data
# @description
# The variables in this file are used to instruct `autorestic` and possibly other utilities about the
# location of the private application data for various programs that get backed up.
if [ -d /Applications ] && [ -d /System ]; then
### macOS
ALTAIR_APPDATA="$HOME/Library/Application Support/Altair GraphQL Client"
ANDROID_STUDIO_APPDATA="TODO"
BRAVE_BROWSER_APPDATA="$HOME/Library/Application Support/BraveSoftware/Brave-Browser/Default"
FERDIUM_APPDATA="$HOME/Library/Application Support/Ferdium"
FIREFOX_APPDATA="$HOME/Library/Application Support/Firefox/Profiles"
GOOGLE_CHROME_APPDATA="$HOME/Library/Application Support/Google/Chrome/Default"
LOGI_OPTIONS_PLUS_APPDATA="$HOME/Library/Application Support/LogiOptionsPlus"
MAILSPRING_APPDATA="$HOME/Library/Application Support/Mailspring"
MARK_TEXT_APPDATA="$HOME/Library/Application Support/marktext"
MICROSOFT_EDGE_APPDATA="$HOME/Library/Application Support/Microsoft Edge/Default"
NOTION_APPDATA="$HOME/Library/Application Support/Notion"
PIECES_OS_APPDATA="$HOME/Library/Application Support/com.pieces.os"
# REMMINA_APPDATA - Remmina not available on macOS
TOR_BROWSER_APPDATA="$HOME/Library/Application Support/TorBrowser-Data/Tor"
WARP_TERMINAL_APPDATA="$HOME/Library/Application Support/dev.warp.Warp-Stable"
else
### Linux
# Currently, we assume the Flatpak location whenever possible
ANDROID_STUDIO_APPDATA="TODO"
ALTAIR_APPDATA="$HOME/snap/altair/current/.config/Altair GraphQL Client"
BRAVE_BROWSER_APPDATA="$HOME/.var/app/com.brave.Browser/config/BraveSoftware/Brave-Browser/Default"
FERDIUM_APPDATA="$HOME/.var/app/org.ferdium.Ferdium/config/Ferdium"
FIREFOX_APPDATA="$HOME/.var/app/org.mozilla.firefox/.mozilla/firefox"
GOOGLE_CHROME_APPDATA="$HOME/.var/app/com.google.Chrome/config/google-chrome/Default"
MAILSPRING_APPDATA="TODO"
MARK_TEXT_APPDATA="TODO"
MICROSOFT_EDGE_APPDATA="TODO"
NOTION_APPDATA="TODO"
PIECES_OS_APPDATA="TODO"
REMMINA_APPDATA="$HOME/.var/app/org.remmina.Remmina/config/remmina/remmina.pref"
TOR_BROWSER_APPDATA="TODO"
WARP_TERMINAL_APPDATA="TODO"
fi

View file

@ -181,6 +181,9 @@ export CONCURRENT_LOG_DIR="${XDG_DATA_HOME:-$HOME/.local/share}/concurrent"
### cURL ### cURL
export CURLOPT_ACCEPT_ENCODING=true export CURLOPT_ACCEPT_ENCODING=true
### Dagu
export DAGU_HOME="${XDG_CONFIG_HOME:-$HOME/.config}/dagu"
### Desk ### Desk
export DESK_DIR="${XDG_CONFIG_HOME:-$HOME/.config}/desk" export DESK_DIR="${XDG_CONFIG_HOME:-$HOME/.config}/desk"
export DESK_DESKS_DIR="${XDG_CONFIG_HOME:-$HOME/.config}/desk/desks" export DESK_DESKS_DIR="${XDG_CONFIG_HOME:-$HOME/.config}/desk/desks"

View file

@ -12,6 +12,8 @@ export XDG_CONFIG_HOME="${XDG_CONFIG_HOME:-$HOME/.config}"
[ ! -f "${XDG_CONFIG_HOME:-$HOME/.config}/shell/exports.sh" ] || . "${XDG_CONFIG_HOME:-$HOME/.config}/shell/exports.sh" [ ! -f "${XDG_CONFIG_HOME:-$HOME/.config}/shell/exports.sh" ] || . "${XDG_CONFIG_HOME:-$HOME/.config}/shell/exports.sh"
[ ! -f "${XDG_CONFIG_HOME:-$HOME/.config}/shell/aliases.sh" ] || . "${XDG_CONFIG_HOME:-$HOME/.config}/shell/aliases.sh" [ ! -f "${XDG_CONFIG_HOME:-$HOME/.config}/shell/aliases.sh" ] || . "${XDG_CONFIG_HOME:-$HOME/.config}/shell/aliases.sh"
[ ! -f "${XDG_CONFIG_HOME:-$HOME/.config}/shell/functions.sh" ] || . "${XDG_CONFIG_HOME:-$HOME/.config}/shell/functions.sh" [ ! -f "${XDG_CONFIG_HOME:-$HOME/.config}/shell/functions.sh" ] || . "${XDG_CONFIG_HOME:-$HOME/.config}/shell/functions.sh"
[ ! -f "${XDG_CONFIG_HOME:-$HOME/.config}/shell/apps.sh" ] || . "${XDG_CONFIG_HOME:-$HOME/.config}/shell/apps.sh"
[ ! -f "${XDG_CONFIG_HOME:-$HOME/.config}/shell/docker.sh" ] || . "${XDG_CONFIG_HOME:-$HOME/.config}/shell/docker.sh"
### Bash / ZSH ### Bash / ZSH
if [ "$BASH_SUPPORT" = 'true' ]; then if [ "$BASH_SUPPORT" = 'true' ]; then

View file

@ -0,0 +1,20 @@
#!/usr/bin/env bash
# @file Dagu Cron-Based Daemon Helper
# @brief Helper executable used by cron to ensure Dagu is running
# @description
# This script is utilized by the user-level cronjob runner. Every minute this script is called by the cron
# scheduler to ensure that the Dagu service is running. Read more about Dagu on their [GitHub page](https://github.com/dagu-dev/dagu).
PROCESS="dagu start-all"
COMMAND="/usr/bin/dagu start-all"
### Ensure dagu is installed
if command -v dagu > /dev/null; then
### Check if process is already running
if ps ax | grep -v grep | grep "$PROCESS" > /dev/null; then
exit
else
$COMMAND &
fi
fi
exit

View file

@ -1,4 +1,10 @@
#!/usr/bin/env bash #!/usr/bin/env bash
# @file RClone Mount
# @brief Helper utility to aid with mounting RClone S3 buckets to the file system
# @description
# This script is a helper utility to assist a system service that ensures various
# RClone S3 mounts are mounted properly. For more information, take a look at the
# RClone files stored in `~/.config/rclone`.
### Variables ### Variables
TYPE="$1" TYPE="$1"
@ -44,7 +50,7 @@ for FOLDER in "$CACHE_FOLDER" "$CONFIG_FOLDER" "$LOG_FOLDER" "$MOUNT_PATH"; do
if [ ! -d "$FOLDER" ]; then if [ ! -d "$FOLDER" ]; then
mkdir -p "$FOLDER" mkdir -p "$FOLDER"
chmod 750 "$FOLDER" chmod 750 "$FOLDER"
chown -f $USER:rclone "$FOLDER" chown -f "$USER:rclone" "$FOLDER"
fi fi
done done
@ -54,15 +60,15 @@ if [ ! -f "$RCLONE_IGNORE" ] && [ -f "/etc/rcloneignore" ]; then
RCLONE_IGNORE='/etc/rcloneignore' RCLONE_IGNORE='/etc/rcloneignore'
fi fi
sudo chown -f root "$CONFIG_FOLDER/rclone.conf" chown -f "$USER:rclone" "$CONFIG_FOLDER/rclone.conf"
sudo chmod -f 600 "$CONFIG_FOLDER/rclone.conf" chmod -f 600 "$CONFIG_FOLDER/rclone.conf"
### Mount ### Mount
unset AWS_CA_BUNDLE unset AWS_CA_BUNDLE
export PATH="$PATH:/usr/local/bin:/usr/bin" export PATH="$PATH:/usr/local/bin:/usr/bin"
# TODO: Only launch with --rc-web-gui if the servers hostname is the {{ .kubernetesHost }} # TODO: Only launch with --rc-web-gui if the servers hostname is the {{ .kubernetesHost }}
# TODO: Add more secure authentication method # TODO: Add more secure authentication method
sudo rclone --config "$CONFIG_FOLDER/rclone.conf" \ rclone --config "$CONFIG_FOLDER/rclone.conf" \
mount \ mount \
--allow-other \ --allow-other \
--buffer-size 4G \ --buffer-size 4G \

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

View file

@ -24,6 +24,10 @@ ingress:
service: tcp://localhost:2022 service: tcp://localhost:2022
- hostname: vnc.{{ $baseDomain }} - hostname: vnc.{{ $baseDomain }}
service: tcp://localhost:5901 service: tcp://localhost:5901
- hostname: dagu.{{ $baseDomain }}
service: tcp://localhost:8321
- hostname: rsyslog.{{ $baseDomain }}
service: tcp://localhost:514
{{- if eq .host.softwareGroup "Kubernetes" }} {{- if eq .host.softwareGroup "Kubernetes" }}
- hostname: k8s.{{ .host.domain }} - hostname: k8s.{{ .host.domain }}
service: bastion service: bastion

View file

@ -422,10 +422,10 @@ softwarePackages:
sudo snap connect pieces-os:dotnet-runtime-aspnetcore sudo snap connect pieces-os:dotnet-runtime-aspnetcore
_app: Pieces.app _app: Pieces.app
_note: Waiting for choco package _note: Waiting for choco package
_link:cask: _env:
- src: "${XDG_CONFIG_HOME:-$HOME/.config}/pieces-os" PIECES_OS_APPDATA:
target: "$HOME/Library/Application Support/com.pieces.os" cask: "$HOME/Library/Application Support/com.pieces.os"
_link:snap: 'TODO' snap: "TODO"
appinstaller: https://builds.pieces.app/stages/production/appinstaller/os_server.appinstaller appinstaller: https://builds.pieces.app/stages/production/appinstaller/os_server.appinstaller
cask: pieces-os cask: pieces-os
exe: https://builds.pieces.app/stages/production/os_server/windows-exe/download exe: https://builds.pieces.app/stages/production/os_server/windows-exe/download
@ -532,13 +532,11 @@ softwarePackages:
_home: https://altairgraphql.dev/ _home: https://altairgraphql.dev/
_name: Altair GraphQL Client _name: Altair GraphQL Client
_app: Altair GraphQL Client.app _app: Altair GraphQL Client.app
_link:cask: _env:
- src: "${XDG_CONFIG_HOME:-$HOME/.config}/Altair GraphQL Client" ALTAIR_APPDATA:
target: "$HOME/Library/Application Support/Altair GraphQL Client" cask: "$HOME/Library/Application Support/Altair GraphQL Client"
_link:choco: 'TODO' choco: "TODO"
_link:snap: snap: "$HOME/snap/altair/current/.config/Altair GraphQL Client"
- src: "${XDG_CONFIG_HOME:-$HOME/.config}/Altair GraphQL Client"
target: "$HOME/snap/altair/current/.config/Altair GraphQL Client"
cask: altair-graphql-client cask: altair-graphql-client
choco: altair-graphql choco: altair-graphql
snap: altair snap: altair
@ -609,10 +607,12 @@ softwarePackages:
_home: https://developer.android.com/studio _home: https://developer.android.com/studio
_name: Android Studio _name: Android Studio
_app: Android Studio.app _app: Android Studio.app
_link:cask: 'TODO' _env:
_link:choco: 'TODO' ANDROID_STUDIO_APPDATA:
_link:flatpak: 'TODO' cask: "TODO"
_link:snap: 'TODO' choco: "TODO"
flatpak: "TODO"
snap: "TODO"
cask: android-studio cask: android-studio
choco: androidstudio choco: androidstudio
flatpak: com.google.AndroidStudio flatpak: com.google.AndroidStudio
@ -1179,6 +1179,11 @@ softwarePackages:
_github: https://github.com/cupcakearmy/autorestic/ _github: https://github.com/cupcakearmy/autorestic/
_home: https://autorestic.vercel.app/ _home: https://autorestic.vercel.app/
_name: Autorestic _name: Autorestic
_post: |
#!/usr/bin/env bash
sudo mkdir -p /var/local/backups/apps
sudo mkdir -p /var/local/backups/home
sudo mkdir -p /var/local/backups/docker
ansible: professormanhattan.autorestic ansible: professormanhattan.autorestic
brew: autorestic brew: autorestic
awscli: awscli:
@ -1281,10 +1286,10 @@ softwarePackages:
_github: false _github: false
_name: Logi Options+ _name: Logi Options+
_app: logioptionsplus.app _app: logioptionsplus.app
_link:choco: 'TODO' _env:
_link:cask: LOGI_OPTIONS_PLUS_APPDATA:
- src: "${XDG_CONFIG_HOME:-$HOME/.config}/LogiOptionsPlus" cask: "$HOME/Library/Application Support/LogiOptionsPlus"
target: "$HOME/Library/Application Support/LogiOptionsPlus" choco: "TODO"
choco: logioptionsplus choco: logioptionsplus
cask: logi-options-plus cask: logi-options-plus
exe: https://download01.logi.com/web/ftp/pub/techsupport/optionsplus/logioptionsplus_installer.exe exe: https://download01.logi.com/web/ftp/pub/techsupport/optionsplus/logioptionsplus_installer.exe
@ -1685,6 +1690,25 @@ softwarePackages:
_name: MongoDB Atlas _name: MongoDB Atlas
brew: mongodb-atlas brew: mongodb-atlas
choco: mongodb-atlas choco: mongodb-atlas
pywin32:
_bin: pywin32
_name: Pywin32
_github: https://github.com/mhammond/pywin32
pipx:windows: pywin32
terminal-notifier:
_bin: terminal-notifier
_name: Terminal Notifier
_github: https://github.com/julienXX/terminal-notifier
brew:darwin: terminal-notifier
apprise:
_deps:
- pywin32
- terminal-notifier
_bin: apprise
_name: Apprise
_github: https://github.com/caronc/apprise
dnf: apprise
pipx: apprise
privaxy: privaxy:
_bin: privaxy _bin: privaxy
_desc: Privaxy is the next generation tracker and advertisement blocker. It blocks ads and trackers by MITMing HTTP(s) traffic. _desc: Privaxy is the next generation tracker and advertisement blocker. It blocks ads and trackers by MITMing HTTP(s) traffic.
@ -1704,18 +1728,12 @@ softwarePackages:
_home: https://brave.com/ _home: https://brave.com/
_name: Brave Browser _name: Brave Browser
_app: Brave Browser.app _app: Brave Browser.app
_link:cask: _env:
- src: "${XDG_CONFIG_HOME:-$HOME/.config}/BraveSoftware/Brave-Browser/Default" BRAVE_BROWSER_APPDATA:
target: "$HOME/Library/Application Support/BraveSoftware/Brave-Browser/Default" cask: "$HOME/Library/Application Support/BraveSoftware/Brave-Browser/Default"
_link:choco: choco: "%APPDATA%/Local/BraveSoftware/Brave-Browser/User Data"
- src: "${XDG_CONFIG_HOME:-$HOME/.config}/BraveSoftware/Brave-Browser/Default" flatpak: "$HOME/.var/app/com.brave.Browser/config/BraveSoftware/Brave-Browser/Default"
target: "%APPDATA%/Local/BraveSoftware/Brave-Browser/User Data" snap: "$HOME/snap/brave/current/.config/BraveSoftware/Brave-Browser/Default"
_link:flatpak:
- src: "${XDG_CONFIG_HOME:-$HOME/.config}/BraveSoftware/Brave-Browser/Default"
target: "$HOME/.var/app/com.brave.Browser/config/BraveSoftware/Brave-Browser/Default"
_link:snap:
- src: "${XDG_CONFIG_HOME:-$HOME/.config}/BraveSoftware/Brave-Browser/Default"
target: "$HOME/snap/brave/current/.config/BraveSoftware/Brave-Browser/Default"
_post: | _post: |
#!/usr/bin/env bash #!/usr/bin/env bash
# @brief See `google-chrome` `_post` script for more details # @brief See `google-chrome` `_post` script for more details
@ -1797,6 +1815,18 @@ softwarePackages:
emerge: broot emerge: broot
pkgin: broot pkgin: broot
port: broot port: broot
rsyslog:
_bin: rsyslog
_github: https://github.com/rsyslog/rsyslog
_name: RSyslog
_service: rsyslog
_ports:
- port: 514
proto: tcp
apt: rsyslog
brew: rsyslog
dnf: rsyslog
pacman: rsyslog
browser-sync: browser-sync:
_bin: browser-sync _bin: browser-sync
_desc: '[Browsersync](https://browsersync.io/) allows you to keep multiple browsers & devices in sync when building websites' _desc: '[Browsersync](https://browsersync.io/) allows you to keep multiple browsers & devices in sync when building websites'
@ -2007,12 +2037,10 @@ softwarePackages:
_home: https://www.google.com/chrome/ _home: https://www.google.com/chrome/
_name: Google Chrome _name: Google Chrome
_app: Google Chrome.app _app: Google Chrome.app
_link:cask: _env:
- src: "${XDG_CONFIG_HOME:-$HOME/.config}/google-chrome/Default" GOOGLE_CHROME_APPDATA:
target: "$HOME/Library/Application Support/Google/Chrome/Default" cask: "$HOME/Library/Application Support/Google/Chrome/Default"
_link:flatpak: flatpak: "$HOME/.var/app/com.google.Chrome/config/google-chrome/Default"
- src: "${XDG_CONFIG_HOME:-$HOME/.config}/google-chrome/Default"
target: "$HOME/.var/app/com.google.Chrome/config/google-chrome/Default"
_post: | _post: |
#!/usr/bin/env bash #!/usr/bin/env bash
# @file Chrome Settings / Extensions # @file Chrome Settings / Extensions
@ -2124,11 +2152,11 @@ softwarePackages:
_name: Tor Browser _name: Tor Browser
_restricted: true _restricted: true
_app: Tor Browser.app _app: Tor Browser.app
_link:cask: _env:
- src: "${XDG_CONFIG_HOME:-$HOME/.config}/tor-browser" TOR_BROWSER_APPDATA:
target: "$HOME/Library/Application Support/TorBrowser-Data/Tor" cask: "$HOME/Library/Application Support/TorBrowser-Data/Tor"
_link:choco: 'TODO' choco: "TODO"
_link:flatpak: 'TODO' flatpak: "TODO"
cask: tor-browser cask: tor-browser
choco: tor-browser choco: tor-browser
flatpak: com.github.micahflee.torbrowser-launcher flatpak: com.github.micahflee.torbrowser-launcher
@ -3965,21 +3993,15 @@ softwarePackages:
_home: https://www.mozilla.org/en-US/firefox/new/ _home: https://www.mozilla.org/en-US/firefox/new/
_name: Mozilla Firefox _name: Mozilla Firefox
_app: Firefox.app _app: Firefox.app
_link: _env:
- src: "${XDG_CONFIG_HOME:-$HOME/.config}/firefox/profiles" FIREFOX_APPDATA:
target: "$HOME/.mozilla/firefox" apt: "$HOME/.mozilla/firefox"
_link:cask: cask: "$HOME/Library/Application Support/Firefox/Profiles"
- src: "${XDG_CONFIG_HOME:-$HOME/.config}/firefox/profiles" choco: "TODO"
target: "$HOME/Library/Application Support/Firefox/Profiles" dnf: "$HOME/.mozilla/firefox"
_link:choco: flatpak: "$HOME/.var/app/org.mozilla.firefox/.mozilla/firefox"
- src: "${XDG_CONFIG_HOME:-$HOME/.config}/firefox/profiles" pacman: "$HOME/.mozilla/firefox"
target: 'TODO' snap: "$HOME/snap/firefox/common/.mozilla/firefox"
_link:flatpak:
- src: "${XDG_CONFIG_HOME:-$HOME/.config}/firefox/profiles"
target: "$HOME/.var/app/org.mozilla.firefox/.mozilla/firefox"
_link:snap:
- src: "${XDG_CONFIG_HOME:-$HOME/.config}/firefox/profiles"
target: "$HOME/snap/firefox/common/.mozilla/firefox"
_post: | _post: |
#!/usr/bin/env bash #!/usr/bin/env bash
# @file Firefox Settings / Add-Ons / Profiles # @file Firefox Settings / Add-Ons / Profiles
@ -4852,6 +4874,9 @@ softwarePackages:
_github: https://github.com/gabrie30/ghorg _github: https://github.com/gabrie30/ghorg
_home: null _home: null
_name: ghorg _name: ghorg
_post: |
#!/usr/bin/env bash
ghorg reclone
ansible: professormanhattan.ghorg ansible: professormanhattan.ghorg
brew: gabrie30/utils/ghorg brew: gabrie30/utils/ghorg
github: github.com/gabrie30/ghorg github: github.com/gabrie30/ghorg
@ -6883,16 +6908,12 @@ softwarePackages:
ferdium: ferdium:
_bin: ferdium _bin: ferdium
_app: Ferdium.app _app: Ferdium.app
_link:cask: _env:
- src: "${XDG_CONFIG_HOME:-$HOME/.config}/Ferdium" FERDIUM_APPDATA:
target: "$HOME/Library/Application Support/Ferdium" cask: "$HOME/Library/Application Support/Ferdium"
_link:choco: 'TODO' choco: TODO
_link:flatpak: flatpak: "$HOME/.var/app/org.ferdium.Ferdium/config/Ferdium"
- src: "${XDG_CONFIG_HOME:-$HOME/.config}/Ferdium" snap: "$HOME/snap/ferdium/current/.config/Ferdium"
target: "$HOME/.var/app/org.ferdium.Ferdium/config/Ferdium"
_link:snap:
- src: "${XDG_CONFIG_HOME:-$HOME/.config}/Ferdium"
target: "$HOME/snap/ferdium/current/.config/Ferdium"
cask: ferdium cask: ferdium
choco: ferdium choco: ferdium
flatpak: org.ferdium.Ferdium flatpak: org.ferdium.Ferdium
@ -6929,12 +6950,12 @@ softwarePackages:
_home: https://getmailspring.com/ _home: https://getmailspring.com/
_name: Mailspring _name: Mailspring
_app: Mailspring.app _app: Mailspring.app
_link:cask: _env:
- src: "${XDG_CONFIG_HOME:-$HOME/.config}/mailspring" MAILSPRING_APPDATA:
target: "$HOME/Library/Application Support/Mailspring" cask: "$HOME/Library/Application Support/Mailspring"
_link:choco: 'TODO' choco: "TODO"
_link:flatpak: 'TODO' flatpak: "TODO"
_link:snap: 'TODO' snap: "TODO"
cask: mailspring cask: mailspring
choco: mailspring choco: mailspring
flatpak: com.getmailspring.Mailspring flatpak: com.getmailspring.Mailspring
@ -6960,12 +6981,12 @@ softwarePackages:
_home: null _home: null
_name: MarkText _name: MarkText
_app: MarkText.app _app: MarkText.app
_link:cask: _env:
- src: "${XDG_CONFIG_HOME:-$HOME/.config}/marktext" MARK_TEXT_APPDATA:
target: "$HOME/Library/Application Support/marktext" cask: "$HOME/Library/Application Support/marktext"
_link:choco: 'TODO' choco: "TODO"
_link:flatpak: 'TODO' flatpak: "TODO"
_link:winget: 'TODO' winget: "TODO"
cask: mark-text cask: mark-text
choco: marktext choco: marktext
flatpak: com.github.marktext.marktext flatpak: com.github.marktext.marktext
@ -7038,11 +7059,11 @@ softwarePackages:
_home: https://www.microsoft.com/en-us/edge _home: https://www.microsoft.com/en-us/edge
_name: Microsoft Edge _name: Microsoft Edge
_app: Microsoft Edge.app _app: Microsoft Edge.app
_link:cask: _env:
- src: "${XDG_CONFIG_HOME:-$HOME/.config}/microsoft-edge/Default" MICROSOFT_EDGE_APPDATA:
target: "$HOME/Library/Application Support/Microsoft Edge/Default" cask: "$HOME/Library/Application Support/Microsoft Edge/Default"
_link:choco: 'TODO' choco: "TODO"
_link:flatpak: 'TODO' flatpak: "TODO"
_post: | _post: |
#!/usr/bin/env bash #!/usr/bin/env bash
# @brief See `google-chrome` `_post` script for more details # @brief See `google-chrome` `_post` script for more details
@ -8117,10 +8138,10 @@ softwarePackages:
_name: Notion AI _name: Notion AI
_note: Waiting on Linux install alternative. _note: Waiting on Linux install alternative.
_app: Notion.app _app: Notion.app
_link:cask: _env:
- src: "${XDG_CONFIG_HOME:-$HOME/.config}/notion" NOTION_APPDATA:
target: "$HOME/Library/Application Support/Notion" cask: "$HOME/Library/Application Support/Notion"
_link:choco: 'TODO' choco: "TODO"
cask: notion cask: notion
choco: notion choco: notion
mas: 1559269364 mas: 1559269364
@ -8187,9 +8208,9 @@ softwarePackages:
_home: https://www.warp.dev/ _home: https://www.warp.dev/
_name: Warp Terminal _name: Warp Terminal
_app: Warp.app _app: Warp.app
_link:cask: _env:
- src: "${XDG_CONFIG_HOME:-$HOME/.config}/warp-terminal" WARP_TERMINAL_APPDATA:
target: "$HOME/Library/Application Support/dev.warp.Warp-Stable" cask: "$HOME/Library/Application Support/dev.warp.Warp-Stable"
cask: warp cask: warp
figma: figma:
_bin: null _bin: null
@ -9685,12 +9706,10 @@ softwarePackages:
_github: null _github: null
_home: https://remmina.org/ _home: https://remmina.org/
_name: Remmina _name: Remmina
_link:flatpak: _env:
- src: "${XDG_CONFIG_HOME:-$HOME/.config}/remmina/remmina.pref" REMMINA_APPDATA:
target: "$HOME/.var/app/org.remmina.Remmina/config/remmina/remmina.pref" flatpak: "$HOME/.var/app/org.remmina.Remmina/config/remmina/remmina.pref"
_link:snap: snap: "$HOME/snap/remmina/current/.config/remmina/remmina.pref"
- src: "${XDG_CONFIG_HOME:-$HOME/.config}/remmina/remmina.pref"
target: "$HOME/snap/remmina/current/.config/remmina/remmina.pref"
apt: remmina apt: remmina
dnf: remmina dnf: remmina
flatpak: org.remmina.Remmina flatpak: org.remmina.Remmina
@ -11616,6 +11635,24 @@ softwarePackages:
pipx: termius pipx: termius
snap: termius-app snap: termius-app
yay: termius yay: termius
dagu:
_bin: dagu
_github:
_name: Dagu
_post: |
#!/usr/bin/env bash
sudo mkdir -p /var/log/dagu
dagu start-all
_boot: |
#!/usr/bin/env bash
# TODO - Add _boot capability
dagu start-all
brew: yohamta/tap/dagu
runitor:
_bin: runitor
_github: https://github.com/bdd/runitor
_name: Runitor
go: bdd.fi/x/runitor/cmd/runitor@latest
postfix: postfix:
_bin: postfix _bin: postfix
_desc: Postfix is an e-mail server that can be used to send e-mail _desc: Postfix is an e-mail server that can be used to send e-mail