GitHub Actions + Galaxy: Zero-Downtime Deploy CI/CD

I recently set up a zero-downtime deploy pipeline for my Meteor app using GitHub Actions and Galaxy and honestly, it was way simpler than I expected.

In this post, I’ll walk you through how I did it step by step. You’ll have a fully working push-to-deploy setup in minutes using secrets for safety, pinned Meteor versions for consistency, and Galaxy’s infrastructure for smooth deploys.

Galaxy is Meteor’s official cloud hosting platform designed for simple, reliable deployments with integrated monitoring.

Today, beyond Meteor, Galaxy also supports Node.jsPython, and databases like MongoDB.

Learn more here

What we’re building

  • A GitHub Actions workflow that deploys your Meteor app to Galaxy automatically on every main push
  • Secure configuration using GitHub Secrets (no plain text credentials in the repo)
  • Reliable, reproducible builds with a pinned Meteor release for consistency

Why CI/CD with Actions helps

If you’ve ever deployed Meteor locally, you know how resource-hungry the build process can be high CPU load, memory spikes, and your laptop fans going full throttle.

Running this through GitHub Actions takes that pain away:

  • Builds run entirely on GitHub’s hosted runners (Ubuntu VMs).
  • Your machine stays free for real work no waiting around for Meteor to compile.
  • Every run happens in a clean, isolated environment, so you avoid “works on my machine” problems.

The result: faster, more consistent deploys, no local slowdowns, and zero babysitting during the build.

Useful links

Prerequisites

You’ll need:

  • A live Galaxy app (e.g. myapp.meteorapp.com)
  • MongoDB configured via your app settings
  • A GitHub repo with Actions enabled

Create a Meteor session (local, one-time)

Meteor’s CLI deploy requires a valid session. We’ll create one locally and convert it to base64 to use securely in GitHub.

Bash
METEOR_SESSION_FILE=./meteor_session.json meteor login
base64 -w0 meteor_session.json > meteor_session.b64

Save the base64 string output — we’ll add this as a GitHub Secret.

Add your GitHub Secrets

Go to your repo → Settings → Secrets and variables → Actions → New repository secret

Add the following two secrets:

Secret NameDescription
METEOR_SESSION_B64Paste the contents of meteor_session.b64
METEOR_SETTINGSYour app’s settings JSON (as a single line)

Tip: use jq -c to compress your settings file into one line:

Bash
jq -c . settings.json

Add the deploy workflow

In your project, create a file at .github/workflows/deploy.yml with:

Bash
name: Build & Deploy to Galaxy

on:
  push:
    branches: ["main"]

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - uses: meteorengineer/setup-meteor@v2
        with:
          meteor-release: '2.14'  # Use your exact Meteor version

      - run: meteor npm install

      - name: Write settings.json
        run: |
          printf '%s' '${{ secrets.METEOR_SETTINGS }}' > settings.json

      - name: Show Settings
        run: cat settings.json

      - name: Deploy to Galaxy
        uses: aquinoit/[email protected]
        with:
          meteor_session_base64: ${{ secrets.METEOR_SESSION_B64 }}
          app_hostname: myapp.meteorapp.com
          region: galaxy.meteor.com
          settings_file: ./settings.json
          deploy_flags: '--free'
          npm_install: 'true'
          npm_install_args: ''

Push and deploy

Now commit and push to main. The workflow will run automatically and deploy your app to Galaxy.

Bash
git add .
git commit -m "ci: automatic deploy to Galaxy"
git push origin main

Then on GitHub:

  • Go to the Actions tab
  • Click on Build & Deploy to Galaxy
  • Watch the logs in real time!

🔐 Secrets & best practices

  • Never commit settings.json. The workflow writes it at runtime.
  • Use a Meteor account with the minimum necessary access for deployment.
  • Consider separate workflows for production and staging environments.

Common issues & fixes

Meteor “superuser” warning
You can ignore this. The action already includes --allow-superuser internally.

Deploying to the wrong region?
Use the correct region hostname:

  • US: galaxy.meteor.com
  • EU: eu-west-1.galaxy.meteor.com
  • APAC: ap-southeast-2.galaxy.meteor.com

“Can’t find action” error?
Make sure:

  • You have uses: aquinoit/[email protected]
  • You’ve included the checkout step at the top

Production tips

  • Pin your Meteor version in the workflow to avoid surprises
  • Add a second workflow for develop → staging app
  • You can also enable manual deployments with workflow_dispatch in your workflow. This allows you to trigger a deploy from the GitHub Actions UI, without pushing a commit.

Final thoughts

That’s it! You now have a clean, secure CI/CD pipeline that deploys your Meteor app to Galaxy automatically — with zero downtime. Just push to main and watch it go live in seconds.

🔗 More resources

🔮 Coming soon: GitLab CI and Bitbucket Pipelines

This guide focused on GitHub Actions, but I’ll soon publish versions tailored for GitLab CI and Bitbucket Pipelines.

So if your team uses those platforms, stay tuned the same zero-downtime deployment approach applies, just with different syntax.

Let me know if this was helpful or if you hit any issues while setting it up happy to help!