DEV Community

Cover image for GitHub Actions + Galaxy: Zero-Downtime Deploy CI/CD
Philippe Oliveira for Meteor

Posted on

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.js, Python, 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

1️⃣ 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.

METEOR_SESSION_FILE=./meteor_session.json meteor login
base64 -w0 meteor_session.json > meteor_session.b64
Enter fullscreen mode Exit fullscreen mode

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

1


2️⃣ Add your GitHub Secrets

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

Add the following two secrets:

Secret Name Description
METEOR_SESSION_B64 Paste the contents of meteor_session.b64
METEOR_SETTINGS Your app’s settings JSON (as a single line)

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

jq -c . settings.json
Enter fullscreen mode Exit fullscreen mode

2




2




3️⃣ Add the deploy workflow

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

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/galaxy-ghactions@0.0.2
        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: ''
Enter fullscreen mode Exit fullscreen mode



2


4️⃣ Push and deploy

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

git add .
git commit -m "ci: automatic deploy to Galaxy"
git push origin main
Enter fullscreen mode Exit fullscreen mode

Then on GitHub:

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

3




4


🔐 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.

5


🧯 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/galaxy-ghactions@0.0.2
  • 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.

6


✅ 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.

7




8





🔗 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!

Top comments (0)