Manual Production Deploy
Use this only when CI/CD is unavailable or out of credits.
Rules
- Deploy from
masteronly. - Keep production overrides in
.env/.env.api, not indocker-compose.yml. - Do not leave tracked files dirty on the VPS before
git pull. - Use
--remove-orphanswhen the service shape changes.
Production host
bash
ssh -i ~/.ssh/hetzner-ashburn-mev deploy@178.156.224.187Pre-checks
bash
cd /opt/solana-mev-bot
git log --oneline -1
git status --short
docker compose ps
free -h
docker stats --no-streamIf 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 shredstreamExample 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.apiThen recreate the affected service:
bash
docker compose up -d --build --force-recreate venum-apiPost-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-relayHealth + 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-apibotConnected=truefresh<60srising after startup- quotes/builds returning
200for 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 shredstreamAfter rollback, move back to master before the next normal deploy.
