Add the production document.
This commit is contained in:
		
							parent
							
								
									c05f4b41cc
								
							
						
					
					
						commit
						173e4f89a0
					
				|  | @ -0,0 +1,117 @@ | |||
| # Production Overview | ||||
| 
 | ||||
| This document details how the production instance of Tildes Statistics at [ts.bauke.xyz](https://ts.bauke.xyz) is put together. | ||||
| 
 | ||||
| ## Compose | ||||
| 
 | ||||
| The Compose setup uses a shared network for every service so no ports ever need to be exposed, helps with making sure UFW and Docker play nice together. Then three services are created, namely: | ||||
| 
 | ||||
| * `tildes-statistics-app`, the main Tildes Statistics CLI, pulled from `git.bauke.xyz/tildes-community/tildes-statistics:latest`. | ||||
| * `tildes-statistics-db`, a PostgreSQL 14 instance from the official image. | ||||
| * `tildes-statistics-netlify`, an unofficial Netlify CLI image (because there is no official one). | ||||
| 
 | ||||
| The `tildes-statistics-app` and `tildes-statistics-netlify` services share the `data` volume so the CLI can build the website and then Netlify can publish it. The `tildes-statistics-db` service has its own `db` volume so data is persisted. | ||||
| 
 | ||||
| ```yaml | ||||
| # compose.yaml | ||||
| version: "3" | ||||
| 
 | ||||
| networks: | ||||
|   shared-network: | ||||
|     external: true | ||||
| 
 | ||||
| services: | ||||
|   tildes-statistics-app: | ||||
|     image: "git.bauke.xyz/tildes-community/tildes-statistics:latest" | ||||
|     hostname: "tildes-statistics-app" | ||||
|     container_name: "tildes-statistics-app" | ||||
|     restart: "no" | ||||
|     depends_on: | ||||
|       - "tildes-statistics-db" | ||||
|     environment: | ||||
|       DATABASE_URL: "${DATABASE_URL}" | ||||
|       USER_AGENT: "${USER_AGENT}" | ||||
|     networks: | ||||
|       - "shared-network" | ||||
|     volumes: | ||||
|       - "data:/public" | ||||
| 
 | ||||
|   tildes-statistics-db: | ||||
|     image: "postgres:14" | ||||
|     hostname: "tildes-statistics-db" | ||||
|     container_name: "tildes-statistics-db" | ||||
|     restart: "unless-stopped" | ||||
|     mem_limit: "200m" | ||||
|     environment: | ||||
|       POSTGRES_DB: "${POSTGRES_DB}" | ||||
|       POSTGRES_USER: "${POSTGRES_USER}" | ||||
|       POSTGRES_PASSWORD: "${POSTGRES_PASSWORD}" | ||||
|     networks: | ||||
|       - "shared-network" | ||||
|     volumes: | ||||
|       - "db:/var/lib/postgresql/data" | ||||
| 
 | ||||
|   tildes-statistics-netlify: | ||||
|     image: "williamjackson/netlify-cli" | ||||
|     hostname: "tildes-statistics-netlify" | ||||
|     container_name: "tildes-statistics-netlify" | ||||
|     restart: "no" | ||||
|     depends_on: | ||||
|       - "tildes-statistics-db" | ||||
|     environment: | ||||
|       NETLIFY_AUTH_TOKEN: "${NETLIFY_AUTH_TOKEN}" | ||||
|     networks: | ||||
|       - "shared-network" | ||||
|     volumes: | ||||
|       - "data:/project" | ||||
| 
 | ||||
| volumes: | ||||
|   data: | ||||
|   db: | ||||
| ``` | ||||
| 
 | ||||
| ## Environment | ||||
| 
 | ||||
| The `.env` file is loaded in by Docker Compose and the variables are replaced in the `compose.yaml` file for each service. | ||||
| 
 | ||||
| ```sh | ||||
| # .env | ||||
| 
 | ||||
| # The User-Agent string for HTTP requests, replace the email with yours. | ||||
| USER_AGENT="Tildes Statistics (Production, your-email@example.org)" | ||||
| 
 | ||||
| # The full PostgreSQL connection string for the Tildes Statistics CLI. | ||||
| DATABASE_URL="postgres://username:password@localhost:5432/database" | ||||
| 
 | ||||
| # The connection details for the PostgreSQL service. | ||||
| # Make sure these match the DATABASE_URL. | ||||
| POSTGRES_DB="database" | ||||
| POSTGRES_USER="username" | ||||
| POSTGRES_PASSWORD="password" | ||||
| 
 | ||||
| # The Netlify token to authenticate with. | ||||
| # https://docs.netlify.com/cli/get-started/#authentication | ||||
| NETLIFY_AUTH_TOKEN="" | ||||
| ``` | ||||
| 
 | ||||
| ## Crontab | ||||
| 
 | ||||
| The server is set to the UTC timezone so using Cron, deploy the website once a day at 12:00. | ||||
| 
 | ||||
| ```txt | ||||
| # crontab -e | ||||
| # Change $USER to your username if you're copying this. | ||||
| 00 12 * * * cd "/home/$USER/tildes-statistics" && ./deploy.sh | ||||
| ``` | ||||
| 
 | ||||
| ## Deployment | ||||
| 
 | ||||
| The `deploy.sh` script then creates the snapshot for today, builds the website and publishes it to Netlify. | ||||
| 
 | ||||
| ```sh | ||||
| #!/usr/bin/env bash | ||||
| 
 | ||||
| docker compose run tildes-statistics-app tildes-statistics --no-migrate snapshot create | ||||
| docker compose run tildes-statistics-app tildes-statistics --no-migrate web build | ||||
| docker compose run tildes-statistics-netlify deploy --dir . --message "Automated daily 12:00 UTC deployment." --prod --site tildes-statistics | ||||
| ``` | ||||
		Reference in New Issue