Project

General

Profile

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.