Skip to content

Manual Production Deploy

Use this only when CI/CD is unavailable or out of credits.

Rules

  • Deploy from master only.
  • Keep production overrides in .env / .env.api, not in docker-compose.yml.
  • Do not leave tracked files dirty on the VPS before git pull.
  • Use --remove-orphans when the service shape changes.

Production host

bash
ssh -i ~/.ssh/hetzner-ashburn-mev deploy@178.156.224.187

Pre-checks

bash
cd /opt/solana-mev-bot
git log --oneline -1
git status --short
docker compose ps
free -h
docker stats --no-stream

If git status shows tracked-file changes, move the override into .env / .env.api first and clean the tracked file before pulling.

Deploy latest master

bash
cd /opt/solana-mev-bot
git checkout -- docker-compose.yml
git pull --ff-only origin master
docker compose up -d --build --remove-orphans engine-agents engine-api market-data-relay venum-api shredstream

Example env override

Do this in .env.api, not in docker-compose.yml:

bash
grep -q '^PRICE_SSE_DEDUP_THRESHOLD=' .env.api \
  && perl -0pi -e 's/^PRICE_SSE_DEDUP_THRESHOLD=.*/PRICE_SSE_DEDUP_THRESHOLD=0.0001/m' .env.api \
  || printf '\nPRICE_SSE_DEDUP_THRESHOLD=0.0001\n' >> .env.api

Then recreate the affected service:

bash
docker compose up -d --build --force-recreate venum-api

Post-deploy checks

bash
cd /opt/solana-mev-bot
git log --oneline -1
docker compose ps engine-agents engine-api market-data-relay venum-api shredstream
docker compose logs --tail 80 engine-agents venum-api market-data-relay

Health + freshness:

bash
docker compose exec -T venum-api node -e "const key=(process.env.VENUM_INTERNAL_KEYS||'').split(',')[0]||''; fetch('http://localhost:3000/health').then(async r=>{console.log('health', await r.text())}).then(()=>fetch('http://localhost:3000/v1/_debug/freshness',{headers:{'x-api-key':key}})).then(async r=>{console.log('freshness', await r.text()); process.exit(0)}).catch(err=>{console.error(err); process.exit(1)})"

What to watch

  • engine-agents
    • Geyser started
    • no repeated last-resort RPC spam
    • no long zero-update windows
  • market-data-relay
    • upstream connected
    • steady event traffic
  • venum-api
    • botConnected=true
    • fresh<60s rising after startup
    • quotes/builds returning 200 for known-good pairs

Rollback

If needed:

bash
cd /opt/solana-mev-bot
git log --oneline -5
git checkout <previous_commit>
docker compose up -d --build --remove-orphans engine-agents engine-api market-data-relay venum-api shredstream

After rollback, move back to master before the next normal deploy.