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
|
||||||
|
```
|
Loading…
Reference in New Issue