deploy.sh 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. #!/usr/bin/env bash
  2. # CelestiaTrace backend deployment.
  3. # This updates only the backend service; PostgreSQL is not recreated or stopped.
  4. set -Eeuo pipefail
  5. SERVER_IP="47.93.193.127"
  6. PEM_KEY="../ccdw-meishi-1.pem"
  7. REMOTE_DIR="/opt/celestia-trace-backend"
  8. SSH_USER="root"
  9. COMPOSE_PROJECT="celestia-trace-backend"
  10. PROXY_DIR="/opt/meishi_ccdw_life"
  11. PROXY_CONFIG="../remote_nginx.conf"
  12. PUBLIC_URL="https://api.ccdw.life/celestia-trace/v1"
  13. SSH_OPTS=(-i "$PEM_KEY" -o BatchMode=yes -o StrictHostKeyChecking=accept-new)
  14. if [[ ! -f "$PEM_KEY" ]]; then
  15. echo "SSH key not found: $PEM_KEY" >&2
  16. exit 1
  17. fi
  18. if [[ ! -f "$PROXY_CONFIG" ]]; then
  19. echo "Nginx config not found: $PROXY_CONFIG" >&2
  20. exit 1
  21. fi
  22. chmod 400 "$PEM_KEY"
  23. ssh "${SSH_OPTS[@]}" "$SSH_USER@$SERVER_IP" "mkdir -p '$REMOTE_DIR'"
  24. rsync -avz --delete \
  25. --exclude '.git' \
  26. --exclude '.env' \
  27. --exclude 'vendor' \
  28. -e "ssh -i $PEM_KEY -o BatchMode=yes -o StrictHostKeyChecking=accept-new" \
  29. ./ "$SSH_USER@$SERVER_IP:$REMOTE_DIR/"
  30. scp "${SSH_OPTS[@]}" "$PROXY_CONFIG" "$SSH_USER@$SERVER_IP:$PROXY_DIR/nginx.conf.next"
  31. ssh "${SSH_OPTS[@]}" "$SSH_USER@$SERVER_IP" << REMOTE_CMDS
  32. set -Eeuo pipefail
  33. cd "$REMOTE_DIR"
  34. if [[ ! -f .env ]]; then
  35. echo "Missing $REMOTE_DIR/.env; refusing to deploy with template secrets" >&2
  36. exit 1
  37. fi
  38. chmod 600 .env
  39. docker compose -p "$COMPOSE_PROJECT" config --quiet
  40. docker compose -p "$COMPOSE_PROJECT" up -d --build --no-deps backend
  41. for attempt in \$(seq 1 30); do
  42. health=\$(docker inspect -f '{{if .State.Health}}{{.State.Health.Status}}{{else}}{{.State.Status}}{{end}}' celestia-backend)
  43. if [[ "\$health" == "healthy" ]]; then
  44. docker compose -p "$COMPOSE_PROJECT" ps backend
  45. exit 0
  46. fi
  47. if [[ "\$health" == "unhealthy" || "\$health" == "exited" ]]; then
  48. docker logs --tail 100 celestia-backend
  49. exit 1
  50. fi
  51. sleep 2
  52. done
  53. echo "Backend health check timed out" >&2
  54. docker logs --tail 100 celestia-backend
  55. exit 1
  56. REMOTE_CMDS
  57. ssh "${SSH_OPTS[@]}" "$SSH_USER@$SERVER_IP" << REMOTE_CMDS
  58. set -Eeuo pipefail
  59. cd "$PROXY_DIR"
  60. docker run --rm \
  61. --network meishi_ccdw_life_default \
  62. -v "$PROXY_DIR/nginx.conf.next:/etc/nginx/nginx.conf:ro" \
  63. -v /etc/letsencrypt:/etc/letsencrypt:ro \
  64. docker.m.daocloud.io/library/nginx:alpine nginx -t
  65. cp nginx.conf.next nginx.conf
  66. chmod 644 nginx.conf
  67. rm -f nginx.conf.next
  68. docker exec meishi_ccdw_life-proxy-1 nginx -s reload
  69. REMOTE_CMDS
  70. echo "Backend deployed: $PUBLIC_URL"