TERRAFORM_ENV := production config_dir := ./config/ apps_config := $(config_dir)apps.config ALL_APPS_FILES = $(shell find all-apps/ -type f -name '*') # .dirstamp plus && $@ is like make magic to get this rule # to only run if the contents of all-apps changes app/.dirstamp: copy-apps.sh $(apps_config) $(ALL_APPS_FILES) rm -Rf app/ mkdir app/ cp all-apps/app.service app/ cp all-apps/restic-snapshot.service app/ cp all-apps/docker-compose.yaml app/ ./copy-apps.sh $(apps_config) && touch $@ # # compose .env files # # (compose only supports one .env file at the root by default) app/.env: app/ghost/.compose-env find app/ -name ".compose-env" -exec cat > app/.env {} + # Caddy / lb app/lb/Caddyfile: $(apps_config) make-caddyfile.sh mkdir -p app/lb ./make-caddyfile.sh $(apps_config) > app/lb/Caddyfile # Instance Control app/instance-control/webhook_secret: $(apps_config) bash -c 'source $(apps_config); printf "%s\n" "$$INSTANCE_CONTROL_WEBHOOKS_SECRET" > $@' app/instance-control/hooks/hooks.json: $(apps_config) make-instance-control-config.sh ./make-instance-control-config.sh $(apps_config) # Nextcloud app/nextcloud/nextcloud_admin_user: $(apps_config) bash -c 'source $(apps_config); printf "%s\n" "$$NEXTCLOUD_ADMIN_USER" > $@' app/nextcloud/nextcloud_admin_password: $(apps_config) bash -c 'source $(apps_config); printf "%s\n" "$$NEXTCLOUD_ADMIN_PASSWORD" > $@' app/nextcloud/postgres_db: $(apps_config) bash -c 'source ./$(apps_config); printf "%s\n" "$$NEXTCLOUD_POSTGRES_DB" > $@' app/nextcloud/postgres_user: $(apps_config) bash -c 'source ./$(apps_config); printf "%s\n" "$$NEXTCLOUD_POSTGRES_USER" > $@' app/nextcloud/postgres_password: $(apps_config) bash -c 'source ./$(apps_config); printf "%s\n" "$$NEXTCLOUD_POSTGRES_PASSWORD" > $@' app/nextcloud/redis_password: $(apps_config) bash -c 'source ./$(apps_config); printf "%s\n" "$$NEXTCLOUD_REDIS_PASSWORD" > $@' app/nextcloud/nextcloud.env: $(apps_config) app/nextcloud/nextcloud.env.tmpl make-nextcloud-env.sh ./make-nextcloud-env.sh $(apps_config) # Nassella app/nassella/postgres_db: $(apps_config) bash -c 'source ./$(apps_config); printf "%s\n" "$$NASSELLA_POSTGRES_DB" > $@' app/nassella/postgres_user: $(apps_config) bash -c 'source ./$(apps_config); printf "%s\n" "$$NASSELLA_POSTGRES_USER" > $@' app/nassella/postgres_password: $(apps_config) bash -c 'source ./$(apps_config); printf "%s\n" "$$NASSELLA_POSTGRES_PASSWORD" > $@' app/nassella/authelia_postgres_db: $(apps_config) bash -c 'source ./$(apps_config); printf "%s\n" "$$NASSELLA_AUTHELIA_POSTGRES_DB" > $@' app/nassella/authelia_postgres_user: $(apps_config) bash -c 'source ./$(apps_config); printf "%s\n" "$$NASSELLA_AUTHELIA_POSTGRES_USER" > $@' app/nassella/authelia_postgres_password: $(apps_config) bash -c 'source ./$(apps_config); printf "%s\n" "$$NASSELLA_AUTHELIA_POSTGRES_PASSWORD" > $@' app/nassella/lldap_postgres_db: $(apps_config) bash -c 'source ./$(apps_config); printf "%s\n" "$$NASSELLA_LLDAP_POSTGRES_DB" > $@' app/nassella/lldap_postgres_user: $(apps_config) bash -c 'source ./$(apps_config); printf "%s\n" "$$NASSELLA_LLDAP_POSTGRES_USER" > $@' app/nassella/lldap_postgres_password: $(apps_config) bash -c 'source ./$(apps_config); printf "%s\n" "$$NASSELLA_LLDAP_POSTGRES_PASSWORD" > $@' app/nassella/lldap_admin_password: $(apps_config) bash -c 'source ./$(apps_config); printf "%s\n" "$$NASSELLA_LLDAP_ADMIN_PASSWORD" > $@' app/nassella/stripe_api_key: $(apps_config) bash -c 'source ./$(apps_config); printf "%s\n" "$$NASSELLA_STRIPE_API_KEY" > $@' app/nassella/authelia-config/configuration.yml: $(apps_config) app/nassella/authelia-config/configuration.yml.tmpl make-nassella-authelia-config.sh ./make-nassella-authelia-config.sh $(apps_config) app/nassella/lldap-config/lldap_config.toml: $(apps_config) app/nassella/lldap-config/lldap_config.toml.tmpl make-nassella-lldap-config.sh ./make-nassella-lldap-config.sh $(apps_config) # Ghost app/ghost/.compose-env: $(apps_config) app/ghost/.compose.env.tmpl make-ghost-env.sh ./make-ghost-env.sh $(apps_config) # Backups / Restic / Backblaze restic-env: $(apps_config) make-restic-generated.sh ./make-restic-generated.sh $(apps_config) > restic-env restic-password: $(apps_config) make-restic-password.sh ./make-restic-password.sh $(apps_config) > restic-password ignition.json: cl.yaml app/.dirstamp \ app/lb/Caddyfile \ app/instance-control/webhook_secret \ app/instance-control/hooks/hooks.json \ app/nextcloud/nextcloud_admin_user \ app/nextcloud/nextcloud_admin_password \ app/nextcloud/postgres_db \ app/nextcloud/postgres_user \ app/nextcloud/postgres_password \ app/nextcloud/redis_password \ app/nextcloud/nextcloud.env \ app/nassella/postgres_db \ app/nassella/postgres_user \ app/nassella/postgres_password \ app/nassella/lldap_postgres_db \ app/nassella/lldap_postgres_user \ app/nassella/lldap_postgres_password \ app/nassella/authelia_postgres_db \ app/nassella/authelia_postgres_user \ app/nassella/authelia_postgres_password \ app/nassella/nassella.env \ app/nassella/authelia-config/configuration.yml \ app/nassella/lldap-config/lldap_config.toml \ app/ghost/.compose-env \ restic-env \ restic-password \ restic-restore.sh \ restic-snapshot.sh \ app/.env \ $(config_dir)ssh-keys cat cl.yaml | docker run --rm --volume $(config_dir)/ssh-keys:/pwd/ssh-keys --volume ${PWD}:/pwd --workdir /pwd -i quay.io/coreos/butane:latest -d /pwd > ignition.json generated.tfvars: $(apps_config) make-generated.sh ./make-generated.sh $(apps_config) > generated.tfvars plan: ignition.json $(config_dir)$(TERRAFORM_ENV).tfvars generated.tfvars terraform init bash -c "terraform plan -var-file=<(cat $(config_dir)$(TERRAFORM_ENV).tfvars generated.tfvars)" .PHONY: announce-start announce-start: echo "NASSELLA_CONFIG: start" apply: announce-start restic-init ignition.json $(config_dir)$(TERRAFORM_ENV).tfvars generated.tfvars echo "NASSELLA_CONFIG: end" terraform init bash -c "terraform apply -auto-approve -input=false -var-file=<(cat $(config_dir)$(TERRAFORM_ENV).tfvars generated.tfvars)" destroy: ignition.json $(config_dir)$(TERRAFORM_ENV).tfvars generated.tfvars terraform init bash -c "terraform destroy -auto-approve -input=false -var-file=<(cat $(config_dir)$(TERRAFORM_ENV).tfvars generated.tfvars)" .PHONY: restic-init restic-init: $(apps_config) restic-password ./init-restic.sh $(apps_config) ## just an easy way to see snapshots that have been taken .PHONY: restic-snapshots restic-snapshots: $(apps_config) restic-password ./restic-snapshots.sh $(apps_config) .PHONY: archive archive: tar -cf nassella-latest.tar all-apps cl.yaml init-restic.sh main.tf make-caddyfile.sh Makefile \ make-generated.sh make-nextcloud-env.sh make-ghost-env.sh make-restic-generated.sh make-restic-password.sh restic-snapshots.sh copy-apps.sh restic-restore.sh restic-snapshot.sh \ make-nassella-authelia-config.sh make-nassella-lldap-config.sh .terraform.lock.hcl \ make-instance-control-config.sh cp nassella-latest.tar src/ ## to help me remember the command to run to test the config locally testlocalhost: curl -k --resolve localhost:443:146.190.12.129 https://localhost flatcarbuild: ignition.json cp --reflink=auto flatcar/flatcar_production_qemu_image.img.fresh flatcar/flatcar_production_qemu_image.img flatcarrun: ./flatcar/flatcar_production_qemu.sh -i ignition.json