v0.4.5
Signedpublished August 18, 2026What changed
Added
-
uninstall.sh --nukereturns the VPS to its pre-install state.--purgeonly ever removed DevGrail's own things; the host kept the changesinstall.shmade outside that namespace, so a re-install was never really a fresh install.--nukeimplies--purgeand additionally strips theuserns-remapanddefault-address-poolskeys the installer added to/etc/docker/daemon.json(restarting Docker), reclaims the now-orphaned per-UID data root, and removes thedockremapuser and its subordinate ranges. The measurable result is thatinstall.shtakes its fresh-host branch on the next run — it offers userns-remap again instead of refusing because the host still has Docker state.Keys are removed only while they still hold the values
install.shwrites. Auserns-remappointing at a named user, or pools tuned to the operator's own addressing, are decisions this script reports and leaves alone. Adaemon.jsonthat does not parse is never touched, and a daemon that does not come back gets its previous config restored. Interactively,--nukeis offered as a follow-up question after the data-wipe prompt rather than requiring the flag. -
uninstall.sh --remove-dockeradditionally uninstalls Docker Engine, containerd and/var/lib/docker. It implies--nuke, is asked separately and defaults to no, because it stops and deletes every container on the host — DevGrail's or not.jqandopensslare never removed.
Fixed
uninstall.sh --purgeleft things behind, despite promising it did not. Per-workspacedevgrail-ws-*networks were never removed (containers and volumes with the samedevgrail.managedlabel always were), so each uninstall leaked one address-pool slot per workspace. Only:latestwas removed for the two DevGrail images, leaving:previousand the release tagdocker loadunpacked. And once an earlier--purgehad deleted the compose file, the fallback path removed two infra containers by name — missing Traefik, which declares nocontainer_name, along with the project's volumes and networks. The stack's leftovers are now found by their Compose project labels, confirmed against the recorded config-file path so another project cannot be caught by the same sweep.uninstall.shalso honoursdocker-compose.override.ymlnow, asinstall.shalready did.
Container images
Installer files
Signature
One signature covers every artifact above. It is made off this host, and neither this site nor the registry behind it can check it — that is the point, and it is why verifying it catches things a checksum from the same server cannot. How to verify it.
curl -fsSL https://web-dev.trixibot.com/api/registry/releases/v0.4.5 -o release.json
# -j, not -r: -r appends a newline the signer never saw, and the check fails.
jq -j '.signature.payload' release.json > payload
jq -r '.signature.signature' release.json | base64 -d > payload.sig
openssl dgst -sha256 -verify devgrail-release.pem -signature payload.sig payload
# -> Verified OK
# The payload must name this release, so an older signed one cannot be replayed.
head -2 payload
# ...and it must name this exact file. -qxF: whole line, literal.
grep -qxF 'image devgrail-container 13 amd64 fa73a2b12e95522990e8c7142d5f4e194336aa24c35ac59b9483e9fca5d59b5c' payload && echo "digest is covered by the signature"The signed payload — shown for reading, not for verifying
Copy this from the manifest with jq -j, never from this page: the signature covers exact bytes, and rendering here drops the trailing newline the signer included.
devgrail-release-signature-v1
release v0.4.5
asset docker-compose.yml 12 61ecf9e19a3c6be92a1161c645fa31e0cb16795419b1b2ff84c3fafeeb21f57a
asset install.sh 12 d95f439701a773f6694477fe3d9463ab81484b55aacb391d7094ade7a2f8dca7
asset traefik-dynamic-http.yml 11 e344c8efd13c7d84996e2ebfbc75dcee2d995d8538c8a245c89c0e44fad0089b
asset traefik-dynamic.yml 12 d18fa561b8eb7d53b015284e0246b2d05953bf281b65269c1fae3d6883530db6
asset uninstall.sh 12 670dce6be818dc4b5f12f729b07324e4f6dfce8973a00a57dae96db90e863b85
image devgrail-container 13 amd64 fa73a2b12e95522990e8c7142d5f4e194336aa24c35ac59b9483e9fca5d59b5c
image devgrail-container 13 arm64 79ea60a454390221b22c43f37d3845f90ddbba5271d38d99cd341c88e27833d0
image devgrail-server 13 amd64 f6e54b598081b3d1a4bb13ae3a5631614ad536b7eb93ee760236dd1b63b2e19a
image devgrail-server 13 arm64 26eda5a5f7725b6a72d0bfd73a2799b0dbf8c40a2b7a5775a4cb02ac1f605280