| name | deploy |
| description | Deploy applications to cloud platforms — Fly.io, Railway, Vercel, or via SSH. Use when the user wants to publish, deploy, or release an application. |
| metadata | {"ccbot":{"emoji":"🚀","requires":{"bins":["curl"]}}} |
Deploy Skill
Fly.io
curl -L https://fly.io/install.sh | sh
fly launch --name myapp --region sin
fly deploy
fly scale count 2
fly scale memory 512
fly secrets set DATABASE_URL="postgres://..." API_KEY="..."
fly secrets list
fly logs -a myapp
fly status -a myapp
fly ssh console -a myapp
Railway
npm install -g @railway/cli
railway login
railway link
railway up
railway variables set KEY=value
railway variables
railway logs
Vercel (frontend / Next.js)
npm install -g vercel
vercel
vercel --prod
vercel env add NEXT_PUBLIC_API_URL production
vercel env ls
vercel domains add myapp.com
SSH / VPS Deploy
rsync -avz --exclude='.git' --exclude='node_modules' \
./ user@server.example.com:/var/www/myapp/
ssh user@server.example.com "
cd /var/www/myapp
git pull origin main
uv sync --no-dev
systemctl restart myapp
echo 'Deploy complete'
"
ssh user@server.example.com "systemctl status myapp"
Docker to Remote Server
docker buildx build --platform linux/amd64 \
-t ghcr.io/owner/myapp:$(git rev-parse --short HEAD) --push .
TAG=$(git rev-parse --short HEAD)
ssh user@server.example.com "
docker pull ghcr.io/owner/myapp:$TAG
docker stop myapp || true
docker rm myapp || true
docker run -d --name myapp \
-p 8080:8080 \
--env-file /etc/myapp.env \
--restart unless-stopped \
ghcr.io/owner/myapp:$TAG
echo 'Running: $TAG'
"
GitHub Actions Deploy (CI-triggered)
Check current workflow status:
gh run list --repo owner/repo --limit 5
gh run view $(gh run list --repo owner/repo --limit 1 --json databaseId -q '.[0].databaseId')
Trigger manual deploy:
gh workflow run deploy.yml --repo owner/repo \
-f environment=production \
-f version=v1.2.0
Health Check After Deploy
URL="https://myapp.fly.dev/health"
for i in $(seq 1 12); do
STATUS=$(curl -s -o /dev/null -w "%{http_code}" "$URL")
if [ "$STATUS" = "200" ]; then
echo "✅ Deploy successful — $URL is healthy"
break
fi
echo "Waiting ($i/12)... HTTP $STATUS"
sleep 5
done
[ "$STATUS" != "200" ] && echo "❌ Health check failed after 60s"
Tips
- Always tag Docker images with git commit SHA (not just
latest).
- Run health checks after every deploy to confirm success.
- Use
fly secrets / railway variables for secrets — never commit .env.
- For zero-downtime: Fly.io and Railway handle it natively; for SSH deploys use blue-green.