CI/CD Pipeline¶
All repositories use self-hosted GitHub Actions runners for zero-cost auto-deployment.
Runners¶
| VPS | Location | Labels | Repos served |
|---|---|---|---|
| Staging (94.136.188.221) | /opt/runners/<repo>/ | self-hosted, staging | All 4 repos |
| Production (89.116.31.109) | /opt/runners/<repo>/ | self-hosted, production | All 4 repos |
Total: 8 runners (4 staging + 4 production). Cost: $0 (self-hosted = free on GitHub).
Auto-deploy triggers¶
| Event | Result |
|---|---|
Push to staging branch | Auto-deploys to staging VPS |
Push to main branch | Auto-deploys to production VPS |
| PR merge → staging | Same as push to staging |
| PR merge → main | Same as push to main |
Workflow files¶
Each repo has two workflow files:
.github/workflows/
├── deploy-staging.yml # runs-on: [self-hosted, staging]
└── deploy-prod.yml # runs-on: [self-hosted, production]
Deploy steps per repo¶
| Repo | Build step | Reload command |
|---|---|---|
| astradial-editor | npm ci + npm run build | pm2 reload editor |
| astrapbx | npm ci --omit=dev | pm2 reload astrapbx |
| workflow-engine | npm install --omit=dev | pm2 reload workflow-engine |
| pipecat-flow | uv sync | systemctl restart pipecat-flow |
Runner management¶
# Check runner status
systemctl status actions.runner.astradial-<repo>.<runner-name>
# Restart a stuck runner
systemctl restart actions.runner.astradial-<repo>.<runner-name>
# View all runners on a VPS
systemctl list-units "actions.runner.*"
# Check GitHub runner status
gh api /repos/astradial/<repo>/actions/runners