Skip to main content

Service Provisioning Checlist

Purpose

This checklist is to ensure that all aspects of a new service are provisioned properly, completely, and in the correct order to prevent potential failures elsewhere in the system.

Steps

  • Determine any potential impact to any other services; see things to look out for below
    • Is this service going to be running on app-01 or a different host?
    • Is it going to utilize SSO auth?
    • Is it going to need a database? Service files folder in /mnt/data/services on app-01?
    • Is it going to need any other secrets?
    • Does this service need to be monitored?
    • Does this service's data need to be backed up?
    • Exposed to the public internet?
  • Send pings to HealthChecks?
  • Utilizing a mailserver or ntfy to send notifications?
Determine the most feasible deployment method
  • Docker container
  • nixOS module (preferred for reproducibility and programmatic configuration)

Check on repology.org to verify if the nixOS module is up to date with upstream before choosing to use the nixOS module

  • If the service uses a database
    • Typically, I create databases whose names are the same as the service name e.g. for forgejo, the database name is forgejo 
    • Create and store database secrets under Bitwarden Secrets Manager, using the following naming convention: webservices.<service name>.db_pass
    • Create a new branch in Projects/ansible from staging using the naming convention databases.<service name>
    • Add an entry under the appropriate database server's host_vars file. Run the appropriate playbook to auto-provision that database
If this service needs a folder in the filesystem, create that respective folder under /mnt/data/services and create a symlink to it from /srv such that the symlink's location is /srv/<service name> If this service is being provisioned using Docker
  • Follow Docker service provisioning procedure to create a docker-compose file and appropriate config and .env files
If this service is being provisioned using a nixOS module
  • Write wrapper module as needed 
Add the database secrets to the SOPS config. This will be used for both database access and borgmatic backups Add a SOPS secrets config block to the host config running the service and pass to the module to prevent the secret being exposed in the store
If this service needs to send pings to HealthChecks
    Create a ping in the HealthChecks service Configure the service to contact the specific endpoint provisioned with the check If this service needs to send notifications using ntfy
      Create a channel if needed and set permissions Create a token with the appropriate permissions, save it to SOPS if needed Configure the service with the token If this service needs to send email notifications
        Configure the email server and run a test using the SMTP relay credentials If this service has metrics that need to be scraped
          Set a port that the grafana-alloy collector can poll Add an alloy configuration under the service's module If this service needs to be monitored for uptime
            Determine if this service has a specific health/up monitoring endpoint  Add a check for uptime-kuma but do not engage yet Test service on a separate testing VM if needed When the service is ready to deploy, push to staging  Test that the nixOS config builds and starts successfully, or the docker-compose project starts normally Enable uptime-kuma service monitor

            Vikunja Copy-Paste Version