Health Check » History » Version 3
Redmine Admin, 10/31/2026 07:01 PM
deploy-publish.sh
| 1 | 3 | Redmine Admin | *Chapter 6 of the dmz-web documentation · headings are numbered like the cheat sheets · index: [[Wiki]]* |
|---|---|---|---|
| 2 | |||
| 3 | {{>toc}} |
||
| 4 | |||
| 5 | 2 | Redmine Admin | All `site-*` units at once, from the host. Requests go straight to NPM on |
| 6 | 127.0.0.1:444 — the same 443→444 translation the FortiGate VIP does — while |
||
| 7 | `--resolve` keeps SNI/Host as the real domain. Domains come from each unit's |
||
| 8 | 1 | Redmine Admin | `Description=<App> -- <domain>` line (WordPress, Redmine and Snipe-IT alike). |
| 9 | |||
| 10 | 2 | Redmine Admin | ```bash |
| 11 | 1 | Redmine Admin | for u in ~/.config/containers/systemd/site-*.container; do |
| 12 | d=$(sed -n 's/^Description=.* -- //p' "$u") |
||
| 13 | printf '%-28s ' "$d"; curl -sI --max-time 10 --resolve "$d:444:127.0.0.1" "https://$d:444" | head -1 |
||
| 14 | done |
||
| 15 | # add -k to curl while a Let's Encrypt cert isn't issued yet |
||
| 16 | |||
| 17 | # one site by hand |
||
| 18 | curl -sI --resolve <domain>:444:127.0.0.1 https://<domain>:444 | head -1 |
||
| 19 | |||
| 20 | # from outside (mobile data / VPN client) |
||
| 21 | curl -sI https://<domain> | head -1 |
||
| 22 | ``` |
||
| 23 | |||
| 24 | 2 | Redmine Admin | `~/deploy/check-sites.sh` is the same loop with container status alongside |
| 25 | (uses the same `.* -- ` sed so non-WordPress units are included). |
||
| 26 | 1 | Redmine Admin | |
| 27 | 2 | Redmine Admin | `200`/`301`/`302` healthy · `502` NPM up but can't reach the container |
| 28 | 1 | Redmine Admin | (network membership? container down?) · `NO RESPONSE` NPM/TLS not answering on 444. |
| 29 | |||
| 30 | |||
| 31 | 2 | Redmine Admin | --- |
| 32 | _Source: `dmz-web-podman-cheatsheet.md` v1.1.1 in the `dmz-web-deploy` repo ([[Releases]]). Edit the wiki and the repo copy together._ |
||
| 33 | 3 | Redmine Admin | |
| 34 | ## 6.1 Before go-live checklist |
||
| 35 | |||
| 36 | Run through this when a stack moves from "being built" to "in use", and again after bigger changes: |
||
| 37 | |||
| 38 | * **Nothing readable without login that should not be:** open the Redmine project's *Repository* and *Wiki* URLs in a private window — they must redirect to the login page (Anonymous role: no *Browse repository* / *View wiki pages*, or the project not Public). |
||
| 39 | * **Access List on every Proxy Host that is not meant to be public** (assets, pf, track, …), and the 8181 admin UI only from the allowed subnets (§1). |
||
| 40 | * **No floating image tags:** `grep -H '^Image=' ~/.config/containers/systemd/*.container | grep -E ':latest|:11$'` should print nothing worth keeping (use a version tag or a digest; Snipe-IT and MariaDB are pinned, see §4). |
||
| 41 | * **Live vs repo:** `diff <(grep '^Network=' ~/.config/containers/systemd/nginx-proxy-manager.container) <(grep '^Network=' ~/deploy/quadlet/nginx-proxy-manager.container)` prints nothing (or only a new network you are about to deploy). |
||
| 42 | * **Backups exist and one restore has been tried** per stack (databases dumped *off* the host; Snipe-IT: DB + `app-snipeit-data` + secret `snipeit-app-key`; PF: `pg_dump -Fc` and the Timescale restore calls). |
||
| 43 | * **Secrets that were ever pasted into a chat, ticket or terminal log are rotated** (database root passwords first). |
||
| 44 | * **Mail:** a test mail to an `@mdsdefense.com` mailbox arrives from every app that sends mail; external recipients are a separate check (Snipe-IT currently gets `451 4.4.4 ATTR5` from Exchange for outside addresses). |
||
| 45 | * `~/deploy/check-sites.sh` shows `200`/`302` for every site. |