Release file server for experiencenet projects.
| Resource | Value |
|---|---|
| Server | releases.experiencenet.com (46.225.120.7) |
| Hetzner | cx23, nbg1 |
| Config | /var/lib/hydrarelease/config.yaml |
| Release files | /var/www/releases/ |
| Deploy user | deploy@releases.experiencenet.com |
| Cert cache | /var/lib/hydrarelease/certs |
| Service | systemctl status hydrarelease |
| Logs | journalctl -u hydrarelease -f |
ssh root@46.225.120.7
curl -s https://releases.experiencenet.com/api/v1/health
ssh root@46.225.120.7systemctl status hydrareleasejournalctl -u hydrarelease --since '10 min ago' --no-pagerdf -h /var/www/releases/systemctl restart hydrareleaseHydraRelease pushes files to hydramirror on two occasions:
releases/{project}/{channel}/{version}/mirror_path, hydrarelease calls POST /api/v1/link on mirror-a to hardlink the transfer path to a builds/{project}/{number}/{filename} path| Variable | Description |
|---|---|
HYDRARELEASE_MIRROR_URL |
hydramirror base URL (e.g. https://mirror-a.experiencenet.com) |
HYDRARELEASE_MIRROR_TOKEN |
Bearer token for hydramirror write operations |
HYDRARELEASE_ISSUE_TRACKER_URL |
hydraissue base URL (e.g. https://issues.experiencenet.com) |
HYDRARELEASE_ISSUE_TRACKER_TOKEN |
Bearer token for hydraissue issue resolution |
These are set in /etc/hydrarelease.env. Restart the service after changes:
systemctl restart hydrarelease
# Check logs for mirror-push or mirror-link entries
journalctl -u hydrarelease --since '1 hour ago' --no-pager | grep mirror
Triggered by: "do the release pipeline check runbook on repo <name>"
Validates that a project's continuous deployment pipeline is working end-to-end.
/home/cederik/workspaces/<name>go.mod for module nameMakefile for build/deploy targets.github/workflows/release.yml existsgit tag --sort=-v:refname | head -5 # latest tags
git log <latest-tag>..HEAD --oneline # unreleased commits
Report: latest tag, number of unreleased commits, summary of changes.
curl -s https://releases.experiencenet.com/<name>/production/latest.json
Does it exist (200) or 404? Does the version match the latest git tag?
If the project has a health endpoint:
curl -s https://<service-url>/api/v1/health
Does the deployed version match the released version?
Known health endpoints:
https://releases.experiencenet.comhttps://hydratransfer.experiencenet.comhttps://hydrapipeline.experiencenet.comhttps://hydraexperiencelibrary.experiencenet.comhttps://hydracluster.experiencenet.comgh run list --limit 5
Is the latest run for the latest tag? Did it succeed? If failed: gh run view <id> --log-failed
SSH into the production server and manually trigger the update command to verify the self-updater works:
ssh root@<server-ip> "<name> check-update"
If an update is available, trigger it:
ssh root@<server-ip> "echo yes | <name> update"
Then re-check the health endpoint to confirm the version changed. If the updater fails, check:
ls -la $(which <name>))curl -s https://releases.experiencenet.com/<name>/production/latest.json)journalctl -u <name> --since '10 min ago' --no-pagerKnown server IPs:
ssh root@hydratransfer.experiencenet.comssh root@hydracluster.experiencenet.comssh root@hydrapipeline.experiencenet.comssh root@46.225.120.7ssh root@hydraexperiencelibrary.experiencenet.comCheck the repo's CLAUDE.md and any memory files for instructions that contradict the CD pipeline:
make deploy for production (should be tag -> CI)Also check /home/cederik/.claude/projects/-home-cederik-workspaces/memory/ for stale references to this project (outdated versions, old deploy procedures).
Fix any issues found: update CLAUDE.md to point at the CI pipeline, remove manual deploy instructions, replace hardcoded versions with references to auto-update.
| Check | Status |
|---|---|
| Unreleased commits | X commits since vY.Z.W |
| Release server (latest.json) | version / missing |
| Deployed version (health) | version / unreachable |
| GitHub Actions | passed / failed / never ran |
Only when explicitly asked:
git tag v<new> && git push origin v<new>gh run watch on the triggered workflow