# Galaxy Documentation (Full) > Galaxy is a cloud platform for deploying Meteor, Node.js, AdonisJS, and Python applications with managed databases. # Container Environment (https://help.galaxycloud.app/docs/apps/container-environment) Galaxy runs your app inside Docker containers on 64-bit Linux machines in the UTC timezone. Most apps deploy without any special configuration. This page covers what Galaxy injects automatically and how the runtime environment behaves. *** ## Environment Variables Galaxy sets several environment variables before your container starts. Some you'll use directly; others work behind the scenes. ### Variables You'll Use | Variable | Example | Purpose | | ----------------- | --------------------------------------- | --------------------------------------------------------------- | | `PORT` | `3000` | Port your app must listen on | | `ROOT_URL` | `https://myapp.sandbox.galaxycloud.app` | Your Meteor app's base URL for generating links | | `METEOR_SETTINGS` | `{"public": {...}}` | Your Meteor app's `settings.json` contents as `Meteor.settings` | ### Variables Galaxy Manages | Variable | Example | Purpose | | ------------------------------------- | ------- | ----------------------------------------------------------------------------------- | | `GALAXY_APP_VERSION_ID` | `123` | The Meteor app version number, when Galaxy can resolve a version for the deployment | | `GALAXY_CONTAINER_ID` | — | Legacy variable. It is not injected by the current platform. | | `SIGTERM_GRACE_PERIOD_SECONDS` | `5` | The configured Container Stop Grace Period, in seconds | | `METEOR_SIGTERM_GRACE_PERIOD_SECONDS` | `5` | Alias for `SIGTERM_GRACE_PERIOD_SECONDS`. Both variables have the same value. | | `MONTI_*` | Various | Configuration for Monti APM when it is enabled for a Meteor app | You can add your own variables through your `settings.json` or the Galaxy dashboard. *** ## The PORT Variable Galaxy sets `PORT` to `3000` when you do not configure a value. Your app must read this variable and listen on it. Don't hardcode port 3000, 5000, or any other number. If your app doesn't listen on `$PORT`, Galaxy can't route traffic to it. Health checks fail and the container gets marked unhealthy. This is the most common deployment issue. Always read `PORT` from the environment. Your stack-specific setup guide shows exactly how. *** ## Graceful Shutdown When Galaxy stops your container (new deploy, scale-down, maintenance), Kubernetes begins the pod termination process. It runs the container's pre-stop hook, then sends `SIGTERM` to your app. Any process still running when the configured termination period ends is force-stopped with `SIGKILL`. The default termination period is 5 seconds. You can increase it up to 600 seconds in your app's **Settings > General** tab, using **Container Stop Grace Period (seconds)**. Changes apply on the next deployment. The setting controls the total Kubernetes termination period. Galaxy exposes its configured value in your container through two aliases: `SIGTERM_GRACE_PERIOD_SECONDS` and `METEOR_SIGTERM_GRACE_PERIOD_SECONDS`. Both aliases have the same value. Environment variables are strings. Parse either alias as an integer number of seconds in your shutdown handler when you need to budget application work for the configured shutdown window. Here's a minimal Node.js handler: ```javascript process.on('SIGTERM', () => { server.close(() => { process.exit(0); }); }); ``` Close your database connections and stop accepting new requests during the time remaining after `SIGTERM`. Any work you can't finish should be queued for the next container to pick up. *** ## Health Checking Galaxy configures Kubernetes probes to verify that your container is healthy. Your app must: * Listen on `$PORT` * Respond to the configured health check path (the default is `GET /`) within the configured probe timeout * Return a response considered healthy by the container image: `200` through `499` for standard images, or `200` through `399` for the Elixir/Phoenix image The default probe timeout is 15 seconds. You can set it from 1 to 30 seconds in your app's **Settings** page. **What happens when a container fails health checks:** * New containers have approximately 7.5 minutes to pass the default startup probe * A container that fails its readiness probe stops receiving traffic * A container that fails its liveness probe is restarted * A failed deployment is handled by the deployment workflow before traffic is switched to the new deployment The current platform does not expose a setting to disable automatic replacement. *** ## Network Environment ### Incoming Connections Galaxy exposes exactly one port per container: the one assigned via `$PORT`. HTTP (port 80) and HTTPS (port 443) both route through Galaxy's load balancer to your container. You can't serve on any other ports. ### Client IP Addresses All traffic arrives through Galaxy's load balancer, so your app sees the proxy's address (something like `10.42.x.x`) instead of the real client IP. To get the real address, set `HTTP_FORWARDED_COUNT` in the `galaxy.meteor.com.env` section of your `settings.json`. Use `HTTP_FORWARDED_COUNT=1` for Galaxy alone. Add one for each additional proxy in front (Cloudflare, Fastly, etc.). Galaxy also forwards the `X-Forwarded-For` header. The leftmost value is the original client; the rightmost is the proxy closest to your app. Clients can spoof `X-Forwarded-For`. Only trust the portion added by proxies you control. ### Outgoing Connections and IP Whitelisting When your app connects to external services, those requests come from Galaxy's fixed outgoing proxy IPs. If you're using MongoDB Atlas, AWS RDS, or any service that requires IP whitelisting, you'll need these addresses. Find them in your app's **Settings** page under outgoing connections. If your service requires CIDR format, append `/32` to each IP (for example, `203.0.113.42/32`). Outgoing IP addresses are available for Meteor apps on the Professional plan. These IPs are shared across all Galaxy Professional customers, so always pair whitelisting with strong authentication. ### Load Balancing Galaxy routes traffic to healthy containers through its load balancer and Kubernetes Service. For Meteor apps, Galaxy uses cookie persistence so reconnecting clients can be routed to the same pod. High CPU or memory alone doesn't trigger rebalancing. Only an unhealthy status (failing health checks) moves users off a container. For troubleshooting, you can [open your app on a specific container](/docs/dashboard/apps/containers#open-your-app-on-a-specific-container). Galaxy uses a browser cookie to keep page reloads, navigation, and new WebSocket connections on that instance, with fallback to another available container if the selected one becomes unavailable. ### Memory Management Node.js (v12+) is container-aware and automatically caps the heap at about 50% of your container's memory limit, up to 2 GB. For most apps this requires no configuration. If you're hitting out-of-memory crashes or need a different heap size, use `NODE_OPTIONS` to tune it. Meteor apps set it in the `galaxy.meteor.com.env` section of `settings.json`; Web Apps set it in the dashboard. See the [Memory Management](/docs/apps/memory-management) guide for per-container-size recommendations. `GALAXY_NODE_OPTIONS` belongs to the legacy Galaxy runtime and is ignored at startup, with no error or warning at deploy time. Use `NODE_OPTIONS` instead. ### IPv6 IPv6 is automatically enabled for all paid plans. Free plans have IPv4 only. To activate IPv6, upgrade your plan and configure DNS at your domain registrar. *** ## Troubleshooting Usually means the container is maxing out CPU or memory and can't respond to health checks within the configured probe timeout. * Increase your container size * Add more containers to spread the load * Move heavy background processing to a job queue * Use Monti APM (Professional plan) to find the bottleneck Most common cause: a hardcoded port. Make sure your app reads `process.env.PORT` (or your stack's equivalent) instead of assuming a fixed value. Other possibilities: * Environment variables not configured in Galaxy * Database connection string pointing to localhost * File system paths that don't exist in the container * Dependencies that require native compilation Set `HTTP_FORWARDED_COUNT=1` in the `galaxy.meteor.com.env` section of your `settings.json`. Increase it by one for each additional proxy in front of Galaxy (Cloudflare, Fastly, etc.). If your database requires IP whitelisting, find Galaxy's outgoing IPs in your app's **Settings** page (Professional plan required for Meteor apps). Add those IPs to your database's allowlist and redeploy. Also verify your connection string is correct and your credentials are valid. Galaxy gives new containers approximately 7.5 minutes to pass the default startup probe. If they don't: * Check your app logs for startup errors * Confirm all required environment variables are set * Make sure your app actually starts and doesn't hang during initialization * Verify your app listens on `$PORT` The deployment workflow handles a failed deployment before switching traffic to the new deployment. *** ## What's Next? --- # Container Sizes (https://help.galaxycloud.app/docs/apps/container-sizes) Container size determines how much memory and CPU your app gets. Pick the right size from the start and scale up as your traffic grows. Don't overthink it: you can resize at any time. ECU stands for EC2 Compute Unit, Amazon's unit for measuring CPU capacity. The higher the ECU value, the more processing power your container has. ## Meteor Apps Galaxy offers seven container sizes for Meteor applications, from lightweight to high-memory workloads.
| Container | Memory | CPU | | --------- | ------ | ------- | | Tiny | 256 MB | 0.3 ECU | | Compact | 512 MB | 0.5 ECU | | Standard | 1 GB | 1 ECU | | Double | 2 GB | 2 ECU | | Quad | 4 GB | 4 ECU | | Octa | 8 GB | 8 ECU | | Dozen | 12 GB | 12 ECU |
**Tiny** is a great starting point for small apps and prototypes. **Standard** handles most production apps comfortably. **Quad** and above are ideal for compute-heavy workloads or apps with high concurrent user counts. ## Web Apps Web Apps (Node.js, Python, AdonisJS, and others) use a different size lineup, starting from the ultra-lightweight Nano.
| Container | Memory | CPU | | --------- | ------ | ------- | | Nano | 128 MB | 0.1 ECU | | Micro | 256 MB | 0.2 ECU | | Small | 512 MB | 0.5 ECU | | Medium | 1 GB | 1 ECU | | Large | 2 GB | 2 ECU | | XLarge | 4 GB | 4 ECU | | 2XLarge | 8 GB | 8 ECU |
**Nano** is the free Sandbox tier option, perfect for experimentation. **Medium** covers the majority of production use cases. Go **Large** or above when you're seeing memory pressure or handling significant traffic spikes. Start with the smallest size that seems reasonable and watch your app's memory and CPU metrics after deploying. Galaxy makes it easy to resize containers without downtime. ## What's Next? --- # Custom Domains (https://help.galaxycloud.app/docs/apps/custom-domains) ## Why Custom Domains? Your app deserves a real domain. Instead of `myapp.sandbox.galaxycloud.app` or `myapp.us.galaxycloud.app`, use `app.yourcompany.com` or `yourcompany.com`. Same app, professional branding. Galaxy makes this simple. Point your DNS at us, add the domain in your dashboard, and we handle SSL certificates automatically. No manual certificate management. No renewal headaches. Every custom domain gets a free certificate from ZeroSSL. Galaxy provisions it automatically and renews it before expiration. Prefer your own certificate? You can upload one instead. HTTPS just works either way. *** ## Choose Your Setup Method Two ways to connect your domain, depending on whether you're pointing a subdomain or a root domain. For subdomains like `www.yoursite.com` or `app.yoursite.com`. Works with virtually all DNS providers. This is what Galaxy's dashboard walks you through. For root domains like `yoursite.com`. Points to Galaxy's load balancer IP for your region. Also what the dashboard walks you through. Use CNAME for subdomains and A records for root domains. That's what the **Add Custom Domain** dialog in your dashboard guides you through for each case. Some DNS providers support ALIAS or ANAME records, which let a root domain point to a hostname instead of a fixed IP. If your provider supports one, you can point it at the same ingress hostname used for CNAME records. Galaxy's dashboard doesn't generate ALIAS-specific instructions though, so verify resolution yourself with `dig` after setup. Add your DNS records first and wait 5 to 10 minutes before adding the domain in Galaxy. Some providers take a bit longer to propagate, and giving DNS a head start avoids a failed verification on the first try. *** ## Method 1: CNAME Records (Subdomains) CNAME is the standard approach for subdomains like `www.yoursite.com`, `app.yoursite.com`, or `dashboard.yoursite.com`. CNAME records can't be used for root domains (like `yoursite.com` without www). For root domains, use an A record instead. ### Galaxy Ingress Endpoints Point your CNAME to the ingress hostname for your app's region. The format is `{username}.{region}.ingress.galaxycloud.app`: | Region | Ingress Hostname Suffix | | ------ | ----------------------------- | | **US** | `.us.ingress.galaxycloud.app` | | **EU** | `.eu.ingress.galaxycloud.app` | | **AP** | `.ap.ingress.galaxycloud.app` | Prefix the suffix with your Galaxy username. For example, if your username is `acme-corp` and your app runs in the US region, your CNAME target is `acme-corp.us.ingress.galaxycloud.app`. The **Add Custom Domain** dialog shows this hostname pre-filled for your app's actual region and username. Copy it from there to avoid typos. ### Step-by-Step Setup ### Choose Your Subdomain Decide which subdomain you want to use. Common patterns include `www.yoursite.com` for your main app or `app.yoursite.com` for a dedicated app subdomain. Make sure this matches the hostname you'll add in Galaxy. ### Add the CNAME Record Log into your DNS provider (GoDaddy, Cloudflare, Namecheap, Route 53, wherever you manage DNS) and create a new CNAME record. **Example for www subdomain:** * **Name/Host**: `www` * **Type**: `CNAME` * **Value/Target**: `acme-corp.us.ingress.galaxycloud.app` (replace `acme-corp` with your Galaxy username, use your region's suffix) * **TTL**: 3600 seconds (or as recommended by your provider) Save the record. ### Wait for DNS Propagation DNS changes take time to spread across the internet. Usually 30 minutes to 2 hours, sometimes up to 24 hours in rare cases. Check propagation with this command: ```bash dig www.yoursite.com ``` You should see a CNAME pointing to the Galaxy ingress hostname. ### Add the Domain in Galaxy Open your app in the Galaxy dashboard. Go to **Settings**, open the **Networking** tab, and click **Add Custom Domain**. Enter your full domain (like `www.yoursite.com`). Galaxy verifies DNS is pointing correctly. ### HTTPS Is Automatic Once DNS verifies, Galaxy provisions an SSL certificate automatically (usually a few minutes). HTTPS enforcement is on by default for every custom domain, so all HTTP traffic redirects to HTTPS with no extra configuration. There's no toggle to flip: your users always get a secure connection. That's it. Your custom domain is live with automatic SSL. One domain per app is the **primary** domain, which sets the main app URL and the value of `ROOT_URL` for Meteor apps. Use the star action in the Networking tab to make your custom domain primary once it's active. The primary domain has to be an active domain. *** ## Method 2: A Records (Root Domains) Use an A record for a root domain like `yoursite.com`. This points your domain to Galaxy's load balancer IP for your app's region. This IP is shared across every app in that region, not a dedicated IP for your app alone. You don't need to request or reserve anything, just use the value for your region. ### Load Balancer IPs by Region | Region | Load Balancer IP | | ------ | ---------------- | | **US** | `54.234.98.174` | | **EU** | `51.44.119.105` | | **AP** | `54.66.97.66` | These IPs can change. Always confirm the current value in the **Add Custom Domain** dialog for your app before creating the record. ### Setup Process ### Get the Load Balancer IP Open your app in the Galaxy dashboard. Go to **Settings**, open the **Networking** tab, and click **Add Custom Domain**. Galaxy shows the load balancer IP for your app's region right in the dialog. Copy this IP address. ### Create the A Record In your DNS provider, create an A record for your root domain. **Example:** * **Name/Host**: `@` (or leave blank, depends on provider) * **Type**: `A` * **Value**: The load balancer IP for your region * **TTL**: 3600 seconds (or as recommended by your provider) ### Add the Domain in Galaxy After DNS propagation (30 minutes to a few hours), return to the same **Add Custom Domain** dialog and enter your root domain (like `yoursite.com`). ### SSL and HTTPS Are Automatic Once verification finishes, Galaxy provisions a certificate from ZeroSSL for your root domain automatically. HTTPS enforcement is on by default, so HTTP traffic redirects to HTTPS without any extra configuration. *** ## Free Galaxy Subdomains Don't have a custom domain yet? No problem. Galaxy provides free subdomains for your app. The format depends on your plan. | Plan | Subdomain Format | | ----------------------- | ------------------------------- | | **Free** | `myapp.sandbox.galaxycloud.app` | | **Paid (US East)** | `myapp.us.galaxycloud.app` | | **Paid (EU West)** | `myapp.eu.galaxycloud.app` | | **Paid (Asia Pacific)** | `myapp.ap.galaxycloud.app` | You choose your app name during deployment. If it's available, it's yours immediately. For the available subdomain actions in the dashboard, see [Networking](/docs/dashboard/apps/settings/networking#domains). All Galaxy subdomains come with SSL enabled by default. No DNS configuration needed. Just deploy your app and you're live immediately. If a Java based client calls your app (webhooks, server to server integrations, payment or fiscal system integrations), watch for a `PKIX path building failed` error. Galaxy subdomains share one certificate across every app on the same wildcard (`*.sandbox.galaxycloud.app`, `*.us.galaxycloud.app`, and so on), and Java's default validation can reject that even though the chain is valid and works fine in browsers. Connect a [custom domain](#method-1-cname-records-subdomains) to get a dedicated certificate and resolve it. If your app previously ran on the old `.meteorapp.com` domain, migrating to Galaxy Metal switches it automatically to the new `galaxycloud.app` format shown above, and the old domain stops resolving. Add a custom domain before migrating if you need to avoid any interruption for users relying on the old URL. Use a Galaxy subdomain to get started quickly. Add your custom domain whenever you're ready. Both can work simultaneously on paid plans. *** ## SSL Certificates Galaxy handles SSL automatically. Here's what happens behind the scenes. ### Automatic Provisioning When you add a domain, Galaxy requests a certificate from ZeroSSL. This typically completes within a few minutes. If DNS isn't pointing correctly yet, Galaxy retries a few times automatically. If it still can't verify, the domain moves to a **Failed** state, and you can trigger a fresh check with the re-verify action in the Networking tab (each re-verify gives three new automatic attempts). ### Automatic Renewal Managed certificates expire after 90 days. Galaxy renews them automatically before expiration. You don't need to track renewal dates or manually update anything. Prefer to bring your own certificate? See [Custom Certificates](#custom-certificates) below. *** ## Custom Certificates Galaxy issues and renews a managed certificate for every custom domain automatically. If you'd rather use your own, upload a certificate and private key from the dashboard. This is the right choice when you need a certificate from a specific commercial CA, an EV or OV certificate, a wildcard certificate, or anything your compliance rules require. Galaxy's managed certificates don't cover wildcard domains (`*.yoursite.com`). To use a wildcard, upload a custom certificate. It's the only supported path for wildcards. ### Two Ways to Add One **When you add the domain**: In the **Add Custom Domain** dialog, check **Use custom certificate**. Galaxy adds the domain and immediately opens the upload dialog so you can finish. The domain waits for your certificate before it starts DNS verification. **On an existing domain**: Open the actions column for any custom domain in the Networking tab and click the certificate upload button. This works whether the domain currently uses a managed certificate or a custom one, so you can switch at any time. ### What to Upload You'll provide two files: * **Certificate**: The full PEM chain, leaf certificate first. Accepts `.pem`, `.crt`, `.cer`, or `.cert`. * **Private key**: The key that matches your leaf certificate. Accepts `.pem` or `.key`. Before installing anything, Galaxy validates that: * The chain is complete, and every signature and issuer verifies. * Exactly one private key is present, and it matches the leaf certificate. * The certificate is currently valid (not expired, not yet-to-start). * The certificate covers your domain through its SANs, including wildcard matches. If any check fails, Galaxy rejects the upload and tells you why (for example, if the certificate doesn't cover the domain). Nothing changes until a valid certificate passes. ### Open the Upload Dialog Either check **Use custom certificate** when adding the domain, or click the certificate upload button in the domain's actions column. ### Select Your Files Choose your certificate file and your private key file. Galaxy shows each file name once it's selected. ### Upload Click **Upload custom certificate**. Galaxy validates both files, installs the certificate, then runs DNS verification. Once verification finishes, the domain becomes **Active**. ### After Uploading Galaxy stores only the details it needs to display, never the certificate or private key itself. The certificate panel shows the common name, subject alternative names (SANs), expiry date, upload time, and a SHA-256 fingerprint, so you can confirm exactly which certificate is installed. Galaxy renews its managed certificates for you. Custom certificates are yours to manage. Watch the expiry date and upload a replacement before it lapses, or your domain will start serving an expired certificate. ### Replacing a Certificate Upload again from the same dialog. Galaxy keeps the current certificate serving until the new one is validated and installed, so there's no gap. If the replacement fails validation, your existing certificate stays in place. ### Removing a Certificate Removing a custom certificate from a standard domain switches it back to Galaxy's managed ZeroSSL certificate and re-runs verification. Wildcard domains are the exception: they must keep a custom certificate, so to stop using one, delete the domain instead. *** ## WWW vs Non-WWW Decide which format is your canonical URL, then redirect the other to it. **Primary**: `www.yoursite.com` 1. Set up a CNAME for `www` pointing to Galaxy 2. Set up a root domain redirect to `www.yoursite.com` 3. Add `www.yoursite.com` as your domain in Galaxy Most DNS providers offer URL forwarding for the root domain redirect. **Primary**: `yoursite.com` 1. Set up an A record for the root domain (or an ALIAS/ANAME if your provider supports it) 2. Set up a CNAME for `www` pointing to Galaxy (or redirect www to root) 3. Add `yoursite.com` as your domain in Galaxy 4. Optionally add `www.yoursite.com` as an additional domain Both domains can work, or you can redirect www to the root. Consistency matters. Pick one and stick with it. Search engines treat www and non-www as separate sites, so consolidating helps SEO. *** ## Verifying Your DNS After making changes, verify everything is working correctly. ### Check DNS Records ```bash # Check CNAME records dig www.yoursite.com # Check A records dig yoursite.com # Check from Google's DNS (bypasses local caching) dig @8.8.8.8 yoursite.com ``` ### What to Look For **CNAME setup**: You should see a CNAME record pointing to your region's Galaxy ingress hostname. **A record setup**: You should see an A record matching your region's load balancer IP. *** ## Troubleshooting DNS propagation typically takes 30 minutes to 2 hours, but can take up to 48 hours in rare cases. Factors include TTL values, geographic location, and local DNS caching. Try checking from a different network or use `dig @8.8.8.8 yoursite.com` to query Google's DNS directly. Galaxy retries verification automatically a few times. If DNS still isn't resolving to Galaxy, the domain lands in a **Failed** state. Confirm your record points to the exact value from the **Add Custom Domain** dialog, wait for propagation, then click the re-verify action in the Networking tab. Each re-verify grants three fresh automatic attempts. Certificate generation requires DNS to be pointing correctly. Make sure your domain resolves to Galaxy before expecting a certificate. Allow 5 to 10 minutes after DNS is correct for initial certificate generation. Check the Networking tab in Settings for status. This happens when a Java based client (a webhook caller, a payment or fiscal integration, or any server to server request) tries to reach your app over HTTPS while it's still on a shared Galaxy subdomain (`*.sandbox.galaxycloud.app`, `*.us.galaxycloud.app`, and so on). The certificate chain is valid, but Java's stricter validation tends to reject certificates shared across a wildcard used by many apps. Browsers and most other HTTP clients aren't affected. This is specific to Java's certificate validation behavior. The fix: connect a [custom domain](#method-1-cname-records-subdomains) to your app. Once it's added, Galaxy generates a dedicated certificate for it (or you can [upload your own](#custom-certificates)), which resolves the validation error on the caller's side. Galaxy validates every upload before installing it. The most common reasons for a rejection are a certificate that doesn't cover the domain (check the SANs), an incomplete chain (include intermediates, leaf first), a private key that doesn't match the leaf, or a certificate that's expired or not yet valid. Fix the file and upload again. Your existing certificate keeps serving until a valid one replaces it. Verify the target hostname is exactly as shown in the **Add Custom Domain** dialog for your region and username (no typos, no trailing spaces). Make sure you're not trying to use CNAME for a root domain (that doesn't work). Check that you haven't created conflicting A and CNAME records for the same hostname. Root domains can't use CNAME records. You need an A record pointing to your region's load balancer IP, or an ALIAS/ANAME record if your DNS provider supports one. Consider using `www.yoursite.com` instead if root domain setup is proving difficult. If your site loads but shows security warnings, you might have resources loading over HTTP instead of HTTPS. Check your application code for hardcoded `http://` URLs and update them to `https://` or use protocol-relative URLs. *** ## AWS Route 53 Advanced Setup Using AWS for your infrastructure? Route 53 provides advanced DNS features like geographic routing, health checks, and tight AWS integration. For comprehensive AWS Route 53 documentation, see the [official AWS Route 53 Developer Guide](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/dns-configuring.html). The short version: create a hosted zone for your domain, update your registrar's nameservers to Route 53, then create a CNAME (subdomain) or A record (root domain) pointing to the values from your Galaxy dashboard. Route 53 also supports ALIAS records natively, which you can point at your Galaxy ingress hostname instead of a fixed IP for root domains. *** ## Common Questions Yes, up to the limit your plan allows. Each plan sets a maximum number of custom domains per app, and the dashboard shows when you've reached it. Every domain gets its own SSL certificate, which is useful for different brand names or regional domains all pointing to the same app. Custom domains are included on paid plans at no additional cost. Free plans are limited to Galaxy-provided subdomains. Yes. Add the wildcard domain (`*.yoursite.com`), then upload your own certificate for it. Galaxy's managed certificates don't cover wildcards, so a custom certificate is required. See [Custom Certificates](#custom-certificates) for the steps. Yes. Upload a certificate and private key from the dashboard, either by checking **Use custom certificate** when you add the domain or from the domain's actions column later. Galaxy validates the chain, key match, validity, and domain coverage before installing it. Custom certificates don't auto-renew, so you'll replace them yourself before they expire. See [Custom Certificates](#custom-certificates) for details. The domain you mark as **primary** sets your app's main URL and, for Meteor apps, the `ROOT_URL` value. Use the star action next to any active domain in the Networking tab to make it primary. Only an active domain can be primary. After DNS propagation (30 minutes to 2 hours typically), add your domain in Galaxy. SSL certificate generation takes a few more minutes. Total time from DNS change to live HTTPS site is usually under an hour. Your domain keeps working as long as the new DNS provider has the same records pointing to Galaxy. Recreate your CNAME or A record in the new provider and you're good. Absolutely. Update your DNS records to point to Galaxy, add the domain in your dashboard, and traffic starts flowing to Galaxy. No downtime if you set up the new records before removing the old ones. *** ## What's Next? --- # Apps on Galaxy (https://help.galaxycloud.app/docs/apps) # Deploy Your Apps on Galaxy Galaxy is built to host your applications, whether you're running Meteor.js, Node.js, Python, or AdonisJS. Deploy from your Git repository, scale automatically as your app grows, and let Galaxy handle the infrastructure. You focus on code, we handle the rest. Connect your repository once, and every push automatically deploys your latest code with zero downtime. *** ## What Runtime Are You Using? Galaxy supports multiple runtimes. Find yours below and jump straight to the deployment guide. *** ## How Galaxy Apps Work Here's the flow, keeping things simple. ### 1. Push to Deploy Connect your repository to Galaxy. Every time you push code to your deploy branch, Galaxy automatically detects the change and starts a new deployment. Your app updates with zero downtime. Old deployments are cleaned up, new code goes live. ### 2. Automatic Scaling Your app grows with traffic. Define scaling rules and Galaxy handles it for you. Need more containers? Add them instantly. Need to shrink? Scale down and watch costs drop. ### 3. Integrated Databases Host MongoDB, PostgreSQL, or Redis right alongside your apps. Zero data transfer fees between your app and database because they're in the same infrastructure. Simple connection strings, automatic backups, and easy scaling. ### 4. Monitoring and Alerts See what's happening in real time. View app logs, monitor resource usage, set up alerts for deployments and failures. Professional plan includes Monti APM for deep performance insights on Meteor apps. *** ## Getting Started in Three Steps Pick your runtime above and follow the guide, or use this quick walkthrough. ### Connect Your Git Provider 1. Go to your Galaxy dashboard 2. Click **Deploy New App** 3. Select your runtime (Meteor, Node.js, etc.) 4. Click **Continue with GitHub** or **Continue with Bitbucket** 5. Authorize Galaxy to access your repositories That's it. Galaxy remembers this for future deployments. ### Pick Your App and Settings 1. Select the repository containing your app 2. Choose your plan (Sandbox for testing, Production for live) 3. Pick a container size 4. Select your deploy branch (usually `main`) 5. Choose your region (paid plans only; free apps deploy to us-east-1) 6. Add any environment variables your app needs Don't sweat the details here. You can change most of this later from the dashboard. ### Watch Galaxy Work 1. Click **Deploy** 2. Galaxy clones your repo, installs dependencies, builds your app 3. Your app goes live on Galaxy's infrastructure 4. You get a URL like `myapp.sandbox.galaxycloud.app` Next time you push code, Galaxy redeploys automatically. *** ## Features Across All Runtimes *** ## Before You Deploy To deploy any application on Galaxy, you must add a valid payment method for identity verification. We'll place a small temporary hold on your card to verify it, then automatically refund it. Don't worry: you'll only be charged if you deploy a paid app. A few things to know upfront. ### A Supported Git Provider is Required Push to Deploy works with GitHub and Bitbucket. If your code is on another provider, push it to one of those first. ### Your App Needs a Start Script Galaxy needs to know how to start your app. Define a `start` script in your `package.json` (Node.js) or equivalent config file. Your app should listen on the PORT environment variable that Galaxy provides. Don't hardcode port 3000 or 5000. Read from the PORT environment variable instead. Galaxy passes this to your app. ### Region Matters Pick the region closest to your users. Galaxy runs in US East, EU West, and Asia Pacific. Same-region deployments mean lower latency and faster responses. *** ## Questions? We've Got Answers Start with Sandbox (free) for testing or development. Move to Production when you're ready for real users. You can change plans anytime. Absolutely. After deployment, configure DNS records to point your custom domain to your Galaxy app. SSL certificates are automatic. You pay by the minute for what you use. Container size and how long they run determines your bill. No per-user charges, no deployment fees, no data transfer fees between your app and database. Yes. Add more containers, increase container size, or set up auto-scaling rules. All from the dashboard, zero downtime. Galaxy monitors your app and automatically restarts it. If you're on Professional plan with Monti APM, you'll get alerts so you know about issues before your users do. *** ## Choose Your Runtime and Deploy Ready to get started? Click on your runtime above and follow the deployment guide. You'll be live in minutes. Don't have code ready yet? No problem. You can always test with a simple "Hello World" app first to get familiar with the process. Have questions along the way? [Galaxy support](/docs/getting-started/support) is fast and helpful. Use the live chat in your dashboard or email. Now stop reading and start deploying. --- # Memory Management in Containers (https://help.galaxycloud.app/docs/apps/memory-management) Running out of memory during traffic spikes? Getting mysterious container restarts? You're not alone. Understanding how Node.js manages memory in containers can save you hours of debugging. The good news is that Galaxy and Node.js handle most of this automatically. *** ## Node.js Is Container-Aware Modern Node.js (v12 and later) is [container-aware](https://developers.redhat.com/articles/2025/10/10/nodejs-20-memory-management-containers). It automatically detects your container's memory limits and sets the heap to about 50% of the container size, up to a maximum of 2GB. | Container Memory | Default Heap | | ---------------- | ------------ | | 256MB | \~128MB | | 512MB | \~256MB | | 1GB | \~512MB | | 2GB | \~1GB | | 4GB | \~2GB (max) | | 8GB | \~2GB (max) | For most applications, Node.js figures out the right memory settings on its own. You don't need to do anything unless you're hitting limits during traffic spikes. Just because Node.js allocates 1GB of heap doesn't mean your app uses all of it. Under normal traffic, your app might consume 500MB. But during traffic spikes, it tries to allocate more, and things get tight if you're close to the limit. *** ## When to Configure Memory Manually Don't worry if you're not hitting memory limits. Most apps don't need manual configuration. But if you want predictable control (or need more than the 2GB default cap), you can set the heap size explicitly. We recommend allocating 70% to 90% of your container's memory to the heap. This gives your app plenty of room while leaving headroom for the Node.js runtime, native modules, and the operating system. | Container Memory | Recommended Range (70-90%) | | ---------------- | -------------------------- | | 256MB | 180 to 230 MB | | 512MB | 360 to 460 MB | | 1GB | 720 to 920 MB | | 2GB | 1400 to 1800 MB | | 4GB | 2800 to 3600 MB | | 8GB | 5600 to 7200 MB | Only manually configure heap size if: * You're seeing "JavaScript heap out of memory" errors * Your app crashes during traffic spikes * You have a larger container and need the extra headroom Otherwise, stick with defaults. *** ## Configuring Heap Size If you decide to configure memory manually, here's how. Every app type on Galaxy uses the standard `NODE_OPTIONS` variable; only the place you set it changes. For Meteor applications, add `NODE_OPTIONS` to the `env` section of your `settings.json` file: ```json { "galaxy.meteor.com": { "env": { "NODE_OPTIONS": "--max-old-space-size=1600" } } } ``` Galaxy starts your production bundle with `node main.js`, so Node picks up `NODE_OPTIONS` directly. Current Node versions accept the memory and garbage collection flags there, including `--max-old-space-size`. Galaxy previously recommended `GALAXY_NODE_OPTIONS` for Meteor apps. That variable belongs to the legacy Galaxy runtime and has no effect today: it's ignored at startup, with no error or warning at deploy time, so the setting looks applied while your heap size stays at the default. Replace it with `NODE_OPTIONS` in the same `env` section and redeploy. For Node.js, Python, and AdonisJS apps, set `NODE_OPTIONS` in the Galaxy dashboard: 1. Open your app in Galaxy 2. Go to **Settings** → **Environment Variables** 3. Add: `NODE_OPTIONS` = `--max-old-space-size=1600` After updating, redeploy for the change to take effect. *** ## Examples Here are some real-world scenarios. ### 2GB Container with Traffic Spikes You're running tight on memory during traffic spikes. Default heap is \~1GB, but you need more headroom. **Solution**: Allocate 80% of container memory to heap: ```json { "galaxy.meteor.com": { "env": { "NODE_OPTIONS": "--max-old-space-size=1600" } } } ``` This allocates 1600MB instead of the default \~1GB. ### 8GB Container Needing Extra Headroom You have a larger container and need more than the 2GB default cap. **Solution**: Allocate 80% of your 8GB container: ```json { "galaxy.meteor.com": { "env": { "NODE_OPTIONS": "--max-old-space-size=6400" } } } ``` This gives your app 6.4GB of heap space. *** ## Troubleshooting You're likely hitting the memory limit. The Linux OOM Killer terminates processes that exceed container limits. **What to try**: 1. Check container metrics in the Galaxy dashboard for memory spikes 2. Lower `--max-old-space-size` to leave more headroom 3. Consider upgrading to a larger container 4. Look for memory leaks This error means V8 couldn't allocate more memory within its heap limit: ``` FATAL ERROR: Allocation failed - JavaScript heap out of memory ``` **What to try**: 1. Increase `--max-old-space-size` (if you have container headroom) 2. Upgrade to a larger container 3. Investigate memory leaks Increasing heap size won't fix a memory leak. It just delays the crash. If memory keeps growing without limit, find and fix the leak. `GALAXY_NODE_OPTIONS` is a legacy variable and is ignored at startup. Deploys succeed with no error or warning, so the setting looks applied while your heap size stays at the default. Replace it with `NODE_OPTIONS` in the same `env` section of your `settings.json` and redeploy. `SERVER_NODE_OPTIONS` isn't a replacement either. Meteor uses it for the Node process started by `meteor run` during local development, not for your deployed bundle. Memory leaks show as continuously growing memory usage that never plateaus, even after traffic drops. **Signs of a leak**: * Memory graph keeps climbing over hours or days * Restarting temporarily fixes performance * App gets slower over time To debug, take heap snapshots at different times and compare them. Look for objects that keep growing in count or size. Large heap sizes can slow down garbage collection during startup. This is normal and usually not a problem in production. If startup time is critical, you might need to balance between heap size and startup performance. *** ## Quick Reference **Defaults**: Node.js auto-detects container limits and sets heap to \~50% (max 2GB) **Custom config**: Allocate **70-90%** of container memory to the heap **Meteor and Web Apps**: Use `NODE_OPTIONS` (Meteor apps set it in the `env` section of `settings.json`, Web Apps in the dashboard) **Deprecated**: `GALAXY_NODE_OPTIONS` is a legacy variable and has no effect **Monitor**: Check container metrics in Galaxy dashboard regularly **Remember**: Increasing heap size doesn't fix memory leaks *** ## What's Next? --- # Public API (https://help.galaxycloud.app/docs/apps/meteor/api) The Galaxy Public API is a REST API for automating a small, deliberate set of operations on your apps. It replaces the legacy GraphQL API for customer automation. **What you'll need**: A Meteor app on the Professional plan **Who can create credentials**: The account owner, or an owner or admin of the organization that owns the app *** ## What You Can Automate The API covers operational tasks you'd otherwise click through in the dashboard. It doesn't expose deployments, environment variables, or billing. **Applications**: List the applications assigned to a credential, with status, service type, and region. **Managed domains**: Read metadata for every domain on an app. Create, re-verify, and delete custom domains that use Galaxy-managed TLS. **Scaling**: Read and change the desired container count and the container specification. **Scaling schedules**: Create one-time or daily recurring container count changes, list recent schedules, and cancel pending ones. Production base URL: `https://api.galaxycloud.app` The full endpoint reference, request and response schemas, and an interactive **Test Request** console live at [api.galaxycloud.app/public/docs](https://api.galaxycloud.app/public/docs). The OpenAPI 3.1 contract is published at [/public/openapi.json](https://api.galaxycloud.app/public/openapi.json) if you'd rather generate a client. *** ## Create a Credential Credentials are created in the Galaxy dashboard, not through the API. ### Open Public API Access Head to **Settings**, then **Public API** under **API & Integrations**. Organizations have their own **Public API** page in organization settings, separate from your personal account. ### Click Create credential The button sits at the top of the page, next to **Documentation**. If it's disabled, hover it: the tooltip explains why, usually because the account has no eligible application yet. ### Name the credential Use the **Name** field and describe what the integration does, like `Production domain automation`. You get up to 80 characters. ### Pick your applications Select at least one app under **Applications**. Only Meteor apps on the Professional plan in this account show up here. ### Pick your capabilities **Capabilities** starts with `public:apps:read` checked. Add whatever else the integration needs. Write capabilities automatically pull in their matching read capability. ### Set an expiration **Expires on** defaults to 90 days from today. The earliest you can pick is tomorrow, the latest is 365 days out. ### Copy your token Submit the form and Galaxy shows the token **once**. Copy it into your secret manager, tick the box confirming you've saved it, then click **Done**. You can't close that dialog any other way. Send the token as a bearer token on every request: ```bash curl https://api.galaxycloud.app/public/v1/apps \ -H "Authorization: Bearer gxy_v1.your-token-here" ``` *** ## Scopes Every request needs both the right scope and an app that's on the credential's allowlist. Apps that aren't listed, and apps belonging to another owner, return `404` instead of `403` so the API never confirms they exist. **`public:apps:read`**: Lists the applications assigned to the credential. **`public:domains:read`**: Reads domain metadata for those applications. **`public:domains:write`**: Creates, re-verifies, and deletes custom domains that use Galaxy-managed TLS. Requires `public:domains:read`. **`public:scaling:read`**: Reads container counts, container specifications, and scaling schedules. **`public:scaling:write`**: Changes scaling state and manages scaling schedules. Requires `public:scaling:read`. Custom certificates and Galaxy subdomains aren't part of the public contract. See [Custom Certificates](/docs/apps/custom-domains#custom-certificates) for certificate management and [Networking](/docs/dashboard/apps/settings/networking#domains) for the available Galaxy subdomain actions in the dashboard. *** ## Rotation and Revocation Both actions live in the actions menu at the end of each row in the credential list, and both ask for confirmation first. Rotate a credential when a token may have leaked, or on whatever schedule your security policy sets. Rotation issues a new token and keeps the previous one valid for 15 minutes, so your workers have time to pick up the new value. The dialog tells you the exact time the old token stops working. Revocation is immediate and permanent. A revoked credential can't authenticate again, and you can't undo it. Galaxy stores a hash, not the token. If you lose it, rotate the credential to get a new one. *** ## Retries, Request IDs, and Rate Limits Domain mutations and scaling schedule mutations require an `Idempotency-Key` header. Generate a unique value per logical operation and reuse it only when retrying the exact same request. Galaxy replays the completed response for 24 hours; reusing a key with a different operation or payload returns `409`. Every automation response includes an `X-Request-ID`. Send your own identifier (visible ASCII, up to 128 characters) to correlate requests with your own logs, or let Galaxy generate one. Default rate limits are 120 requests per minute per credential and 600 requests per minute per owner. A `429` response includes `Retry-After` with the number of seconds to wait. *** ## Common Questions Yes. The Public API is the supported path for customer automation going forward. Active Meteor applications on the Professional plan. Apps that become ineligible are quietly dropped from the credential's list. No. Only the account owner, or an organization owner or admin, can create, rotate, or revoke credentials. Impersonated sessions are blocked too. The app isn't on that credential's allowlist, or it's no longer eligible. Open the credential list under **Settings**, then **Public API**, and confirm the app is still on the Professional plan. Apps that get suspended are flagged there too. No. Your plan and scaling rules still apply, and they can be stricter than the contract maximum. Schedules are validated against those rules before they're stored. Include the `X-Request-ID` from the failing response when you contact support. It's the fastest way for us to find your request. *** ## What's Next? --- # Meteor CLI (https://help.galaxycloud.app/docs/apps/meteor/cli) This guide is for Meteor apps. For Node.js, AdonisJS, or Python, use the [Galaxy CLI](/docs/apps/webapps/galaxy-cli) instead. ## Prerequisites * [Meteor CLI](https://docs.meteor.com/about/install.html) installed * A [Galaxy account](https://my.galaxycloud.app/signup) * A [payment method](/docs/getting-started/creating-account) added for identity verification Log in before deploying: ```bash meteor login ``` *** ## Deploy The basic command: ```bash meteor deploy myapp ``` That's it. Galaxy creates your app on the Free plan with a Tiny container and deploys it to US East. Pass a simple **app name** (like `myapp`), not a full domain (like `myapp.example.com`). A domain format is treated as a custom domain assignment, which requires a paid plan. On the Free plan it fails with `Free apps must use a free-tier domain`. Use a simple name and let Galaxy generate the hostname (`myapp.us.galaxycloud.app`). ### Regions Set `DEPLOY_HOSTNAME` to deploy to a different region: | Region | DEPLOY\_HOSTNAME | | ----------------- | ----------------------------------------- | | US East (default) | `us-east-1.galaxy-deploy.meteor.com` | | EU West | `eu-west-1.galaxy-deploy.meteor.com` | | Asia Pacific | `ap-southeast-2.galaxy-deploy.meteor.com` | ```bash DEPLOY_HOSTNAME=eu-west-1.galaxy-deploy.meteor.com meteor deploy myapp ``` Use `SET DEPLOY_HOSTNAME=eu-west-1.galaxy-deploy.meteor.com` before running `meteor deploy`. ### Plan and Container Size ```bash meteor deploy myapp --plan professional --container-size standard ``` Plans: `free`, `essentials`, `professional`. Container sizes: `tiny`, `compact`, `standard`, `double`, `quad`, `octa`, `dozen`. ### Settings Pass your configuration via a settings file: ```bash meteor deploy myapp --settings settings.json ``` Settings persist across deployments until you specify a new file. See the [Meteor Reference](/docs/apps/meteor/meteor-reference) for the settings structure. ### Database Add a free shared MongoDB to your deployment: ```bash meteor deploy myapp --mongo ``` For a free plan app with a database: ```bash meteor deploy myapp --free --mongo ``` The shared cluster doesn't include backups. Not recommended for production. See the [Meteor Reference](/docs/apps/meteor/meteor-reference) for SSL configuration. *** ## CI/CD with Deployment Tokens Use a deployment token instead of personal credentials for automated pipelines. ### Generate a token ```bash METEOR_SESSION_FILE=token.json meteor login ``` This creates `token.json` with a session token valid for 90 days. ### Use in your pipeline ```bash METEOR_SESSION_FILE=token.json meteor deploy myapp --settings settings.json ``` Store tokens in your CI/CD platform's secret storage (GitHub Secrets, GitLab Variables). Never commit them to your repo. *** ## Flag Reference | Flag | Description | | ------------------------------- | ----------------------------------------------------- | | `--free` | Deploy on the free plan | | `--plan [plan]` | Set plan: `professional`, `essentials`, or `free` | | `--mongo` | Provision a free shared MongoDB | | `--container-size [size]` | Set container size | | `--settings [file]` | Pass a JSON settings file | | `--cache-build` | Reuse build if git commit is unchanged (Meteor 1.11+) | | `--debug` | Deploy without minifying code | | `--no-wait` | Exit after upload, don't wait for deployment | | `--deploy-polling-timeout [ms]` | Deployment wait timeout (default: 15 min) | | `--owner [user/org]` | Deploy under a specific account | | `--delete, -D` | Permanently delete the app | Changing app ownership from the CLI is deprecated. Move apps between accounts from the dashboard instead. See [Transfer an App](/docs/apps/transfer-apps). *** ## Troubleshooting You passed a domain format (like `myapp.example.com`) as the app name. Free plan apps must use a simple name: ```bash # Wrong meteor deploy myapp.example.com --free # Correct meteor deploy myapp --free ``` Galaxy generates the `.sandbox.galaxycloud.app` hostname automatically. If you want a custom domain, use a paid plan: `meteor deploy myapp.example.com --plan essentials`. Ownership changes moved to the dashboard. `--transfer` is rejected and redirects you there, `--add` is deprecated, and `--remove` is blocked because an app can't be left without an owner. Transfers are asynchronous and usually need approval from the destination account, which the CLI has no way to report. Use the **Transfer App** control in your app's Danger Zone instead. See [Transfer an App](/docs/apps/transfer-apps). Try deploying again. The build container might have had issues. If it keeps failing, your app may be too large for the default build memory. Make sure the file path is correct and the JSON is valid. Check your app logs in the Galaxy dashboard. Deploy with `--debug` to inspect `Meteor.settings` in the browser console. Increase the timeout: `meteor deploy myapp --deploy-polling-timeout 30000` (milliseconds). *** ## What's Next? --- # Custom Base Images (https://help.galaxycloud.app/docs/apps/meteor/custom-base-images) By default, Galaxy builds your Meteor app using a standard base image that covers most use cases. But if you need full control over the system packages available to your app, or want to customize exactly what happens at build and run time, you can provide your own base image instead. You can also select a pre-built Galaxy image explicitly to resolve [Meteor 3.5.2 image issues](#meteor-352-image-issues), without building your own Docker image. **What you'll need**: A Docker Hub account and a publicly readable Docker image *** ## How It Works When you run `meteor deploy`, your local Meteor CLI builds your app, bundles it into a tarball, and uploads it to Galaxy. Galaxy then builds a Docker image by running a setup script (`/app/setup.sh`) inside your base image using `/bin/bash`. After the build, Galaxy runs whatever command you define in your Dockerfile's `CMD` or `ENTRYPOINT` directive. Your base image is a Docker image hosted on [Docker Hub](https://hub.docker.com/). It must be publicly readable, which means it should never contain secrets. *** ## Setting Up a Custom Base Image ### Write a Dockerfile Start with a base OS (like `ubuntu`) and install the packages your app needs. You can look at the [source of the Galaxy default base image](https://github.com/meteor/galaxy-images) for inspiration. You must also add a file called `/app/setup.sh` and specify a command to run with the `CMD` or `ENTRYPOINT` directives. Galaxy passes a single argument to your setup script: a URL pointing to your app's tarball. Your script should download and expand that tarball. Here's a minimal example: ```bash cd /app && curl -sS "$1" | tar xz -m ``` The `-m` flag ignores timestamps from the computer that ran `meteor deploy`. This avoids clock-skew issues in some build systems. Your setup script can do anything else you need at build time: run `npm install`, invoke other build systems, etc. Your image must include `/bin/bash` and `/app/setup.sh`. The setup script must have the executable bit set and a proper shebang line (like `#!/bin/bash`). ### Push to Docker Hub Build your image and push it to Docker Hub. Use a specific tag (like `v23` or a git SHA) rather than a mutable tag like `latest`. Galaxy won't rebuild your app just because you pushed a new image to the same tag; a new deploy is always required. ```bash docker build -t username/my-galaxy-base-image:v23 . docker push username/my-galaxy-base-image:v23 ``` Use a new tag each time you update your base image. That way your `settings.json` reference is always explicit and you can roll back by changing the tag. ### Configure `settings.json` Tell Galaxy to use your image by adding a `baseImage` block inside the `galaxy.meteor.com` section of your `settings.json`: ```json { "galaxy.meteor.com": { "env": { "MONGO_URL": "mongodb://..." }, "baseImage": { "repository": "username/my-galaxy-base-image", "tag": "v23" } } } ``` The `repository` field should include your Docker Hub username. The `tag` field is the specific version you want to use. ### Configure Your Deploy Method How you apply the settings depends on how you deploy. **Push to Deploy (recommended):** If you use Push to Deploy with Galaxy Mode, paste your complete `settings.json` content (including the `baseImage` block) into the **Variables** tab of your app. Galaxy stores and injects these settings on every deployment automatically. Just push your code and the custom base image is picked up. **CLI deploy:** Pass your settings file directly with `meteor deploy`: ```bash meteor deploy myapp --settings settings.json ``` Either way, Galaxy will use your custom base image for this deployment and all future ones until you change the `baseImage` configuration. *** ## Run Time Behavior At run time, Galaxy invokes whatever command is specified in your Dockerfile's `CMD` or `ENTRYPOINT` directive. No additional arguments are passed. Galaxy sets the environment variables documented under [Container Environment](/docs/apps/container-environment). Your command is expected to run a server that listens on the port specified by the `$PORT` environment variable. Galaxy needs to see a functioning web server to consider your app healthy. If you're deploying something that isn't a traditional web server (like a helper process for your main app), you should disable unhealthy container replacement on your app's settings page. That said, exposing a web server is recommended so you can tell whether your container is healthy. Your container runs until its specified command completes or Galaxy stops it. *** ## Puppeteer Image If your app uses [Puppeteer](https://pptr.dev/) for headless browser automation, there's a pre-built image that includes all the libraries Puppeteer needs. Configure it in your `settings.json`: ```json { "galaxy.meteor.com": { "env": { "MONGO_URL": "mongodb://..." }, "baseImage": { "repository": "meteor/galaxy-puppeteer", "tag": "latest" } } } ``` For Meteor 3.5.2, use the `3.5.2` tag instead of `latest` or `latest-2026`. Follow the [Meteor 3.5.2 image instructions](#meteor-352-image-issues). For apps on other Meteor versions, if the `latest` tag doesn't work on your app, try `latest-2026` instead. That tag includes an updated image with full compatibility for Galaxy Metal. When using this image, launch Puppeteer with these flags: ```javascript const browser = await puppeteer.launch({ args: [ '--no-sandbox', '--disable-setuid-sandbox', '--disable-dev-shm-usage' ] }); const page = await browser.newPage(); await page.goto('https://www.google.com'); ``` These flags are required for Puppeteer to run correctly in Galaxy's container environment. *** ## Meteor 3.5.2 Image Issues If your Meteor 3.5.2 app has image-related deployment issues on Galaxy V1, or runs into issues using Puppeteer, set `baseImage` explicitly in your app settings. ### Select the Image Add the matching `baseImage` block inside `galaxy.meteor.com` in your existing settings. Keep your environment variables and other settings intact. Use `meteor/galaxy-app` with the `3.5.2` tag: ```json { "galaxy.meteor.com": { "baseImage": { "repository": "meteor/galaxy-app", "tag": "3.5.2" } } } ``` Use `meteor/galaxy-puppeteer` with the `3.5.2` tag, including when deploying to Galaxy V1: ```json { "galaxy.meteor.com": { "baseImage": { "repository": "meteor/galaxy-puppeteer", "tag": "3.5.2" } } } ``` Keep the [Puppeteer launch flags](#puppeteer-image) shown above. ### Deploy with the Updated Settings For Push to Deploy in **Galaxy Mode**, update the JSON in your app's **Variables** tab, click **Save**, and trigger a new deployment. In **Repository Mode**, update the settings file used by your deployment and deploy through Push to Deploy. See [Meteor settings modes](/docs/dashboard/apps/variables#meteor-apps-settings-modes). For CLI deployments in Galaxy Mode, pass the updated file: ```bash meteor deploy myapp --settings settings.json ``` A new deployment is required to build your app with the selected base image. Saving settings or restarting existing containers doesn't rebuild the image. *** ## Common Questions Yes, Docker allows pushing to an existing tag. However, Galaxy won't automatically rebuild your app when you do this. You need to trigger a new `meteor deploy` to pick up the updated image. This is one reason to prefer versioned tags: you can update your `settings.json` to point to the new tag, making the change explicit and reversible. Yes. Galaxy pulls your base image from Docker Hub and it must be publicly readable. Don't include secrets or sensitive data in your image layers. Currently, Galaxy only supports images hosted on Docker Hub. Build time is when Galaxy runs your `/app/setup.sh` script to download and expand your app's tarball. Run time is when Galaxy starts your container using the `CMD` or `ENTRYPOINT` directive. Your setup script handles build-time steps like installing dependencies. Your Dockerfile command handles starting the actual app process. *** If you run into issues with custom base images, [contact Galaxy support](/docs/getting-started/support). Include your Docker Hub repository name and the error from your deploy logs. ## What's Next? --- # GraphQL API (deprecated) (https://help.galaxycloud.app/docs/apps/meteor/graphql-api) The public GraphQL API was built to let you monitor your Meteor apps and change their configurations without touching the dashboard. It's now deprecated, and the [Galaxy Public API](/docs/apps/meteor/api) has replaced it for customer automation. The public GraphQL API is deprecated and no longer available for new integrations. It's no longer possible to generate new API keys. If you already have a key, the endpoints continue to work for now, but you shouldn't build new tooling against this API. ## What Replaces It The [Galaxy Public API](/docs/apps/meteor/api) is a REST API with scoped credentials you create from the dashboard. It's available for Meteor apps on the Professional and Custom plans. **Managed domains**: Read domain metadata, then create, re-verify, and delete custom domains that use Galaxy-managed TLS. **Scaling**: Read and change the desired container count and the container specification. **Scaling schedules**: Set up one-time or daily recurring container count changes. Coverage isn't identical to the old GraphQL schema. Check the [API reference](https://api.galaxycloud.app/public/docs) before you plan a migration, so you know exactly what's available. ## Moving Your Tooling Over There's nothing to convert. GraphQL API keys and Public API credentials are separate systems, so you create a new credential and point your scripts at the new base URL. Start in **Settings**, then **Public API** under **API & Integrations**. The [Public API article](/docs/apps/meteor/api) walks through creating a credential, picking capabilities, and authenticating. ## What's Next? --- # Meteor Reference (https://help.galaxycloud.app/docs/apps/meteor/meteor-reference) ## Meteor Settings Galaxy uses `settings.json` to configure your Meteor app. Paste your settings in the Galaxy deployment form or manage them in the **Variables** tab after deployment. Your settings should follow this structure: ```json { "galaxy.meteor.com": { "env": { "MONGO_URL": "mongodb://user:password@host/db", "MAIL_URL": "smtp://user:password@smtp.example.com:587" } }, "packages": { "mongo": { "options": { "tlsAllowInvalidCertificates": true } } }, "private": { "stripeKey": "sk_live_xxx" }, "public": { "appName": "My App" } } ``` Paste your settings directly in Galaxy instead of committing them to your repository. For advanced secrets management, see the [Secrets Management guide](/docs/apps/meteor/secrets-management). *** ## Build Configuration ### Base Image Set `galaxy.meteor.com.baseImage` in your Meteor settings to select a specific Docker base image. If you're running Meteor 3.5.2 and encounter image-related deployment issues on Galaxy V1 or issues using Puppeteer, use the [Meteor 3.5.2 image configurations](/docs/apps/meteor/custom-base-images#meteor-352-image-issues). ### Root Directory If your Meteor app lives in a subdirectory of your repository (like `apps/web`), set the root directory during deployment. Leave it empty if your app is at the repo root. ### Install Command Defaults to `meteor npm install`. Switch to `meteor npm ci` for reproducible builds if you commit `package-lock.json` to your repository. ### Settings File Path If your `settings.json` file is committed to your repository, enter the path here (like `private/settings.json`). Leave this empty if you paste your settings directly in Galaxy. Only use the Settings File Path for non-sensitive configuration. Never commit secrets like API keys, database passwords, or tokens to your repository. Use the Meteor Settings JSON field instead. ### Pre-Deploy Command Runs after the build completes, before the new containers go live. Use it for tasks like database migrations. Your command runs within your private network and has access to your environment variables. If the command fails, the deployment stops. Pre-deploy commands are only available on paid plans. Free plan apps can't use this field. ### Environment Variables For Meteor apps, most configuration goes in the Meteor Settings JSON. You can still add additional environment variables if needed. Galaxy pre-adds `PORT` (default `3000`) and `ROOT_URL` (auto-calculated from your subdomain). *** ## Free MongoDB Toggle **Add Free MongoDB** during deployment to provision a shared cluster for testing and development. When enabled, Galaxy sets `MONGO_URL` automatically. You'll also need to include this in your settings to handle SSL certificates: ```json { "packages": { "mongo": { "options": { "tlsAllowInvalidCertificates": true } } } } ``` This setting is necessary because the free database provider doesn't have certificates installed on every machine. If you're using your own external MongoDB, you won't need this. The free MongoDB shared cluster doesn't include backups or restoration resources. For production apps, use a [dedicated MongoDB instance](/docs/databases/mongodb). If you've already set a `MONGO_URL` in your environment variables or Meteor Settings, the **Add Free MongoDB** option will be disabled. Galaxy detects the existing connection string and skips provisioning a new database. When you enable this option, the free database is linked directly to your app: it appears in the **Databases** tab of your dashboard alongside paid instances, and it shares the app's lifecycle (if you delete the app, the database goes with it). *** ## Managing Settings After Deployment Open your app in the Galaxy dashboard and navigate to the **Variables** tab. For Meteor apps, you'll see a specialized JSON editor (marked with a "GALAXY MODE" badge) where you can edit your complete `settings.json`. Make changes, click Save, and Galaxy restarts your containers with the new configuration. For the complete guide on editing settings, understanding hot-swappable vs rebuild-required changes, and troubleshooting configuration issues, see the [Variables tab documentation](/docs/dashboard/apps/variables). *** ## Need Help? * [Galaxy Support](/docs/getting-started/support) Live chat is fastest for urgent issues. Available directly from your Galaxy dashboard. *** ## What's Next? --- # Monti APM (https://help.galaxycloud.app/docs/apps/meteor/monti-apm) Monti APM is application performance monitoring built specifically for Meteor. It shows you exactly what's happening inside your app: slow methods, inefficient publications, memory leaks, and errors your users are hitting. Monti APM is included with your Professional Plan subscription. No additional fees, no separate account needed. *** ## Setting Up on Galaxy Galaxy handles the Monti APM configuration automatically. You just need to install the agent package and deploy. ### Install the Agent Add the Monti APM package to your Meteor project: ```bash meteor add montiapm:agent ``` ### Deploy on Professional Plan Deploy your app to Galaxy. Make sure your app is on the Professional plan (Monti APM isn't available on Free or Essentials). ### Access the Dashboard Open your app in the Galaxy dashboard. Click the APM button in the top action bar of your app's Overview page. Data starts appearing within a minute of deployment. On other plans, the button is visible but disabled. Galaxy automatically provisions your Monti APM app and handles all credentials. You don't need to add settings to your `settings.json` or call `Monti.connect()` manually. *** ## Migrating from Meteor APM Running the old Meteor APM agent? Remove it before using Monti APM. The two agents can't run simultaneously. ```bash meteor remove mdg:meteor-apm-agent meteor add montiapm:agent ``` Then deploy to Galaxy. *** ## Migrating from Existing Monti APM Configuration Already using Monti APM with your own account? To use Galaxy's integrated version, remove your existing configuration: * Remove any `monti` or `kadira` objects from your `settings.json` * Remove any `Monti.connect()` calls from your code * Remove `MONTI_APP_ID` and `MONTI_APP_SECRET` environment variables After removing manual configuration, Galaxy's automatic setup takes over. If you prefer using your own Monti APM account, keep your existing configuration. Galaxy won't override it. *** ## Common Questions No. Just install `montiapm:agent` and deploy on the Professional plan. Galaxy handles everything else. Monti APM is included with the Professional plan at no additional cost. Yes. Keep your existing configuration and Galaxy won't override it. Remove the `montiapm:agent` package and redeploy, or downgrade to Essentials. *** ## Learn More For detailed guides on using Monti APM features, dashboards, and optimization techniques: --- # Prerendering with Meteor (https://help.galaxycloud.app/docs/apps/meteor/prerender) ## What is prerendering? Search engines and social media platforms work best when they can immediately see your page's content. But if your Meteor app renders everything in JavaScript, they might just see a blank page or a loading screen. That's where prerendering comes in. Prerendering generates static HTML snapshots of your pages before search engines crawl them. Think of it as taking a screenshot of your fully-rendered app and serving that to bots. Your real users still get the full interactive experience, but search engines get exactly what they need for SEO. ## Why you need it Without prerendering, search engines struggle to index dynamic content. This hurts your search rankings, and social media platforms can't show rich previews when people share your links. Prerendering fixes both problems. ## Getting started Galaxy includes a built-in prerendering service, available on the Essentials plan and higher, at no additional cost. If you're on the Free plan, you'll need to upgrade to use this feature. Prerendering requires at least an **Essentials plan**. Free plan apps can't use Galaxy's prerendering service. If you have the right plan, adding prerendering takes just one command. Open your Meteor app directory and add the SEO package. ```bash meteor add mdg:seo ``` If you're already using the `spiderable` package, remove it. These two packages don't play well together. ```bash meteor remove spiderable ``` Deploy your app to Galaxy. The prerendering service activates automatically. ```bash meteor deploy myapp ``` That's it! Your app is now prerendering pages for search engines. No configuration needed. ## Testing if prerendering works Want to verify that prerendering is actually happening? You need to simulate how search engines see your site, not just how your browser does. The old `?_escaped_fragment_=` parameter approach is outdated. Google discontinued the AJAX Crawling Scheme back in 2015, and modern search engines don't use it anymore. Skip that method. The right way is to test with curl commands that mimic actual search engine User-Agent strings. This tells your prerenderer to serve the static HTML version instead of raw JavaScript. ```bash curl -s -A "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)" -L "https://www.myapp.com" > googlebot_response.html ``` ```bash curl -s -A "Mozilla/5.0 (compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm)" -L "https://www.myapp.com" > bingbot_response.html ``` ```bash curl -s -A "facebookexternalhit/1.1 (+http://www.facebook.com/externalhit_uatext.php)" -L "https://www.myapp.com" > facebook_response.html ``` ```bash curl -s -A "LinkedInBot/1.0 (compatible; Mozilla/5.0; Jakarta Commons-HttpClient/3.1 +http://www.linkedin.com)" -L "https://www.myapp.com" > linkedinbot_response.html ``` Then check the file to confirm it contains your fully rendered page content. If you see your actual page content (text, headings, etc.) in the response file, prerendering is working great. If you only see a header and a reference to a script file, something's not right and you'll need to troubleshoot. ## Troubleshooting Check your app's router and make sure all pages render on the server. Some Meteor apps have JavaScript that only runs on the client, and prerendering won't capture those changes. Look for code that checks `Meteor.isClient` and make sure your page content is available during server-side rendering. The prerenderer might be timing out if a page takes too long to load. Check your subscriptions and database queries. If something is slow in development, it'll be slow during prerendering too. That's actually normal for new deployments. The prerenderer generates snapshots and caches them. Give it a few minutes and hit your pages with the curl commands again. ## Cache freshness and limitations Galaxy's prerendering service has one important limitation: pages are cached for up to 4 days. If your content changes frequently, that might not work for you. Need to refresh cached pages more often, or need full control over prerendering? Set up your own [prerender.io](https://prerender.io) service. You'll have manual cache clearing and custom expiration policies. ## What's Next? --- # Deploy Meteor Apps (https://help.galaxycloud.app/docs/apps/meteor/push-to-deploy) ## Prerequisites * A [Galaxy account](https://my.galaxycloud.app/signup) * Your Meteor app in a Git repo * A [payment method](/docs/getting-started/creating-account) added for identity verification *** ## 1. Prepare Your Settings Galaxy uses `settings.json` to configure your Meteor app. At minimum, you need your `MONGO_URL`: ```json { "galaxy.meteor.com": { "env": { "MONGO_URL": "mongodb://user:password@host/db" } } } ``` Don't have a database yet? You can toggle **Add Free MongoDB** during deployment to get a shared cluster for testing. If you don't have a `settings.json` file, Galaxy creates one for you and adds the `MONGO_URL` automatically. Paste your settings directly in Galaxy instead of committing `settings.json` to your repo. See the [Secrets Management guide](/docs/apps/meteor/secrets-management) for best practices. *** ## 2. Deploy Prefer the command line? See the [Meteor CLI Deployment guide](/docs/apps/meteor/cli). ### Connect your repo Go to your [Galaxy dashboard](https://my.galaxycloud.app), click **Create New**, then **Deploy New App**. Select **Meteor.js** as the app type and connect your GitHub or Bitbucket account. ### Select repo and branch Pick your repository and the branch to deploy from (usually `main`). ### Choose plan and container Select a plan (Free for testing, Essentials for production, Professional for mission-critical apps) and a container size. Start small, scale later. ### Choose Your Account, Plan, and Container Now things get real. You're picking the resources for your app. #### Which Account? If you're working with an organization, select it here. Otherwise, your personal account is already selected. #### Pick Your Plan Galaxy has three plans to choose from: Free (great for testing), Essentials (for production apps), and Professional (for mission-critical work). Each supports different container sizes and resource allocations. Not sure which one is right for you? Start with Essentials for production, or Free for testing. You can always upgrade or downgrade later based on what you actually need. For a detailed breakdown of pricing, features, and what's included in each plan, check out the [Billing documentation](/docs/billing/meteor). You can switch plans anytime after deployment. Don't overthink this choice. #### Select Your Container Size Each plan supports multiple container sizes. Container size determines how much RAM and CPU your app gets. Bigger containers handle more traffic and heavier workloads, but cost more to run. Start with a medium-sized container and scale up if you hit performance limits. Most apps do just fine starting smaller and growing as needed. For the complete breakdown of container sizes, CPU allocations, and pricing, see the [Billing documentation](/docs/billing/meteor). ### Configure and Deploy You're almost there. This final step is where you customize the deployment itself. #### App Configuration **App Display Name**: Give your application a friendly name. This is just for your reference in the Galaxy dashboard (it's not used in the URL). **Branch**: Which branch should Galaxy watch and deploy from? Most teams deploy from `main` or `master`, but choose whatever branch makes sense for your workflow. **Custom Subdomain**: Choose a memorable subdomain for your app. This becomes your default URL (like `myapp.us.galaxycloud.app` for paid apps or `myapp.sandbox.galaxycloud.app` for free apps). Don't worry too much about it, though, you can always add a custom domain later. **Region**: Galaxy runs your application across multiple regions to reduce latency: * **us-east-1** (Virginia, United States): East Coast and general US traffic * **eu-west-1** (Roubaix, France): European users * **ap-southeast-2** (Sydney, Australia): Asia Pacific traffic Free plan apps are deployed to **us-east-1** by default and don't include region selection. Paid plans (Essentials and Professional) can choose any region during deployment. Want to change regions later? Upgrade to a paid plan from your app's dashboard. #### Build Configuration This section is specific to Meteor apps. Here's where you configure your build and Meteor settings. **Root Directory**: If your Meteor app lives in a subdirectory of your repository (like `apps/web`), enter the path here. Leave it empty if your app is at the repo root. **Pre-Deploy Command**: Runs after the build completes, before the new containers go live. Use it for tasks like database migrations. Your command runs within your private network and has access to your environment variables. If the command fails, the deployment stops. Pre-deploy commands are only available on paid plans. Free plan apps can't use this field. **Install Command**: Defaults to `meteor npm install`. Switch to `meteor npm ci` for reproducible builds if you commit `package-lock.json` to your repository. **Settings File Path (Optional)**: If your `settings.json` file is committed to your repository, enter the path here (like `private/settings.json`). Leave this empty if you prefer to paste your settings directly or manage them in Galaxy. Only use the Settings File Path for non-sensitive configuration. Never commit secrets like API keys, database passwords, or tokens to your repository. Use the Meteor Settings JSON field instead. **Meteor Settings JSON**: This is where you paste your complete `settings.json` content. Galaxy provides a code editor with syntax highlighting and a size indicator (up to 1 MB). Your settings should follow this structure: ```json { "galaxy.meteor.com": { "env": { "MONGO_URL": "mongodb://user:password@host/db", "MAIL_URL": "smtp://user:password@smtp.example.com:587" } }, "packages": { "mongo": { "options": { "tlsAllowInvalidCertificates": true } } }, "private": { "stripeKey": "sk_live_xxx" }, "public": { "appName": "My App" } } ``` This is the recommended approach for secrets and sensitive configuration. Your settings stay out of version control, keeping your repository safe. #### Database Want to add a MongoDB database right now? Toggle **Add Free MongoDB** to provision a shared cluster for testing and development. This is super convenient for getting up and running fast. If you enable Free MongoDB, `MONGO_URL` will be automatically added to your settings. The free shared cluster is great for testing but not recommended for production workloads. If you've already set a `MONGO_URL` in your environment variables or Meteor Settings, the **Add Free MongoDB** option will be disabled. Galaxy detects the existing connection string and skips provisioning a new database. Remove your existing `MONGO_URL` if you want to use the free shared cluster instead. When you enable this option, the free database is linked directly to your app: it appears in the **Databases** tab of your dashboard alongside paid instances, and it shares the app's lifecycle (if you delete the app, the database goes with it). The **Databases** tab only shows free databases created through this toggle during deployment. If your account had a free MongoDB database provisioned before this feature was introduced, it won't appear there retroactively. Only databases linked to apps deployed on Galaxy Metal are listed. If you already have a database or prefer to configure it separately, skip this option. #### Environment Variables Below the Meteor settings, you'll see an Environment Variables section. For Meteor apps, most configuration goes in the Meteor Settings JSON above. However, you can still add additional environment variables here if needed. Galaxy pre-adds `PORT` (with a default value of `3000`) and `ROOT_URL` (auto-calculated from your chosen subdomain). These variables are available alongside your Meteor settings. Every push to your deploy branch triggers a new deployment automatically. *** ## 3. Configure (Optional) **Root directory**: Set if your Meteor app is in a subdirectory (like `apps/web`). **Install command**: Defaults to `meteor npm install`. Use `meteor npm ci` for reproducible builds. **Pre-deploy command**: Run database migrations or other tasks before the new version goes live (paid plans only). **Free MongoDB**: Toggle during deployment to get a shared cluster for testing. See the [Meteor Reference](/docs/apps/meteor/meteor-reference) for SSL configuration details. For full settings structure, build options, and environment variables, see the [Meteor Reference](/docs/apps/meteor/meteor-reference). *** ## Troubleshooting Check the logs in your Galaxy dashboard. Common causes: * Missing or invalid `MONGO_URL` in your Meteor settings * Missing environment variables * Incompatible Meteor version (check [supported versions](/docs/apps/meteor/supported-versions)) Check your app's build logs in the Galaxy dashboard. Common causes: * Missing dependencies in `package.json` * Invalid Meteor settings JSON (check syntax) * Run `meteor build` locally to reproduce the error Verify you pasted valid JSON in the Meteor Settings field. Check your app logs to see if `Meteor.settings` is populated. You can test by opening your browser console and typing `Meteor.settings`. Make sure the Galaxy app has access to your account or organization on your Git provider. If you recently granted access, try refreshing the page. Your Bitbucket workspaces may not have webhooks registered. During setup, look for the warning banner on the Repository step and click **Register webhooks now**. *** ## What's Next? --- # Secure Secrets Management for Meteor Apps (https://help.galaxycloud.app/docs/apps/meteor/secrets-management) Committing a `settings.json` file with real credentials is one of the most common Meteor security mistakes. If your repository ever goes public, gets forked, or your image ends up in a public registry, those credentials are exposed permanently. Git history never forgets. *** ## The Essential Setup Two things to do right now if you haven't already. ### Update Your `.gitignore` Add these entries so secrets files never get committed accidentally: ``` settings.json settings-*.json .settings-*.json env/ ``` ### Commit a Settings Template Keep a `settings.example.json` in your repository as documentation. This is safe to commit because it contains no real values. It shows your team exactly what configuration they need. ```json { "galaxy.meteor.com": { "env": { "MONGO_URL": "YOUR_MONGO_URL", "MAIL_URL": "YOUR_MAIL_URL" } }, "private": { "stripeKey": "YOUR_STRIPE_KEY" }, "public": { "appName": "My App" } } ``` Removing them from current files isn't enough. They're still in your Git history. Use [BFG Repo-Cleaner](https://rtyley.github.io/bfg-repo-cleaner/) to scrub them. Test on a clone first since BFG rewrites history and anyone with a local copy will need to re-clone. After cleanup, rotate every credential that was ever committed. Assume they've been exposed. *** ## Using a Secrets Manager A secrets manager stores credentials securely and injects them at deploy time. No secrets in code. No secrets in Git. Popular options: * [Infisical](https://infisical.com): Open source with a generous free tier * [Doppler](https://www.doppler.com): Universal secrets platform with team features * [HashiCorp Vault](https://www.vaultproject.io): Enterprise-grade * [AWS Secrets Manager](https://aws.amazon.com/secrets-manager/): Native AWS integration The pattern is the same regardless of which you choose: store your `settings.json` content as a secret (for example, a variable named `SETTINGS_JSON`), fetch it at deploy time, write it to a temp file, deploy, then delete the temp file. *** ## Deploy Script Here's a minimal deploy script using Infisical. The same pattern works with any secrets manager. ```bash #!/bin/bash set -e APP_NAME="my-app" ENVIRONMENT="prod" TEMP_SETTINGS=".settings-deploy-$$.json" infisical secrets get SETTINGS_JSON --env=$ENVIRONMENT --plain > $TEMP_SETTINGS meteor deploy $APP_NAME --settings $TEMP_SETTINGS rm -f $TEMP_SETTINGS ``` Make it executable with `chmod +x deploy.sh`, then run `./deploy.sh`. The temp file is cleaned up automatically even if deployment fails. For multiple environments, pass different values: ```bash ENVIRONMENT=staging APP_NAME=staging.myapp.com ./deploy.sh ENVIRONMENT=prod APP_NAME=myapp.com ./deploy.sh ``` *** ## CI/CD Automation For automated deployments from GitHub Actions, store your secrets manager credentials and your `METEOR_TOKEN` (from `~/.meteor/meteor_token.json`) as [GitHub Actions secrets](https://docs.github.com/en/actions/security-guides/encrypted-secrets). Then fetch your `SETTINGS_JSON` from the secrets manager during the workflow, write it to disk, deploy, and clean up. See the [Infisical GitHub Actions docs](https://infisical.com/docs/integrations/cicd/githubactions) for a complete example using Machine Identity authentication. *** ## Security Best Practices Rotate credentials every 90-180 days. Compromised credentials that get rotated frequently limit the damage window significantly. Not everyone needs access to production secrets. Limit access to only the people who actually need it. Your staging environment shouldn't have the same access controls as production. Never use production database credentials in development. If your dev environment gets compromised, production data stays safe. Private repositories can become public by accident: a misconfigured setting, a team member leaving, an acquisition. Treat secrets as if they could be exposed at any time. Most secrets managers provide audit logs. Review them periodically and look for unusual access patterns. Yes. Galaxy supports `METEOR_SETTINGS` as an environment variable in the [Variables tab](/docs/dashboard/apps/variables). Set your full settings JSON there. This is the simplest approach if you're using Push to Deploy and don't need the additional features a dedicated secrets manager provides. Use encrypted secrets built into your CI/CD system directly. GitHub Actions, GitLab CI, and others all support encrypted secrets. Store your entire `settings.json` content as a secret, write it to disk during the workflow, deploy, then clean up. If you're using Galaxy's built-in MongoDB (deployed with the `--mongo` flag), Galaxy sets `MONGO_URL` automatically. You don't need to include it in your settings file. *** ## What's Next? --- # Meteor Version Support Status (https://help.galaxycloud.app/docs/apps/meteor/supported-versions) So you're running a Meteor app on Galaxy. Great! But which version should you be on? And how long will it actually be supported? Let's break it down. ## What Galaxy Hosts Here's the good news: Galaxy hosts all major Meteor versions right now. | Version | Galaxy Hosting | | ---------- | -------------- | | Meteor 1.x | ✅ Supported | | Meteor 2.x | ✅ Supported | | Meteor 3.x | ✅ Supported | Now the important part: this doesn't mean all versions are created equal. ## What the Meteor Core Team Supports Galaxy's hosting support is different from the Meteor core team's support. The core team maintains the framework itself, and they've set different expectations for each version. 🚫 **Meteor 1.x: End-of-Life** Not getting any more love here. No security patches. No bug fixes. If something breaks, you're on your own. The core team strongly recommends upgrading. 🚫 **Meteor 2.x: End-of-Life** This one already reached the end. It entered maintenance mode in July 2025 and reached end-of-life in December 2025. No more security patches. No more support. Not getting any love here either. The core team strongly recommends upgrading. ✅ **Meteor 3.x: Actively Supported** This is where the action is. Full development. Bug fixes. Feature additions. It includes modern improvements too, like ESM support and SWC compilation. The core team recommends you upgrade here. ## What Should You Actually Do? If you're on Meteor 1.x or 2.x, start planning an upgrade to Meteor 3.x. Not immediately, necessarily, but sooner rather than later. Galaxy will keep hosting your version, but the Meteor core team won't be maintaining it. Think of it this way: Galaxy is the hotel, and Meteor is the furniture. Galaxy keeps the lights on no matter what version you're using. But Meteor only builds new furniture for 3.x now. Both 1.x and 2.x are done getting any updates from the core team. This doesn't have to be an emergency. If your app is stable and not hitting version-specific problems, you have time. Just make a plan. The sooner you upgrade, the longer you'll have access to improvements and security patches. ## Ready to Upgrade? Have questions about your migration path? The Meteor community forums are super helpful. You can also reach out on GitHub where the core team hangs out. And Galaxy support is here if you hit hosting-specific issues during your upgrade. Don't worry, you've got help. *** **Ready to deploy a Meteor app?** Start with [Deploy a Meteor App](/docs/apps/meteor/push-to-deploy). **Want to explore more?** Check out the [Meteor section](/docs/apps) of the documentation. --- # Transfer an App to Another Account (https://help.galaxycloud.app/docs/apps/transfer-apps) Need to hand an app off to a colleague, or move it from your personal account into an organization? Galaxy handles transfers from the dashboard. The app keeps its configuration and domains, and the destination account owner approves the move before anything happens. **What you'll need**: Owner access to the account that currently holds the app, plus the exact username or organization name of the destination account. *** ## Who Can Transfer an App Transfers are owner-only on both sides. On the sending side, only the exact owner of the account that holds the app can start a transfer. Organization admins, developers, and viewers see the **Transfer App** button disabled with a tooltip explaining why. On the receiving side, only the owner of the destination account can accept or reject. Other members of that organization won't see the request at all. *** ## How a Transfer Works Every transfer runs in three stages. **Request**: You pick a destination account and confirm the app name. Galaxy validates the destination and creates the request. **Approval**: The destination account owner accepts or rejects. Nothing moves until they accept. **Move**: Galaxy moves the app to the destination account. Credentials and integrations that belong only to the source account are disconnected once the app is healthy in its new home. If something goes wrong partway through, Galaxy automatically restores the app in the source account. You don't need to do anything to trigger that. *** ## Send a Transfer Request ### Open the Danger Zone Open the app you want to move, go to **Settings**, and scroll to **Danger Zone**. The **Transfer App** section sits just above **Delete App**. ### Start the Transfer Click **Transfer App**. A confirmation modal opens. ### Name the Destination In **Destination account**, enter the personal account username or the organization name you're transferring to. Galaxy validates it when you submit. ### Confirm the App Name Type the app's name exactly as it appears. **Request Transfer** stays disabled until the name matches and a destination is filled in. ### Send It Click **Request Transfer**. Galaxy confirms with a "Transfer request sent" notification, and a status alert appears at the top of the Danger Zone. While a transfer is pending, running, or recovering, both **Transfer App** and **Delete App** are disabled. You'll see a tooltip asking you to wait for the current transfer to finish. *** ## Accept or Reject an Incoming Transfer If someone sends you an app, Galaxy surfaces it in two places. A banner titled **Incoming app transfer** appears at the top of any dashboard page, naming the app and the account it came from. Click **Review transfer** to open the review modal. The same list also lives in **Settings** on your account page, under **Incoming App Transfers**. Both spots give you **Accept** and **Reject** for each request. Accept and Galaxy starts preparing the app in your account. Reject and the source account keeps it. An accepted app arrives with its configuration and domains, and the source account loses its credentials and access to it. If you weren't expecting a transfer, confirm with the sender before accepting. *** ## Track the Status The Danger Zone shows the current state of any transfer tied to the app, refreshing on its own. These are the states you'll see: **Pending acceptance**: Waiting for the destination account owner to accept. **Running**: The transfer is in progress. **Completed**: The app now belongs to the destination account. **Rejected**: The destination account owner turned it down. The app stays where it is. **Canceled**: You canceled the request before it was accepted. **Expired**: The request timed out before the destination accepted it. **Failed**: The transfer didn't complete. The app stays with the source account, and Galaxy shows the reason. **Recovery required**: The transfer failed and Galaxy is automatically restoring the source app. *** ## Cancel a Pending Request Changed your mind before the other side accepted? Open the Danger Zone and click **Cancel Transfer** in the status alert, then confirm. The button only appears while the request is pending acceptance. Once you cancel, the destination can no longer accept it, and the app stays in your account. *** ## Transferring Between Your Own Accounts If you own both the source and the destination account, there's no approval step. Galaxy starts the move immediately and tells you the app is on its way. This applies when you're the exact owner of both, for example moving an app from your personal account to an organization you own. *** ## The CLI Method Is Deprecated `meteor authorized --transfer` no longer transfers apps. Galaxy rejects the request and points you to the dashboard instead. The related flags are gone too: `--add` is deprecated, and `--remove` is blocked because an app can't be left without an owner. *** ## Common Questions No. Transfers are restricted to the exact account owner. Admins, developers, and viewers see the button disabled. The app keeps its configuration and domains through the transfer. Credentials and integrations that belong only to the source account are disconnected once the app is healthy in the destination account. The request expires on its own and the app stays in your account. You can send a new request whenever you're ready. Galaxy restores the app in the source account automatically. The Danger Zone shows the failure reason, and destructive actions stay locked until recovery finishes. For personal accounts, it's the username shown in the Galaxy dashboard under your profile. For organizations, it's the organization name shown in the account switcher. No. `meteor authorized --transfer` is rejected and redirects you to the dashboard. Use the Transfer App control in your app's Danger Zone. *** ## What's Next? --- # Versions and Deployments (https://help.galaxycloud.app/docs/apps/versions-deployments) A **version** is your code. A **deployment** is that code running. Every push creates a new version. Every time Galaxy runs that code (automatically or manually), it creates a new deployment. The same version can have multiple deployments, because you might run the same code with different configuration. *** ## What Triggers a Deployment? | Trigger | What Happened | | --------------- | ------------------------------------------------------------ | | Webhook | A push to your Git repository triggered automatic deployment | | Manual | Someone clicked **Deploy Now** in the dashboard | | API | A CLI command or programmatic API call | | Rollback | Someone redeployed a previous version | | Env Var Update | An environment variable change triggered a hot-swap | | Retry | Someone manually retried a failed deployment | | Automatic Retry | Galaxy automatically retried a failed deployment | Configuration changes (variables, container size) create a new deployment of your current version. They don't create a new version. Code changes create a new version. *** ## How Galaxy Keeps Your App Live Galaxy uses different strategies depending on what changed. The goal is always zero downtime. | Operation | Strategy | Result | | --------------------------- | -------------------------- | ---------------------------------------------------------- | | New deploy | Blue-Green | Builds in the inactive slot, switches traffic once healthy | | Environment variable change | Hot-swap | Rolling restart in the same slot | | Plan: Free to Paid | Blue-Green (cross-cluster) | Domain changes from Free to Paid URL | | Plan: Paid to Paid | Database update | No disruption, same cluster | | Plan: Paid to Free | Blue-Green (cross-cluster) | Domain changes from Paid to Free URL | | Container spec change | Rolling Update | Pods replaced with zero downtime | | Rollback | Blue-Green | Traffic switches to previous slot (about 1-2 seconds) | | Scale up/down | Direct patch | No pod replacement needed | | Restart | Rolling Update | Pods replaced gracefully in the same slot | Galaxy keeps two deployment slots for your app. New code builds in the inactive slot. Once healthy, traffic switches instantly. If anything fails, your previous slot is still running. Galaxy's rolling update strategy uses `maxSurge: 1, maxUnavailable: 0`. New containers spin up before old ones shut down. Your app never goes offline. *** ## Common Scenarios **You push new code.** Galaxy detects the commit, creates a new version, and deploys it automatically. One push, one version, one deployment. **You fix a broken environment variable.** Go to **Variables**, update the value, and click **Deploy**. Galaxy creates a new deployment of your current version (no new version, no rebuild). Your app restarts with the fixed config. **You need to roll back.** Go to **Versions**, find the last stable version, and click **Redeploy**. Galaxy deploys that old version as a new deployment. Takes about 1-2 seconds. Your users won't notice. *** ## Common Questions No. You get a new deployment of your current version. The version number stays the same. Yes. Go to **Versions**, find the version you want, and click **Redeploy**. Your app switches to that version instantly. You deployed the same code more than once, usually because you changed configuration (variables, container size) and redeployed. Same version, different deployments. Check the deployment logs to find out why. Fix the issue and deploy again. Your previous version keeps running until the new one passes health checks. No. Versions are kept indefinitely. You can roll back to any previous version at any time. No. Galaxy spins up new containers before shutting down old ones, and only switches traffic once the new deployment is healthy. *** ## What's Next? --- # AdonisJS Reference (https://help.galaxycloud.app/docs/apps/webapps/adonisjs-reference) ## Environment Variables Set these in the Galaxy deployment form or your app's Settings page. ### Required Variables | Variable | Description | | ---------- | ------------------------------------------------------------------- | | `PORT` | Port your app listens on (AdonisJS default is 3333) | | `APP_KEY` | 32-character encryption key (generate with `node ace generate:key`) | | `NODE_ENV` | Set to `production` for live apps | ### Optional Variables | Variable | Default | Description | | ---------------- | -------- | ---------------------------------------------------------------------- | | `TZ` | `UTC` | Timezone for your app | | `LOG_LEVEL` | `info` | Logging verbosity (`trace`, `debug`, `info`, `warn`, `error`, `fatal`) | | `SESSION_DRIVER` | `cookie` | Session storage (`cookie`, `file`, `redis`, `memory`) | | `DRIVE_DISK` | `local` | File storage driver (`local`, `s3`) | *** ## Database Configuration ### Connection Variables ```bash DB_CONNECTION=pg DB_HOST=your-postgres-host DB_PORT=5432 DB_USER=your-username DB_PASSWORD=your-password DB_DATABASE=your-database ``` ```bash DB_CONNECTION=mysql DB_HOST=your-mysql-host DB_PORT=3306 DB_USER=your-username DB_PASSWORD=your-password DB_DATABASE=your-database ``` ```bash DB_CONNECTION=sqlite DB_DATABASE=./database/db.sqlite3 ``` SQLite is not recommended for production. Use PostgreSQL or MySQL with persistent storage instead. ### Lucid ORM Configuration If using Galaxy's managed databases, update your database config: ```typescript // config/database.ts const dbConfig = defineConfig({ connection: env.get('DB_CONNECTION', 'pg'), connections: { pg: { client: 'pg', connection: { connectionString: env.get('DATABASE_URL'), ssl: { rejectUnauthorized: false } }, pool: { min: 2, max: 10 } } } }) ``` ### Running Migrations Run database migrations automatically on every deployment using the **Pre-Deploy Command**. This command executes after the build completes but before your app starts, within your private network with access to your environment variables. In Galaxy, set the **Pre-Deploy Command** to: ``` node ace migration:run --force ``` Set this during initial deployment or later in your app's **Settings** page under **Build Commands**. Pre-deploy commands require a paid plan. Always backup your database before running migrations in production. *** ## Advanced Configuration ### Custom Build Commands Override the defaults in your `package.json`: ```json { "scripts": { "build": "node ace build --production && node ace optimize", "start": "node bin/server.js" } } ``` Then in Galaxy, set Build Command to `npm run build`. ### Health Check Endpoint ```typescript // start/routes.ts router.get('/health', async ({ response }) => { return response.ok({ status: 'healthy', timestamp: new Date().toISOString() }) }) ``` In the Galaxy deployment form, set Health Check Path to `/health`. *** ## Troubleshooting If you see SSL certificate errors, add this to your database config: ```typescript // config/database.ts connections: { pg: { client: 'pg', connection: { connectionString: env.get('DATABASE_URL'), ssl: { rejectUnauthorized: false } } } } ``` Increase connection timeout if queries are timing out: ```typescript // config/database.ts connections: { pg: { client: 'pg', connection: { connectionString: env.get('DATABASE_URL'), connectionTimeoutMillis: 30000 }, pool: { min: 2, max: 10 } } } ``` **Check your credentials**: ```bash # Test connection locally with correct DATABASE_URL psql $DATABASE_URL # Verify Galaxy environment variables are set # Check that DB_USER and DB_PASSWORD are correct ``` *** ## Need Help? * [Galaxy Support](/docs/getting-started/support) Live chat is fastest for urgent issues. Available directly from your Galaxy dashboard. --- # AdonisJS (https://help.galaxycloud.app/docs/apps/webapps/adonisjs) Deploy your AdonisJS 6.x app on Galaxy with zero-downtime deploys and autoscaling. ## Prerequisites * A [Galaxy account](https://my.galaxycloud.app/signup) * Your AdonisJS app in a Git repo * A [payment method](/docs/getting-started/creating-account) added for identity verification *** ## 1. Prepare Your App Galaxy compiles your TypeScript and runs the output. Three things are required: **Define your scripts in `package.json`:** ```json { "type": "module", "scripts": { "build": "node ace build", "start": "node bin/server.js" } } ``` **Generate an `APP_KEY` (if you haven't already):** ```bash node ace generate:key ``` Copy the output. You'll set this as an environment variable in Galaxy. **Listen on `process.env.PORT`:** AdonisJS reads `PORT` from your `.env` by default. Galaxy sets it automatically, so no code change is needed. Just make sure you're not hardcoding a port in `bin/server.ts`. *** ## 2. Deploy ### Connect your repo Go to your [Galaxy dashboard](https://my.galaxycloud.app), click **Create New**, then **Deploy New App**. Select **AdonisJS** as the app type and connect your GitHub or Bitbucket account. ### Select repo and branch Pick your repository and the branch to deploy from (usually `main`). ### Choose plan and container Select a plan (Sandbox for testing, Production for live apps) and a container size. Start small, scale later. ### Set environment variables and deploy Add your `APP_KEY`, `NODE_ENV=production`, and any database variables. Hit **Deploy**. Galaxy runs `npm install`, `npm run build`, and `npm start` automatically. Every push to your deploy branch triggers a new deployment automatically. ### Install the CLI ```bash npm install -g @galaxy-cloud/cli ``` ### Log in ```bash galaxy login ``` ### Deploy From your project root: ```bash galaxy deploy my-app-name ``` For more CLI options, see the [Galaxy CLI guide](/docs/apps/webapps/galaxy-cli). *** ## 3. Configure (Optional) **Database migrations**: Set a Pre-Deploy Command to `node ace migration:run --force` (paid plans only). **Health check path**: Point Galaxy at `/health` (you'll need to add a route for it). **Environment variables**: See the [AdonisJS Reference](/docs/apps/webapps/adonisjs-reference) for the full list, including database configuration. *** ## 4. Try It *** ## Troubleshooting **Most common cause**: missing or invalid `APP_KEY`. ```bash # Generate a new key node ace generate:key # Copy the output and set it as APP_KEY in Galaxy ``` Also check: * `NODE_ENV=production` is set * Your `start` script points to `node bin/server.js` * All production dependencies are in `dependencies` Run your build locally first: ```bash npm install && npm run build && npm start ``` Common causes: TypeScript errors, missing `@adonisjs/assembler` in devDependencies, or incorrect `tsconfig.json`. * Verify your database URL or credentials in Galaxy environment variables * Make sure the database is in the same region as your app * For PostgreSQL SSL errors, add `ssl: { rejectUnauthorized: false }` to your Lucid config * See the [AdonisJS Reference](/docs/apps/webapps/adonisjs-reference) for full database configuration *** ## What's Next? --- # Galaxy CLI (https://help.galaxycloud.app/docs/apps/webapps/galaxy-cli) This guide is for Web Apps. For Meteor, use the [Meteor CLI](/docs/apps/meteor/cli) instead. ## Prerequisites * Node.js 18 or higher * A [Galaxy account](https://my.galaxycloud.app/signup) * A [payment method](/docs/getting-started/creating-account) added for identity verification *** ## Quick Start ```bash npm install -g @galaxy-cloud/cli galaxy login galaxy init galaxy deploy ``` *** ## Install ```bash npm install -g @galaxy-cloud/cli ``` ```bash npx @galaxy-cloud/cli login npx @galaxy-cloud/cli init npx @galaxy-cloud/cli deploy ``` *** ## Deploy ### Authenticate ```bash galaxy login ``` Opens your browser for OAuth. Run `galaxy whoami` to confirm your account. ### Initialize your project ```bash galaxy init ``` The CLI walks you through setup: app name, app type (Node.js, Next.js, AdonisJS, or Python), runtime version, plan, region, container size, and build commands. Next.js apps require `output: 'standalone'` in your `next.config.ts`. The CLI validates this and shows an error if it's missing. ### Deploy ```bash galaxy deploy ``` The CLI packages your code, builds a Docker image, and deploys. Logs stream in real-time. Each deployment creates a new version with zero downtime. Every future deploy is just `galaxy deploy` from your project directory. *** ## Configuration Files **`.galaxy/config.json`** (private): Links your directory to a Galaxy app. Created during `galaxy init` or `galaxy link`. Never commit this to Git. **`galaxy.json`** (shareable): Your deployment configuration. Safe to commit so your team shares the same settings. ```json { "commands": { "install": "npm install", "build": "npm run build", "start": "npm start" }, "health": { "path": "/health" }, "deploy": { "rootDirectory": "./" } } ``` **`.galaxyignore`** (optional): Exclude files from deployments, like `.gitignore`. Default patterns (`.git/`, `node_modules/`, `*.log`, `.env`) apply automatically. Maximum archive size is 100MB. *** ## Command Reference ### Authentication | Command | Description | | --------------- | ----------------------------------- | | `galaxy login` | Authenticate via browser | | `galaxy logout` | Clear local credentials | | `galaxy whoami` | Show current user and organizations | ### Project Setup | Command | Description | | ------------------------------------ | ---------------------------------------- | | `galaxy init` | Create a new app and link your directory | | `galaxy link ` | Link to an existing app | | `galaxy link --with-config` | Link and pull config from backend | | `galaxy unlink` | Disconnect directory from app | | `galaxy config` | Show and validate current configuration | Grab it from your dashboard URL: `https://my.galaxycloud.app/{account}/{region}/apps/{appId}/overview` ### Deployment | Command | Description | | ---------------------------- | ------------------------------------ | | `galaxy deploy` | Deploy with real-time log streaming | | `galaxy deploy --path ` | Deploy from a specific directory | | `galaxy deploy --env ` | Deploy with env vars from a file | | `galaxy deploy --detach` | Fire-and-forget (skip log streaming) | ### Logs | Command | Description | | ------------------------------- | -------------------------- | | `galaxy logs --deployment ` | View build and deploy logs | ### Environment Variables Galaxy uses a staging workflow: make changes, then deploy them. | Command | Description | | -------------------------------- | ----------------------------------- | | `galaxy variables` | List all variables (values masked) | | `galaxy variables --env ` | Import variables from a `.env` file | | `galaxy variables:set KEY VALUE` | Stage a variable change | | `galaxy variables:unset KEY` | Stage a variable deletion | | `galaxy variables:deploy` | Apply all pending changes | | `galaxy variables:status` | Check for pending changes | | `galaxy variables:diff ` | See what changed in a deployment | `variables:set` and `variables:unset` only stage changes. Run `galaxy variables:deploy` to apply them. Use `variables:deploy` for config-only changes (fast, no build). Use `galaxy deploy` when your code changed. To do both at once: `galaxy deploy --env .env.production`. *** ## Team Collaboration When teammates clone your repo, they run `galaxy link ` to connect their local directory, then deploy normally. The `galaxy.json` file is safe to commit. The `.galaxy/config.json` file is gitignored and machine-specific. Want automatic deployments? Connect any CLI-created app to GitHub or Bitbucket from the Galaxy dashboard. See the [Push to Deploy guide](/docs/apps/webapps/push-to-deploy). Switching to Git doesn't disable the CLI. *** ## Troubleshooting Make sure you can access the [Galaxy dashboard](https://my.galaxycloud.app). Behind a corporate firewall? Check that OAuth redirects aren't blocked. Maximum size is 100MB. Add patterns to `.galaxyignore` to exclude large files. Common culprits: `node_modules/`, build artifacts, media files. `variables:set` and `variables:unset` only stage changes. Run `galaxy variables:deploy` to apply them. Make sure your app responds on the configured health check path. Check your app logs in the dashboard for startup errors. Next.js apps require `output: 'standalone'` in your `next.config.ts`. The CLI validates this during `galaxy init`. If you're behind a firewall, SSE connections might be blocked. Use `galaxy deploy --detach` and check logs in the dashboard. *** ## What's Next? --- # Node.js Reference (https://help.galaxycloud.app/docs/apps/webapps/node-reference) ## Environment Variables Set these in the Galaxy deployment form or your app's Settings page. ### Core Variables | Variable | Required | Default | Description | | -------------- | -------- | ------- | ------------------------------------------------------------ | | `PORT` | Yes | 3000 | Port your app listens on. Galaxy assigns this automatically. | | `NODE_ENV` | Yes | (none) | Set to `production` for live apps | | `NODE_OPTIONS` | No | (none) | Extra Node.js flags (e.g., `--max-old-space-size=512`) | ### Common Application Variables | Variable | Default | Description | | ----------- | ------- | ------------------------------------------------------------- | | `LOG_LEVEL` | `info` | Logging verbosity (`trace`, `debug`, `info`, `warn`, `error`) | | `TZ` | `UTC` | Timezone for your app | *** ## Advanced Configuration ### Custom Build Commands If you need build steps (bundling, TypeScript compilation, etc.), define a `build` script in your `package.json`: ```json { "scripts": { "build": "tsc && webpack", "start": "node dist/server.js" } } ``` Then in Galaxy, set: * **Build Command**: `npm run build` * **Start Command**: `npm start` Galaxy runs install, then build, then start. ### Health Check Endpoint Create a simple health check endpoint for Galaxy to monitor: ```javascript app.get('/health', (req, res) => { res.status(200).json({ status: 'ok', timestamp: new Date().toISOString() }); }); ``` In the Galaxy deployment form, set Health Check Path to `/health`. Galaxy checks this endpoint regularly. If it fails, Galaxy knows something's wrong. ### Supported Versions Galaxy supports Node.js 18.x, 20.x, 22.x, and later versions. For best compatibility, use Node.js 20.x or 22.x. Select your Node.js version via the Docker Preset option during deployment or in your app's Settings page. *** ## Need Help? * [Galaxy Support](/docs/getting-started/support) Live chat is fastest for urgent issues. Available directly from your Galaxy dashboard. --- # Node.js (https://help.galaxycloud.app/docs/apps/webapps/node) Deploy your Node.js app on Galaxy with zero-downtime deploys and autoscaling. ## Prerequisites * A [Galaxy account](https://my.galaxycloud.app/signup) * Your app in a Git repo with a `package.json` and a `start` script * A [payment method](/docs/getting-started/creating-account) added for identity verification *** ## 1. Prepare Your App Galaxy runs your `start` script and routes traffic to the port it assigns. Two things are required: **Listen on `process.env.PORT`:** ```javascript const port = process.env.PORT || 3000; app.listen(port, () => console.log(`Listening on ${port}`)); ``` **Define a `start` script in `package.json`:** ```json { "scripts": { "start": "node server.js" } } ``` *** ## 2. Deploy ### Connect your repo Go to your [Galaxy dashboard](https://my.galaxycloud.app), click **Create New**, then **Deploy New App**. Select **Node.js** as the app type and connect your GitHub or Bitbucket account. ### Select repo and branch Pick your repository and the branch to deploy from (usually `main`). ### Choose plan and container Select a plan (Sandbox for testing, Production for live apps) and a container size. Start small, scale later. ### Configure and deploy Set your app name, region, and any environment variables. Hit **Deploy**. Galaxy clones your repo, runs `npm install`, runs your build command (if set), and starts your app. Every push to your deploy branch triggers a new deployment automatically. ### Install the CLI ```bash npm install -g @galaxy-cloud/cli ``` ### Log in ```bash galaxy login ``` ### Deploy From your project root: ```bash galaxy deploy my-app-name ``` For more CLI options, see the [Galaxy CLI guide](/docs/apps/webapps/galaxy-cli). *** ## 3. Configure (Optional) **Build command**: Set if you need a build step (e.g., `npm run build` for TypeScript or bundlers). **Health check path**: Point Galaxy at an endpoint like `/health` so it can verify your app is running. **Environment variables**: Set them in the deploy form or your app's Settings page. See the [Node.js Reference](/docs/apps/webapps/node-reference) for a full list. *** ## 4. Try It *** ## Troubleshooting **Most common cause**: your app isn't listening on `process.env.PORT`. ```javascript // Wrong app.listen(3000) // Correct app.listen(process.env.PORT || 3000) ``` Also check: * Your `start` script is defined in `package.json` * All production dependencies are in `dependencies` (not `devDependencies`) * Required environment variables are set in Galaxy Run your build locally first to reproduce the error: ```bash npm install && npm run build && npm start ``` Common causes: missing dependencies, TypeScript errors, or incompatible package versions. * Verify your database URL is correct in Galaxy environment variables * Make sure the database is in the same region as your app * For PostgreSQL SSL errors, add `ssl: { rejectUnauthorized: false }` to your connection config * For MongoDB timeouts, increase `connectTimeoutMS` in your connection options *** ## What's Next? --- # Deploy Web Apps (https://help.galaxycloud.app/docs/apps/webapps/push-to-deploy) ## Prerequisites * A [Galaxy account](https://my.galaxycloud.app/signup) * Your app in a Git repo (GitHub or Bitbucket) * A [payment method](/docs/getting-started/creating-account) added for identity verification *** ## 1. Choose Your App Type Select the type that matches your application: * **Node.js**: JavaScript and TypeScript apps (versions 18, 20, and 22 supported) * **Python**: Flask, Django, FastAPI, and other frameworks (versions 3.13, 3.12, 3.11, and 2.7 supported) * **AdonisJS**: TypeScript-first Node.js framework (AdonisJS 6, pre-configured) AdonisJS has its own dedicated app type. Don't select Node.js and configure it manually. *** ## 2. Deploy ### Connect your repo Go to your [Galaxy dashboard](https://my.galaxycloud.app), click **Create New**, then **Deploy New App**. Select your app type and connect your GitHub or Bitbucket account. If a warning banner appears on the Repository step, click **Register webhooks now**, select your workspaces, and click **Register Webhooks**. ### Select repo and branch Pick your repository and the branch to deploy from (usually `main`). ### Choose plan and container Select a plan (Sandbox for testing, Production for live apps) and a container size. Start small, scale later. See [Web Apps Billing](/docs/billing/webapp) for pricing details. ### Choose Your Plan and Container Size Now you're picking the resources for your app. #### Which Account? If you're working with an organization, select it here. Otherwise, your personal account is already selected. #### Pick Your Plan Galaxy offers flexible plans: Sandbox (free, for testing), Production (for live apps), and Business (enterprise, coming soon). Each supports different container sizes and features. Not sure which one is right for you? Start with Production for live apps, or Sandbox for testing and development. You can upgrade or downgrade anytime based on what you actually need. For detailed pricing and feature comparisons, check out the [Web Apps Billing documentation](/docs/billing/webapp). You can change plans anytime after deployment. Don't overthink this choice. #### Select Your Container Size Container size determines how much RAM and CPU your app gets. Bigger containers handle more traffic and heavier workloads, but cost more to run. Start with a smaller container and scale up if you hit performance limits. Most apps do just fine starting smaller and growing as needed. For the complete breakdown of container sizes, CPU allocations, and pricing, see the [Web Apps Billing documentation](/docs/billing/webapp). ### Configure and Deploy You're almost there. This final step is where you customize the deployment itself. #### App Configuration **App Display Name**: Give your application a friendly name. This is just for your reference in the Galaxy dashboard (it's not used in the URL). **Branch**: Which branch should Galaxy watch and deploy from? Most teams deploy from `main` or `master`, but choose whatever branch makes sense for your workflow. Every push to this branch triggers an automatic deployment. **Custom Subdomain**: Choose a memorable subdomain for your app (3-63 characters). This becomes your default URL (like `myapp.sandbox.galaxycloud.app`). Don't worry too much about it, though. You can always add a custom domain later. **Region**: Galaxy runs your application across multiple regions to reduce latency: * **us-east-1** (Virginia, United States): East Coast and general US traffic * **eu-west-1** (Roubaix, France): European users * **ap-southeast-2** (Sydney, Australia): Asia Pacific users Sandbox (free) apps are deployed to **us-east-1** by default and don't include region selection. Production plans can choose any region during deployment. Want to change regions later? Upgrade to Production from your app's dashboard. #### Build Configuration This section varies depending on which app type you selected in Step 1. * **Docker Preset**: Node.js version (18, 20, or 22 LTS) * **Install Command**: Usually `npm install` * **Build Command**: Optional. Use `npm run build` for TypeScript or bundling * **Start Command**: Usually `npm start` * **Docker Preset**: Python version (3.12 or 3.13 recommended) * **Install Command**: Usually `pip install -r requirements.txt` * **Build Command**: Optional. Most Python apps don't need one * **Start Command**: Like `python main.py` or `gunicorn app:app` AdonisJS apps come pre-configured. Install, build, and start commands are pre-filled. Hit **Deploy**. Galaxy builds your app, starts your container, and runs health checks. Within a few minutes your app is live. Every push to your deploy branch triggers a new deployment automatically. *** ## 3. Configure (Optional) **Region**: us-east-1 (Virginia), eu-west-1 (Roubaix, France), or ap-southeast-2 (Sydney). Sandbox apps deploy to us-east-1 by default. **Health Check Path**: Optional endpoint Galaxy pings to verify your app is running (like `/` or `/health`). **Pre-deploy command**: Run database migrations or other tasks before the new version goes live (paid plans only). **Custom domain**: Your app gets a default URL like `myapp.sandbox.galaxycloud.app`. You can add a custom domain later. *** ## Troubleshooting Check the logs in your Galaxy dashboard. Common causes: * Incorrect start command * Missing environment variables * App not reading the `PORT` environment variable Check your app's build logs in the Galaxy dashboard. Common causes: * Missing dependencies in `package.json` or `requirements.txt` * Incorrect build command * Run your install command locally to reproduce the error Your previous version keeps running. Check the Pre-Deploy logs in your deployment details. Common causes: incorrect command, missing environment variable, or a database connection issue. Fix and push again. Make sure the Galaxy app has access to your account or organization on your Git provider. If you recently granted access, try refreshing the page. Your Bitbucket workspaces may not have webhooks registered. During setup, look for the warning banner on the Repository step and click **Register webhooks now**. *** ## What's Next? --- # Python Reference (https://help.galaxycloud.app/docs/apps/webapps/python-reference) ## Environment Variables Set these in the Galaxy deployment form or your app's Settings page. ### Core Variables | Variable | Required | Default | Description | | ------------------ | -------- | ------- | ------------------------------------------------------------ | | `PORT` | Yes | 5000 | Port your app listens on. Galaxy assigns this automatically. | | `PYTHONUNBUFFERED` | Yes | (none) | Set to `1` to ensure immediate output flushing | | `PYTHON_VERSION` | No | (none) | Specify Python version if needed | ### Common Application Variables | Variable | Default | Description | | ----------- | ------- | --------------------------------------------- | | `DEBUG` | `false` | Enable debug mode (set to `0` for production) | | `LOG_LEVEL` | `info` | Logging verbosity | | `TZ` | `UTC` | Timezone for your app | *** ## Advanced Configuration ### Custom Build Commands Most Python apps don't need a build step. If yours does, set it in Galaxy: * **Build Command**: Custom command (e.g., `python manage.py collectstatic --noinput`) * **Start Command**: `gunicorn app:app` or `python main.py` Galaxy runs install, then build (if set), then start. ### Health Check Endpoint Create a simple health check endpoint for Galaxy to monitor: ```python @app.route('/health') def health(): return { 'status': 'ok', 'timestamp': datetime.now().isoformat() }, 200 ``` In the Galaxy deployment form, set Health Check Path to `/health`. ### Supported Versions Galaxy supports Python 3.10, 3.11, 3.12, 3.13, and Python 2.7 (legacy). For best compatibility, use Python 3.12 or 3.13. Select your Python version via the Docker Preset option during deployment or in your app's Settings page. *** ## Need Help? * [Galaxy Support](/docs/getting-started/support) Live chat is fastest for urgent issues. Available directly from your Galaxy dashboard. --- # Python (https://help.galaxycloud.app/docs/apps/webapps/python) Deploy your Python app on Galaxy with zero-downtime deploys and autoscaling. ## Prerequisites * A [Galaxy account](https://my.galaxycloud.app/signup) * Your app in a Git repo with a `requirements.txt` (or `pyproject.toml`) * A [payment method](/docs/getting-started/creating-account) added for identity verification *** ## 1. Prepare Your App Galaxy installs your dependencies and runs your start command. Two things are required: **Listen on the `PORT` environment variable:** ```python port = int(os.getenv('PORT', 5000)) app.run(host='0.0.0.0', port=port) ``` **List your dependencies in `requirements.txt`:** ``` Flask==2.3.0 gunicorn==20.1.0 ``` *** ## 2. Deploy ### Connect your repo Go to your [Galaxy dashboard](https://my.galaxycloud.app), click **Create New**, then **Deploy New App**. Select **Python** as the app type and connect your GitHub or Bitbucket account. ### Select repo and branch Pick your repository and the branch to deploy from (usually `main`). ### Choose plan and container Select a plan (Sandbox for testing, Production for live apps) and a container size. Start small, scale later. ### Configure and deploy Set your app name, region, start command (e.g., `gunicorn app:app` or `python main.py`), and any environment variables. Hit **Deploy**. Galaxy installs your dependencies via `pip install -r requirements.txt` and starts your app. Every push to your deploy branch triggers a new deployment automatically. ### Install the CLI ```bash npm install -g @galaxy-cloud/cli ``` ### Log in ```bash galaxy login ``` ### Deploy From your project root: ```bash galaxy deploy my-app-name ``` For more CLI options, see the [Galaxy CLI guide](/docs/apps/webapps/galaxy-cli). *** ## 3. Configure (Optional) **Start command**: Set how Galaxy starts your app (e.g., `gunicorn app:app`, `uvicorn main:app --host 0.0.0.0`). **Health check path**: Point Galaxy at an endpoint like `/health` so it can verify your app is running. **Environment variables**: Set `PYTHONUNBUFFERED=1` for proper log output. See the [Python Reference](/docs/apps/webapps/python-reference) for a full list. *** ## 4. Try It *** ## Troubleshooting **Most common cause**: your app isn't listening on the `PORT` environment variable. ```python # Wrong app.run(port=5000) # Correct port = int(os.getenv('PORT', 5000)) app.run(host='0.0.0.0', port=port) ``` Also check: * Your start command is correct * All dependencies are listed in `requirements.txt` * Required environment variables are set in Galaxy Run your install locally first: ```bash pip install -r requirements.txt && python app.py ``` Common causes: missing packages, version conflicts, or packages that need system libraries (like `psycopg2`, try `psycopg2-binary` instead). * Verify your database URL is correct in Galaxy environment variables * Make sure the database is in the same region as your app * For PostgreSQL, use `psycopg2-binary` if `psycopg2` compilation fails * For MongoDB, check that your connection string includes the correct auth database *** ## What's Next? --- # What Happens If You Don't Pay Your Invoice (https://help.galaxycloud.app/docs/billing/account-status) Life happens, and sometimes a payment doesn't go through. Galaxy won't pull the plug the moment that happens, but it will gradually restrict your account if the issue isn't resolved. This article walks you through each account status, what it means for your apps, and exactly how to fix it. A failed payment first puts your account on **probation** (your apps keep running, but you can't deploy or change plans). If it stays unpaid past the grace period, your account moves to **suspension** (your apps get stopped). Updating your payment method and settling the balance brings everything back automatically. *** ## How This Works When an invoice fails to charge, Galaxy doesn't suspend you immediately. Instead, it gives you a grace period (currently 7 days) to update your payment method before anything changes for your apps. Here's the general flow: 1. An invoice payment fails. 2. Your account moves to **Probation**. You'll see a banner in the dashboard letting you know. 3. If the balance isn't settled within the grace period, your account moves to **Suspension**. Your apps are stopped. 4. Once you update your payment information and the outstanding invoice is paid, your account automatically returns to **Active**, and (if it was suspended) your apps are restarted. There's also a separate account status for regions where Galaxy can't legally operate. That's unrelated to payments and is covered in [Service Availability and Geographic Restrictions](/docs/security-compliance/service-availability). *** ## Account Status: Active This is the normal, healthy state. If your payment method is valid and your invoices are paid, you're here. No restrictions, nothing to do. *** ## Account Status: Probation **What it means**: Your most recent invoice failed to charge. Galaxy is giving you a window to fix your payment method before anything more serious happens. **What still works**: **Existing apps keep running**: Probation doesn't touch your running apps. They stay online exactly as they are. **Dashboard access**: You can log in, view your apps, check usage, and see your billing information normally. **What's restricted while on probation**: * You can't create new apps * You can't deploy or redeploy existing apps * You can't upgrade or downgrade your subscription (no plan changes, no adding databases or addons) If you're on probation and try to push a new deploy, it won't go through. Your app keeps running its last successful deploy, but new code won't ship until your account is back to active. **How to fix it**: Head to your billing settings and update your payment method, then make sure any outstanding invoice gets paid. Once the payment goes through, your account returns to **Active** automatically, no waiting, no support ticket needed. *** ## Account Status: Suspended **What it means**: The invoice stayed unpaid past the grace period (7 days by default). At this point, Galaxy stops your apps to limit further usage charges while the issue gets sorted out. **What's restricted while suspended**: * All of your apps are stopped automatically * Your apps stay offline until the suspension is resolved * You can't create new apps * You can't deploy or redeploy existing apps * You can't manually start or stop apps (the start/stop controls are disabled) * You can't upgrade or downgrade your subscription Suspension stops every app on your account. They're not deleted, and your data isn't touched, but they won't serve traffic until your account is active again. **Dashboard access**: You can still log in. You'll see a red banner across the dashboard letting you know your account is suspended. Your apps, databases, and settings are all still visible, just locked for the actions listed above. **How to fix it**: Update your payment method and settle the outstanding balance. Once the payment is confirmed, Galaxy automatically reactivates your account and restarts your apps. If you run into trouble or need a hand, [contact our support team](/docs/getting-started/support) and we'll help you sort it out. *** ## Quick Reference | Status | Apps Running? | Deploy? | Start/Stop Apps? | Create New Apps? | Change Plan? | Dashboard Access? | | --------- | --------------- | ------- | ---------------- | ---------------- | ------------ | ----------------- | | Active | Yes | Yes | Yes | Yes | Yes | Full | | Probation | Yes (unchanged) | No | Yes | No | No | Full | | Suspended | No (stopped) | No | No | No | No | View only | *** ## Common Questions No. Suspension stops your apps, but your code, databases, and configuration stay exactly as they were. Once your account is active again, everything restarts as expected. By default, you have 7 days from the failed invoice before your account moves from probation to suspension. Nope. Once your payment method is updated and the outstanding invoice is paid, your account status updates automatically. If your apps were stopped due to suspension, they'll restart on their own too. Yes. You can log in and view your apps, databases, and billing details at any time. You just won't be able to deploy, start, stop, or create apps until the account is active again. The same process applies. A new failed invoice puts you back on probation, with the same grace period before suspension kicks in if it's not resolved. [Contact our support team](/docs/getting-started/support) and we'll take a look. We're happy to help straighten it out. *** ## What's Next? --- # Redeeming a Coupon Code (https://help.galaxycloud.app/docs/billing/coupon-code) Got a promo code? Applying it to your account takes less than a minute. Galaxy requires a valid payment method on file before a coupon can be activated. Make sure your billing info is set up before you enter the code. ### Go to Billing In the left sidebar, click **Billing**. This opens your Personal Billing page, where you can manage your payment method, view current usage, and apply promo codes. ### Add a Payment Method If you haven't added one yet, look for the **Billing & Payment Method** section and click **Update Billing**. Fill in your card details and save. ### Enter Your Coupon Code Scroll down to the **Coupon Code** section. Type your code into the field and click **Apply**. That's it, your discount is now active. *** ## Common Questions Click **Manage Coupon** on the Billing page. You'll see a table with all redeemed codes, their current state (active or inactive), and the redemption date. Galaxy uses your payment method to handle any charges after the coupon credit runs out. It needs to be on file before the code can be activated. Double-check that you've added a valid payment method first. If everything looks right and the code still won't apply, reach out to our support team through the chat widget in the dashboard. *** If you run into any trouble, our [support team](/docs/getting-started/support) is available to help you. ## What's Next? --- # Databases (https://help.galaxycloud.app/docs/billing/database) ### MongoDB Check out the [MongoDB pricing page](https://galaxycloud.app/databases/mongodb/pricing) for the latest plans, including standalone and replicaset options. MongoDB includes automatic daily backups, 24/7 monitoring, and expert support for all plans. **Free MongoDB for Meteor**: Every Meteor app on the Free Plan includes a shared MongoDB cluster. Perfect for testing. ### Redis Check out the [Redis pricing page](https://galaxycloud.app/databases/redis/pricing) for the latest plans and pricing. ### PostgreSQL Check out the [PostgreSQL pricing page](https://galaxycloud.app/databases/postgres/pricing) for the latest plans and pricing. --- # Billing (https://help.galaxycloud.app/docs/billing) Galaxy billing breaks down into two categories: apps and databases. Each works differently, so let's cover them separately. Billing happens monthly, calculated from the beginning to the end of each calendar month. Invoices are emailed to your account email, and you can download them anytime. *** ## App Billing (Pay Per Minute) Think of Galaxy containers like renting a server. You spin one up, and we charge you for every minute it's running. Stop the container or delete your app, and the charges stop. Simple as that. Your app costs depend on three things: Meteor, Node.js, Python, or AdonisJS Free, Essentials, Professional, Sandbox, or Production (varies by runtime) From 256MB up to 12GB Everything is billed by the minute, pro-rated to the second. No surprises. If you stop or delete an app mid-month, you only pay for the time it was actually running. For detailed pricing per runtime, check the specific billing pages: [Meteor Apps](/docs/billing/meteor), [Web Apps](/docs/billing/webapp). *** ## Database Billing (Monthly Plans) Databases work differently. Instead of per-minute charges, you pick a monthly plan based on the resources you need (RAM, CPU, storage). The price is fixed for as long as you're on that plan. Galaxy offers managed databases for three engines: **MongoDB**: Available as standalone or replica set. **PostgreSQL**: Relational database with flexible sizing. **Redis**: In-memory caching and data structures. Need to scale? Upgrade your plan anytime and the new price takes effect immediately. For the full pricing breakdown, check [Database Billing](/docs/billing/database). Every Meteor app on the Free Plan includes a shared MongoDB cluster at no extra cost. Perfect for testing and prototyping. *** ## What You Don't Pay For Good news. These things never affect your bill: Add as many team members as you need. No per-seat charges, ever Scale freely without per-unit charges Deploy as often as you need Between your app and database is free *** ## Payment Methods Galaxy accepts Visa, MasterCard, American Express, and Discover credit cards. Change your payment method anytime in your account settings. *** ## Stopping or Reducing Charges Want to lower your bill? Here are your options: Per-minute charges stop immediately. When you're ready to run the app again, start it back up. Permanently removes it from your account. No more charges, but you can't recover it later. Smaller containers cost less. Drop from Standard to Compact and watch your costs fall (but keep an eye on performance). Running two Standard containers? Drop to one and save money. Switch to a smaller database plan if your current one is overkill. The new price applies immediately. Remove databases you no longer need. Charges stop, but your data is gone for good. *** ## Failed Payments and Account Suspension We'll email you if a payment fails. This usually happens because: * Your card has expired or been reported as compromised * Your bank blocked the charge (some banks require pre-approval for cloud charges) * Payment info in your account is outdated If charges go unpaid, your account will be suspended. While suspended, you can't deploy, start, or run containers. Once payment is made, full access restores immediately. **Stay on top of it:** Keep your email address current and your payment method active. Check for payment notifications regularly. *** ## Estimating Your Costs Here's a quick way to ballpark your monthly bill: **For apps:** 1. Pick your container size from the pricing tables 2. Calculate monthly hours (most apps run 24/7, so 30 days = 720 hours) 3. Multiply the hourly rate by the number of hours 4. Running multiple containers? Multiply by the container count **For databases:** Database costs are simpler. Just pick the plan that fits your needs. The monthly price is what you pay. **Quick example:** Say you're running a Standard Meteor.js container on the Essentials plan 24/7 and pairing it with a Starter MongoDB standalone plan. That's roughly $58/mo for the container plus $12/mo for the database, around $70/mo before tax. The numbers above are just an example to show how costs add up. For current pricing, check the billing pages for [Meteor Apps](/docs/billing/meteor), [Web Apps](/docs/billing/webapp), and [Databases](/docs/billing/database). *** ## Common Questions Billing happens monthly. You'll receive a statement at the start of each month for the previous period's usage. There's no built-in spending cap, but you can monitor usage from the Billing page in your dashboard. Keep an eye on running containers and database plans to control costs. No. Databases use fixed monthly plans. You pick a plan tier and pay the monthly rate for as long as it's active. Apps are the ones billed by the minute. For apps, the new rate kicks in immediately and charges are pro-rated. For databases, the new plan price applies right away as well. *** ## Questions? Still unsure about pricing or which plan fits your needs? [Reach out to our team](/docs/getting-started/support) or use the live chat in your Galaxy dashboard. We're here to help. ## What's Next? --- # Understanding Your Invoice (https://help.galaxycloud.app/docs/billing/invoices) Galaxy invoices are generated on the **5th of each month** and charged to your card on the same day. What appears on yours depends on what you're running: apps, databases, or both. *** ## What Appears on Your Invoice Every invoice starts with a **Base Subscription** line at $0.00. You might see "Base Galaxy Subscription," "Base Database Subscription," or both. These are the subscription records themselves, not actual charges. Your real charges appear as separate line items below them. The charges that follow break down into two categories: app usage and database plans. *** ## App Charges App charges reflect how many hours your containers ran during the billing period. The format of those charges depends on which infrastructure your apps are running on. ### Galaxy Metal Format Apps running on Galaxy Metal generate charges that look like this: ``` Meteor Pro – Double 960.06 $0.22 /Container Hours $211.21 Meteor Pro – Compact 384.55 $0.055 /Container Hours $21.15 ``` Each line shows the plan and container size, the total container hours consumed, the hourly rate, and the subtotal. The date range in the Date column tells you which portion of the billing period those hours cover. Keep in mind: if you run multiple apps at the same plan and container size, their hours are combined into a single line. There won't be a separate entry per app. To see a per-app breakdown, head to the **Usage Summary** section on your [Billing page](/docs/dashboard/billing) in the dashboard. ### Monthly Aggregation Format At the end of each calendar month, Galaxy posts one-time charges to cover any usage that wasn't synced during the normal daily cycle. These appear in a distinct format and do include individual app names: ``` Usage: My App — May 2026 [33.2h X $0.22/h] [meteor-pro-double] $7.31 ``` This tells you the app name, the month covered, the exact hours and rate, and in brackets the plan code. These aren't duplicates: they cover a specific window of time that wasn't already included in the recurring Galaxy Metal lines above. ### Legacy Format Apps that ran on the previous Galaxy infrastructure before migration to Galaxy Metal appear with a different format: ``` us-east-1/my-app.example.com: 744.00 container-hours [Standard: 744.00h @ $0.11/h] $81.84 ``` This shows the AWS region, the full app hostname, the total container hours, the container size and hourly rate in brackets, and the subtotal. The date range typically covers a full calendar month of usage. *** ## Database Charges Database charges are simpler. Each active database appears as a fixed monthly line item with the engine type, configuration, and monthly price: ``` MongoDB Replicaset – Premium Jun 5 – Jul 5, 2026 $369.00 Redis Standalone – Starter Jun 5 – Jul 5, 2026 $14.99 ``` No hourly math, no daily tracking. Just a flat monthly rate for as long as the database plan is active. *** ## When You See Two Different App Charge Formats This is the most common source of confusion. During the migration to Galaxy Metal, an invoice may contain both legacy-format charges and Galaxy Metal-format charges for apps in the same billing period. This happens when some apps were still running on the previous infrastructure while others had already moved to Galaxy Metal. The two formats cover different apps or different portions of the same month. Their date ranges don't overlap. The total on your invoice is correct. Nothing is duplicated. Each legacy charge includes the full app hostname and the Galaxy Metal charges include a plan code in brackets. Between the two, you should be able to match every line to a specific app. If something still doesn't add up, reach out at [support@galaxycloud.app](mailto:support@galaxycloud.app) with your invoice number. *** ## Common Questions Base Galaxy Subscription and Base Database Subscription lines are subscription records, not actual charges. They always appear at $0.00. Your real costs are the usage and plan lines listed below them. Galaxy Metal recurring charges combine all apps running at the same plan and container size into one line. The invoice won't break them out individually. Head to Usage Summary on your Billing page for a per-app view. Recurring charges reflect usage tracked daily throughout the billing period. 'Usage:' lines are end-of-month one-time charges for any hours that weren't synced during the normal cycle. Both cover real usage. They cover distinct time windows and won't overlap. Yes, during the migration to Galaxy Metal. Legacy charges cover apps that were still on the previous infrastructure for part of the month. Galaxy Metal charges cover the portion running on the new system. The date ranges are different, and the total is accurate. No. App charges stop the moment your containers stop running. If you stopped an app on the 15th, the quantity on that line item reflects only the hours it was active. If something looks off, check that the app was fully stopped and not just idle. Depending on your account, app and database charges may appear together on a single invoice or on separate invoices. This depends on how your subscriptions are configured. Either way, the line items are the same: use the Description column to tell them apart. Yes. Go to the Billing page in your dashboard and click View Invoices. Every past invoice is available there as a downloadable PDF with full line-item detail. Invoices are generated and charged on the 5th of the month following the billing period. The billing period itself generally runs from the 5th of one month to the 5th of the next. *** ## What's Next? --- # Meteor Apps (https://help.galaxycloud.app/docs/billing/meteor) ### Container Sizes and Pricing Check out the [Meteor pricing page](https://galaxycloud.app/meteorjs/pricing) for the latest container sizes, hourly rates, and monthly estimates. Your apps start with a **Free Plan**. Upgrade whenever you're ready to go production. ### Plan Features Perfect for learning, testing, and early prototypes. Includes one Tiny container per app and a free MongoDB shared cluster. **Limitations**: Single container only, limited to Tiny size, basic support. Security options aren't included. For MVPs and small production apps. Add multiple containers, scale up in size, and access better support. **Includes**: Multiple containers, any size, email support, SSL certificates, and load balancing. Your production-grade option. Everything in Essentials, plus Monti APM for app performance monitoring and priority support. **Includes**: All Essentials features, plus Monti APM monitoring, priority email support, and advanced security options. --- # Savings Plan (https://help.galaxycloud.app/docs/billing/savings-plan) The Savings Plan is currently available exclusively for Meteor applications. If you're running Node.js, Python, or AdonisJS, standard on-demand billing applies. ## How the Savings Plan Works Here's the deal: you estimate your annual spending, we apply a 20% discount to that amount, then you prepay the discounted total upfront. We split it into twelve months of credits. Quick example: Your average monthly bill is $500, so annually that's $6,000. With the 20% discount, you prepay $4,800 instead. That gives you $400 in monthly credits spread across the year. This plan is built for Meteor teams running production apps who want predictable, stable costs. Your support, setup, and service level don't change. You're just paying less for the same infrastructure and support you're already getting. Savings Plans are one-year commitments with non-refundable prepayment (limited exceptions apply). Don't commit unless you're confident about your usage. A few things to know about how credits work: Your monthly credits don't roll over. If you spend $300 in a month but have a $350 credit, that extra $50 doesn't carry forward to next month. If you go over your monthly credit, you're charged regular on-demand rates for the overage. And unused credits at year's end are forfeited. *** ## Getting Started Ready to lock in savings? Contact our team with your estimated annual usage, and we'll get you set up. We'll work with you to find a commitment amount that matches your actual spending patterns. [Contact support](/docs/getting-started/support) *** ## Renewing Your plan auto-renews each year. If you want to cancel after renewal, let us know within 30 days of renewing, and we can help before the next billing cycle kicks in. *** ## Common Questions Your Savings Plan credits are applied daily. We prorate your monthly allocation by dividing it by the days in the month. So a $9 monthly credit in December (31 days) equals roughly $0.29 per day. Any usage beyond your monthly credit is billed at regular on-demand rates. Your service never interrupts, you just pay the standard rate for the overage. You can buy additional credits anytime to increase your commitment and keep saving as you grow. To modify your prepayment for the next renewal, [reach out to support](/docs/getting-started/support). Savings Plans can't be canceled, and prepaid amounts are non-refundable. The one exception: if you decide the plan isn't for you shortly after renewal, let us know within a few days of that renewal date. Otherwise, notify us at least one month before your plan period ends. Multiply your average monthly spend by 12. When in doubt, estimate on the conservative side. You can always add credits later if you need more. *** ## What's Next? --- # Web Apps (https://help.galaxycloud.app/docs/billing/webapp) ### Container Sizes and Pricing Check out the [Web Apps pricing page](https://galaxycloud.app/webapps/pricing) for the latest container sizes, hourly rates, and monthly estimates. ### Plan Comparison Free tier for experimenting and learning. Single Nano container, great for testing without risk. Ready to go live? Production gives you multiple containers, any size, and the reliability your users expect. **Includes**: Multiple containers, auto-scaling, SSL, load balancing, email support, and advanced security options. Enterprise-grade hosting with custom features. Contact our team to discuss your needs. --- # Containers (https://help.galaxycloud.app/docs/dashboard/apps/containers) Ever wonder what's actually running when your app handles traffic? Each container is a separate instance of your application working independently. This guide shows you how to monitor containers, understand what the metrics mean, and scale when traffic grows. Galaxy shows you exactly what's happening with your app in real-time. No guesswork. Just data. *** ## Understanding Containers A container is a running copy of your app. Small apps might have one. High-traffic apps might have several running in parallel, with Galaxy distributing traffic across them all. Think of containers like individual servers. Each one runs your code independently. If you have three containers running, Galaxy is essentially running your app three times at once, spreading user traffic across all three. *** ## The Containers Card At the top of the page, the **Containers** card shows your current configuration and lets you adjust your replica count directly. Three fields appear inline: **Container**: The container preset name. This identifies the size tier your app is running on. **Size**: The resource allocation for each container, shown as memory and CPU. **Plan**: Your current plan tier. ### Adjusting Replica Count On the right side of the Containers card, you'll see a number with `∨` and `∧` controls. This is your replica count: how many container instances are running. Click the arrows to increase or decrease the number directly from this page. Apps on the Free plan (Meteor) or Sandbox plan (Web Apps) are limited to a single container and cannot be scaled. To add more containers or change container size, upgrade your plan from the [Plans](/docs/dashboard/apps/plans) page. *** ## Container Status Each container displays its current status. Watch these statuses change when you deploy or scale your app. 🟡 **Pending**: Container is queued to start but hasn't launched yet. 🔵 **Creating**: Container is starting up for the first time or after a scale event. 🟢 **Running**: Container is healthy and handling requests. 🟠 **Terminating**: Container is being shut down (usually during a scale-down or deployment). ⚪ **Stopped**: Container is stopped or suspended. 🟡 **Waiting**: Container is in a generic waiting state. 🔴 **Failed**: Container encountered an error state (CrashLoop, ImagePull, etc.). 🟣 **Succeeded**: Container finished its task (usually for one-time jobs). When you deploy new code or adjust container count, you'll watch these statuses change in real-time. Creating containers take a moment to spin up. Terminating containers shut down gracefully without dropping traffic. *** ## Open Your App on a Specific Container To investigate an issue affecting one instance, open your app's **Containers** page and click **View app using this container**, the external-link icon next to **View Logs** for that container. Your app opens in a new tab. The icon is disabled when the container isn't ready or container selection isn't available for the app. Galaxy saves the selection in a browser cookie for the app's domain. Page reloads, navigation, and new WebSocket connections keep using the selected container while it's available. If it becomes unavailable, traffic falls back to another available container. Use **View Logs** next to the same container to open [Runtime Logs](/docs/dashboard/apps/logs) filtered to that instance, and compare its CPU and memory charts below while reproducing the issue. Existing apps need a new deployment to activate the routing rules. A restart alone isn't enough. After redeploying, click **View app using this container** again to select a current container. *** ## Performance Below the Containers card, the **Performance** section shows resource usage charts. Two badges at the top display your configured limits: **CPU LIMIT** and **MEMORY LIMIT** (e.g., `CPU LIMIT: 500M`, `MEMORY LIMIT: 512 MB`). Two filters let you narrow down the data: **Filter by Container**: Select a specific container instance to view its metrics individually. Useful when you have multiple replicas and want to compare their resource usage. **Filter by Time**: Change the time window for the charts. Defaults to 1 hour. If your app hasn't received traffic recently or was just started, you'll see "No metrics data available yet" until data begins populating. Watch container metrics when you're testing under load. You'll understand how your app behaves when traffic increases. *** ## What Containers Tell You The Containers page is most useful when something's not quite right. Here's what to look for. **All containers running smoothly?** Everything's fine. Your app is healthy. **One container stuck in "Creating" state?** Give it a moment. It takes a few seconds to spin up. If it never finishes, check [Logs](/docs/dashboard/apps/logs) to see what's blocking startup. **Replica count not matching your target?** You might be in the middle of a scale event or deployment. Wait a moment and check again. If it doesn't correct itself, there might be an issue preventing containers from starting. **Uneven resource usage across containers?** This is normal for stateless apps. Traffic distribution depends on many factors. If usage is drastically different, it might indicate a slow container that needs investigation. *** ## Troubleshooting Check [Logs](/docs/dashboard/apps/logs). Repeated restarts usually mean your app is crashing, and the logs will tell you why. **High CPU or memory usage?** This might indicate an inefficient query, memory leak, or a need to scale up to larger containers. Check your app code and consider upgrading container size from Plans. **One container consistently using more resources?** Sometimes individual containers get into a bad state. Try restarting your app from the [Overview](/docs/dashboard/apps/overview) page. This usually clears up transient issues. *** ## Container Count: Single vs Multiple Most apps start with one container. But you have options. **Single container**: Simple, cheaper. Fine for low to moderate traffic. If that one container crashes, your app goes down until it restarts. **Multiple containers**: More resilient. Galaxy distributes traffic across all containers. If one crashes, others keep handling requests. Better performance under load. For production apps, at least two containers is recommended. For mission-critical apps, three or more is better. This gives you redundancy and better performance. *** ## High-Availability If you're running a Standard (1GB) container or larger with three or more containers, high-availability is automatically enabled. This distributes your containers across different availability zones. See the [Overview](/docs/dashboard/apps/overview#high-availability) page for more details on high-availability. *** ## Changing Your Plan or Container Size The Containers page lets you adjust replica count directly. To change container size or plan tier, head to Plans. 1. Open your app and navigate to **Plans** 2. Select your new plan (if changing tiers) 3. Pick your new container size 4. Click **Apply** Galaxy applies the change and triggers your next deployment. Your app doesn't go down. The change takes effect when your app restarts. Changing container count doesn't require downtime. Galaxy adds or removes containers gracefully while your app keeps serving traffic. *** ## Downscaling to Save Money Running more containers than you need? Or paying for bigger containers than necessary? Downscaling replica count is quick: use the `∧` and `∨` controls on the Containers card. To downsize container size, go to Plans. For temporary cost savings, you can also Stop your app from the [Overview](/docs/dashboard/apps/overview) page. Stopped apps don't cost anything, but users can't access them until you restart. *** ## Different Plans for Different App Types Different app types (Meteor, Node.js, Python, AdonisJS) have different plan names and container options. The concept is the same: pick a tier, choose a size. But specific options vary by runtime. Check our [billing documentation](/docs/billing) for details specific to what you're running. *** ## Quick Reference **Containers are instances**: Each one runs your app independently. **Adjust replicas here**: Use the `∨` and `∧` controls on the Containers card. **Monitor performance**: The Performance section shows CPU and memory usage per container. **Change size from Plans**: Container size and plan tier changes happen in the Plans page, not here. **High-availability**: Automatically enabled with 3+ Standard containers. **Scaling is non-disruptive**: Your app keeps serving traffic during changes. **Free and Sandbox plans are single-container only**: Upgrade to scale beyond one container. *** ## What's Next? Your containers are running. Your app is live. Your users are happy. Now you've got the tools to keep it that way as your traffic grows. --- # Deployments (https://help.galaxycloud.app/docs/dashboard/apps/deployments) ## Deployment History The deployment history table shows every deployment your app has had. Each row shows: | Column | Description | | ------------ | ------------------------------------------ | | Status | Success, Failed, In Progress, or Cancelled | | Version | Which version of your code was deployed | | Source | The Git branch and commit hash | | Trigger | What initiated this deployment | | Triggered By | Who or what triggered the deployment | | Started | When this deployment began | | Duration | How long the deployment took | Click any deployment to see details: build logs, deploy logs, timing information, and what happened at each stage. *** ## Deployment Triggers The Trigger column tells you how a deployment was initiated. Galaxy tracks seven trigger types: | Trigger | What It Means | | --------------- | ----------------------------------------------------------------------------------- | | Manual | Someone clicked "Deploy Now" or "Deploy with Custom Configuration" in the dashboard | | Webhook | A push event from your Git provider triggered automatic deployment | | Retry | Someone manually retried a failed deployment | | Automatic Retry | Galaxy automatically retried a failed deployment | | API | Deployment via CLI (`galaxy deploy`) or programmatic API calls | | Rollback | Someone rolled back to a previous version | | Env Var Update | An environment variable change triggered a hot-swap deployment | Webhook triggers mean your Push to Deploy is working. API triggers show CLI or CI/CD pipeline deployments. Manual triggers indicate someone used the dashboard directly. *** ## Triggering Deployments You have options for deploying: ### Deploy Now Click "Deploy Now" for a quick re-deployment using your current configuration and the current branch. This is useful when you've made configuration changes (environment variables, container size, etc.) but your code hasn't changed. It's a quick way to apply settings without pushing new code. ### Deploy with Custom Configuration Click "Deploy with Custom Configuration" to override settings for just this deployment. Want to deploy from a different branch? Deploy to a different region? Set different environment variables for this specific deployment? This button lets you do all that without changing your saved settings. This is handy for testing. Deploy from a feature branch to test before merging to main. Deploy to a different region to test regional deployment. Do all this without permanently changing your app's configuration. *** ## Understanding Deployment Status Each deployment has a status that tells you what happened: * **Success**: Deployment completed successfully. Your app is now running this version. * **Failed**: Something went wrong during build or startup. Your app is still running the previous version. Check the logs to see what failed. * **In Progress**: Deployment is currently running. Galaxy is building your code and starting containers. * **Cancelled**: You cancelled this deployment before it finished. Your app continues running the previous version. *** ## Deployment Logs Click any deployment to see what happened. You'll see logs in two stages: Shows everything that happened while Galaxy prepared your code: * Cloning your repository * Installing dependencies * Compiling code (TypeScript, bundlers, etc.) * Running build scripts * Creating the deployment package If your build fails, errors are here. Missing dependencies, syntax errors, incorrect build commands, all show up in build logs. Shows the output from your pre-deploy command (if configured). This phase runs after the build completes but before containers start. Common tasks here include database migrations and data seeding. If the pre-deploy command fails, the deployment stops here and your previous version keeps running. Check the error output to diagnose the issue. This section only appears if you have a pre-deploy command configured. Pre-deploy commands are available on paid plans only. Shows what happened when Galaxy started your containers: * Creating and initializing containers * Starting your application * Running health checks * Bringing containers online If your app won't start, deploy logs tell you why. Port binding errors, missing environment variables, runtime errors, all appear here. Build logs show if your code is broken. Deploy logs show if your app can't start. Always check both when troubleshooting. *** ## Deployment Timing Each deployment shows timing information: * **Build time**: How long it took Galaxy to build your code. * **Deploy time**: How long it took to bring containers online and pass health checks. * **Total time**: Complete end-to-end deployment time. Watch these times over multiple deployments. If build time is increasing, your app might be getting more complex. If deploy time is increasing, health checks might be taking longer. *** ## Automatic Deployments When you push code to your deploy branch, Galaxy automatically detects the change and starts a deployment. This uses Push to Deploy, which is covered in deployment guides. You'll see these automatic deployments in history with a `webhook` trigger. Each one was initiated by a Git webhook when code was pushed. *** ## Manual Deployments You can also trigger deployments manually from this page using "Deploy Now" or "Deploy with Custom Configuration". These show up with a `manual` trigger. Manual deployments are useful when you've changed configuration but not code, or when you need to redeploy a specific version. *** ## Cancelled Deployments Sometimes you might cancel a deployment that's in progress. Click "Cancel" while deployment is running, and Galaxy stops the process. Your app continues running the previous version unaffected. Cancelling is instant. No impact on your live app. *** ## Understanding Versions vs Deployments This section shows deployments (every time code ran). But every deployment is tied to a [Version](/docs/dashboard/apps/versions) (a code snapshot). A single version can have multiple deployments. Deploy code once, you get one version and one deployment. Change a configuration variable and deploy again using the same code? Same version, new deployment (with an `env_var_update` trigger). Want to understand this better? Head to [Versions and Deployments](/docs/apps/versions-deployments) for the full picture. Need to understand versions vs deployments? They're related but different. Deployments are actions. Versions are code snapshots. One version can have many deployments. *** ## Troubleshooting Failed Deployments **Build failed?** Check build logs. Look for missing dependencies, syntax errors, or incorrect build commands. Usually the error message tells you exactly what's wrong. **Deploy failed?** Check deploy logs. Look for errors about starting containers, binding ports, or health check failures. **App started but isn't responding?** Logs might show your app is running but failing health checks. Check your app's code and health check endpoint configuration. **Still stuck?** [Reach out to support](/docs/getting-started/support) with your deployment ID. Include build and deploy logs so support can see exactly what happened. *** ## What's Next? --- # Apps Menu (https://help.galaxycloud.app/docs/dashboard/apps) The Apps section lists every application in your current account or organization. Each row shows the app name, status, runtime type, plan tier, and creation date. A colored dot on the status lets you spot issues at a glance: green means running, anything else needs attention. Use the filters at the top to narrow by **Status**, **Plan**, or **Type**. Click any app name to open its management page. *** ## App-Level Settings Each app has an **App Settings** menu on its management page. The sections below are available for **Meteor apps only**. ### Notifications Galaxy can alert you by email or Slack when something happens to your app. Events you can subscribe to: * Deploy failed * Build failed (temporarily or permanently) * App automatically stopped * Certificate generation error * Container unhealthy * App unavailable **Email**: Click **Add New Notification**, select **Enable Email Notifications**, choose your event types, and click **Save**. For organizations, go to the **Members** tab and toggle on each person who should receive emails. **Slack**: Create an Incoming WebHooks app in your Slack workspace and copy the webhook URL. Then click **Add New Notification**, select **Enable Slack Notifications**, paste the URL, choose your event types, and click **Save**. You can specify a channel or leave it blank to use the webhook's default. Per-app overrides are also available. Open the app's **Settings**, find **Notifications**, click **Enable Custom App Notifications**, and configure email and Slack independently for that app. This lets you silence staging while keeping production alerts loud. ### Resources Shows how many containers you're using versus your account limit. If you're approaching the ceiling, use **Contact Support** to request an increase. The **Integrations API** section displays your GraphQL API key for automating deployments and managing apps programmatically. Copy or regenerate it here. See the [GraphQL API guide](/docs/apps/meteor/graphql-api) for usage details. Treat your API key like a password. Never commit it to version control. If it's exposed, regenerate it immediately from this section. ### Authorized Domains Available on personal accounts only. If your Meteor app uses Meteor as an identity provider, add the redirect URIs where Meteor sends authentication responses. Without them, the auth flow won't complete. Click **Add New Domain**, enter a name for your reference and the full redirect URI (like `https://example.com/callback`), then click **Add Domain**. Use **Add New URI Field** to include multiple environments under one entry. *** ## What's Next? --- # Runtime Logs (https://help.galaxycloud.app/docs/dashboard/apps/logs) Runtime Logs capture everything your deployed app prints while it's running: every `console.log`, every `console.error`, every line emitted by a library. Open your app and click the **Runtime Logs** tab to get started. *** ## Reading the Page The page has four main areas stacked vertically: the toolbar at the top, a filter bar below it, a volume histogram, and the log list. **Toolbar**: Stream selector (**All / App / Errors**), time presets (**15m / 1h / 6h / 24h / 7d**), the **Dates** picker, the **Live** button, **Download**, the share icon, and view settings. **Filter bar**: Shows active filter chips. Use **+ Add filter** to narrow by pod or severity, and the search box to match text across loaded logs. **Volume histogram**: A bar chart showing how many events happened over time, colored by severity. Hover any bar for a breakdown. Click a bar to zoom into that time window. **Log list**: One row per log event, newest at the bottom in Live mode. *** ## Anatomy of a Log Row Each row has the same structure, left to right: **Severity stripe**: A colored bar on the left edge that encodes how serious the event is. Click it to filter to that severity. | Color | Level | What it means | | --------- | ------- | ----------------------------------------------------------- | | 🔴 Red | `error` | Something went wrong: exceptions, failed requests, crashes. | | 🟠 Orange | `warn` | Worth noticing, but not broken. | | 🔵 Blue | `info` | Normal operational output. | | ⚪ Grey | `debug` | Developer-level detail, usually off in production. | **Pod short ID**: A 5-character ID, identifying which running container produced the log. Galaxy can run multiple pods in parallel for scale and redundancy, and each one logs independently. Click the badge to filter to that pod only. Hover it to see the full pod ID. **Timestamp**: The exact date and time, shown in your local time zone with millisecond precision. Hover for UTC, local, and relative (for example, "36s ago") versions. **Message**: The log content. Plain text is shown as-is, with ANSI color codes rendered as color and URLs as clickable links. If your app uses structured (JSON) logging, you'll see a compact key/value preview like `msg: "handshake" userId: "abc123"`. The full object is available in the event drawer. Hovering a row reveals three action icons on the right: * **View in context**: opens an unfiltered window of events around this one, across all pods. * **Copy line**: copies the raw message to your clipboard. * **Open details**: opens the event drawer with full event properties and raw JSON. Clicking anywhere on the row body does the same. *** ## Live Mode When you open Runtime Logs with no time range selected, you're in **Live** mode. The page polls for new events every 5 seconds, and the list auto-scrolls to the bottom as they arrive. If you scroll up to read something, auto-scroll pauses and a floating pill appears: **↓ N new events**. Click it to jump back to the newest entry. Auto-scroll re-engages as soon as you're at the bottom again. Click the **Live** button to pause polling entirely. Useful when you need to read through logs without the list moving. Click **Paused** to resume. Live mode turns off automatically when you pick a time range or enter Context view. Turn on Live mode before your app restarts and you'll see startup errors, failed connections, and boot crashes the moment they happen. *** ## Filtering and Searching ### Stream The **All / App / Errors** selector at the top-left of the toolbar controls which output stream you see: **All**: Both streams interleaved. This is the default. **App**: Normal output only (stdout). Most of your app's logs appear here. **Errors**: Error output only (stderr). Crashes, uncaught exceptions, and library errors. ### Time Presets and Custom Range Click any preset (**15m**, **1h**, **6h**, **24h**, **7d**) to jump to that window. For a custom range, click **Dates** to open the calendar picker, set a **From** and **To** date/time, and click **Apply**. Click **Clear** to go back to live tailing. Galaxy keeps runtime logs for up to 7 days. Ranges wider than that are automatically trimmed. ### Add Filter Click **+ Add filter** to narrow by: * **Pod**: filter to one specific container instance. * **Level**: show only one severity (error, warn, info, debug). * **Level ≠**: exclude one severity. A common trick: hide noisy debug output with `Level ≠ debug`. Active filters appear as chips in the filter bar. Click **×** on any chip to clear it. It's worth knowing that filters fall into two categories. **Stream**, **pod**, and **time range** are server-side: they narrow the fetch itself, so less data comes over the wire. **Level**, **Level ≠**, and **search** are client-side: they filter over whatever is already loaded in your browser. If you have only 1,000 events loaded and add a level filter, you're filtering those 1,000. Use **Load older** or **Load all in range** first if you want client-side filters to cover more of the range. To reproduce an issue on the instance you're investigating, use **View app using this container** on the [Containers page](/docs/dashboard/apps/containers#open-your-app-on-a-specific-container). Click **View Logs** beside the same container to open its filtered logs. ### Search Type in the **Search visible logs** box (or press `⌘K` / `Ctrl+K`) to match text across loaded logs. Search is case-insensitive and matches against the message text, the pod short ID, and any fields in parsed JSON (both key names and values). Search only covers what's already loaded. If you want to search a wider range, use **Load older** or **Load all in range** first, then search. Click the `.*` icon next to the search box to switch to regex mode. Your expression runs case-insensitively. A few useful patterns: * `^\[login\]` matches lines starting with `[login]` * `error|warn` matches lines containing either word * `user_\d+` matches `user_123`, `user_456`, and so on If your regex is invalid, the search silently falls back to plain text matching with no error shown. If results look wrong, double-check for unescaped characters like `(`, `[`, or a trailing backslash. *** ## The Volume Histogram The bar chart between the filter bar and the log list shows how many events happened over time. Bars are colored by severity so you can spot error spikes at a glance. Hover any bar to see a tooltip with the total count, the time window it covers, and a breakdown per severity level. Click any bar to zoom the page into that exact time window. The bar width adjusts automatically based on the range you're viewing: roughly one bar per minute for ranges under an hour, one per hour for ranges up to 24 hours, and one per day beyond that. The histogram only spans the events that are currently loaded, not the full picked range. Use **Load older** or **Load all in range** to pull more events and fill it out. *** ## Loading More Events When you pick a time range, Galaxy fetches the newest 1,000 events first. The match-count strip just above the log list tells you where you stand: **"Loaded 1,000 of 1,720 in range · 931 match filters"**. If the total in range is higher than what's loaded, there are older events still on the server. Two buttons on the right side of that strip let you pull them in: **↓ Load older**: Fetches the next page of 1,000 events, prepending them to the top of the list. Click it as many times as needed to work your way back through the range. The scroll position is preserved so the list doesn't jump on you. **Load all in range**: Fetches the remaining events in the range in one go (up to 10,000 per request). Use this when you want client-side filters like search, **Level**, or **Level ≠** to cover the entire range at once, or when you want the histogram to span the full window. For very noisy apps over a long range, narrow the time window or add a pod filter first, then click **Load all in range**. There's no hard cap on total events per session. You can click either button as many times as needed. When the count strip reads **"Loaded X of X in range"** with both numbers equal, everything is in. *** ## The Event Drawer Click any row (or press `Enter` on a focused row) to open the event drawer on the right side. The drawer has two tabs: **Event Properties**: A key/value table with everything about the event. The **Time** section shows the timestamp in four formats: Raw (ISO), UTC, your local time zone, and relative (for example, "1m ago"). The **Properties** section shows severity, source, stream, pod metadata, app version, the raw message, and every `parsed.*` field if the log was JSON structured. Hover any property row to copy its value. On pod, level, and stream rows you'll also see **=** (filter to this value) and **≠** (exclude this value) shortcuts. Toggle **Show null values** in the top-right corner to include empty fields. **Raw JSON**: The full event as pretty-printed, syntax-highlighted JSON. Click **Copy JSON** to grab the whole thing for a ticket, a bug report, or a code comment. Navigate between events using the **▲ / ▼** arrows in the drawer header. Click **View in context** to open Context view centered on the current event. Press **Esc** to close. *** ## Context View When you spot an error, you usually want to see what happened just before and after it, across all pods, with no filters in the way. That's Context view. Open it via the **⟷** icon on any row, or the **View in context** button in the drawer. Galaxy shows a window of events around the one you selected, highlighting it in place. Use **Load earlier** and **Load later** to widen the window. Click **Exit context** to return to your filtered list. *** ## Downloading Logs Click **Download** for two options: **Export loaded logs (NDJSON)**: Downloads the currently loaded events as newline-delimited JSON (one event per line). This is instant and client-side. If you want the full range, click **Load all in range** before exporting. **Email full download**: Galaxy prepares a full export in the background and emails you a download link when it's ready. Pick a range (last 1 hour, 6 hours, 24 hours, or 7 days) and submit. *** ## Sharing a View Click the share icon (top-right toolbar) to copy the current URL to your clipboard. Every filter, time range, selected event, and context target is encoded in the URL. Paste it to a teammate and they'll open exactly what you're seeing. *** ## View Settings Click the gear icon in the top-right toolbar to adjust: **Density**: **Comfortable** (default) or **Compact** (tighter rows, more events on screen). **Wrap long lines**: Off by default. Long messages are truncated with `…`. Turn this on to wrap them. **Collapse repeated messages**: Off by default. When on, consecutive identical messages collapse into one row with a **×N** badge. Useful for apps that log the same line every second. Settings are saved per user in your browser and persist across sessions. *** ## Keyboard Shortcuts | Shortcut | Action | | -------------------------- | -------------------------------------- | | `⌘K` / `Ctrl+K` | Focus the search box | | `Enter` (on a focused row) | Open the event drawer | | `Esc` | Close the drawer, or exit Context view | *** ## Limitations Galaxy retains runtime logs for up to 7 days. Ranges wider than 7 days are automatically trimmed, anchored on the end date. If you need longer retention, consider sending logs to an external service like Papertrail, Datadog, or Elasticsearch. You can configure a custom log destination in your app's [Settings](/docs/dashboard/apps/settings/logging). The initial fetch loads the newest 1,000 events. Use **Load older** to page through the range 1,000 events at a time, or **Load all in range** to pull up to 10,000 events at once. The match-count strip above the log list shows "Loaded X of Y in range" so you always know where you stand. There's no hard cap on total events per session. Filter and search state lives in the URL only. Closing the tab forgets your active filters, but any bookmarked or shared URL retains them. *** ## What's Next? --- # Overview (https://help.galaxycloud.app/docs/dashboard/apps/overview) ## Quick Status Check At the top of the page, you'll see your app's name and its current status at a glance. The info card below shows six fields in a grid: | Field | Description | | --------------------- | ---------------------------------------------------------- | | **Status** | The current app state. See the full list of statuses below | | **App Type** | The runtime your app uses | | **Plan** | Your current plan tier | | **Region** | Where your app is deployed | | **High-availability** | On or Off, depending on whether your containers qualify | | **Containers** | How many containers are running and their size | Here's what each app status means: | Status | Description | | ------------------ | ------------------------------ | | Pending Deployment | App created, no deployment yet | | Queued | Job queued, waiting for worker | | Building | Worker building Docker image | | Deploying | Deploying to Kubernetes | | Running | Successfully running | | Unhealthy | Health checks failing | | Crashed | Container crashed | | Restarting | Attempting restart | | Stopped | User stopped | | Suspended | Admin suspended | | Failed | Deployment failed | | Deleted | Soft deleted | *** ## Common Actions At the top right of the page, you'll find action buttons for the most common operations. Which buttons appear depends on your app type and its current state. **Open App**: Opens your live application in a new tab. **Settings**: Jumps to your app's Settings page. Change Git config, domains, health checks, and more. **Upgrade App**: Takes you to the Plans section to change your container size or plan tier. **Restart**: Forces a clean restart without redeploying. Good for clearing transient issues when your app is stuck. **Stop / Start**: Pauses your app without deleting it (**Stop**), or brings it back up (**Start**). The button toggles based on whether your app is currently running. Stopped apps don't incur container charges. **APM** (Meteor apps only): Opens Monti APM for performance monitoring. Only available on apps with a Professional plan. **SEO** (Meteor apps only): Opens the SEO configuration for your Meteor app. Bookmark your app's Overview page. You'll be checking it constantly, and it's the fastest way to see what's happening. *** ## Performance Below the info card, you'll find the **Performance** section. This shows real-time charts for your app's resource usage. Two badges at the top show your container's configured limits: **CPU LIMIT** and **MEMORY LIMIT**. Use the **Filter by Time** dropdown (top right of the section) to change the time window. The default is 1 hour. Three charts are available: **CPU Usage**: Tracks how much processing power your app is consuming over time, measured in millicores (m). Watch for spikes that correlate with traffic or deployments. **Memory Usage**: Shows RAM consumption in MB. A steadily climbing line can indicate a memory leak. If it's consistently near your memory limit, consider upgrading to a larger container. **Requests**: Shows incoming request rate in requests per minute (req/min). Useful for correlating traffic patterns with CPU and memory usage. If your app is stopped or hasn't received traffic recently, the charts will be empty. Start your app and send some requests to see data populate. *** ## Activity Feed On the right side of the page, the **Activity Feed** shows a chronological log of everything that's happened to your app. Each entry shows an icon, a description, and a timestamp. Events you'll see here include: * **App created**: When the app was first provisioned * **Domain added**: When a custom domain was configured * **Deployment started / completed / failed**: Each stage of a deployment cycle, with version number * **Build started / completed**: Build phase events, with duration * **App started / stopped**: Manual start and stop actions, showing who triggered them The feed gives you a quick audit trail without needing to dig into Deployments or Logs. If something changed unexpectedly, check here first. *** ## High-Availability High-availability makes your app more resilient. When enabled, Galaxy distributes your containers across different availability zones in the same region. If one zone goes down, your app keeps running on the others. This is crucial for production apps. Your users won't notice an outage when you have high-availability enabled. ### How High-Availability Works Galaxy supports high-availability automatically, but you need to meet two requirements: 1. **Container size**: Standard (1GB) or larger 2. **Container count**: Three or more containers That's it. Once both conditions are met, Galaxy automatically enables HA and spreads your containers across different availability zones. You'll see a green "On" indicator next to High-Availability in your app's overview. ### Checking Your HA Status Look at the High-Availability field in your overview. You'll see one of two states: **On** (green): Your app is fault-tolerant across availability zones. You're protected if a zone goes down. **Off** (red): Your app doesn't meet the requirements yet. Either your containers are too small, or you don't have enough of them. Click the status to see exactly what you need to do. ### Enabling High-Availability Getting HA up and running takes just a few steps: 1. Go to your app's [Plans](/docs/dashboard/apps/plans) section 2. Change the container size to Standard (1GB) or larger 3. Add containers until you have three or more running 4. Check back at Overview: HA should now show as "On" Smaller containers don't qualify for high-availability, even if you run three or more of them. You need 1GB containers at minimum. *** ## What's Next? --- # Plans (https://help.galaxycloud.app/docs/dashboard/apps/plans) ## Current Configuration At the top, you'll see your current setup: which region your app is deployed to, your current container size, and your current domain. This is a quick reference showing what's live right now. ## Choosing Your Plan Galaxy offers different plans for different needs. Each plan supports different container sizes and features: **Free or Sandbox Plans**: Great for testing and learning. Limited resources, lower cost (or free). Perfect for staging environments and early development. **Production Plans**: For apps with real traffic. Multiple container sizes available, better resource allocation, and features you need for production workloads. **Business Plans** (coming soon): Enterprise-grade with custom features. Pick the plan that matches your app's current needs. You can always change later as your app grows. ## Container Sizing Once you pick a plan, select your container size. Container size determines how much RAM and CPU your app gets. Bigger containers handle more traffic and heavier workloads, but cost more to run. The container size table shows everything you need to decide: * **Size name**: Tiny, Compact, Standard, Double, etc. * **Memory**: RAM allocated to each container * **CPU**: Processing power * **Hourly price**: What it costs per hour * **Monthly estimate**: Rough cost if running 24/7 for a month ### How to Choose a Container Size **Starting out?** Pick a smaller container (Compact or Small) and scale up if you hit limits. Most apps do fine starting smaller. **Existing app?** Look at your current resource usage. If your containers are always at high CPU or memory, upgrade to the next size. If they're idle, you might be paying for more than you need. **Performance issues?** Try upgrading to the next container size. See if it helps. If it does, that's your bottleneck. If it doesn't, the issue is elsewhere (code optimization, database queries, etc.). Test different container sizes and watch your app's performance. You'll find the sweet spot where cost and performance balance nicely. ## Container Count Most apps run one container. But you can run multiple containers if your app gets heavy traffic or needs redundancy. Each additional container is charged separately. Running two Standard containers costs twice as much as running one. But you get better performance and fault tolerance. ### Single vs Multiple Containers **Single container**: Simple, cheaper. Fine for low to moderate traffic. If that one container crashes, your app goes down until it restarts. **Multiple containers**: More resilient. Galaxy distributes traffic across all containers. If one crashes, others keep handling requests. Better performance under load. For production apps, at least two containers is recommended. For mission-critical apps, three or more is better. This gives you redundancy and better performance. ## High-Availability If you're running a Standard (1GB) container or larger with three or more containers, high-availability is automatically enabled. This distributes your containers across different availability zones. See the [Overview](/docs/dashboard/apps/overview#high-availability) page for details on high-availability. ## Changing Your Plan or Container Size Ready to scale? It's simple: 1. Open your app and navigate to Plans 2. Select your new plan (if changing tiers) 3. Pick your new container size 4. Adjust container count if needed 5. Click **Apply** Galaxy applies the change and triggers your next deployment. Your app doesn't go down. The change takes effect when your app restarts. Scaling is instant for most changes. Want to test a bigger container? Change it here and test. If it doesn't help, change back. No harm in experimenting. ## Downscaling to Save Money Running more containers than you need? Or paying for bigger containers than necessary? Downscaling is just as easy as scaling up: 1. Go to Plans 2. Reduce container size or count 3. Click **Apply** Your app updates and triggers the next deployment. Your monthly bill decreases immediately. For temporary cost savings, you can also Stop your app from the [Overview](/docs/dashboard/apps/overview) page. Stopped apps don't cost anything, but users can't access them until you restart. ## Different Plans for Different App Types Different app types (Meteor, Node.js, Python, AdonisJS) have different plan names and container options. The concept is the same: pick a tier, choose a size. But specific options vary by runtime. Check our [billing documentation](/docs/billing) for details specific to what you're running. ## Cost Estimation The table shows hourly and monthly costs. Monthly estimates assume 24/7 running (720 hours in a month). Not running 24/7? Adjust the estimate in your head. Running only during business hours? That's roughly 8/24 of the daily cost. Running only weekdays? That's roughly 5/7 of the weekly cost. Galaxy charges by the minute, so you only pay for time your app actually runs. Estimating costs can be tricky. When in doubt, go with the larger estimate. It's better to be surprised that costs are lower, not higher. ## Auto-Scaling Some plans support auto-scaling. This automatically adjusts container count based on traffic. High traffic? Automatically add containers. Traffic drops? Automatically remove them. If your plan supports auto-scaling, you can configure it here. You set minimum and maximum container counts, and Galaxy handles the rest. This is perfect for apps with variable traffic. You don't pay for containers you're not using, but you always have enough capacity when traffic spikes. ## What's Next? --- # General (https://help.galaxycloud.app/docs/dashboard/apps/settings/general) The General tab sets the defaults Galaxy uses every time it builds and deploys your app. ## Git Configuration **Git Account**: The provider account Galaxy uses to access your repositories. Disconnect and reconnect here to switch accounts. **Repository**: The repo Galaxy deploys from. Pushing to your deploy branch triggers an automatic deployment. **Branch**: The branch Galaxy watches, usually `main` or `master`. Every push triggers a deploy. To stop automatic deployments, click **Disconnect push-to-deploy**. Your build settings are preserved and CLI deployments still work. Reconnect anytime without reconfiguring. *** ## Build Commands These control how Galaxy turns your source into a running app. Meteor apps use a fixed build step, so you'll see fewer fields. **Install Command**: Runs before `meteor build`. Defaults to `meteor npm install`. Use `meteor npm ci` for reproducible builds. **Root Directory**: Path to your app if it lives in a subdirectory. Leave empty if it's at the repo root. **Pre-Deploy Command**: Runs after build, before containers go live. Use it for migrations. Fails the deployment if it errors. Paid plans only. **Health Check Path**: The HTTP path Galaxy pings to verify your app is healthy. Must start with `/`. Defaults to `/`. **Container Stop Grace Period**: Seconds Galaxy waits after SIGTERM before force-stopping. Defaults to 5, max 600. Paid plans only. **Root Directory**: Path to your app if it lives in a subdirectory. Leave empty if it's at the repo root. **Install Command**: How Galaxy installs dependencies, for example `npm install` or `pip install -r requirements.txt`. **Build Command**: How Galaxy builds your app, for example `npm run build`. Optional if no build step is needed. **Start Command**: How Galaxy starts your app, for example `npm start` or `python app.py`. **Pre-Deploy Command**: Runs after build, before containers go live. Use it for migrations. Fails the deployment if it errors. Paid plans only. **Health Check Path**: The HTTP path Galaxy pings to verify your app is healthy. Must start with `/`. Defaults to `/`. **Container Stop Grace Period**: Seconds Galaxy waits after SIGTERM before force-stopping. Defaults to 5, max 600. Paid plans only. To learn how your app can read the configured shutdown period, see [Container Environment](/docs/apps/container-environment#graceful-shutdown). *** ## Danger Zone Two actions live here, and both are limited to the account owner. Organization admins, developers, and viewers see them disabled. **Transfer App**: Moves the app to another personal account or organization. You enter the destination account, confirm the app name, and the destination owner approves before anything moves. A status alert appears here while the transfer is open, with a **Cancel Transfer** button while it's still waiting for approval. See [Transfer an App](/docs/apps/transfer-apps) for the full walkthrough. **Delete App**: Permanently removes your app. All containers stop, all data is lost, and your domain is released. This can't be undone. While a transfer is pending, running, or recovering from a failure, both **Transfer App** and **Delete App** are disabled. They unlock as soon as the transfer resolves. *** ## Common Questions Yes. Use **Transfer App** in the Danger Zone. The app keeps its configuration and domains, and the destination account owner has to accept before anything moves. See [Transfer an App](/docs/apps/transfer-apps). *** ## What's Next? --- # Settings (https://help.galaxycloud.app/docs/dashboard/apps/settings) Your app's **Settings** page has six tabs. Open an app in the dashboard, then select **Settings** from its sidebar. Choose the tab for the change you want to make. Most changes save when you click the confirm button on that tab. A few apply on your next deployment, and the page tells you when that's the case. *** ## Choose a Tab *** ## What's Next? --- # Logging (https://help.galaxycloud.app/docs/dashboard/apps/settings/logging) Ship logs to an external endpoint alongside Galaxy's built-in log viewer. Supported providers: **Elasticsearch** and **HTTP** (Datadog, Logstash, or any HTTP receiver). Paid plans only. Configure in **Settings > Logging**: enable the toggle, pick a provider, enter the host and port, add credentials if needed, then click **Save Configuration**. Changes apply on your next deployment. Set an **Index Name** (like `app-logs`) where Galaxy writes your logs. Set a **URI Path** (like `/v1/logs`) appended to the host for log delivery. To remove a destination, click **Delete Configuration**. Logs return to the built-in viewer only on the next deployment. The `settings.json` method is legacy and will be deprecated. Switch to the dashboard configuration: no code changes required, and it works for both Meteor and Web Apps. *** ## Common Questions Galaxy supports one custom log destination per app. Route logs through an aggregator like Logstash or Fluentd if you need to forward to multiple tools. No. Custom destinations are additive. Your logs remain accessible in Galaxy's built-in viewer regardless of your external configuration. The configuration locks while your app is building or deploying. Wait for the operation to finish, then try again. *** ## What's Next? --- # Networking (https://help.galaxycloud.app/docs/dashboard/apps/settings/networking) The Networking tab manages the addresses your app answers on and the outbound IPs it connects from. ## Domains When you create an app on Galaxy Metal, you choose a subdomain prefix and Galaxy sets up the [Galaxy subdomain](/docs/apps/custom-domains#free-galaxy-subdomains) automatically. You can't add a Galaxy subdomain from **Networking**, even if your app currently has only a custom domain. If your app has a Galaxy subdomain, you can disable and re-enable it without releasing its name, but you can't delete it. Before disabling it, make another active domain primary. The primary domain determines your app's main URL and the value of `ROOT_URL` for Meteor apps. It can be a Galaxy subdomain or a custom domain you own. Use the star action on an active domain to make it primary. On paid plans, click **Add Custom Domain** to connect a domain you own, such as `app.yourcompany.com`. Custom domains need a DNS record at your registrar (a CNAME for subdomains, an A record for root domains). Galaxy provisions and renews SSL automatically, or you can upload your own certificate. See the [Custom Domains guide](/docs/apps/custom-domains) for DNS setup, and the [Custom Certificates](/docs/apps/custom-domains#custom-certificates) section for bringing your own. The tab shows a table of every configured domain with its status, encryption state, and per-domain actions. From the actions column you can set an active domain as primary, upload a custom TLS certificate, or delete a custom domain. Checking **Use custom certificate** when you add a domain does the same thing at creation time. ## IP Whitelisting Shows the outbound IPs your containers use for external connections. Add these to your database or external service allow lists. Available on the Professional plan for Meteor apps only. *** ## What's Next? --- # Notifications (https://help.galaxycloud.app/docs/dashboard/apps/settings/notifications) Get alerted when something happens to your app, through email, Slack, or webhooks. Each app supports up to 10 channels, and each channel routes the events you choose to one destination. Two channels can watch the same event, so a crash can page both your team Slack and an on-call webhook. ## Channel Types Enter the email address that receives alerts. The full address shows on the channel card. Paste a Slack incoming webhook URL (starts with `https://hooks.slack.com/services/`). Optionally set a channel override like `#deploys` to route messages to a specific channel. Enter an HTTPS endpoint. Galaxy signs each delivery with an HMAC secret so your receiver can verify it. The secret is generated when you create the channel. ## Events Pick which events trigger each channel. They're organized into seven groups: **Deployments**, **Push-to-deploy**, **App lifecycle**, **Health and uptime**, **Scaling**, **Certificates**, and **Configuration changes**. Sensible defaults are pre-selected, so you can leave them as-is. Every event in the Configuration changes group records who made the change. If a teammate edits your plan, resizes a container, or updates your allow list, you'll know exactly who did it. ## Managing Channels **Add a channel**: Click **Add channel**, pick a type, name it, set the destination, choose your events, then send a test to confirm delivery before saving. **Toggle active**: Flip a channel off to pause it without losing its config. Flip it back on anytime. **Test, edit, or delete**: Use the channel menu to send a test event, change events or destination, or remove it. Slack and webhook URLs are masked on the card since they're secrets; email addresses show in full. If a channel fails to deliver repeatedly, Galaxy disables it and emails you once. Fix the destination, then turn it back on. Migrated apps keep their alerts through a backfilled default channel, no setup required. *** ## Common Questions Yes. Events fan out to every active channel subscribed to them. Send a crash alert to both your team Slack and an on-call webhook by subscribing both channels to it. Your existing alerts carry over. Galaxy backfills a default channel from your old notification settings when your app moves to the new platform, so you keep getting alerted without any setup. You can edit or add to it from the Notifications tab. *** ## What's Next? --- # Scaling (https://help.galaxycloud.app/docs/dashboard/apps/settings/scaling) Autoscaling adjusts how many container replicas your app runs based on demand. Pick one of three modes. Autoscaling requires a paid plan. Free plans will see an upgrade prompt with all options disabled. ## None Autoscaling off. Manage replica count manually from the [Containers](/docs/dashboard/apps/containers) page. ## Basic Set a minimum and maximum replica count (1 to 10). Galaxy scales automatically targeting 70% CPU utilization. Drag the slider handles to set your range, then click **Save Configuration** when the unsaved changes bar appears. Click **Discard** to revert. ## Advanced Advanced mode replaces a single range with a list of named rules you control. Galaxy evaluates them on a schedule and adjusts your replica count to match. Reach for it when one CPU target isn't enough: different metrics, time-based scaling, or several conditions at once. Professional plan only. ### App-wide settings These apply to every rule: **Replicas**: The floor and ceiling for your app. Drag the two slider handles to set your minimum and maximum, up to your plan's container limit. No rule scales you below the floor or above the ceiling. **Polling interval**: How often Galaxy evaluates your metrics, in seconds. Defaults to 300. Lower it for faster reactions; raise it to smooth out noisy traffic. Accepts 10 to 3600. **Replicas per step**: How many replicas Galaxy adds or removes at a time. Defaults to 1. Raise it to scale in larger jumps. ### Scaling rules A rule describes one scaling intent. Add up to 20, give each a clear name, and switch them on or off individually. Advanced mode needs at least one rule; if you don't want any, switch back to **None**. Two ways to create one: * **Templates**: Click **Templates** for a menu of ready-made rules (High CPU defense, Business hours boost, Off-hours baseline, Traffic surge, Memory pressure). Picking one fills the editor so you can adjust before saving. It doesn't save on its own. * **Add rule**: Click **Add rule** to start from a blank editor. Every rule is one of two types: Scales when a metric crosses a threshold. Example: scale up when CPU goes above 70%. **Metric**: Choose `cpu`, `memory`, `requests`, or `connections`. CPU and memory are percentages; requests and connections are counts. **Comparator and threshold**: Set whether the metric should be **above** or **below** your number. A "below" condition only works as a gate alongside at least one "above" condition, so it can't drive scaling on its own. **Match all or any**: Add more than one condition, then choose whether they all must be true (**all**) or just one (**any**). **Schedule (optional)**: Restrict the rule to specific days and hours. Leave it off to run around the clock. Holds a minimum replica count during a time window, with no metric involved. Example: keep at least 3 replicas running on weekdays from 8:00 to 18:00. **Schedule**: Pick the days and hours the baseline applies. Use the presets (Weekdays, Weekends, All) or set them by hand. **Baseline replicas**: The floor to hold during the window. Outside the window the rule does nothing; inside it, Galaxy keeps at least this many replicas running. Schedules display in your local time and are stored in UTC, so they fire at the right moment for everyone on your team. As you edit a rule, Galaxy shows a plain-language summary of what it does, like "Scale up to 8 replicas when CPU is above 70% on weekdays 8:00 to 18:00." If two rules could conflict (same metric and overlapping schedule), you'll see a warning so you can review or remove the duplicate. When everything looks right, click **Save Configuration**. *** ## Common Questions Use Basic when a single CPU target covers you. Use Advanced when you need more than one metric (memory, requests, connections), time-based scaling, or several conditions on one rule. Advanced also lets you keep a baseline replica count during set hours, which Basic can't do. Yes. A common setup pairs a metric trigger (scale up when CPU is high) with a scheduled baseline (keep 3 replicas during business hours). Galaxy evaluates all your enabled rules together within your app-wide minimum and maximum. There's a short delay between a spike and new containers coming online, set by your polling interval. Set your minimum replica count high enough to absorb sudden bursts while Galaxy scales up. Yes. Each container is billed at your plan's hourly rate. Autoscaling reduces idle spend, but containers added during peak traffic count toward your bill. *** ## What's Next? --- # Security (https://help.galaxycloud.app/docs/dashboard/apps/settings/security) Control which IPs and countries can reach your app and how many requests they can make. Rules apply at the edge, before traffic reaches your containers, and take effect within a few moments. Advanced security options are available only on the Professional plan for Meteor apps or the Production plan for Web Apps. *** ## Allow List Exempts specific IP addresses and CIDR ranges from Custom DDoS rate limiting and Country Access restrictions. It does not restrict who can reach your app. Addresses that aren't listed can still connect, they're just subject to your rate limit and any country policy like everyone else. Click **+**, then enter a single IP or a CIDR range. Add an optional description to track what each entry is for. Use it for trusted office, VPN, monitoring, or CI addresses that shouldn't get throttled. The Allow List bypasses rate limiting and Country Access restrictions for listed addresses. It doesn't block anyone else from reaching your app. For country-based restrictions, use Country Access. For IP-specific blocking, use the Deny List. ## Deny List Blocks specific IPs while everyone else connects normally. Click **+**, enter an IP or CIDR range, and add an optional reason. The block stays until you remove it. An IP can live on one list at a time, never both. If a conflict would occur, the Deny List wins. Galaxy prevents you from adding the same address to both. ## Country Access Country Access controls app access based on the visitor's country. It costs **$200 per app per month**. Turning it on starts a recurring charge, and turning it off credits unused time in the current billing period. Choose an access policy, then search for and select one or more countries. Your country selections stay saved while Country Access is off. Active policies require at least one selected country. **Off**: Don't restrict access by country. **Block selected countries**: Visitors from selected countries receive a `403` response before reaching your app. Other countries remain allowed. **Allow only selected countries**: Visitors from countries that aren't selected, including visitors whose country can't be determined, receive a `403` response before reaching your app. Click **Save changes** to apply the policy. When you activate Country Access, review the price and confirm the recurring charge. A user with billing-management permission must accept the charge. IP addresses on your app's **Allow List** continue to reach the app even when their country is restricted. Country Access is separate from the Allow List and Deny List settings. ## Custom DDoS Caps how many requests a single source IP can make in a rolling 30-second window. Enable rate limiting, then set your threshold. The default is 500 requests per IP per 30 seconds. IPs that exceed it receive a `429 Too Many Requests` response until their rate drops back down. **Currently Blocked IPs**: A live table of every IP currently over the limit, with its request count and how long Galaxy has tracked it. Promote any row to your Allow List (to exempt it) or Deny List (to block it permanently). Rate limiting is temporary. An IP that slows down is served again as soon as its rate recovers. For a permanent block, use the Deny List. *** ## Common Questions Within a few moments. Allow List, Deny List, and rate-limit changes apply at the edge, so they aren't instant, but you won't be waiting long. There's no need to redeploy. The Deny List permanently blocks specific addresses you choose. Custom DDoS automatically throttles any IP that sends too many requests, then serves it again when its rate drops. Use the Deny List for known bad actors and Custom DDoS for general abuse protection. No. Country Access is available only on the Professional plan for Meteor apps or the Production plan for Web Apps, and it's configured and charged separately for each app. It costs $200 per app per month, with a prorated charge for the remaining days in the current billing period when you turn it on. Turning it off credits unused time in that period. Yes. Galaxy applies Country Access at the edge. Visitors who don't match the selected policy receive a `403` response before reaching your app. Addresses on your app's Allow List bypass country restrictions. In **Allow only selected countries** mode, the visitor receives a `403` response. In **Block selected countries** mode, the visitor isn't blocked by the country policy. *** ## What's Next? --- # Variables (https://help.galaxycloud.app/docs/dashboard/apps/variables) Ever commit an API key to Git by accident? Yeah, environment variables exist to prevent exactly that. Galaxy keeps variables encrypted and secure. They're never exposed in logs or error messages. They're the right way to handle secrets. Everything you store in Galaxy is encrypted at rest and in transit. No exposure in logs, no visibility to other team members unless you give access. *** ## Why Environment Variables? Never hardcode secrets in your code. Never commit API keys to Git. Never store passwords in your repository. Environment variables exist specifically to solve this problem. Set them in Galaxy, and your app reads them at runtime. Your code stays clean, your secrets stay safe, and you can change configuration without touching code. Think of environment variables as configuration that changes between environments. What you need in production is different from what you need in staging. Variables let you manage both without changing code. *** ## Meteor Apps: Settings Modes Meteor apps get a specialized settings experience in the **Variables** tab. At the top of the page, you'll see a **Settings Mode** toggle with two options: **Galaxy Mode** and **Repository Mode**. ### Choosing a Mode **Galaxy Mode is the recommended option for most teams.** Your settings are encrypted and stored securely in Galaxy, completely outside your repository. Even if your repo ever becomes public by accident, your secrets stay protected. Repository Mode trades that security guarantee for Git-based versioning. It works well for non-sensitive configuration, but any secrets in your settings file live in your repository. One accidental visibility change and they're exposed. Not sure which one to pick? Here's a quick way to think about it. Use **Galaxy Mode** if: * You want your secrets encrypted and stored outside your repository (recommended) * You manage settings directly in the dashboard * You deploy via the Meteor CLI (`meteor deploy`) * You don't have (or don't want) a Git integration set up Use **Repository Mode** if: * You deploy via Push to Deploy (P2D) with a Git integration * Your settings file contains only non-sensitive configuration * Your CI/CD pipeline already manages the settings file Repository Mode is only available when your app has a Git integration configured via Push to Deploy. If your app doesn't have a Git integration set up, the option is disabled in the toggle. Head to your app's **Settings** tab to connect a Git repository and enable P2D first. *** ### Galaxy Mode In Galaxy Mode, Galaxy stores your settings and injects them into your app on every deployment. This is the default for all Meteor apps. Look for the **GALAXY MODE** badge at the top of the page. You edit your complete `settings.json` in a dedicated JSON editor right in the dashboard. Galaxy validates your JSON as you type, catching syntax errors before you save. The editor holds your entire settings structure: ```json { "galaxy.meteor.com": { "env": { "MONGO_URL": "mongodb://user:password@host/db", "MAIL_URL": "smtp://user:password@smtp.example.com:587" } }, "packages": { "mongo": { "options": { "tlsAllowInvalidCertificates": true } } }, "private": { "paymentApiKey": "your-payment-api-key", "apiSecret": "your-api-secret" }, "public": { "appName": "My App", "apiUrl": "https://api.example.com" } } ``` In Galaxy Mode, the dashboard and the Meteor CLI write to the same place. If you run `meteor deploy --settings settings.json`, Galaxy updates the stored settings with whatever file you pass. That means a CLI deploy will overwrite any edits you made in the dashboard, and vice versa. They're always in sync, but the last write wins. The Meteor Settings editor has a maximum size limit of **1 MB** (1024 KB). If your settings approach this limit, you'll see a warning. Settings that exceed 1 MB cannot be saved. Consider moving large configuration data to external services or databases if you're hitting this limit. *** ### Repository Mode In Repository Mode, Galaxy reads your settings file directly from your Git repository snapshot captured during each Push to Deploy build. Look for the **REPOSITORY MODE** badge at the top of the page. You'll see a **Settings File Path** field showing the path to your settings file relative to the repo root. Click the edit icon next to the path to change it. Because settings come from your repository, there's no separate save step in the dashboard. Just update the file in your repo and push. Galaxy picks it up on the next deployment automatically. Repository Mode is great for non-sensitive configuration, but be careful with secrets. Any values in your settings file will be committed to your repository. For API keys and passwords, consider Galaxy Mode, or use environment variables outside the settings file. If you run `meteor deploy --settings settings.json` while Repository Mode is active, Galaxy ignores the file you pass. Settings always come from the repository snapshot, not from the CLI argument. If you need to update settings, update the file in your repo and trigger a P2D deployment. *** ### Understanding the Settings Structure Both modes use the same `settings.json` structure. Here's what each section does. **`galaxy.meteor.com.env`**: Environment variables that Galaxy injects into your container. These become available via `process.env` in your server code. Common uses include `MONGO_URL`, `MAIL_URL`, `ROOT_URL`, and other service connection strings. **`packages`**: Configuration for specific Meteor packages. The most common use is the MongoDB TLS setting for Galaxy's free shared cluster. **`private`**: Server-only settings accessible via `Meteor.settings` in your server code. API keys, service credentials, and other secrets belong here. These never reach the client. **`public`**: Client-accessible settings available via `Meteor.settings.public` in both server and client code. App names, feature flags, and public API endpoints go here. Everything in the `public` section is sent to browsers and visible to anyone using your app. Keep secrets in `private` or `galaxy.meteor.com.env` only. ### Editing Settings in Galaxy Mode 1. Navigate to your app's **Variables** tab 2. Make sure **Galaxy Mode** is selected 3. Edit the value directly in the JSON editor 4. Click **Save** to store your changes 5. Click **Deploy** to apply them to your running app 1. Navigate to your app's **Variables** tab 2. Make sure **Galaxy Mode** is selected 3. Add new keys to the appropriate section (`env`, `private`, or `public`) 4. Make sure your JSON syntax is valid (Galaxy validates as you type) 5. Click **Save** then **Deploy** 1. Navigate to your app's **Variables** tab 2. Make sure **Galaxy Mode** is selected 3. Delete the key-value pair from the JSON 4. Verify the remaining JSON is valid 5. Click **Save** then **Deploy** ### Accessing Settings in Your Code On the server, access all settings via `Meteor.settings`: ```javascript // Server-side code const paymentApiKey = Meteor.settings.private.paymentApiKey; const mongoUrl = process.env.MONGO_URL; ``` On the client, only `public` values are available: ```javascript // Client-side code const appName = Meteor.settings.public.appName; ``` *** ## Web Apps: Standard Variables For Node.js, Python, and AdonisJS apps, the Variables tab shows a standard key-value interface. Each variable appears as a row you can edit individually. ### Adding Variables Add variables one at a time by clicking **Add Variable**. Type the key (the variable name) and value (what your app reads). **Key**: The variable name your code looks for. Usually all uppercase with underscores, like `DATABASE_URL`, `PAYMENT_API_KEY`, or `API_TOKEN`. **Value**: What your app gets when it reads this variable. The actual secret, URL, or configuration value. Click **Save** to store the variable. ### Editing Variables Find the variable you want to change. Click it to edit. Update the value, click **Save**. Done. Your change is saved but not yet applied. ### Deleting Variables Find the variable and click the delete icon (trash can). Confirm the deletion. The variable is removed. Deleting a variable doesn't restart your app. The old value stays in memory until you deploy or restart. *** ## Save vs Deploy This is important. Saving and deploying are separate actions. **Save**: Click **Save** to store your variable changes. Your running app isn't affected. **Multiple edits**: Make as many variable changes as you need, saving each one. Your live app keeps running. **Deploy**: When ready, click **Deploy** to apply all saved changes. Galaxy performs a zero-downtime rolling restart, updating your app with new variables. This separation prevents accidents. Prepare configuration changes carefully. Only when you click **Deploy** does anything change. Changes only take effect after you deploy. Make all variable changes you need, then deploy once. This is more efficient than deploying after each variable change. *** ## Common Variables by Platform ### Meteor Apps ```json { "galaxy.meteor.com": { "env": { "MONGO_URL": "mongodb://...", "MAIL_URL": "smtp://...", "ROOT_URL": "https://myapp.us.galaxycloud.app" } } } ``` ### Node.js / AdonisJS ``` DATABASE_URL=postgresql://user:pass@host:5432/db REDIS_URL=redis://user:pass@host:6379 NODE_ENV=production LOG_LEVEL=info ``` ### Python ``` DATABASE_URL=postgresql://user:pass@host:5432/db SECRET_KEY=your-django-secret-key DEBUG=False ``` *** ## Best Practices **Keep them secure**: Never share variable values with anyone who doesn't absolutely need them. Don't paste them in chat or email. **Use strong values**: For API keys and tokens, use the strongest credentials your provider offers. For passwords, use long, random strings. **Rotate sensitive values**: Periodically regenerate API keys, auth tokens, and passwords. Update Galaxy with new values and redeploy. **Don't duplicate**: Don't create multiple variables with similar purposes. It's confusing and error-prone. One `DATABASE_URL` per environment, not five variants. **Document them**: Keep notes somewhere (not in code!) about what each variable is for. Future you will thank current you. **Use staging for testing**: Have separate variables for staging and production. Test configuration changes in staging before applying to production. Add `.env` to your `.gitignore` to prevent accidental commits of local environment files. *** ## Troubleshooting Check that you've deployed after adding the variable. Variables don't take effect until after deployment. Edit it, click Save, then Deploy. The change takes effect after deployment. Verify your JSON is valid in the editor. Check your app logs to see if `Meteor.settings` is populated correctly. Open your browser console and type `Meteor.settings` to see what's actually there. Changes to `public` require a rebuild, not just a restart. Galaxy handles this automatically, but it takes longer than environment variable changes. Wait for the full deployment to complete. The editor validates as you type. Look for red highlighting or error messages. Common issues include missing commas, unmatched brackets, or trailing commas after the last item in an object or array. The Meteor Settings editor has a 1 MB limit. If your settings exceed this, consider moving large data to external services, splitting configuration across multiple sources, or storing large values in your database instead of settings. Repository Mode requires Push to Deploy (P2D) to be configured. If your app doesn't have a Git integration set up, the option is disabled. Head to your app's **Settings** tab to connect a Git repository and enable P2D first. Yes, as long as your app has P2D configured. Switching to Galaxy Mode triggers a confirmation: your settings will no longer come from the repository, and Galaxy will use the JSON stored in the dashboard instead. Make sure your settings are in the right place before deploying after a switch. That's expected behavior in Galaxy Mode. The dashboard and the CLI share the same settings store, and the last write wins. If you run `meteor deploy --settings settings.json`, Galaxy updates the stored settings with that file. To avoid surprises, pick one source of truth: either manage settings in the dashboard or always pass them via the CLI. In Repository Mode, Galaxy reads settings from your Git repository snapshot, not from the CLI argument. The `--settings` flag is effectively ignored. Update the file in your repository and deploy via P2D to apply changes. Some variables are needed during the build process (for compilation, bundling, etc.). These might need special handling depending on your build system. Check your framework's documentation. Consider organizing by prefix: `DB_*` for database variables, `PAYMENT_*` for payment keys, `AWS_*` for AWS, etc. Makes them easier to find. *** ## What's Next? --- # Versions (https://help.galaxycloud.app/docs/dashboard/apps/versions) ## Understanding Versions A version is a snapshot of your code at a specific moment in time. Every push creates a new version. Versions are immutable, meaning they never change after creation. This makes rollbacks possible and safe. Think of versions like Git commits, but captured for Galaxy deployment. Each version is a complete, unchangeable record of your code. *** ## Version History The version history table shows all your versions. Each row displays: | Column | Description | | --------------- | ---------------------------------------------------------------------------------------------------------- | | **Version** | The version number. The currently active version shows an **Active** badge next to it | | **Source** | The Git branch and short commit hash together | | **Created** | When this version was created | | **Created By** | The username of the person who pushed the code | | **Runtime** | The runtime and version used for this build | | **Deployments** | Total deployment count with a breakdown of outcomes (e.g., `1 total (1 successful)`, `2 total (2 failed)`) | Click any version to see full details about it. *** ## Version Details Click any version in the list to open its detail page. The page header shows the version number with an **Active** badge if this is the currently running version. The **Rollback to This Version** button sits in the top right corner, grayed out if you're already on this version. The page is split into two sections: **Overview** and **Deployment History**. ### Overview The Overview card shows everything about the code snapshot itself: * **Branch and commit**: Displayed at the top as branch name and short commit hash * **Commit message**: The message from the Git commit, shown below the branch and hash * **Commit author**: The full name and email of the person who authored the commit * **Created by**: The Galaxy username of the person who triggered the deployment * **Created**: When this version was created * **Runtime**: The runtime and version used to build this version * **Build Commands**: A grid showing the Install, Build, Start, and Root commands Galaxy used for this version * **Deployments**: A quick summary at the bottom of the card (e.g., `1 total · 1 successful`) ### Deployment History Below the Overview card, the Deployment History section lists every time this version has been deployed. Each entry shows: * **Status badge**: Success, Failed, In Progress, or Cancelled * **Deployment ID**: A short identifier for this specific deployment run * **Username**: Who triggered it * **Date**: When this deployment ran * **Duration**: How long the deployment took to complete * **View Details**: A button to open the full deployment log and timeline The **Rollback to This Version** button creates a new deployment of this version's code. If this is already the active version, the button is disabled. Your app switches instantly with zero downtime. *** ## Rollback to a Previous Version Current version has issues? Your latest deployment broke something? Rollback to any past version in seconds. Find the version you want to go back to and click "Rollback to This Version". Galaxy instantly switches your app to run that version. Rollback is safe because versions are immutable. You're switching to code that was already tested and working before. No surprises. ### How Rollback Works 1. Find the working version you want to use 2. Click "Rollback to This Version" 3. Galaxy creates a new deployment of that old version 4. Your app switches to the old version instantly 5. Zero downtime. Users don't notice the switch. It's that simple. The old version becomes your current version. New deployments will be of this version going forward until you push new code. If something breaks in production, you can revert to a working version in seconds while you figure out what went wrong. *** ## Version vs Deployment Confused about the difference? Here's the simple explanation: **Version**: A code snapshot. Created every time you push. Immutable. One per push. Shows your code. **Deployment**: Running that code. Changes every time you deploy. Many per version. Shows what happened when code ran. One version can have multiple deployments. You might deploy the same code several times if you change configuration (environment variables, container size, etc.) but not the code itself. Want to understand this better? Check [Versions and Deployments](/docs/apps/versions-deployments) for the full detailed guide. You can rollback to any version. But you can't change a version after it's created. That immutability is what makes rollbacks reliable. *** ## Rollback Scenarios Here are common situations where rollback saves the day: ### New Code Has a Bug You pushed new code that broke something. Rollback to the previous version while you fix the bug. Your app works again instantly. Fix the code, push it, deploy again. ### Performance Regressed Last deployment made your app slower. Rollback to the previous version. Performance is back. Investigate the code change to see what caused the slowdown. ### Database Compatibility Issue New code requires a database schema change you haven't done yet. Rollback to the old version, run the migration, then redeploy new code with the migration complete. ### Accidental Bad Merge Bad code got merged to main. Rollback to before the merge. Delete the bad commit from your Git repository. When you fix it, push new code and deploy. ### Hotfix Needed Fast Production is down. You need a quick fix. Rollback to the last known working version. Your app is working again. Now take time to fix the bug properly. *** ## Recovery Considerations When you rollback, keep these in mind: **Your code goes backward**: You're running old code. Any bugs that version had are back too. **Database changes don't rollback**: If the old version expects a different database schema, you might have issues. Be careful if you've made database migrations. **New features disappear**: Users won't have access to features from the broken version. They'll only have what the old version provided. **Configuration persists**: Environment variables, settings, and configuration from your new version stay. Make sure they're compatible with the old code version. Usually rollback works fine. But if you've made database migrations, you might need to handle that carefully. *** ## Version Cleanup Versions are kept forever by default. They don't cost you anything, so Galaxy keeps them all. You can always rollback to any version, no matter how old. But if you want to clean up your version list, check with support about archival or deletion policies. Some versions might be removable if they're very old. *** ## Working With Many Versions As your app matures, you'll accumulate many versions. Use filters and search to find the one you need: **Filter by branch**: Show versions from a specific branch. **Filter by creator**: Show versions created by a specific team member. **Search by commit**: Paste a commit hash to find that specific version. These tools help you navigate your version history when you have dozens or hundreds of versions. *** ## Deployment Recording Each version shows all its deployments. This gives you a complete record of every time code has run. **Successful deployments**: Working versions, code that compiled and ran correctly. **Failed deployments**: Code that broke things. Useful for comparing what went wrong. **Configuration changes**: Same code deployed with different settings. This history is valuable for understanding your app's behavior over time. *** ## What's Next? --- # Billing Menu (https://help.galaxycloud.app/docs/dashboard/billing) The Billing page is titled **Personal Billing** for personal accounts and **Organization Billing** for organizations. Both show the same sections described below. *** ## Billing & Payment Method The **Billing & Payment Method** section sits at the top of the page. It shows the credit card currently configured for your account, along with the name and billing address on file. Click **Update Billing** to change your payment information. This opens a 3-step wizard: 1. **Personal information**: First name, last name, email, company name, VAT number (if applicable) 2. **Address**: Your billing address 3. **Payment method**: Update credit card details Once you complete the wizard, Galaxy saves your billing information for future charges. Your payment information is encrypted and secure. Galaxy follows industry-standard security practices. *** ## Savings Plan Below the payment method, you'll see a **"Get 20% OFF with our Savings Plan"** block. Pay annually and receive 20% off your total hosting costs. Click **Learn More** to explore the savings plan options. See the [Savings Plan guide](/docs/billing/savings-plan) for full details on how it works. *** ## Coupon Code The **Coupon Code** section shows your current promo status ("No active promo" if none is applied). Enter a promo code in the field and click **Apply** to activate it. Click **Manage Coupon** to view all redeemed codes, their state (Active or Inactive), and redemption dates. See the [Redeeming a Coupon Code](/docs/billing/coupon-code) guide for step-by-step instructions. *** ## Current Usage The **Current Usage** section shows how much you've been charged so far this billing period. It displays the total amount, a **METEOR APPS** badge indicating the scope, and the date range covered (e.g., "Usage between March 1st and March 21st"). Current Usage shows charges for Meteor Apps only. It does not include Web Apps or database charges. For a complete breakdown of all resource costs, click **View Invoices**. Click **View Invoices** to see detailed charges from previous months. Download PDF copies, see itemized breakdowns, review payment history, and keep records for accounting. Invoices are usually generated on the same date each month. Check them after your billing date to see what you were charged. *** ## Usage Summary Below the main billing card, the **Usage Summary** section gives you a detailed breakdown of consumption for any billing period. Use the **Period** dropdown to select which period to view. The default is **Current Month**, which shows the date range in progress. Two summary cards show: **Total Hours**: The total container-hours consumed during the selected period. **Total Cost (Dollars)**: The total dollar amount for that period. Below the summary cards, the **Usage Breakdown** section shows a per-resource breakdown of what contributed to your costs. If no apps ran during the period, it shows "No usage data available for this period." *** ## How Billing Works Charged on the same date each month for usage during that period. No contract, cancel anytime. Pay once per year, upfront, for a discounted rate. Requires a year-long commitment, but the discount makes it worth it if you're staying. Pay for resources you actually use. Bigger containers cost more. Running longer costs more. The Billing page shows all charges clearly. Each organization can have its own billing settings and payment method. Cancel anytime. If you cancel mid-month, you typically get a prorated refund for unused days. Upgrade or downgrade anytime. Changes take effect at your next billing cycle. *** ## Managing Costs **Review monthly.** Spend a few minutes each month checking your invoice. Make sure everything looks right. **Track usage.** Keep an eye on what you're using. Costs creeping up? Time to optimize resources or change how you're running things. **Use coupons.** Never leave promotional codes on the table. Discount offered? Apply it immediately. **Plan for growth.** Scaling up apps and databases? Expect costs to increase. Budget accordingly. **Optimize resources.** Look for opportunities: consolidate apps, optimize database queries, clean up unused resources. Less usage means lower bills. Stopping unused apps saves money quickly. Check app and database resource usage regularly. Sometimes a simple optimization, like removing an unused app or downscaling a database, saves significant money. *** ## Common Questions You're charged on the same date each month. The billing date is set when you create your account. Credit cards (Visa, MasterCard, American Express, Discover). If you cancel mid-month, you typically get a prorated refund for unused days. Contact support for specific situations. Current usage shows Meteor Apps only. For a complete breakdown including Web Apps and databases, check your invoices. Stop unused apps, downsize containers, scale down databases, or clean up resources you're not using. You only pay for what's running. We'll email you. Update your payment method in the Billing section. If charges remain unpaid, your account may be suspended. *** ## What's Next? --- # Databases Menu (https://help.galaxycloud.app/docs/dashboard/databases) ## Your Databases at a Glance The main page shows all your database clusters in a table. Everything you need is visible at a glance. Each row shows: * **Cluster name** * **Database type and version** (MongoDB 8.0.4, PostgreSQL 14, Redis 7.2) * **Cluster type** (Standalone, Replica Set, Sharded) * **Status** (Running, Provisioning, Failed) * **Region** * **Creation date** Search for databases by name using the search field. Filter by status, database type, or cluster configuration. Useful when you have lots of databases and you're hunting for a specific one. Click any database name to open its management page. View credentials, monitor performance, check logs, manage backups, and scale resources. Looking for a specific database? Use the search field and filters instead of scrolling. *** ## Creating a New Database Click "Create Database" to start the setup wizard. Answer a few questions and Galaxy handles the rest. ### Database Information Pick your database type: MongoDB, PostgreSQL, or Redis. Then choose your version. Galaxy offers several versions for each, so pick one that matches your needs (or stick with current stable if unsure). ### Configuration Select your cluster type. Standalone is great for getting started. Replica sets give you high availability for production. For some databases, you can toggle SSL on or off for encrypted connections. ### Size and Pricing Pick your instance size. Each shows RAM, CPU allocation, storage, and monthly price. Click a size to see full specifications and confirm pricing. ### Account and Location Select which Galaxy account owns this database (if you're in an organization). Choose the deployment region. Give your database a name. Only letters allowed (no spaces, special characters). This is your cluster name in the database list. ### Review and Create Galaxy shows a summary of everything you configured. Review it and make sure everything looks right. Click "Create Database & Start Billing" and Galaxy provisions your database. Billing starts immediately based on instance size. Want to test different sizes before committing? You can delete and recreate (you'll be charged pro-rated for days run). *** ## Managing Individual Databases Click any database name to open its management page. This is where you handle ongoing operations. At the top you'll see: status (Running, Provisioning, Deploying, Failed), database type and version, instance size, region, storage allocation, and resource details. ### Credentials Section Get connection information here. You'll see the admin username (masked, click the eye icon to reveal), password (also masked), and the full connection string to paste into your app's configuration. The admin user is a super user for administrative actions only, not applications. Create application-specific users if your database supports it. ### Additional Sections Click sidebar tabs to access different features: * **Metrics**: Performance data (connections, network, memory, CPU, disk) * **Logs**: Database activity * **Query Insights**: Slow queries and performance analysis (if available) * **Backups**: Backup history and manual backup creation * **Settings**: Database-specific options * **Danger Zone**: Delete the database Each database type (MongoDB, PostgreSQL, Redis) has slightly different management options and metrics. Core functionality stays the same. *** ## Database Types Galaxy supports three main database types: * **MongoDB**: Flexible document database for evolving schemas and content-heavy applications * **PostgreSQL**: Powerful relational database with strict structure and advanced SQL * **Redis**: Lightning-fast in-memory data store for caching, sessions, and real-time data For detailed info on choosing the right database, visit the [Databases](/docs/databases) documentation. *** ## Zero Data Transfer Fees Here's something that sets Galaxy apart: you don't pay for data transferred between your apps and databases. They're designed to work together. Push as much data as you want without worrying about egress charges. Architect your applications the way you want without cost penalties. *** ## Backups and Recovery Data safety is built in from day one. **Automatic backups** run on a schedule you set (usually daily, with 4-7 day retention depending on plan). See your backup history and download from any backup point if something goes wrong. **Manual backups** let you capture snapshots on demand whenever you want. *** ## Database Security Galaxy includes built-in security features: * **Encrypted connections**: Data in transit protected with SSL/TLS * **Strong password requirements**: Credential management included * **Network access control**: Restrict which IPs can connect (useful for limiting access to just your app's containers) * **Automatic security patches**: Stay current without worrying *** ## Common Questions Choose the region closest to your apps. Latency matters for database performance. If your app runs in us-east-1, your database should too. Standalone is great for development and testing. Replica sets give you high availability for production, your data is replicated across multiple nodes. Copy the connection string from the Credentials section and add it as an environment variable in your app's Variables section. Automatic backups run daily by default, with 4-7 day retention depending on your plan. You can also create manual backups anytime. Galaxy monitors all databases 24/7. If something goes wrong, we're notified immediately. Replica sets provide automatic failover. *** ## What's Next? --- # Logs (https://help.galaxycloud.app/docs/dashboard/databases/logs) ## Real-Time Activity Stream Open the Logs section and you're watching your database's heartbeat in real-time. Every connection, every operation, every error streams past. It's like looking over your database's shoulder as it works. This is invaluable when something goes wrong. Deploy new code and watch logs. See connections spike? That's expected when your app starts up. See error messages? Now you know exactly what broke. Logs update live. If your database is active right now, you'll see entries appearing instantly. Sit and watch for a minute to get a feel for the activity pattern. ## Understanding Log Entries Each log entry shows several pieces of information: **Timestamp**: When this action happened. Millisecond precision helps you correlate with app events. **Message**: What actually happened. "Connection accepted", "Operation successful", "Authentication failed", "Client disconnected". **Level**: How severe the entry is. Info for normal activity, warning for potential issues, error for failures. **Details**: Extra information like client IP, operation type, execution time, or error codes. Log format varies depending on your database type. MongoDB logs differently than PostgreSQL, and Redis has its own format. Galaxy shows them all in their native format so you see exactly what your database is reporting. ## Filtering Logs Looking through all logs can be overwhelming. Use filters to find what matters: **Search field**: Type any text to find matching entries. Looking for failed authentications? Search "authentication". Want to see what happened with a specific client? Search the IP address. **Older entries**: Use "See Older" button to browse back through history and see what happened previously. The search is straightforward text matching, so be specific. Too broad and you'll get thousands of results. Too specific and you'll miss things. ## Live Mode Toggle between live streaming and viewing static logs. When live mode is active, new entries appear instantly as they happen. When it's off, you're viewing a snapshot. **Live mode on**: Perfect for testing your app when you just deployed. Push some traffic through and watch logs appear in real-time. You'll see exactly what your database is doing. **Live mode off**: Better for reviewing what happened in the past. Take your time reading through entries without new ones pushing things off screen. Deploy new code and turn on live mode. Watch logs for 30 seconds. You'll see your app connect, run queries, maybe hit an error. This is how you spot issues before users notice. ## What's Next? --- # Metrics (https://help.galaxycloud.app/docs/dashboard/databases/metrics) ## Understanding Your Database Performance Metrics are your window into how hard your database is working. You'll see charts for CPU usage, memory consumption, active connections, disk usage, and network traffic. These tell you whether your database is humming along or struggling under load. Check metrics regularly. You'll spot trends before they become problems. A steadily climbing CPU line? Time to optimize queries or scale up. Memory consistently maxed out? Your instance size might be too small. ## Time Range Filtering At the top, you can filter metrics by time period. Choose from preset options like 5 minutes, 1 hour, 24 hours, and 7 days to understand performance over different timeframes. Did something spike yesterday at 3pm? Set that time range and see what the metrics were doing then. Investigating an issue that happened last week? Pull up metrics from that specific window. Metrics are most useful when correlated with actual events. Deploy new code and watch metrics. Performance regressed? You'll see it here. ## Active Connections This chart shows how many database connections are currently open. Each line represents a different type of connection activity. Watch this when your app scales up or when traffic patterns change. A sudden spike in connections might indicate that your app is creating too many database sessions, which can be inefficient. A healthy pattern shows connections rising with traffic and falling during quiet periods. ## Network Traffic See data flowing in and out of your database. **Network In** shows data coming into your database (queries, writes, updates). **Network Out** shows data leaving (query results, reads). If network traffic is consistently high, you might be transferring too much data between your app and database. Consider optimizing queries to fetch only what you need. ## Memory Utilization Your database uses RAM for caching, indexes, and operations. This chart shows how much of your allocated memory is being used. Watch for patterns. Is memory usage proportional to your data size and query load? Good. Is memory constantly at 100%? Consider upgrading to a larger instance. Memory pressure causes performance to degrade fast. If memory hits 100% frequently, your queries might be inefficient or your data is growing faster than your instance can handle. Either optimize your schema and queries, or upgrade to a larger instance size. ## CPU Utilization Your database's processor power is precious. This chart shows what percentage of your CPU is being used. Normal patterns show CPU spiking with heavy queries then returning to baseline. If CPU is constantly high, your queries might be doing expensive operations. Consider adding indexes or optimizing slow queries. ## Operations This chart breaks down database operations by type: commands (green), queries (orange), updates (blue), deletes (red), and inserts (yellow). Watch which operations dominate your traffic. A read-heavy workload (mostly queries) has different scaling needs than a write-heavy one (mostly inserts and updates). Understanding your operation pattern helps you optimize effectively. ## Disk Usage Shows how much storage you're actually using versus your allocated capacity. Watch for a steadily climbing line. If you're approaching capacity, plan to increase storage before you hit the limit. Running out of disk space is one of the worst things that can happen to a database. Keep an eye on disk usage. If you approach your allocated storage limit, your database can fail. Increase your instance size well before you hit capacity. ## Reading the Charts Each metric chart shows: **X-axis**: Time. The chart displays data over your selected time range. **Y-axis**: The metric value. CPU percentage, memory in MB, connections count, disk in GB, etc. **Color-coded lines or areas**: Different aspects of that metric, or comparisons over time. Hover over any point to see exact values at that time. This helps you pinpoint the exact moment something changed. ## What to Look For **Healthy patterns**: * Metrics that rise with traffic and fall during quiet periods * Gradual trends, not sudden spikes * Values consistently below your instance's capacity limits * Balanced operation types (not all writes or all reads) **Warning signs**: * Metrics staying at or near 100% capacity * Sudden unexplained spikes * Connections climbing without leveling off * Disk usage approaching limits * Network traffic way higher than expected ## Comparing Metrics Over Time Metrics are most useful when you compare them over time. Is your app getting slower over weeks? Pull up metrics from different dates and compare. See if CPU or memory usage is trending upward, which might indicate data growth or inefficient queries. This historical perspective helps you plan for growth. If memory usage grows 10% per week, you know you'll need a larger instance in a few weeks. ## Troubleshooting with Metrics **App is slow**: Check CPU and memory metrics. Are they consistently high? That's your bottleneck. Are they low? The problem might be network latency or query efficiency, not resource constraints. **Database connections keep increasing**: Look at active connections. Are new connections staying open instead of closing? That's a resource leak in your app. Each connection holds memory. **Disk filling up**: Check disk usage chart. Is it growing steadily? You need either to delete old data or upgrade your instance size. **Performance got worse after a code change**: Compare metrics before and after the change. Did CPU or connections spike? That tells you what the change broke. Metrics alone don't solve problems, but they point you in the right direction. Use them with [Logs](/docs/dashboard/databases/logs) and [Query Insights](/docs/dashboard/databases/query-insights) to get the full picture. ## What's Next? --- # Overview (https://help.galaxycloud.app/docs/dashboard/databases/overview) ## Quick Status Check At the top, you'll see your database's name and status at a glance. The info card shows eight fields in a grid: | Field | Description | | -------------------- | -------------------------------------------------------------------------------------------------------- | | **Status** | Whether your database is Running, Provisioning, Failed, or another state. Green means everything's good. | | **Database** | The type and version. | | **Containers** | How many container instances are running. | | **Instance Size** | The name of your instance tier. | | **Region** | Where your database is deployed. | | **Type** | `Standalone` for single instances or `Replicaset` for high-availability across multiple nodes. | | **Storage** | How much disk space is allocated. | | **Instance Details** | The actual resource specs for your instance. | *** ## Credentials Your database connection details appear in the **Credentials** section below the info card. The admin user is a SUPER user and should only be used for administrative actions, not in applications. Create application-specific users with access to specific databases for your app connections. Each credential field has two icons on the right: an eye icon to reveal the value, and a copy icon to copy it directly to your clipboard without revealing it. * **Username**: Your admin username, masked by default. * **Password**: Your admin password, masked by default. * **Connection String**: The complete connection URL to use in your app's environment variables. The format varies by database type (e.g., `mongodb://...`, `postgres://...`, `redis://...`). *** ## What's Next? --- # Query Insights (https://help.galaxycloud.app/docs/dashboard/databases/query-insights) ## Understanding Your Query Performance Query Insights automatically analyzes your database queries and surfaces the ones dragging down performance. Think of it as a performance dashboard pointing out exactly where your database is working hardest. You'll see charts showing slow queries, execution patterns, and operation rates. This data helps you understand where your database is spending time and which queries might benefit from optimization. Focus on queries that run frequently. A query that's slow but runs once a month is less urgent than one that's moderately slow but runs thousands of times a day. ## Time Range Filtering At the top, filter by time period. Choose from preset options like 5 minutes, 1 hour, 24 hours, and 7 days to understand performance over different timeframes. Troubleshooting a production issue from yesterday? Pull up yesterday's data. Tracking if your app is gradually getting slower? Compare insights from different weeks to spot trends. ## Slow Queries This section shows queries taking longer than expected. Each query is listed with timing information and how many times it's run. What matters here: * How long each query took * How many times it executed * Total time spent across all executions A query that's moderately slow but runs thousands of times is usually more important to fix than a query that's very slow but runs once. ## Query Duration Distribution This chart shows how query execution times are distributed. Most queries fast? You'll see a tall spike on the left. Have a few slow outliers? You'll see a tail extending right. This helps you understand if you have a few problematic queries or if slow performance is widespread across your workload. ## Query Patterns and Trends Query Insights tracks performance over time, showing you if things are stable, improving, or getting worse. A growing slow query rate means your database is getting slower over time. Either your data is growing (tables are getting bigger), or your query patterns changed. Either way, it's a signal to investigate. ## What Query Insights Shows and Doesn't **Shows**: * Which queries are slow * How often they run * Total time spent on them * Performance trends over time **Doesn't show**: * Exact application code that triggered the query * Business logic problems (a correct query computing wrong data) * Application-level issues like N+1 query patterns (your app code reveals those) Use Insights alongside your application code and database logs to understand the full picture. ## Next Steps Once you identify slow queries, you'll want to investigate further and optimize. The next steps depend on your specific database and query patterns. Need guidance on optimizing a specific query? Check your database's official documentation or [reach out to Galaxy support](/docs/getting-started/support) with the query details. ## What's Next? --- # Database Settings (https://help.galaxycloud.app/docs/dashboard/databases/settings) ## Backups Your database backups are your safety net. Galaxy automatically backs up your database daily, and you can customize the schedule and retention period or create manual backups anytime. ### Automatic Backup Schedule Galaxy creates daily backups automatically. By default, backups are kept for **4 days at no additional cost**. If you need longer retention for compliance or peace of mind, you can extend it. Extended retention comes with additional costs. Click **Edit Schedule** to customize: * **Backup Time (UTC)**: Pick the specific time your backups run. Choose a time outside your peak traffic hours to minimize performance impact. * **Retention Period**: How many days to keep automatic backups. Default is 4 days. Changes take effect immediately for future backups. ### Manual Backups Click **Create Manual Backup** anytime to capture a snapshot outside the automatic schedule. Useful before major changes or migrations. Note: You can create up to one manual backup per 24-hour period. ### Downloading Backups Each backup in the history table has an **Actions** column with a download icon. Click it to download a backup dump, useful for exporting data or archival purposes. ### For Complete Backup Information The Backups section here shows your backup history and lets you adjust schedules. For deeper details about how backups work, restoration, and extended retention options, see: * [Database Backups](/docs/databases/backup) for comprehensive backup information * [Extended Backup Retention](/docs/databases/extended-backup) for keeping backups beyond 4 days ## Danger Zone This section contains permanent, irreversible actions. Proceed with caution. ### Delete Database Deleting your database permanently removes it and all its data. There's no recovery after deletion. **What happens**: * Your database becomes inaccessible to your apps immediately * A 30-day backup is created automatically (for emergency recovery only) * You receive email notifications when deletion starts and completes * After 30 days, all backups are deleted permanently **Before you delete**: * Export any data you need to keep * Make sure no apps are using this database * Verify you don't need the data for compliance or archival Only delete if you're absolutely certain. Export critical data first. This cannot be undone. ## What's Next? --- # Defining Your Context with the Header (https://help.galaxycloud.app/docs/dashboard/discovering/header) ## Switching Between Accounts and Regions Ready for one of Galaxy's superpower features? You can switch context instantly. This is huge when you're working across multiple projects or collaborating with teams. ## Account Selector Look at the top-left, right next to the Galaxy logo. This dropdown lets you switch between your personal account and any organizations you're part of. Organizations are perfect for team collaboration. Multiple developers can manage apps and databases together from one shared workspace. Want to create a new organization? Just select "New Organization" from this menu. **Personal Account**: Your solo projects and personal stuff goes here. **Organizations**: Team spaces where you collaborate with other developers. ## Region Selector Located immediately to the right of the account selector, this is how you manage resources in different geographical locations. Galaxy runs across three main regions: | Region Code | Region Name | Location | | ------------------ | ------------ | ----------------- | | **us-east-1** | US East | Virginia, USA | | **ap-southeast-2** | Asia-Pacific | Sydney, Australia | | **eu-west-1** | EU West | Roubaix, France | You need to be in the correct region context to view and manage your resources. If you can't find an app or database, check your region selector first. --- # Discovering the Galaxy Dashboard (https://help.galaxycloud.app/docs/dashboard/discovering) # Get Started --- # Organizations (https://help.galaxycloud.app/docs/dashboard/discovering/organizations) ## What Are Organizations? Want to collaborate on Galaxy? You need an organization. Organizations let multiple developers deploy, scale, and monitor apps together. Think of them as shared workspaces where your team can access the same resources without sharing login credentials. Here's the key thing: you always log in as yourself. Organizations don't have passwords. Each team member uses their own Galaxy account, and organizations group those individual accounts together. **Why this matters:** * Each person keeps their own credentials secure * You can track who did what * Removing someone doesn't affect others * Security settings (like 2FA) are per-person, not shared *** ## Creating an Organization Ready to set up a team workspace? Here's how. ### Open the Account Switcher Click the account dropdown at the top left of the dashboard. You'll see your personal account listed, plus any organizations you're already part of. ### Create New Organization Click "New Organization" at the bottom of the dropdown menu. Enter a name for your organization. Choose carefully. Organization names are locked once created. Can't change them later. ### Set Up Billing Each organization has its own billing. Go to the Billing section and add a payment method for your new organization. Organization charges are completely separate from your personal account billing. ### Add Your Team Head to the Members section and start inviting collaborators. They'll need their own Galaxy accounts first. See the [Members Menu](/docs/dashboard/members) guide for details on adding team members and assigning roles. Organization names are permanent. Pick something you won't regret, like your company name or project codename. *** ## Switching Between Accounts Use the account switcher at the top left of the dashboard to move between your personal account and organizations. Your dashboard view changes depending on what you select. When viewing an organization, you see that organization's apps and databases. Access to billing, members, and organization settings depends on your role and the organization's Billing Management setting. Switch back to your personal account and you see your individual resources. Not seeing the resources you expected? Check which account is selected in the switcher. Apps and databases belong to specific accounts, and you only see what belongs to the currently selected one. *** ## Organization vs Personal Account What's the difference? **Personal accounts** are for individual developers. Apps and databases here are yours alone. Great for personal projects, learning, or solo work. **Organizations** are for teams. Multiple people share access to the same apps and databases. Everyone uses their own login, but resources are collectively managed. You can have both. Keep personal experiments in your individual account and move team projects to an organization. *** ## Roles and Access Each organization member has one role: **Owner**, **Admin**, **Developer**, or **Viewer**. Roles determine organization-level capabilities, while a separate app-permissions matrix lets eligible users choose which app features Admins, Developers, and Viewers can use. App permissions are set by role and apply to all apps in the organization. They aren't configured per member or per app. Database access and billing continue to follow their existing organization rules. For a role overview and the available app permission controls, see the [Members Menu](/docs/dashboard/members). Each organization has one owner. The owner has full access and can transfer ownership. New members join as Viewers. Owners and admins manage members and roles; only the owner can transfer ownership. Configure billing access in [Organization Settings](/docs/dashboard/settings). Changing a role's app permissions changes access for every member with that role across all organization apps. For hard separation between projects, create separate organizations. *** ## Deploying to Organizations When you deploy an app, Galaxy needs to know which account should own it. **Push to Deploy**: Select your organization in the account switcher before starting the deployment flow. The app deploys to whatever account is currently selected. **CLI deployment**: Use the `--owner` flag to specify the organization. See the [Meteor CLI deployment guide](/docs/apps/meteor/cli) for details and examples. Manual deployment access depends on the member's role and the organization's app permission settings. Check the **Manual deployments** permission in the [Members Menu](/docs/dashboard/members) if someone can't deploy. *** ## Transferring Apps Have an app on your personal account that the team needs? Move it in from the app's own Settings page, under Danger Zone. The organization owner then accepts the request from the dashboard, and the app arrives with its configuration and domains intact. Moving an app back out works the same way, in the other direction. Both sides of the transfer are owner-only. You need to own the account the app is leaving, and the owner of the destination account has to approve. See [Transfer an App](/docs/apps/transfer-apps) for the full walkthrough. *** ## Organization Billing Each organization has completely separate billing from your personal account. * Own payment method * Own invoices * Own usage tracking Charges for organization resources never appear on personal account bills. Make sure to set up billing for each organization you create. *** ## Closing an Organization Need to shut things down? **Pause without closing**: Just stop all apps and databases. Galaxy doesn't charge for inactive resources. The organization stays available if you want to restart later. **Close permanently**: Contact support. They'll walk you through closing the organization entirely. All apps, databases, and member associations are deleted. Closing is permanent. Export any data you need first. Let team members know they'll lose access. *** ## Common Questions Yes. A single Galaxy account can be a member of multiple organizations. Use the account switcher to move between them. Viewer, the most limited role. An owner or admin can change it from the Members Menu once they've joined. No, organization names are locked once created. If you need a different name, you'd have to create a new organization and transfer resources. There's no limit. Create as many as you need to organize your teams and projects. No limit. Add as many team members as you need. App permissions are configured by role and apply across every app in the organization. You can't configure different app permissions for a specific app or individual member. For hard separation between projects, create separate organizations. The owner can do it from the dashboard. Open [Organization Settings](/docs/dashboard/settings), pick a member under Transfer Ownership, and confirm. You stay on as a member afterward. You lose access to them. The apps stay with the organization. If you need personal copies, coordinate with the owner before leaving. No. The organization has one billing account. Individual members don't pay, the organization does. *** ## What's Next? --- # Navigating the Sidebar (https://help.galaxycloud.app/docs/dashboard/discovering/sidebar) The sidebar is your main navigation for Galaxy. Everything you see is filtered by your currently selected region and account or organization. If something looks missing, check those selectors first. Switch regions or accounts and the apps and databases you see will change. Can't find something? Check the selectors at the top of the page. *** ## Sidebar Sections The sidebar items are the same for personal accounts and organizations, with one difference: personal accounts show **Security**, organizations show **Members**. **[Overview](/docs/dashboard/overview)**: Your landing page when you log in. See your most recently active apps and databases at a glance, with quick links to the full lists. **[Apps](/docs/dashboard/apps)**: Deploy, monitor, and scale your applications. Filter by status, plan, or type, and click any app to manage it individually. **[Databases](/docs/dashboard/databases)**: Manage your MongoDB, PostgreSQL, and Redis instances. View connection details, metrics, and storage from here. **[Billing](/docs/billing)**: Track costs, view invoices, apply coupons, and manage your payment method for the current billing period. **[Security](/docs/dashboard/security)** (personal accounts): Set up two-factor authentication and update your password. **[Members](/docs/dashboard/members)** (organizations): Manage members, configure app feature access by role, control email notifications, and remove access when needed. **[Settings](/docs/dashboard/settings)**: Update your email addresses, profile info, and account preferences. *** ## What's Next? --- # Galaxy Dashboard (https://help.galaxycloud.app/docs/dashboard) # Welcome to Your Dashboard The Galaxy dashboard is where you manage everything. Deploy apps, create databases, check costs, invite team members, and monitor your infrastructure. It's organized so you can find what you need fast. Log in to your [Galaxy dashboard](https://my.galaxycloud.app) and you're ready to go. *** ## Your Main Navigation On the left side of your screen, you'll see the main menu. The sections change slightly depending on whether you're managing a personal account or an organization, but they always contain the same core tools. *** ## The Header At the very top of your dashboard, you'll find two important controls. **Account Selector** (left side): Switch between your personal account and any organizations you're part of. Click it to create new organizations or manage where you're working. **Region Selector** (next to account selector): Pick where your apps and databases run. Galaxy operates in US East, EU West, and Asia Pacific. Everything you see is filtered by this selection, so if you can't find something, check your region first. *** ## Getting Started **First time here?** Head to [Overview](/docs/dashboard/overview) for a quick look at what's running, then pick a section that matches what you need to do. **Ready to deploy?** Jump to [Apps](/docs/dashboard/apps) and click "Deploy New App". **Need a database?** Go to [Databases](/docs/dashboard/databases) and click "Create Database". **Managing a team?** If you're in an organization, head to [Members](/docs/dashboard/members) to invite developers. **Want to understand costs?** Check [Billing](/docs/dashboard/billing) to see what you're spending. *** ## Quick Tips Your dashboard is always filtered by your current region and account selection. If something looks missing, verify you're in the right account and region. The same menu item appears in both personal accounts and organizations, but some sections change names (Security becomes Members in organizations). You can switch between accounts and regions instantly without losing your place. Need detailed guidance on a specific section? Click any card above to jump to that area's full guide. --- # Members Menu (https://help.galaxycloud.app/docs/dashboard/members) The Members section only appears for organization accounts. Personal accounts don't have this option. New to organizations? Check out the [Organizations](/docs/dashboard/discovering/organizations) guide to learn how team collaboration works on Galaxy. ## Viewing Your Team When you open the Members section, you see a table of everyone in your organization. Each row shows one team member with key information. The table displays: * **Username**: Their Galaxy login name (how you find them when adding) * **Role**: Their role in the organization (Owner, Admin, Developer, or Viewer). The owner shows as fixed text. For everyone else, this is a dropdown you can change if your role allows it. * **Email Notifications**: Toggle for organization activity emails (deployment alerts, database changes, billing updates) * **2FA Status**: Whether they have 2FA enabled and which method they're using (Authenticator App or Email) You can't enable 2FA for someone else, but you can check to make sure they've set it up. Make sure all team members have 2FA enabled. Essential for protecting your organization's data and applications. *** ## Roles and App Permissions Organization roles control team and resource access. The **Owner** has full access and is the only role that can transfer ownership or move apps between accounts. **Admins** and **Developers** can manage apps, while **Viewers** have limited access. The Members page's **App permissions** matrix lets eligible users tailor access to app features for each role. The matrix controls app features across every app in the organization. It doesn't set permissions for an individual member or a specific app. Database access and organization-level actions continue to follow their existing rules. ### App Permission Defaults Unless changed in the matrix, role permissions use these defaults. An owner always has every app permission. | App feature | Admin | Developer | Viewer | | ----------------------------------------- | ------- | ----------- | ----------- | | General settings and runtime logs | Allowed | Allowed | Not allowed | | Deployment history and details | Allowed | Allowed | Not allowed | | Manual deployments | Allowed | Allowed | Not allowed | | App lifecycle (start, stop, restart) | Allowed | Allowed | Not allowed | | Scaling | Allowed | Allowed | Not allowed | | Application variables and Meteor settings | Allowed | Not allowed | Not allowed | These are defaults, not fixed role definitions. Changing a role's app permissions affects all members with that role in the organization. ### Configure App Permissions The **App permissions** panel appears below the members table. It lists app features as rows and organization roles as columns. Select or clear a checkbox to change access for that role. **Variables** combines access to application environment variables and Meteor `settings.json`; the control enables or disables both together. * Owners can edit Admin, Developer, and Viewer permissions. * Admins can edit Developer and Viewer permissions, but not Admin permissions. * Developers can view the matrix when they can access organization settings, but can't edit it. Viewers and users without organization settings access can't manage members. * Owner permissions are always enabled and can't be changed. Select **Save changes** to apply edits, or **Cancel** to discard the current draft. Unsaved selections don't change access. If another authorized user saves changes first, reload the latest matrix before saving your edits. Managing member roles is a separate control: use the **Role** dropdown in the member's row. Only owners and admins can change roles. You can't assign Owner from that dropdown; use Transfer Ownership in [Organization Settings](/docs/dashboard/settings). ### Changing a Member's Role Find the member in the table and use the **Role** dropdown to pick Admin, Developer, or Viewer. The change takes effect right away. A few things to know: * You can't assign Owner from the dropdown. To hand off ownership, use Transfer Ownership in [Organization Settings](/docs/dashboard/settings). * The owner's row is fixed. It shows "Owner" as text, not a dropdown. * Only owners and admins can change roles. If your role can't, the dropdown is disabled and hovering it tells you why. *** ## Adding Team Members Want to bring someone new onto your team? They need their own Galaxy account first. ### Have Them Create an Account They must create their own account. Can't do it from the Members section. Send them to [https://my.galaxycloud.app/signup](https://my.galaxycloud.app/signup) to sign up, create a password, and complete setup. ### Get Their Username Ask them to share their Galaxy username so you can find them when adding. ### Invite Them Click "Add New Member" in the top right of the Members section. Enter their username and click "Add Member". They join right away as a **Viewer** (the most limited role) and appear in your Members list. Change their role from the dropdown once they're in. ### What Access Do They Get? New members start as **Viewer**. Their access to app features follows the organization's Viewer settings in the **App permissions** matrix. To change app access, update the Viewer permissions; changing a member's role affects their other organization access too. **About billing access:** Billing sits outside the role system. Whether members can see billing information depends on your organization settings. The owner can restrict billing access in the [Settings Menu](/docs/dashboard/settings). If set to "Only Organization Owner," members won't see payment methods or invoices. *** ## Managing Member Settings Once someone is part of your organization, you can control a few key settings. ### Email Notifications Each member has a toggle for email notifications. * **Notifications on**: They get emails about events, alerts, deployments, and changes * **Notifications off**: No email notifications, but their role-based access stays the same (useful if they prefer checking the dashboard manually) Toggle the checkbox in the "Email Notifications" column. Takes effect immediately. Team member drowning in notifications? Don't remove them. Just toggle off their email notifications. Their access doesn't change. ### 2FA Status Look at the 2FA column to see each member's status: * **2FA Enabled (App)**: Using an authenticator app (best option) * **2FA Enabled (Email)**: Using email-based 2FA (still good, less secure) * **2FA Disabled**: No 2FA set up (security risk) You can't enable 2FA for someone else. Encourage team members without it to set it up. Point them to the [Security Menu](/docs/dashboard/security) guide. Team member without 2FA? Their account is at greater risk. Encourage them to set it up immediately, especially if they have Developer or Admin access to production systems. *** ## Removing Members Sometimes you need to remove someone. Maybe they left the company, or you need to reduce access. Find the member in the table and click "Remove" on their row. Confirm, and they're instantly removed with all access lost. **What happens when you remove someone:** * Can't access the organization anymore * Can't see apps and databases * Can't deploy applications or make changes * Ongoing deployments they started keep running, but they can't manage them * Their personal Galaxy account stays active (they just lose access to your organization) Removing someone is instant and irreversible. Made a mistake? You'll need to add them back manually, and they'll rejoin as a Viewer. Removing a member is permanent. They lose all access immediately. Be certain before you confirm. *** ## Pro Tips **Start people at the right role.** New members land as Viewer. Only bump them to Developer or Admin when they actually need to deploy or manage the team. **Require 2FA from day one.** When inviting new team members, ask them to enable 2FA before accessing production systems. Make it standard practice. **Monitor 2FA status regularly.** Check the Members page occasionally to confirm all team members still have 2FA enabled. Quick security audit. **Use notification toggles wisely.** Some want all alerts, others prefer checking manually. Respect preferences. **Keep admin access tight.** Only owners and admins can change roles. Hand out Admin sparingly, and use Developer for people who just need to ship. **Offboard properly.** When someone leaves, remove them immediately. Don't leave old members with access to sensitive resources. *** ## Common Questions Viewer, the most limited role. An owner or admin can change it from the table by picking a new role in the dropdown. Owners and admins. Developers can add and remove members but can't change roles. Viewers can't manage members at all. App permissions are configured by role and apply across every app in the organization, not per app or per individual member. For hard separation between projects, create separate organizations. No, you can't enable it for them. But you can check their status in the Members table and encourage them to set it up. Removing is instant and irreversible. You'll need to add them back manually by clicking "Add New Member" and entering their username again. They'll rejoin as a Viewer, so you'll need to reassign their role. There's no limit to the number of members you can add to an organization. Depends on your settings. The organization owner can restrict billing access to "Only Organization Owner" in the Settings menu. Otherwise, all members can see billing information. The owner does it from the dashboard. Open [Organization Settings](/docs/dashboard/settings), pick a member under Transfer Ownership, and confirm. The previous owner stays on as a member. No. Moving an app between accounts is owner-only on both ends, so admins, developers, and viewers see the control disabled. See [Transfer an App](/docs/apps/transfer-apps). *** ## What's Next? --- # Understanding Galaxy Metal Infrastructure (https://help.galaxycloud.app/docs/dashboard/metal) ## What is Galaxy Metal? Galaxy Metal is our complete rebuild of the hosting platform. It's built on bare metal servers with direct hardware access and no virtualization overhead. All Galaxy applications run on this infrastructure, giving you faster builds, enhanced security, and superior performance. The best part? You don't have to do anything. It just works. Every Galaxy app runs on Metal infrastructure. You get the performance boost automatically, no configuration needed. ## Why Galaxy Metal Matters We built Galaxy Metal to give you faster deployments, better security, and more powerful performance without adding complexity. Here's what you get: Less time waiting for builds to finish, more time developing. Deployments that used to take minutes now finish in seconds. We've eliminated build queues and achieved 3x faster builds overall. Enterprise-grade features built into the platform: role-based access control, network policies, and comprehensive audit logging. No "enterprise tier" required for security fundamentals. Direct hardware access means no virtualization overhead. Dedicated, stable hardware with no "noisy neighbor" issues. Your app gets the full power of the physical server with nothing in between. Your app stays live while we deploy. Blue-green deployments ensure your new version is fully tested before we switch traffic over, and it happens faster than ever. *** ## Data Security and Compliance Galaxy Metal maintains rigorous security and data protection standards. Your data is protected under our comprehensive security framework, with enterprise-grade encryption and industry-standard compliance. Currently GDPR compliant with Data Processing Agreements available for all customers. We're also working on SOC 2 Type II and ISO 27001 certifications throughout 2026 to support customers with strict compliance requirements. Want to learn more about how Galaxy handles your data? Check out our [Data Processing Agreement](https://galaxycloud.app/legal/dpa/) for complete details on data protection, GDPR compliance, and security measures. *** ## Cloud Architecture and Data Sovereignty Galaxy Metal uses a cloud-agnostic architecture. This means we can deploy your application on the infrastructure that best fits your needs, whether that's for compliance, performance, or business requirements. **EU Region and Data Sovereignty** If data residency matters for your compliance requirements, Galaxy's EU region runs on OVHcloud, a French company headquartered in Roubaix. This means your data stays in Europe on European-owned infrastructure, subject to EU jurisdiction rather than the US Cloud Act. There's no extra cost for this flexibility; it's part of Galaxy Metal. **Custom Infrastructure Needs** If your application requires specific infrastructure considerations for technical or compliance reasons, reach out to our support team. We'll work with you to find the right solution for your use case. Have specific infrastructure or compliance needs? [Contact our support team](/docs/getting-started/support) to discuss your requirements. *** ## Domain Changes on Migration Migrating to Galaxy Metal changes your app's free domain. Your app gets a new domain in the `galaxycloud.app` format (like `myapp.us.galaxycloud.app`), and your previous `.meteorapp.com` domain stops working once migration completes. If your app is reachable through its old `meteorapp.com` URL (in links, integrations, or bookmarks), that URL breaks after migration. Add a [custom domain](/docs/apps/custom-domains) before or immediately after migration to keep your app reachable without interruption. *** ## Do You Need to Do Anything? **Short answer**: Nope, not for your app itself. **Long answer**: Galaxy runs all apps on Metal infrastructure automatically. You don't need to change your workflow, update your code, or modify your deployment process. Everything just works, except faster. The one exception is your free domain. If you rely on the old `meteorapp.com` URL, see [Domain Changes on Migration](#domain-changes-on-migration) above and set up a custom domain to avoid any interruption. That's Galaxy Metal in action. Check your deployment logs to see the performance improvements. *** ## Common Questions Yes. All Galaxy applications run on Metal infrastructure. If you're deploying on Galaxy, you're using Metal. Nope. Your code works exactly the same on Metal. No configuration changes needed. No redeployment required. Everything just works. If you've deployed a new app on Galaxy recently, you're on Metal. You'll notice faster build times compared to older deployments. Your deployment logs will also reflect the Metal infrastructure. Galaxy's team monitors all infrastructure closely. If anything unexpected happens, we handle it immediately. You can always [reach support](/docs/getting-started/support) for help. No pricing changes. You pay the same rates for the same plans. You just get better performance at the same cost. Databases have been running on Metal infrastructure since before the application migration. If you're using Galaxy's managed databases, they're on Metal. It stops working. Migrating to Galaxy Metal automatically assigns your app a new free domain in the `galaxycloud.app` format, and the old `.meteorapp.com` domain no longer resolves. Add a [custom domain](/docs/apps/custom-domains) beforehand if you need to avoid any interruption. *** ## What This Means for You Galaxy Metal represents our commitment to giving you the best hosting platform possible. Faster builds mean you spend less time waiting and more time shipping features. Enhanced security means your apps are better protected. Superior performance means your users get faster response times. And you didn't have to do anything to get these benefits. That's the whole point. Your deployment workflow stays the same. Your code doesn't change. You just have a faster, more secure, more powerful platform underneath everything you're already doing. Questions about Galaxy Metal infrastructure? Check out our [support page](/docs/getting-started/support) to learn how to reach us. ## What's Next? --- # Overview Menu (https://help.galaxycloud.app/docs/dashboard/overview) ## Recent Apps Your most recently active applications show up instantly in this section. Each app card displays what matters for a quick status check: the app name, current status, container count, and plan tier. One glance tells you everything. Click any app name to jump to its management page. That's where you configure deployments, scale containers, view logs, and make changes. See something stuck or unexpected? Click it and investigate. Click "View All" for your complete app list. Useful when you have many apps and you're hunting for one that's not in the recent section. Check Overview first when you log in. It's the fastest way to see what's running and what needs attention. *** ## Recent Databases Similar to apps, your most recent database clusters appear here for a quick view of your data layer. Each card shows the database name, type (MongoDB, PostgreSQL, Redis), version (like MongoDB 8.0.4), and current status. This quick glance tells you whether databases are running smoothly or need attention. Click any database to open its management page. View connection credentials, check performance metrics, manage backups, and scale as your needs grow. Click "View All" to browse your entire database collection. Handy when you need to find a specific one that's not in the recent list. Database showing "Provisioning" or "Failed"? Click into it to see what's happening. Logs and details are right there. *** ## Making the Most of Overview Overview is your jumping-off point, not your command center. Use it to get oriented when you log in and spot anything needing attention. Notice an app or database with an unusual status? That's your signal to click in and investigate. Status changes often signal something important, and logs explain why. The beauty of Overview? It shows you what matters in seconds. You don't need to be a Galaxy expert to scan this page and know what's running, what's stopped, and whether anything looks wrong. *** ## What's Next? --- # Security Menu (https://help.galaxycloud.app/docs/dashboard/security) The Security section only appears for personal accounts. In an organization, you'll see the [Members menu](/docs/dashboard/members) instead. ## Two-Factor Authentication Two-factor authentication (2FA) adds a crucial second layer of protection. Even if someone gets your password, they can't access your account without the second verification. It's the single most important thing you can do to protect your account. Don't skip 2FA. Set it up as soon as you create your account. 2FA isn't optional if you care about security. We strongly recommend setting it up immediately. *** ## Choose Your 2FA Method ### The Gold Standard Use an app like Google Authenticator, Authy, or Microsoft Authenticator. **How it works:** 1. Click "Enable App 2FA" 2. Galaxy shows you a QR code 3. Open your authenticator app and scan it 4. Your app generates a new 6-digit code every 30 seconds 5. When logging in, enter your password, then the current code Only you can generate valid codes unless someone has physical access to your phone. **Why this is the best option:** * Codes generated on your phone with no network dependency * Even if Galaxy's servers are compromised, your codes stay secure * Time-based codes make brute force attacks impossible * You maintain complete control **Recovery codes:** When you enable App 2FA, Galaxy gives you recovery codes. These backup codes work if you lose access to your authenticator app (like getting a new phone). Store them somewhere safe and separate from your phone, like a password manager. Save recovery codes in a password manager. Keep them separate from your phone so you can access them even if your phone is lost. Toggle App 2FA on and off anytime. Switching phones? Disable it on the old device and set it up fresh on the new one. ### Alternative Option Email 2FA is available if you can't use an authenticator app, but it's less secure. **How it works:** 1. Click "Enable Email 2FA" 2. When logging in, Galaxy sends a code to your email 3. Check your email, copy the code, enter it **Why it's less secure:** * Your email itself could be compromised * Email delivery isn't instant * An attacker controlling your email can intercept codes **But still better than no 2FA:** * Much better than just a password * Simple and straightforward * Works as a backup if something happens to your authenticator app You can enable both App 2FA and Email 2FA at the same time for redundancy. If one method breaks, you have a backup. Consider enabling both methods for maximum security. If one breaks, you have a backup. *** ## Updating Your Password Your password is your first line of defense. Keep it strong and change it regularly. On the right side of the Security page, you'll see a password update form. Enter your current password (to confirm it's you), your new password, and confirm. Click "Update Password" and it's done immediately. ### Making a Strong Password Your password should be: * At least 12 to 16 characters long * Mix of uppercase, lowercase, numbers, and symbols * No personal information (names, birthdays, addresses) * No dictionary words or obvious patterns * Different from other accounts * Never reused **Bad:** `password123` **Good:** `Gx$7mK@nP2qL9wR#vY` Use a password manager like 1Password, LastPass, or Bitwarden. They generate strong passwords and remember them. You only need one master password. ### When to Change Your Password * Regularly (every few months) * Immediately if you suspect someone has access * After major security events (adding or removing 2FA) * Never reuse old passwords Use a password manager. Easier and more secure than creating passwords yourself. *** ## If Your Account Is Compromised Suspect someone has access? Act fast. 1. Change your password immediately 2. Check your 2FA setup is still configured correctly 3. Review recent login activity if available 4. Check apps and databases for unauthorized changes 5. Contact support if something looks wrong Don't panic. Galaxy's security features limit what an attacker can do. If you have 2FA enabled, they can't access your account even with your password. *** ## Security Best Practices **Use a password manager** to generate and store all passwords. Unique and complex, every time. **Enable 2FA on your email address.** Your email is how you recover all your other accounts. Protect it. **Never share your Galaxy login** with anyone, even team members. Use Organizations for team collaboration instead. **Logout on shared computers.** Coffee shop, library, shared office? Always logout when done. **Keep devices updated** with latest security patches. This applies to phone, computer, and authenticator apps. **Watch account activity.** Login attempts from unfamiliar locations or strange times? Change your password immediately. *** ## Common Questions Authenticator app is more secure. Use Email 2FA only if you can't use an authenticator app. You can enable both for redundancy. Use your recovery codes to log in. That's why it's critical to store them somewhere safe and separate from your phone. Yes, you can toggle it off anytime. But we don't recommend it, your account is less secure without 2FA. Every few months, or immediately if you suspect it's compromised. Use a password manager to make this easy. At least 12-16 characters, mix of uppercase, lowercase, numbers, and symbols. No dictionary words, personal info, or patterns. Use the "Forgot Password" link on the login page. Galaxy sends a reset link to your email. When you sign up via Google or GitHub, no Galaxy password is created for your account. To set one, go to the login page and click "Forgot Password". Enter the email address associated with your Google or GitHub account and Galaxy will send you a password reset link. Follow the link to create a password. After that, you can log in with either your social account or your new email and password. *** ## What's Next? --- # Settings Menu (https://help.galaxycloud.app/docs/dashboard/settings) The Settings page changes depending on what you have selected in the account switcher at the top of the dashboard. Personal accounts show profile management. Organizations show organization configuration. ## Account Details Your username and email address identify you on Galaxy. **Username** is displayed at the top. This is your unique identifier. You use it to log in, it shows up in your profile, and it's how organization admins find you when adding members. Here's the catch: your username is locked once your account is created. Can't change it later. If you absolutely need a different username, you'd have to create a new account (but that means losing current apps and databases). Pick something you won't regret. **Primary email address** is shown below your username. Galaxy uses it for password reset links, account recovery, important notifications, and billing communications. If this email changes (switching providers, for example), update it here so you don't lose access. *** ## Email Management You can have multiple email addresses on your account. Useful for switching providers, having a backup for recovery, or separating work and personal emails. ### Adding an Email Click "Add New Email" to add another address. Galaxy sends a verification link. Click the link to confirm you own it. If verification doesn't arrive: * Check your spam folder * Wait a moment and refresh the page * Request verification again from the Settings page Once verified, the email is ready to use. ### Setting Your Primary Email Your primary email handles password resets and important communications. Change which email is primary anytime by clicking "Set as primary" next to any verified email. Only verified emails can be set as primary. Pending emails show a "Verify" button to send another verification. ### Removing an Email Click "Remove" next to any email. You need at least one address on your account. Set up a backup email if possible. If you lose access to your primary, a verified backup can help you regain access. *** ## Incoming App Transfers When someone transfers an app to your account, the request lands here under **Incoming App Transfers**. Each pending request shows the app name and the account it came from, with **Accept** and **Reject** next to it. Accept and Galaxy starts preparing the app in your account. Reject and the app stays with the sender. You'll also see a banner at the top of any dashboard page while a request is waiting. Click **Review transfer** on the banner to handle it without coming to this page. Only the account owner can review incoming transfers. Everyone else sees a note explaining that. An accepted app arrives with its configuration and domains, and the sending account loses its credentials and access to it. Confirm with the sender before accepting anything you weren't expecting. Sending an app to someone else works from the app's own Settings page. See [Transfer an App](/docs/apps/transfer-apps) for that side of the flow. *** ## Stopping Your Account Want to stop using Galaxy? Two options. ### Pausing Your Account Might come back later? Consider stopping your apps instead of canceling. Galaxy doesn't charge for inactive or deleted apps. Stop everything, let your account sit dormant, re-enable whenever you're ready. ### Canceling Entirely Sure you want to leave? You can close your account completely. Click "Contact Support" from the Settings page and the team walks you through cancellation. They'll explain what happens and answer questions. **Before you cancel:** * Export important data from databases * Make sure application code is backed up (Git repository or locally) * If unsure, consider just stopping apps and keeping account dormant * Support team can help with questions about the process Cancellation is permanent. Once you cancel and data is deleted, it's gone. Be absolutely sure before confirming. ## Organization Details When you select an organization in the account switcher, the Settings page shows organization-specific information. **Organization name** appears at the top. This is the organization's unique identifier across Galaxy. Like personal usernames, organization names are locked once created. **Owned by** shows who created and owns the organization. The owner has full control and is the only one who can transfer ownership or close the organization entirely. Assigning roles and managing who's on the team happens in the [Members Menu](/docs/dashboard/members). This page covers organization details, billing permissions, and ownership. *** ## Billing Management This is where things get interesting for teams. You can control who manages billing for the organization. Two options: * **Any Organization Member**: Everyone in the organization can view and manage billing settings, update payment methods, and access invoices * **Only Organization Owner**: Billing access is restricted to the organization owner only Only the organization owner can change this setting. Everyone else sees it as read-only. Choose based on your team structure. Small teams might be fine with open billing access. Larger organizations often prefer restricting it to the owner for tighter financial control. Running a company account? "Only Organization Owner" keeps billing details private from developers who just need to deploy apps. *** ## Transfer Ownership Every organization has exactly one owner. When you need to hand that off, do it right from this page. Under **Transfer Ownership**, pick the new owner from the member dropdown and click **Change Ownership**. Confirm the prompt, and the role moves over. You stay on as a member of the organization afterward. Only the current owner can transfer ownership. If you don't own the organization, you won't see this control. Once you confirm, the selected member becomes the owner with full control, including the ability to transfer ownership again or close the organization. Hand off only to someone you trust. *** ## Incoming App Transfers Apps sent to the organization show up here under **Incoming App Transfers**, with the app name, the source account, and **Accept** and **Reject** buttons. A banner at the top of any dashboard page points to the same requests while they're pending. Only the organization owner can accept or reject. Admins, developers, and viewers see a note instead of the buttons, even though they can open this page. An accepted app arrives with its configuration and domains, and the sending account loses its credentials and access to it. Confirm with the sender first. To move an app out of the organization, use the Transfer App control on the app's own Settings page. See [Transfer an App](/docs/apps/transfer-apps). *** ## Closing an Organization Want to stop billing for the organization? You have options. ### Just Stop the Apps Galaxy doesn't charge for inactive or deleted apps. If you want to pause without losing access, simply stop all your apps and databases. The organization stays active but costs nothing. ### Close Entirely Ready to shut everything down? Click "Contact Support" and the team walks you through it. They'll help you understand what happens to apps, databases, and member access. **Before closing:** * Export all database data you need to keep * Make sure all application code is backed up * Let team members know (they'll lose access) * Consider just stopping resources if you might return Closing an organization is permanent. All apps, databases, and member associations are deleted. Be certain before confirming. *** ## API & Integrations The Settings sidebar splits into two groups. **General** holds the account or organization details covered above, and **API & Integrations** holds two pages that work the same way for personal accounts and organizations. **Authorized Domains**: The domain whitelist for apps that use Meteor as an identity provider. **Public API**: Scoped credentials for server-to-server automation. Each credential is locked to the applications and capabilities you pick, and you can rotate or revoke it whenever you need to. It's available for Meteor apps on the Professional and Custom plans, and the [Public API article](/docs/apps/meteor/api) walks through the whole setup. Only the account owner, or an owner or admin of the organization, can manage Public API credentials. Developers and viewers don't see the page. *** ## Pro Tips **Keep your email current.** Change your email provider? Update it in Galaxy too. Don't let them get out of sync. **Use a stable recovery email.** If possible, use an email unlikely to change (like a Gmail you'll keep forever) as recovery. Lifeline if you ever lose primary access. **Verify your backup email.** Having a second verified email means you're not locked out if you lose primary access. Worth setting up. **Review settings occasionally.** Every few months, check Settings to make sure everything is current. Email addresses change, life happens. **Don't share your account.** Not even with team members. Use organizations for collaboration. Keeps your credentials safe while letting others work on the same resources. **Match billing permissions to your team.** Small team where everyone handles finances? Open billing access is fine. Larger team with dedicated finance people? Restrict it to owners. *** ## Common Questions No, usernames are locked once your account is created. If you absolutely need a different username, you'd have to create a new account (losing current apps and databases). No, organization names are locked once created. If you need a different name, you'd have to create a new organization and transfer resources. There's no limit. Add as many as you need for backup, work, personal, etc. Check your spam folder, wait a moment and refresh the page, or request verification again from the Settings page. The owner can do it from this page. Under Transfer Ownership, pick a member, click Change Ownership, and confirm. The previous owner stays on as a member. In the Incoming App Transfers section on this page, or from the banner that appears at the top of any dashboard page while a request is pending. Only the account owner sees the Accept and Reject buttons. Pausing means stopping your apps but keeping your account. Canceling means closing your account permanently. Pausing is reversible; canceling is not. Only the organization owner can change whether billing is open to all members or restricted to the owner. The account owner for a personal account, or an owner or admin for an organization. Developers and viewers can't create, rotate, or revoke credentials, and neither can an impersonated session. Yes, if their role allows it. Billing permissions only affect access to payment methods, invoices, and billing settings. What a member can do with apps depends on their role, not the billing setting. *** ## Security Reminders Settings handles profile stuff. Account security happens in a different section. Keep these in mind: **Change password regularly.** In the [Security Menu](/docs/dashboard/security). Strong password changed occasionally is your first defense. **Keep 2FA enabled.** Should be active in your Security menu. Adds crucial second layer of protection. **Verify recovery emails.** Make sure backup emails are actually verified and working. Test occasionally. *** ## What's Next? --- # Database Backups (https://help.galaxycloud.app/docs/databases/backup) ## How Backups Work Galaxy creates automatic daily backups of every database. Think of them as snapshots in time. If data gets corrupted, deleted, or something breaks, you can restore from any backup point. Every database automatically gets backups with no setup required. They just happen in the background while you sleep. All Galaxy databases include automatic daily backups with a 4-day retention period at no extra cost. *** ## Standard Backups Every database includes automatic daily backups automatically. No cost, no configuration needed. **Retention:** 4 days **Cost:** Included with your plan **Backups per day:** 1 (daily backup) Perfect for most use cases. If something breaks today, you can restore from up to 4 days ago. For most scenarios, that's plenty of time to catch and fix problems. If you need to keep backups beyond 4 days for compliance or business reasons, check out the [Extended Backup Retention guide](/docs/databases/extended-backup). *** ## Backup Timing and Schedule Backups run automatically every day during a consistent window. Understanding when they run helps you plan around large data imports or maintenance. ### Backup Window Daily backups run between **03:00 and 05:00 UTC** by default. That's the timeframe when Galaxy creates your backup snapshot. The exact time within that window can vary, but backups always happen during those two hours. If you run large data operations, avoid that window to prevent impact on your application. ### Want a Different Time? If the 03:00 to 05:00 UTC window doesn't work for your schedule, contact support. We can often arrange a custom backup window that aligns with your needs. Just mention your preferred time when you reach out, and we'll see what we can do. *** ## Logs and Metrics Beyond backups, Galaxy also retains logs and performance metrics for troubleshooting and analysis. ### What's Retained **Logs:** Up to 10,000 lines of database activity logs are kept. Useful for debugging queries, finding errors, and understanding what happened during a specific time period. **Metrics:** Performance data like CPU, memory, connections, and disk usage are retained for one full calendar month. After that, older metrics are automatically removed. You can access both logs and metrics from your database's dashboard in Galaxy. Click into any database, then look for the Logs or Metrics sections. If you delete your database, both logs and metrics are automatically deleted along with it. Backups remain available according to your retention policy, but the database-level logs and metrics are gone. *** ## Downloading Backups Need your data back? Galaxy makes backups available for download so you can restore them yourself. From your database's Backups section in the Galaxy dashboard, you'll see a list of all available backups with their dates and sizes. Select the backup you need and download it. You can then restore the data to your database using your database tool's import features. This gives you full control over when and how you restore data. *** ## Common Questions Check your database's Backups section in the Galaxy dashboard. You'll see a list of all backups with their status (Success, In Progress, Failed). Each entry shows when it ran and how large it is. Yes. From your database's Backups section, select a backup and look for a download option. This lets you store a copy offline or migrate to another system. Absolutely, as long as a backup was created after your data was added but before you deleted it. Download the appropriate backup from your Backups section and restore it using your database tool's import features. Backups run during the scheduled window and use dedicated resources. They don't significantly impact your app's performance, but if you notice slowness during backup hours, reach out to support to explore custom timing. Yes. All backups are encrypted and stored securely using the same security standards as your live database. Backups continue for your retention period. Once your retention period expires, old backups are deleted automatically. If you want to keep specific backups longer, extend your retention period. Yes. Any backups still within your new retention period stay available. Extended retention applies to all existing and future backups. Good question. It's smart to test a restore every few months to make sure your backup strategy actually works when you need it. You'll feel more confident knowing recovery works. *** ## Backup Best Practices **Keep your retention period realistic.** More retention means higher costs. 4 days covers most accidental deletions. Extend beyond that only if you really need long-term protection. **Test restores occasionally.** Don't assume backups work until you've tested a restore yourself. Verify your recovery procedure works before you actually need it. **Combine with your own backups.** Database backups are great, but consider maintaining your own backup outside Galaxy for critical data. Defense in depth is always smart. **Review backup needs regularly.** As your data grows, backup costs increase. Check quarterly whether you actually need extended retention or if you can scale back. **Download important backups.** For mission-critical data, download backups and store them somewhere secure and separate from Galaxy. *** ## What's Next? *** ## Still Have Questions? Backups are critical infrastructure, and we want you to feel confident they're protecting your data. If you have questions about your specific backup setup, [reach out to support](/docs/getting-started/support). We're here to help make sure your data is safe. --- # Connect Your Database with TablePlus (https://help.galaxycloud.app/docs/databases/connect) # TablePlus Want to visually browse your Galaxy database without writing SQL? TablePlus is a slick database manager that works with MongoDB, PostgreSQL, Redis, and more. It's the easier way to poke around your data. This guide gets you connected in just a few minutes. *** ## Before You Start You'll need: * Access to your Galaxy dashboard * A database already provisioned on Galaxy (MongoDB, PostgreSQL, or Redis) * TablePlus installed on your computer * An internet connection Don't have TablePlus yet? Download it from the [official site](https://tableplus.com/download/) for your operating system. It's available for Mac, Windows, and Linux. TablePlus is free to download and use. They offer a paid version with extra features, but the free version works great for connecting to Galaxy databases. *** ## Get Your Connection Details Your Galaxy database connection credentials are right in your dashboard. Here's where to find them. ### Log Into Galaxy Head to your [Galaxy dashboard](https://my.galaxycloud.app). ### Navigate to Databases Click **Databases** in the sidebar menu. ### Select Your Database Find the database you want to connect to and click on its name. ### Copy the Credentials Scroll to the **Credentials** section. You'll see three important pieces: * **Username**: Your database user * **Password**: Your database password * **Connection String**: The complete URL you'll paste into TablePlus Copy that connection string (it looks something like `mongodb://user:pass@host:27017/dbname?ssl=true`). You'll need it in the next step. That connection string contains your password. Keep it secure. Don't commit it to Git, don't paste it in chat, don't leave it lying around. *** ## Connect TablePlus to Your Database Now open TablePlus and point it at your Galaxy database. ### Launch TablePlus Open the TablePlus application on your computer. ### Create a New Connection Click **Create a New Connection** on the welcome screen, or go to **Connection > New > Connection** in the menu. ### Pick Your Database Type TablePlus shows you a list of database types. Find the one matching your Galaxy database (MongoDB, PostgreSQL, Redis, etc.) and select it. Look for an **Import from URL** button. Click it. ### Paste Your Connection String A dialog appears asking for a URL. Paste that connection string you copied from Galaxy earlier. The full URL should look something like: ``` mongodb://your_user:your_password@host.region.galaxy.mongodb.net:27017/dbname?ssl=true ``` Then click **Import**. ### Verify and Save TablePlus automatically parses the URL and fills in the connection fields: host, port, username, password, database name, and SSL settings. Everything should be populated correctly. Give your connection a friendly name if you want (like "Production MongoDB" or "Galaxy Dev Database"). This makes it easier to find later if you have multiple databases. Click **Test** to verify the connection works. If it connects, you're good to go. Click **Save** and you're done. Connected? You now have direct visual access to your database. Browse tables, run queries, and manage data without touching the command line. *** ## What You Can Do Now Once connected, TablePlus gives you full visual access to your database: * **Browse tables and collections**: See your data structure at a glance * **Run queries**: Write and execute SQL or database-specific commands * **Edit data**: Update records directly from the table view * **Manage schema**: Modify tables, add columns, create indexes (depending on database type) * **Export data**: Pull data out for backups or migration *** ## Keeping It Secure Your database connection is as secure as your computer and the connection credentials you're using. A few things to keep in mind: **Never share your connection string.** It includes your password. If someone gets it, they get full access to your database. If you accidentally expose your connection string, change your database password immediately from the Galaxy dashboard. Don't wait. **Keep TablePlus updated.** Security patches matter. Check for updates regularly in TablePlus settings. **Use strong database passwords.** Long, complex, unique. If you inherited a weak password, change it. **Review access regularly.** In the Galaxy dashboard, check which users have access to your database. Remove users who no longer need it. *** ## Troubleshooting **Connection times out?** Make sure your database is running (check the Galaxy dashboard). Also verify the connection string is exactly right, especially the host, port, and database name. **"Authentication failed" error?** Double-check your username and password. Spaces, special characters, and case sensitivity all matter. If you're not sure, reset your database password in the Galaxy dashboard and use the new one. **Can't find Import from URL?** Different versions of TablePlus have slightly different UIs. Look for an option to paste a connection URL, or manually fill in the host, port, username, password, and database name fields instead. **Still stuck?** [Reach out to Galaxy support](/docs/getting-started/support). We can help verify your connection details and troubleshoot connection issues. *** ## What's Next? --- # Database Plans (https://help.galaxycloud.app/docs/databases/database-plans) Galaxy manages your databases so you don't have to. Pick the plan that fits your current needs and scale up as your app grows. All plans include monitoring and daily backups. ## MongoDB MongoDB on Galaxy is available in two deployment modes: **Standalone** (single node, great for most apps) and **Replicaset** (three nodes for high availability and automatic failover). Every Meteor app on the Free Plan includes a shared MongoDB cluster at no cost. It's great for testing and early development.
| Plan | RAM | CPU | Storage | | -------- | ------ | ------- | ------- | | Basic | 512 MB | 0.5 ECU | 5 GB | | Starter | 1 GB | 1 ECU | 10 GB | | Standard | 2 GB | 2 ECU | 15 GB | | Pro | 4 GB | 4 ECU | 30 GB | | Premium | 8 GB | 4 ECU | 60 GB | | Plus | 16 GB | 6 ECU | 100 GB | | Ultra | 32 GB | 12 ECU | 180 GB |
| Plan | RAM | CPU | Storage | | -------- | ------ | ------- | ------- | | Basic | 512 MB | 0.5 ECU | 5 GB | | Starter | 1 GB | 1 ECU | 10 GB | | Standard | 2 GB | 2 ECU | 15 GB | | Pro | 4 GB | 4 ECU | 30 GB | | Premium | 8 GB | 4 ECU | 60 GB | | Plus | 16 GB | 6 ECU | 100 GB | | Ultra | 32 GB | 12 ECU | 180 GB |
**Standalone** works well for most apps in development. **Replicaset** is the right call when you can't afford downtime: it keeps three synchronized nodes running, so a failure on one doesn't take your database offline. *** ## Redis Redis is Galaxy's in-memory data store, built for caching, session management, and real-time workloads. It's fast by design.
| Plan | RAM | CPU | Storage | | -------- | ------ | ------- | ------- | | Basic | 512 MB | 0.5 ECU | 5 GB | | Starter | 1 GB | 1 ECU | 10 GB | | Standard | 2 GB | 2 ECU | 15 GB | | Pro | 4 GB | 4 ECU | 20 GB | | Premium | 8 GB | 4 ECU | 30 GB | | Plus | 16 GB | 6 ECU | 40 GB | | Ultra | 32 GB | 12 ECU | 50 GB |
**Basic** covers most caching scenarios for small apps. Go **Pro** or above if you're storing large datasets in memory or running high-throughput pub/sub workloads. *** ## PostgreSQL PostgreSQL on Galaxy gives you a fully managed relational database with the same flexible sizing as the rest of the platform.
| Plan | RAM | CPU | Storage | | -------- | ------ | ------- | ------- | | Basic | 512 MB | 0.5 ECU | 5 GB | | Starter | 1 GB | 1 ECU | 10 GB | | Standard | 2 GB | 2 ECU | 15 GB | | Pro | 4 GB | 4 ECU | 30 GB | | Premium | 8 GB | 4 ECU | 60 GB | | Plus | 16 GB | 6 ECU | 100 GB | | Ultra | 32 GB | 12 ECU | 180 GB |
**Standard** is a solid baseline for most relational workloads. Step up to **Pro** or **Premium** when you're handling complex queries, heavy joins, or larger datasets. *** ## What's Next? --- # Extended Backup Retention (https://help.galaxycloud.app/docs/databases/extended-backup) Galaxy takes daily backups automatically and keeps them for 4 days at no extra cost. Extended retention lets you keep those backups for longer: 15 days, 30 days, or a custom period. *** ## What It Costs Extended retention is billed at **US$ 0.06 per GB per day** for storage beyond the standard 4-day window. The charge is based on your allocated database size, not how much data you're currently storing. **Formula:** `allocated size (GB) × extra days × $0.06` | Database size | Retention | Extra days | Monthly cost | | ------------- | --------- | ---------- | ------------ | | 10 GB | 14 days | 10 | US$ 6.00 | | 5 GB | 30 days | 26 | US$ 7.80 | | 20 GB | 30 days | 26 | US$ 31.20 | Charges are pro-rated from the date you enable it and appear as a line item on your next invoice. If you allocated 50 GB but only use 20 GB, extended retention charges you for 50 GB. Galaxy reserves backup storage at full capacity. *** ## How to Request It Contact [Galaxy Support](/docs/getting-started/support) via live chat or email. Include: * Your database name * How long you want to keep backups (15 days, 30 days, or a specific number) Support confirms the cost and enables it immediately. No disruption to your database or existing backups. *** ## Restoring From an Extended Backup Restoring from a backup older than 4 days requires contacting support. They extract the backup and send you a secure database dump file. You then import it using your database tool. When you reach out, include: * Your database name * The specific backup date you need * Your database region * Whether you're restoring to production or staging *** ## Common Questions Yes. Extended retention is per-database. Leave others on standard 4-day retention and only pay for what you need. Yes. You're not limited to 15 or 30 days. Tell support your exact requirement (7 days, 60 days, 90 days) and they'll set it up. Yes. Contact support to update it. Changes take effect immediately and costs adjust on your next billing cycle. Backups older than your new retention period are deleted automatically on their expiration dates. No immediate deletion; just a different schedule going forward. Yes. Extended retention is based on allocated size. If you scale up your database allocation, retention costs scale with it. Probably not. Standard 4-day retention covers most accidental deletion scenarios. Use extended retention where you have a compliance requirement, a regulatory mandate, or a specific business need. Each backup gets its own window from its creation date. With 14-day retention, a backup created on day 1 is kept until day 14. A backup created on day 2 is kept until day 15. No overlap. *** ## What's Next? --- # Fair Usage Policy for Free MongoDB (https://help.galaxycloud.app/docs/databases/free-mongodb-fair-usage) ## What You Need to Know Galaxy offers a free MongoDB database to help you prototype, learn, and build personal projects. We love supporting developers getting started, but to keep things sustainable for everyone, there are some boundaries. Think of it like this: the free tier is your sandbox. It's perfect for learning, testing ideas, and shipping personal projects. It's not meant for production apps or commercial services. ## The Key Limits **Data storage:** You get up to 256MB of storage on the free tier. That's plenty for most prototypes and learning projects. If you're building something bigger, that's a signal to upgrade to a paid database, which gives you way more space and resources. **Uptime expectations:** We don't guarantee the same reliability for free databases as we do for paid tiers. Your free database might experience occasional downtime. If uninterrupted service is critical for you (running a business, hosting a customer app), you'll want to move to a paid plan. **What it's for:** Learning, prototyping, testing, personal projects. Not commercial use. If you're earning money from your app or using it for a business, upgrade to a paid tier. It's genuinely affordable and way more reliable. ## Finding Your Free Database When you deploy a new app and enable **Add Free MongoDB**, Galaxy links the database directly to that app. It shows up in the **Databases** tab of your dashboard alongside paid instances, so you can check its status and credentials without digging through app settings. A few things worth knowing about this: * The database shares the app's lifecycle. Delete the app, and the database goes with it. * This only applies to databases created through the **Add Free MongoDB** toggle during deployment. Free databases provisioned before this feature was introduced won't appear in the **Databases** tab retroactively. * If you don't see an older free database there, it may still be active and reachable via the `MONGO_URL` in your app's environment. It just predates dashboard visibility support. ## What's Not Allowed There are a few activities we explicitly don't allow on the free tier, even if you somehow stay under your storage limit: * Cryptocurrency mining or blockchain operations * Any behavior that significantly strains shared resources, even if it technically fits the numerical limits We reserve the right to review your usage and restrict access if something looks out of line with typical use cases. ## Next Steps Not sure if you need to upgrade? Check how much storage you're actually using in your Galaxy dashboard. If you're running low or need production reliability, [explore our paid database options](/docs/billing/database). Already on the free tier and running great? Perfect. Keep building. And if you hit the limits, upgrading is super straightforward. --- # Databases (https://help.galaxycloud.app/docs/databases) # Databases on Galaxy Galaxy hosts MongoDB, PostgreSQL, and Redis alongside your applications. No setup hassle, no management overhead, no data transfer fees between your app and database. Create a database and connect it to your app in minutes. Your apps and databases live together on Galaxy. Zero charges for data moving between them. *** ## Pick Your Database Choose the database that fits your needs. Not sure? Start with PostgreSQL for most apps, MongoDB for flexible data structures, Redis for caching. *** ## Creating a Database Head to your [Galaxy dashboard](https://my.galaxycloud.app), go to Databases, and click "Create Database". Pick your database type, choose a size and region, and Galaxy provisions it in minutes. Once running, click your database to get the connection string. Add it as an environment variable in your app's settings, and you're connected. Pick the same region as your app for fastest performance. Same-region traffic is also free. *** ## Features All Galaxy databases include: **Automatic daily backups**: Restore if something goes wrong. Your data is protected without extra configuration. **Zero data transfer fees**: Data moving between your app and database is free. No surprise charges. **Monitoring and metrics**: Understand what's happening with your database. Track connections, memory, CPU, and more. **Encryption in transit**: Data stays secure as it moves between your app and database. *** ## Common Questions PostgreSQL for most applications: it's reliable, structured, and powerful. MongoDB if your data structure changes frequently or you're building content-heavy apps. Redis for caching, sessions, and real-time features (use alongside a primary database, not instead of one). Daily automatic backups are included with all databases. You can also create manual backups anytime from your database's settings. Pricing depends on database type and instance size. See the [Billing section](/docs/billing/database) for complete pricing. Yes. Create as many as you need. Each database is billed separately based on its size and type. Yes. Use the connection string from your dashboard to connect tools like TablePlus, pgAdmin, MongoDB Compass, or any database-compatible client. See [Connect with TablePlus](/docs/databases/connect) for a guide. *** ## What's Next? --- # Migrate to Galaxy MongoDB (https://help.galaxycloud.app/docs/databases/mongodb-migration) Moving your existing MongoDB database to Galaxy doesn't have to be painful. Galaxy provides a Docker image that handles the data transfer for you, so you can focus on getting your app running instead of wrestling with migration scripts. **What you'll need**: * Docker installed on your machine * Source and target MongoDB URIs ready and tested * IP whitelist configured on MongoDB Atlas if that's your current host This migration method doesn't support MongoDB Sharded Clusters. If you're running a sharded cluster, contact the Galaxy team for help. *** ## Run the Migration ### Get Your MongoDB URIs You'll need two connection strings: one for the source and one for the destination. Your **source URI** comes from your current MongoDB provider (for example, MongoDB Atlas) and looks like: ``` mongodb+srv://:@ ``` Your **target URI** comes from the Galaxy Database team. Find it in the **Credentials** section of your database in the Galaxy dashboard. It looks like: ``` mongodb://:@: ``` ### Run the Docker Container With both URIs ready, run the migration container: ```bash docker run --rm \ -e SOURCE_URI="" \ -e TARGET_URI="" \ -e DB_NAME="example_source_db_name" \ meteor/galaxy-mongodb-migrate:202506181938 ``` Replace `SOURCE_URI`, `TARGET_URI`, and `DB_NAME` with your actual values. Here's a complete example: ```bash docker run --rm \ -e SOURCE_URI="mongodb+srv://username:password@source-cluster.mongodb.net" \ -e TARGET_URI="mongodb://username:password@destination-host-01.mongodb.net:27017,destination-host-02.mongodb.net:27017,destination-host-03.mongodb.net:27017/admin?replicaSet=replicaSetName" \ -e DB_NAME="example_source_db_name" \ meteor/galaxy-mongodb-migrate:202506181938 ``` *** ## SSL Configuration If your Galaxy Database has SSL enabled, the connection string needs a couple of specific adjustments to work correctly. Three things to keep in mind: * **Always include `authSource=admin`** in your target URI. Without it, MongoDB tries to authenticate against the wrong database and the connection fails. * **Omit `ssl=true`** from the connection string unless you're also providing a certificate file. * If `ssl=true` is required, download the SSL certificate from the Galaxy Database dashboard and provide it through the appropriate parameter. ```bash docker run --rm \ -e SOURCE_URI="mongodb+srv://username:password@source-cluster.mongodb.net" \ -e TARGET_URI="mongodb://username:password@destination-host-01.mongodb.net:27017,destination-host-02.mongodb.net:27017,destination-host-03.mongodb.net:27017/admin?authSource=admin&replicaSet=replicaSetName" \ -e DB_NAME="example_source_db_name" \ meteor/galaxy-mongodb-migrate:202506181938 ``` Download the SSL certificate from your Galaxy Database dashboard first, then mount it into the container: ```bash docker run --rm \ -v /path/to/ssl-cert.pem:/ssl-cert.pem \ -e SOURCE_URI="mongodb+srv://username:password@source-cluster.mongodb.net" \ -e TARGET_URI="mongodb://username:password@destination-host-01.mongodb.net:27017,destination-host-02.mongodb.net:27017,destination-host-03.mongodb.net:27017/admin?authSource=admin&ssl=true&sslCAFile=/ssl-cert.pem&replicaSet=replicaSetName" \ -e DB_NAME="example_source_db_name" \ meteor/galaxy-mongodb-migrate:202506181938 ``` *** ## Post-Migration: Create a Dedicated User Once your data is in Galaxy, create a new database user scoped specifically to your migrated database. This is better security practice than connecting with your admin credentials. ### Complete the Migration First Make sure all data has been successfully transferred to Galaxy before creating any new users. ### Connect to Your Database Connect to your Galaxy Database using [MongoDB Compass or another client](/docs/databases/connect). Use the admin credentials from your Galaxy dashboard. ### Select the Migrated Database Switch to the database you just migrated: ```javascript use example_db_name ``` ### Create the New User Create a user with `readWrite` access to that specific database: ```javascript db.createUser({ user: "newuser", pwd: "", roles: ["readWrite"] }) ``` Replace `` with a strong, unique password. ### Verify the User Confirm the user was created successfully: ```javascript db.getUsers() ``` ### Update Your App's Connection String Use the new user credentials in your app's `MONGO_URL`: ``` mongodb://newuser:pass@destination-host-01.mongodb.net:27017,destination-host-02.mongodb.net:27017,destination-host-03.mongodb.net:27017/example_db_name?replicaSet=NameOfYourReplicaSet&readPreference=secondary ``` Update this value in your app's **Variables** section in the Galaxy dashboard. Giving your app user only `readWrite` on its own database limits the blast radius if credentials are ever compromised. Don't connect production apps with admin credentials. *** ## Security Considerations A few practices to keep in mind after migration: * Use secure passwords for all database users. * Assign only the permissions each user actually needs. * Review user privileges regularly and remove access that's no longer needed. *** ## System Users Galaxy automatically creates several users in your MongoDB cluster for internal operations. Don't delete them or your database management will break. **`admin@admin`**: Initial user with administrative privileges. **`galaxyadmin@admin`**: Technical user required for automation. **`galaxybackup@admin`**: Designated user for performing backups. **`galaxymonitor@admin`**: Used for monitoring. *** ## Troubleshooting If the migration fails or the connection is refused: * Check that your connection strings are correct and that the credentials have the necessary permissions. * Review the Docker container logs for specific error messages. *** ## Common Questions No. This Docker image doesn't support sharded clusters. Reach out to the Galaxy team at [support@meteor.com](mailto:support@meteor.com) and we'll help you plan a migration that works for your setup. This migration method copies data but doesn't handle live sync, so there will be a brief window where writes to the source aren't reflected in the destination. For zero-downtime migrations, contact the Galaxy team to discuss options. `authSource=admin` tells MongoDB which database to authenticate your credentials against. Galaxy databases store user credentials in the `admin` database. Without this parameter, the driver tries to authenticate against your app's database and the connection fails. Open your database in the Galaxy dashboard and look in the **Credentials** or **Settings** section. You'll find a download option for the SSL certificate there. Setting up an oplog user is a separate process. Follow the [MongoDB Oplog Setup guide](/docs/databases/mongodb-oplog-setup) for step-by-step instructions. *** For zero-downtime migrations or anything more complex, reach out at [support@meteor.com](mailto:support@meteor.com). The Galaxy team can walk you through the process. ## What's Next? --- # MongoDB Oplog Setup (https://help.galaxycloud.app/docs/databases/mongodb-oplog-setup) Want faster, more efficient real-time updates in your Meteor app? Oplog tailing is the answer. Instead of polling your database for changes, your app listens directly to MongoDB's operations log. The result? Instant reactivity with less database load. ## What is the Oplog? The oplog (operations log) is a special capped collection in MongoDB that records every write operation. It's how replica sets stay in sync, but it's also incredibly useful for applications that need to react to data changes in real-time. For Meteor apps, oplog tailing supercharges reactivity. Your `observeChanges` callbacks fire instantly when data changes, rather than relying on polling. This means snappier UIs and happier users. Oplog tailing requires a MongoDB replica set. Standalone MongoDB instances don't have an oplog. Galaxy Database clusters and most production MongoDB services (like MongoDB Atlas) run as replica sets by default. ## Why Set Up Oplog Tailing? There are a few good reasons to enable oplog tailing: * **Better Meteor reactivity**: Your app sees database changes instantly. No more waiting for the next poll interval. * **Reduced database load**: Polling means constant queries asking "did anything change?" Oplog tailing eliminates that overhead. * **Monti APM insights**: With oplog configured, Monti APM can show you detailed metrics around `observeChanges` and oplog notifications. Without it, those graphs stay empty. * **Third-party integrations**: Many tools that sync with MongoDB rely on oplog tailing to detect changes in real-time. *** ## Creating an Oplog User Your oplog user needs read access to the `local` database (where the oplog lives). Here's how to set it up. ### Connect to Your Database Use MongoDB Shell, MongoDB Compass, or any MongoDB client to connect to your database with admin credentials. ```bash mongosh "mongodb://admin:password@your-host:27017/admin" ``` ### Create the Oplog User Switch to the `admin` database and create a user with read access to the `local` database: ```javascript use admin; db.createUser({ user: "oploguser", pwd: "YourSecurePassword", roles: [{ role: "read", db: "local" }] }); ``` The `read` role on the `local` database is all your oplog user needs. Keep it minimal for security. ### Verify the User Test that your new user can authenticate: ```bash mongosh "mongodb://oploguser:YourSecurePassword@your-host:27017/local?authSource=admin" ``` If you can connect without errors, you're good to go. Use a strong, unique password for your oplog user. This credential will be stored in your app's environment variables. Treat it like any other database credential. *** ## Building the Oplog Connection String The oplog connection string looks similar to your main `MONGO_URL`, but it points to the `local` database where the oplog resides. Here's the format: ``` mongodb://oploguser:password@host1:27017,host2:27017,host3:27017/local?authSource=admin&replicaSet=yourReplicaSetName ``` Let's break that down: | Part | Description | | ------------------------------- | ----------------------------------------------------- | | `oploguser:password` | The credentials you just created | | `host1:27017,host2:27017,...` | Your replica set hosts (same as your main connection) | | `/local` | The database containing the oplog (always `local`) | | `authSource=admin` | Where your oplog user was created | | `replicaSet=yourReplicaSetName` | Your replica set name | Find your replica set name and hosts in your MongoDB connection string. For Galaxy Database, check the Overview tab of your cluster details page. *** ## Configuring Your Meteor App Add the `MONGO_OPLOG_URL` environment variable to your Meteor settings. Place it in the `galaxy.meteor.com.env` section, right below your `MONGO_URL`: ```json { "galaxy.meteor.com": { "env": { "ROOT_URL": "https://myapp.us.galaxycloud.app", "MONGO_URL": "mongodb+srv://user:password@cluster.mongodb.net/yourdb", "MONGO_OPLOG_URL": "mongodb://oploguser:password@cluster.mongodb.net/local?authSource=admin&replicaSet=rs0" } } } ``` Notice the parameters at the end of `MONGO_OPLOG_URL`. Each one serves a specific purpose: | Parameter | Why It's Needed | | ------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `/local` | The oplog lives in MongoDB's `local` database, not your application database. This tells Meteor where to find the oplog collection. | | `authSource=admin` | Your oplog user was created in the `admin` database. This parameter tells MongoDB where to look up the credentials for authentication. Without it, MongoDB tries to authenticate against `local` and fails. | | `replicaSet=rs0` | Identifies which replica set to connect to. Required for oplog tailing since the oplog only exists on replica sets. Replace `rs0` with your actual replica set name. | Save your settings and deploy. Meteor automatically detects `MONGO_OPLOG_URL` and enables oplog tailing. Use `MONGO_OPLOG_URL` for modern Meteor versions. You might see references to `METEOR_OPLOG_URL` in older documentation, but that's legacy. Stick with `MONGO_OPLOG_URL`. *** ## Verifying Oplog Tailing How do you know it's working? A few ways: * **Check your app logs**: When Meteor starts with oplog tailing enabled, you'll see messages about connecting to the oplog. * **Test reactivity**: Open your app in two browser windows. Make a change in one. If oplog tailing is working, the other window updates almost instantly. * **Monti APM**: If you're on Galaxy's Professional plan, check the Monti APM dashboard. The `observeChanges` and Oplog graphs should now show data. If these were empty before, that's your confirmation. *** ## Common Issues Double-check your credentials and make sure `authSource=admin` is in your connection string. The oplog user was created in the `admin` database, so MongoDB needs to know where to look. Oplog tailing only works with replica sets. If you're running a standalone MongoDB instance, you'll need to convert it to a replica set first. Most production MongoDB services already run as replica sets. After adding `MONGO_OPLOG_URL`, redeploy your app. Give it a few minutes to collect data. If graphs are still empty, verify your oplog URL is correct and the user has read access to the `local` database. Make sure you're pointing to `/local` (not your app's database). The oplog lives in the `local` database regardless of which database your app uses. The same principles apply. Create a user with read access to `local`, build the connection string pointing to `/local`, and add it as `MONGO_OPLOG_URL`. Atlas and similar services support oplog tailing on all their replica set deployments. *** ## Quick Reference Here's everything in one place: **Create the user:** ```javascript use admin; db.createUser({ user: "oploguser", pwd: "YourSecurePassword", roles: [{ role: "read", db: "local" }] }); ``` **Connection string format:** ``` mongodb://oploguser:password@hosts/local?authSource=admin&replicaSet=rsName ``` **Meteor settings:** ```json { "galaxy.meteor.com": { "env": { "MONGO_URL": "your-main-connection-string", "MONGO_OPLOG_URL": "your-oplog-connection-string" } } } ``` That's it. Deploy, and your Meteor app will use oplog tailing for lightning-fast reactivity. *** ## What's Next? --- # MongoDB SSL Certificate Setup (Meteor) (https://help.galaxycloud.app/docs/databases/mongodb-ssl-meteor) SSL encrypts the connection between your Meteor app and MongoDB, protecting your data in transit. If you're using Galaxy Database, setting this up takes just a few minutes. **Time Required**: About 5 minutes **What you'll need**: A Meteor project, a Galaxy Database MongoDB instance, and your `settings.json` file **Using Node.js instead?** Check the [Node.js SSL setup guide](/docs/databases/mongodb-ssl-nodejs). Node.js handles certificates differently. *** ## Setting Up SSL ### Download the SSL Certificate Open the Galaxy dashboard and navigate to your MongoDB cluster's **Overview** page. You'll find a download link for the SSL certificate there. Download the certificate file. You'll add it to your Meteor project in the next step. ### Add the Certificate to Your Project Create a `private` folder in the root of your Meteor project (if you don't already have one). Drop the downloaded certificate file inside it. For this guide, we'll assume the file is named `certificate.pem`. Your project structure should look like this: ``` your-meteor-app/ ├── private/ │ ├── certificate.pem │ └── settings.json (recommended location) ├── client/ ├── server/ └── ... ``` Storing your `settings.json` in the `private` folder alongside your certificate keeps your configuration organized and out of the client bundle. ### Configure Your Settings Open (or create) your `settings.json` file and add the SSL configuration along with your MongoDB connection string: ```json { "packages": { "mongo": { "options": { "tls": true, "tlsCAFileAsset": "certificate.pem" } } }, "galaxy.meteor.com": { "env": { "MONGO_URL": "mongodb://user:password@host1:27017,host2:27017,host3:27017/yourdb?replicaSet=yourReplicaSet&ssl=true&authSource=admin" } } } ``` Two key settings here: **`tlsCAFileAsset`**: Tells Meteor to look for the SSL certificate inside the `private` folder. You only need the filename, not the full path. **`MONGO_URL`**: Your MongoDB connection string. Make sure it includes `ssl=true` and `authSource=admin` as query parameters. You'll find the full connection string on your Galaxy Database cluster's **Credentials** section. ### Deploy Your App Deploy with the `--settings` flag pointing to your settings file: ```bash meteor deploy myapp --settings private/settings.json ``` That's it. Meteor reads the certificate from `private/`, establishes the SSL connection, and your data travels encrypted between your app and MongoDB. *** ## Push to Deploy Configuration If you're using [Push to Deploy](/docs/apps/meteor/push-to-deploy) instead of the CLI, you'll need to tell Galaxy where your settings file lives. During the Push to Deploy setup (or in your app's **Settings** page), look for the **Settings File Path** field. Enter the relative path to your settings file: ``` private/settings.json ``` Galaxy reads this file from your repository on every deployment. Your SSL certificate (inside the `private` folder) gets bundled automatically since Meteor includes everything in `private/` in the app bundle. If your `settings.json` contains secrets (API keys, database passwords), consider using the **Meteor Settings JSON** field in the Galaxy dashboard instead of committing secrets to your repository. You can split your configuration: keep non-sensitive settings in the file and paste sensitive values directly in the dashboard. *** ## Connection String Parameters Your `MONGO_URL` needs specific parameters for SSL to work correctly. Here's what each one does: | Parameter | Purpose | | --------------------------- | ------------------------------------------------------------------- | | `ssl=true` | Enables SSL/TLS encryption for the connection | | `authSource=admin` | Tells MongoDB to authenticate against the `admin` database | | `replicaSet=yourReplicaSet` | Identifies your replica set (required for Galaxy Database clusters) | If you're missing `authSource=admin`, MongoDB tries to authenticate against your app's database and fails. Always include it when connecting to Galaxy Database. *** ## Common Questions The `tls: true` option enables TLS/SSL encryption on the connection. The `tlsCAFileAsset` option tells Meteor which certificate file to use for verifying the server's identity. You need both for a fully secure connection to Galaxy Database. The `tlsAllowInvalidCertificates: true` option skips certificate validation entirely. This is used for Galaxy's free MongoDB tier (where certificates aren't installed on every machine), but for dedicated Galaxy Database clusters, using the proper SSL certificate with `tlsCAFileAsset` is the recommended approach. In the Galaxy dashboard, click on your MongoDB cluster and look in the **Credentials** section. You'll see the full connection string there. Copy it and add the required parameters (`ssl=true`, `authSource=admin`) if they're not already included. Yes. Adding or changing the SSL certificate requires a new deployment since Meteor bundles the `private` folder at build time. Redeploying your app picks up the new certificate automatically. Double-check that the certificate file is inside the `private` folder (not a subfolder), the filename in `tlsCAFileAsset` matches exactly (including the extension), and the certificate hasn't expired. You can re-download the certificate from the Galaxy Database overview page if needed. *** If you're having trouble with SSL setup, [reach out to Galaxy support](/docs/getting-started/support). We can verify your certificate configuration and help troubleshoot connection issues. ## What's Next? --- # MongoDB SSL Certificate Setup (Node.js) (https://help.galaxycloud.app/docs/databases/mongodb-ssl-nodejs) SSL encrypts the connection between your Node.js app and MongoDB, keeping your data safe in transit. If you're using Galaxy Database, the whole setup takes just a few minutes. **Time Required**: About 5 minutes **What you'll need**: A Node.js project, a Galaxy Database MongoDB instance, and your SSL certificate file **Using Meteor?** Check the [Meteor SSL setup guide](/docs/databases/mongodb-ssl-meteor) instead. Meteor handles certificates differently. *** ## Setting Up SSL ### Download the SSL Certificate Open the Galaxy dashboard and navigate to your MongoDB cluster's **Overview** page. You'll find a download link for the SSL certificate there. Download the certificate file (usually a `.crt` or `.pem` file). You'll reference this file in your app's connection code. ### Add the Certificate to Your Project Create a `certs` directory in your project root and place the certificate file inside it. This is for local development only: ``` your-node-app/ ├── certs/ │ └── galaxy-mongodb.crt ├── src/ ├── package.json └── .gitignore ``` If your repository is public, never commit certificate files. Add `certs/` to your `.gitignore` and use an environment variable for production (covered in the Deploying to Galaxy section below). For private repos, committing the certificate is fine. ### Install the MongoDB Driver If you haven't already, install the MongoDB driver for Node.js: ```bash npm install mongodb ``` ```bash npm install mongoose ``` This guide covers both options. Pick whichever one your project uses. ### Configure the SSL Connection Point your MongoDB connection to the certificate file. Here's how it works with each driver: ```javascript const { MongoClient } = require('mongodb'); const path = require('path'); const certPath = path.resolve('certs/galaxy-mongodb.crt'); const client = new MongoClient(process.env.MONGO_URL, { tls: true, tlsCAFile: certPath, authSource: 'admin', connectTimeoutMS: 10000, serverSelectionTimeoutMS: 5000, }); await client.connect(); console.log('Connected to MongoDB with SSL'); ``` ```javascript const mongoose = require('mongoose'); const path = require('path'); const certPath = path.resolve('certs/galaxy-mongodb.crt'); await mongoose.connect(process.env.MONGO_URL, { tls: true, tlsCAFile: certPath, authSource: 'admin', connectTimeoutMS: 10000, serverSelectionTimeoutMS: 5000, }); console.log('Connected to MongoDB with SSL'); ``` ### Set Your Connection String Add `MONGO_URL` as an environment variable in the Galaxy dashboard (under your app's **Variables** section). The connection string should include `ssl=true` and `authSource=admin`: ``` mongodb://user:password@host1:27017,host2:27017,host3:27017/yourdb?replicaSet=yourReplicaSet&ssl=true&authSource=admin ``` You'll find the full connection string on your Galaxy Database cluster's **Credentials** section. *** ## Connection String Parameters Your `MONGO_URL` needs specific parameters for SSL to work correctly: | Parameter | Purpose | | --------------------------- | ------------------------------------------------------------------- | | `ssl=true` | Enables SSL/TLS encryption for the connection | | `authSource=admin` | Tells MongoDB to authenticate against the `admin` database | | `replicaSet=yourReplicaSet` | Identifies your replica set (required for Galaxy Database clusters) | If you're missing `authSource=admin`, MongoDB tries to authenticate against your app's database and fails. Always include it when connecting to Galaxy Database. *** ## TLS Options Reference Here's a quick reference for the TLS options you can pass to the driver: | Option | Type | Description | | ----------------------------- | --------- | ------------------------------------------------------------- | | `tls` | `boolean` | Enables TLS/SSL encryption | | `tlsCAFile` | `string` | Path to the certificate authority file | | `tlsAllowInvalidCertificates` | `boolean` | Skips certificate validation (not recommended for production) | | `connectTimeoutMS` | `number` | How long to wait for a connection before timing out | | `serverSelectionTimeoutMS` | `number` | How long to wait for a server to be selected | The default `serverSelectionTimeoutMS` is 30 seconds, which can make debugging slow. Setting it to 5000 (5 seconds) gives you faster feedback when something is misconfigured. *** ## Deploying to Galaxy Your certificate file needs to be accessible at runtime. You have two options depending on how you manage secrets. If your repository is private, you can include the certificate file directly in your project (in the `certs/` directory). Your app reads it from the filesystem at runtime, just like it does locally. This is the simplest approach. Only commit certificate files to private repositories. If your repo is public (or might become public), use the environment variable method instead. Prefer to keep the certificate out of version control entirely? Store the certificate content as an environment variable and write it to disk at startup: ```javascript const fs = require('fs'); const path = require('path'); const certPath = path.resolve('/tmp/galaxy-mongodb.crt'); if (process.env.MONGO_SSL_CERT && !fs.existsSync(certPath)) { fs.writeFileSync(certPath, process.env.MONGO_SSL_CERT); } // Then use certPath as your tlsCAFile ``` In the Galaxy dashboard, go to your app's **Variables** section and add `MONGO_SSL_CERT` as an environment variable. Paste the full certificate content as the value. This is the more secure option, especially for teams with open-source repos or strict security policies. *** ## Common Questions Having `ssl=true` in the connection string is enough to enable encryption. Adding `tls: true` in the options object is redundant but harmless. The important part is `tlsCAFile`, which tells the driver where to find the certificate for server verification. Setting `tlsAllowInvalidCertificates: true` skips certificate validation entirely. This works for Galaxy's free MongoDB tier (where certificates aren't installed on every machine), but for dedicated Galaxy Database clusters, using the proper certificate with `tlsCAFile` is the recommended and more secure approach. Start with the basics: verify your `MONGO_URL` is correct (especially the host, port, and credentials), confirm your database is running in the Galaxy dashboard, and make sure the certificate file path resolves correctly. If you're connecting from outside Galaxy, check that network access isn't restricted. Yes. Most Node.js MongoDB libraries use the official driver under the hood, so the same TLS options apply. Check your library's documentation for how to pass driver-level connection options. Some libraries accept TLS settings directly in the connection string, while others require them in a configuration object. In the Galaxy dashboard, click on your MongoDB cluster and look in the **Credentials** section. You'll see the full connection string there. Copy it and make sure it includes `ssl=true` and `authSource=admin`. *** If you're having trouble with SSL setup, [reach out to Galaxy support](/docs/getting-started/support). We can verify your certificate configuration and help troubleshoot connection issues. ## What's Next? --- # MongoDB (https://help.galaxycloud.app/docs/databases/mongodb) # MongoDB on Galaxy Create and manage MongoDB databases on Galaxy with automatic backups and zero transfer fees. Galaxy offers a free MongoDB tier perfect for development and learning. Free databases have usage limits to ensure fair access for everyone. Learn about storage limits and when to upgrade in our [Fair Usage Policy for Free MongoDB](/docs/databases/free-mongodb-fair-usage). *** ## Create a MongoDB Database Getting a MongoDB database running takes about two minutes. ### Open Your Dashboard Go to your [Galaxy dashboard](https://my.galaxycloud.app) and click **Databases** in the sidebar. ### Start Database Creation Click **Create Database** and select **MongoDB** as your database type. ### Configure Your Instance Choose your MongoDB version and instance size. Pick the region closest to your app for best performance. ### Create and Wait Click **Create Database & Start Billing**. Galaxy provisions your database in a few minutes. You'll see "Running" when it's ready. Deploy your database in the same region as your app. This minimizes latency and keeps your data transfer free. *** ## Connect to Your App Click your database in the dashboard to see the connection string. Copy it and add it as an environment variable in your app's settings. The exact variable name depends on your framework: * **Meteor apps**: Use `MONGO_URL` * **Node.js apps**: Typically `MONGODB_URL` or `DATABASE_URL` * **Other frameworks**: Check your framework's documentation for the expected variable name Never hardcode your connection string in your code. Always use environment variables so it stays secure and out of version control. *** ## Features **Automatic Backups**: Daily backups included with all plans. Your data is protected without you lifting a finger. **Replica Sets Available**: High availability option for production apps. Your data is replicated across multiple nodes, so if one goes down, others keep running. **Zero Transfer Fees**: Data moving between your Galaxy app and database is free. No surprise charges on your bill. *** ## Common Questions Galaxy creates automatic daily backups of your MongoDB database. You can also create manual backups anytime from your database's settings page. Backups are retained for 4 days by default, with extended retention available if you need it. Pricing depends on your instance size and whether you choose standalone or replica set. See the [Billing section](/docs/billing/database) for the complete pricing breakdown. Galaxy's free MongoDB tier includes up to 256MB of storage and is perfect for learning and development. Free databases don't have uptime guarantees like paid tiers. For complete details on free tier limits, usage guidelines, and when to upgrade, check our [Fair Usage Policy for Free MongoDB](/docs/databases/free-mongodb-fair-usage). Everything happens in your [Galaxy dashboard](/docs/dashboard/databases). View metrics, check backups, adjust settings, and monitor performance all from one place. Yes. Use the connection string from your dashboard to connect any MongoDB-compatible tool. Check out our [TablePlus guide](/docs/databases/connect) for step-by-step instructions on connecting external database managers. The **Databases** tab only lists free databases that were linked to an app at deployment time on the current Galaxy infrastructure. If your free database was provisioned before this feature was introduced, it won't appear there. It's still active and reachable via the `MONGO_URL` in your app's environment settings. To get full dashboard visibility going forward, redeploy your app with the **Add Free MongoDB** toggle enabled, or migrate to a [paid MongoDB instance](/docs/billing/database). *** ## What's Next? --- # PostgreSQL (https://help.galaxycloud.app/docs/databases/postgresql) # PostgreSQL on Galaxy Galaxy gives you a fully managed PostgreSQL database, provisioned in minutes and connected to your app with a single environment variable. *** ## Create a PostgreSQL Database ### Open Your Dashboard Go to your [Galaxy dashboard](https://my.galaxycloud.app) and click **Databases** in the sidebar. ### Start Database Creation Click **Create Database** and select **PostgreSQL** as your database type. ### Configure Your Instance Choose your PostgreSQL version and instance size. Pick the region closest to your app for best performance. ### Create and Wait Click **Create Database & Start Billing**. Galaxy provisions your database in a few minutes. You'll see "Running" when it's ready. Deploy your database in the same region as your app. This minimizes latency and keeps your data transfer free. *** ## Connect to Your App Click your database in the dashboard to see the connection string. Copy it and add it as an environment variable in your app's settings. The exact variable name depends on your framework: * **Node.js apps**: Often `DATABASE_URL`, `DB_HOST`, or separate `DB_USER`, `DB_PASSWORD`, `DB_DATABASE` variables * **Python apps**: Typically `DATABASE_URL` * **AdonisJS apps**: Usually `DB_CONNECTION`, `DB_HOST`, `DB_USER`, `DB_PASSWORD`, `DB_DATABASE` Never hardcode your connection string in your code. Always use environment variables so it stays out of version control. *** ## Security Your database is protected with username and password authentication. All connections from your Galaxy apps stay within Galaxy's private network and never traverse the public internet. *** ## Features **Automatic Backups**: Daily backups included with all plans. Your data is protected without any extra configuration. **Zero Transfer Fees**: Data moving between your app and database is free. No surprise charges for internal traffic. *** ## Common Questions Galaxy creates automatic daily backups of your PostgreSQL database. You can also create manual backups anytime from your database's settings page. Backups are retained for 4 days by default, with extended retention available if you need it. Pricing depends on your instance size. See the [Billing section](/docs/billing/database) for the complete pricing breakdown. Everything happens in your [Galaxy dashboard](/docs/dashboard/databases). View metrics, check backups, adjust settings, and monitor performance all from one place. Yes. Use the connection string from your dashboard to connect any PostgreSQL-compatible tool like TablePlus, pgAdmin, or DBeaver. Check out our [TablePlus guide](/docs/databases/connect) for step-by-step instructions. *** ## What's Next? --- # Redis (https://help.galaxycloud.app/docs/databases/redis) # Redis on Galaxy Galaxy hosts and manages Redis for you. Spin up an instance in minutes and connect it to any app on the platform. *** ## Create a Redis Database ### Open Your Dashboard Go to your [Galaxy dashboard](https://my.galaxycloud.app) and click **Databases** in the sidebar. ### Start Database Creation Click **Create Database** and select **Redis** as your database type. ### Configure Your Instance Choose your instance size and the region closest to your app. ### Create and Wait Click **Create Database & Start Billing**. Galaxy provisions your instance in a few minutes. You'll see "Running" when it's ready. *** ## Connect to Your App Click your Redis instance in the dashboard to see the connection string. Copy it and add it as an environment variable in your app's settings. The exact variable name depends on your framework: * **Node.js apps**: Often `REDIS_URL` or `REDIS_HOST` * **Python apps**: Typically `REDIS_URL` * **Other frameworks**: Check your framework's documentation for the expected variable name Never hardcode your connection string in your code. Always use environment variables so it stays secure and out of version control. *** ## Features **Automatic Backups**: Daily backups are included with every Redis instance on Galaxy. **Zero Transfer Fees**: Data moving between your Galaxy app and your Redis instance is free. **Flexible Instance Sizing**: Pick the memory size that fits your workload. Upgrade any time from the dashboard. *** ## Common Questions Pricing depends on your instance size. See the [Billing section](/docs/billing/database) for the complete pricing breakdown. Everything happens in your [Galaxy dashboard](/docs/dashboard/databases). View metrics, check connection status, and monitor memory usage from one place. When Redis hits its memory limit, it starts evicting old data based on its eviction policy. If you're constantly hitting memory limits, consider upgrading to a larger instance from the dashboard. *** ## What's Next? --- # AI Integration (https://help.galaxycloud.app/docs/getting-started/ai-integration) Galaxy documentation is optimized for AI tools. Every page is available as clean markdown by appending `.md` to its URL. Two dedicated endpoints serve the full documentation in plain text for LLMs and AI agents, and a **Copy as Markdown** button is included on every page. *** ## llms.txt The `/llms.txt` endpoint returns a lightweight index of every documentation page with links. ``` https://help.galaxycloud.app/llms.txt ``` This is the recommended starting point for AI agents. It provides a list of all available pages so the agent can decide which ones to fetch. The format follows the [llms.txt standard](https://llmstxt.org/). *** ## Per-Page Markdown Append `.md` to any documentation page URL to get its content as clean, plain-text markdown. ``` https://help.galaxycloud.app/docs/getting-started/quickstart.md ``` This is useful when an AI agent only needs a specific page rather than the full documentation. The response is `text/plain` with a 1-hour cache. *** ## llms-full.txt The `/llms-full.txt` endpoint returns the full content of every documentation page, cleaned and concatenated into a single plain text file. ``` https://help.galaxycloud.app/llms-full.txt ``` Use this endpoint when you want to load the entire documentation into a single prompt. The output strips all custom components and import statements, leaving clean markdown. *** ## Copy as Markdown Every documentation page has a **Copy as Markdown** button below the page description. Click it to copy the current page's content as clean markdown, ready to paste into any AI assistant. The copied content has all custom components and formatting removed, so it reads as plain markdown that any LLM can process. *** ## Common Questions Import statements and custom MDX components (Callout, Steps, Tabs, Cards, Accordions, TechLogo, Video, ImageZoom) are removed. The result is clean markdown with headings, paragraphs, lists, code blocks, and links preserved. Yes. Both `/llms.txt` and `/llms-full.txt` return `text/plain` responses with a 1-hour cache. You can fetch them from scripts, CI pipelines, or any HTTP client. The endpoints serve content from the latest deployment. When documentation is updated and deployed, the endpoints reflect the changes immediately. Responses are cached for 1 hour. *** ## What's Next? --- # Creating a Galaxy Account (https://help.galaxycloud.app/docs/getting-started/creating-account) *** ## Let's Get Started Creating a Galaxy account takes just a few minutes. Pick your preferred signup method below and you'll be ready to deploy your first app in no time. If you sign up with Google or GitHub, Galaxy creates a username for you automatically. You can't customize it later, so keep that in mind when choosing your auth method.
### Visit the signup page Head to [https://my.galaxycloud.app/signup](https://my.galaxycloud.app/signup). ### Choose your username Pick something memorable, you'll use it to access your Galaxy dashboard. ### Enter your email Use an email you have access to. Galaxy sends confirmation messages and account updates here. ### Create a strong password Use at least 8 characters with at least one number and one uppercase letter. ### Confirm your password Double-check for typos (happens to everyone). ### Add a coupon code (optional) Have a promo code? Paste it in and click Apply. No code? Skip this step. ### Click Sign up Hit the Sign up button, confirm your email, and you're done!
### Select "Sign up with Google" On the signup page, click this option. ### Authorize the connection Follow Google's prompts and you'll be back at Galaxy in seconds. ### You're in Galaxy creates a username automatically. It's ready to use right away. ### Set a Galaxy password later (optional) Want a Galaxy-specific password? You can create one anytime in your account settings.
### Select "Sign up with GitHub" On the signup page, click this option. ### Authorize the connection Follow GitHub's prompts and you'll be back at Galaxy in seconds. ### You're in Galaxy creates a username automatically. It's ready to use right away. ### Set a Galaxy password later (optional) Want a Galaxy-specific password? You can create one anytime in your account settings.
*** ## Your Galaxy Dashboard Awaits Once you've signed up and confirmed your email, you'll land in your dashboard. Here's what you can start doing right away. Start with the Free plan. It's perfect for staging and testing, then scale up whenever you need it. We've designed Galaxy to make it simple to start building right away, so don't worry about a steep learning curve. [Galaxy's support team](/docs/getting-started/support) knows the full stack and can help with pretty much any question. They're friendly and respond fast. *** ## What's Next? --- # Introduction to Galaxy (https://help.galaxycloud.app/docs/getting-started) # Welcome to Galaxy Galaxy (previously known as Meteor Cloud) is a cloud platform that handles everything: hosting your apps, managing databases, monitoring performance, all from one unified dashboard. No more switching between services. No more complexity. Just deploy, scale, and build. Apps and databases in one place. Everything you need to ship confidently. *** ## Why Developers Choose Galaxy Stop managing infrastructure. Start building what matters. Here's what you get: Host **Meteor**, **Node.js**, **Python**, and **AdonisJS** apps with enterprise features: triggers, notifications, IP whitelisting, and app protection built in. Invite collaborators, manage permissions, and scale your team within the Galaxy dashboard. Real collaboration, built in. Start instantly with our Free plan, complete with MongoDB auto-configuration. Perfect for staging, testing, and getting your idea live. Provision MongoDB, PostgreSQL, or Redis alongside your apps. Automatic backups, zero data transfer fees, and simple scaling. Get production-grade APM with Monti for your Meteor apps. Identify bottlenecks, track metrics, and optimize performance in real-time. Included with Professional plans. Real engineers who understand application architecture. You're never troubleshooting alone. *** ## What Can You Do With Galaxy? ### Deploy and Scale Meteor Apps Galaxy is the premier hosting platform for Meteor applications. It's built by the Meteor team, so you get everything designed specifically for how Meteor works. **Deploy with confidence:** * **Push to Deploy**: Update your app straight from Git. No manual steps. * **Meteor CLI**: Deploy your app directly from the command line with the Meteor CLI. * **Version Management & Easy Rollbacks**: Every deploy creates a version snapshot. If something breaks, roll back to a previous version with one click. No stress, no downtime nightmares. * **Auto-Scaling**: Customize container size and count. Let Galaxy scale automatically as your app grows. * **Real-Time Monitoring**: Integrated Monti APM helps you optimize performance (Professional Plan). * **Seamless Database Setup**: MongoDB integration built for Meteor, ready in seconds. * **Deep Expertise**: The engineers who built Meteor support your deployments. Galaxy is created and maintained by the people behind Meteor. You get hosting optimized for your framework. ### Host Node.js, Python, and AdonisJS Apps Beyond Meteor, Galaxy supports any Node.js, Python, or AdonisJS application with the same simple deployment experience and enterprise-grade features. **Deploy with the same ease:** * **Push to Deploy**: Update directly from Git. Works with any supported language. * **Galaxy CLI**: Deploy and manage web apps from the command line with the Galaxy CLI. * **Version Management & One-Click Rollbacks**: Every deployment is versioned. Made a mistake? Revert to a previous version instantly without fussing around with git commands or complicated rollback procedures. * **Simple Scaling**: Adjust container size and count based on your needs. * **Unified Dashboard**: Manage all your apps in one place. Monitor usage, adjust settings, control everything from one interface. * **Expert Support**: Real engineers supporting your stack. Deploy frequently without fear. If a deployment goes sideways, roll back instantly and get back to building. ### Manage Databases Alongside Your Apps Host MongoDB, PostgreSQL, or Redis databases right next to your applications. Simple provisioning, automatic backups, and zero hassle. **Database hosting done right:** * **Quick Setup**: Provision a database in seconds without leaving Galaxy. * **Automatic Daily Backups**: Your data is protected automatically. * **Zero Data Transfer Fees**: Connect your apps to your databases with no hidden charges. Internal traffic is free. * **Easy Scaling**: Resize your database as your needs change. * **Enterprise Security**: Industry-standard encryption and security for your data. * **Single Dashboard**: Manage apps and databases together. One place for everything. Stop managing multiple database providers. Host MongoDB, PostgreSQL, and Redis right where your apps live. ### Monitor Performance in Real Time **Monti APM** gives you production-grade application performance monitoring built specifically for Meteor. It's included with the Professional Plan. Identify bottlenecks, see exactly where time is spent, and make data-driven optimization decisions, all from within Galaxy. **Ready to learn more?** [Get started with APM](/docs/apps/meteor/monti-apm). Monitor your production apps in real time with APM included on Professional plans. *** ## Ready to Ship Your App? You don't need to know everything upfront. Galaxy is built to get you running fast. Create your account and deploy your first app today. Everything else is just a docs search away. Want to jump into a specific feature? Head over to our [full documentation](/docs) to explore what you're looking for. --- # Looking for the legacy docs? (https://help.galaxycloud.app/docs/getting-started/looking-for-the-legacy-docs) These docs cover **Galaxy Metal**, the current generation of Galaxy's cloud hosting platform, along with **Web Apps**. If you're here, this is almost certainly where you want to be. Galaxy's in-app menus link here, and this is where all new documentation is published. *** ## Galaxy Legacy docs If your app runs on **Galaxy Legacy**, you'll want the legacy docs instead: **[help-legacy.galaxycloud.app](https://help-legacy.galaxycloud.app/en/)** Not sure which platform your app is on? Check your app in the Galaxy dashboard. Apps on Galaxy Metal and Web Apps use these docs. Apps on Galaxy Legacy use the legacy docs. We maintain both sets of docs and will continue to do so for as long as apps run on Galaxy Legacy. *** ## What's Next? --- # Quickstart Guide (https://help.galaxycloud.app/docs/getting-started/quickstart) Whether you're running Meteor, Node.js, Python, or AdonisJS, you'll be deployed in about 5 minutes. **Time Required**: About 5 minutes **What you'll need**: A repository with your app code on a supported Git provider and a Galaxy account To deploy any application on Galaxy, you must add a valid payment method for identity verification. We'll place a small temporary hold on your card to verify it, then automatically refund it. You'll only be charged if you deploy a paid app. *** ## The Quick Path ### Create Your Galaxy Account Head to [https://my.galaxycloud.app/signup](https://my.galaxycloud.app/signup) and sign up. Verify your email and you're good to go. ### Choose Your App Type Log in to your [Galaxy dashboard](https://my.galaxycloud.app/) and click **Create New** in the top right. A wizard opens asking what you're deploying. Pick **Meteor.js** for your Meteor application. Galaxy automatically detects your Meteor version (1, 2, or 3) from your project. Pick **Node.js** for Express, Next.js, or any Node.js framework. You'll select the specific version later in configuration. Pick **Python** for Flask, Django, or other Python frameworks. You'll select the specific version later in configuration. Pick **AdonisJS** for AdonisJS 6 or AdonisJS 7 applications. This comes with pre-configured settings optimized for the framework. Click your choice and move on. ### Connect Your Repository Choose your Git provider (**Continue with GitHub** or **Continue with Bitbucket**) and authorize Galaxy to access your repositories. This one-time setup lets Galaxy watch your repo for changes and deploy automatically. ### Select Your Repository Browse your repositories or use the filter to find the one with your app. Click **Import** next to it. Don't see your repository? Check that Galaxy has permission to access it in your Git provider's settings. ### Select Account and Plan Pick your Galaxy account (Personal Account or an Organization), then choose a plan. * **Free**: Testing and learning (one Tiny container) * **Essentials**: Production apps with flexible sizes * **Professional**: Full features plus Monti APM * **Sandbox**: Testing and learning (one Nano container) * **Production**: Live apps with multiple sizes * **Business** (coming soon): Enterprise options Select a container size from the table shown. Don't overthink it. Start smaller and scale up later if needed. Click **Next Step** when ready. ### Configure and Deploy Fill in the essential fields: * **App Display Name**: A friendly name for your dashboard * **Custom Subdomain**: Your app's URL (pick something memorable) * **Branch**: Which Git branch to watch (usually `main` or `master`) * **Region**: Pick the one closest to your users (paid plans only; free apps deploy to us-east-1) * **Docker Preset**: Pre-configured runtime for your app * **Health Check Path**: HTTP path Galaxy pings to verify your app is running Add any environment variables your app needs (API keys, database URLs, etc.), then click **Deploy**. Never hardcode secrets in your code. Always use environment variables. Galaxy clones your repo, installs dependencies, builds your app, and goes live. Your app URL appears when it's done. That's it! *** ## Deploy Using the CLI Want to deploy from your terminal? Galaxy also supports CLI deployments for Meteor and other runtimes. This gives you more control over the deployment process and works great for automation and CI/CD pipelines. Check out the [Galaxy CLI](/docs/apps/webapps/galaxy-cli) and the [Meteor CLI](/docs/apps/meteor/cli) guides to get started from the command line. *** ## After Deployment Your app is now live. Galaxy handles the infrastructure automatically: * **SSL certificates**: HTTPS works out of the box * **Health monitoring**: Galaxy watches your app and restarts if needed * **Zero-downtime updates**: Push code, Galaxy deploys automatically * **Automatic restarts**: If your app crashes, Galaxy brings it back *** ## Common Questions Galaxy supports GitHub and Bitbucket for Push to Deploy. If your code is on another provider, push it to one of those first. **App Type** is what you select at the start: Meteor.js, AdonisJS, Node.js, or Python. This determines your runtime environment. **Docker Preset** appears later for Node.js and Python apps only. It lets you pick a specific version (like Node.js 20 LTS or Python 3.12). Meteor.js and AdonisJS apps don't need Docker Preset selection since their environments are pre-configured. Yes. Your first deploy usually takes a few minutes. Subsequent deploys are often faster since Galaxy caches some build steps. No. Use a paid plan for live apps. Free and Sandbox are great for testing, but they're not designed for production traffic. Of course! Upgrade or downgrade anytime from your app's [Plans](/docs/dashboard/apps/plans) section. No downtime required. *** ## Troubleshooting Having trouble with your deployment? Here are common issues and how to solve them. Check the [Logs](/docs/dashboard/apps/logs) section of your app's dashboard. The logs show exactly what went wrong. Common causes include: * Missing dependencies (check your `package.json`, `requirements.txt`, or build configuration) * Incorrect build commands (make sure your build script is configured correctly) * Environment variable issues (ensure required variables are set in your app configuration) Make sure your app listens on the `PORT` environment variable that Galaxy provides. Don't hardcode ports like 3000 or 5000. Galaxy automatically sets the `PORT` variable, and your app needs to use it. Galaxy needs permission to access your repositories. Check that: 1. You've authorized Galaxy in your Git provider's settings 2. The repository is under your personal account or an organization you're a member of 3. Try refreshing the page after granting access Sometimes deployments take longer than expected. Check your app logs to see if the build is still running or if it's hit an error. If logs show the build completed but your app isn't responding, try: 1. Checking the Health Check Path configuration (make sure it's a valid endpoint) 2. Restarting your app from the dashboard 3. Reviewing your app's startup logs This usually means your app isn't healthy or isn't listening on the correct port. Check: 1. Is your app actually running? (Check the app status in your dashboard) 2. Is it listening on the `PORT` environment variable? 3. Are there startup errors in your logs? ### Still stuck? [Reach Galaxy support](/docs/getting-started/support) via live chat or email. Share your app name and recent logs, and we'll help you get unstuck. *** ## What's Next? --- # Getting Help with Galaxy (https://help.galaxycloud.app/docs/getting-started/support) *** ## We're here when you need us Deployments fail. Questions pop up. Features feel unclear. That's part of development, and we're here to help. When you hit a snag, Galaxy support is just a message away: real humans who understand what you're doing, ready to help with instant answers or detailed guidance. *** ## Check the status page first Before reaching out, it's worth a quick look at the [Galaxy Status Page](https://status.galaxycloud.app). If there's an active incident or scheduled maintenance affecting the platform, you'll see it there. It's the fastest way to know whether an issue is on our end or yours. Bookmark the status page. If your app suddenly behaves unexpectedly, checking it takes 5 seconds and can save you a lot of troubleshooting time. *** ## Choose your support channel ### Live chat for immediate help Stuck on something right now? Our live chat connects you with a Galaxy team member in real time, no bots, no automation, just actual humans ready to help. Jump into your Galaxy dashboard, click the chat button in the corner, and start getting answers instantly. Can't spot the chat button? Navigate to **Help & Support** → **Chat Support** and you're in. Chat is perfect when you need quick guidance, urgent troubleshooting, or just want to talk through something with a real person. **When support is most active:** 11am–9pm UTC, Monday–Friday. You'll get the fastest responses during these business hours. ### Email for in-depth issues Some problems deserve a thoughtful, detailed response. Email support is your path for complex issues, feature deep-dives, or when you want to work on your own timeline. Send your questions to [support@galaxycloud.app](mailto:support@galaxycloud.app) and we'll respond with comprehensive guidance, documentation, and examples tailored to your situation. Email works best for technical issues that need back-and-forth discussion, or if you simply prefer asynchronous communication. *** ## Give us the information we need Include these details when you reach out. It'll cut our resolution time in half: * **Your Galaxy identifier**: your account email, username, or organization name * **What's affected**: the specific service, application, database, or feature involved * **What's happening**: a clear description of the issue or behavior you're seeing * **Error messages**: copy and paste the exact error text if you have it * **What you've tried**: the steps you've already taken to troubleshoot * **Supporting details**: screenshots, logs, or API responses (especially for technical issues) The more context you provide, the faster we can pinpoint the issue and get you moving again. A single well-formatted error message or log snippet often tells us everything we need to know. --- # Email Security Verification (https://help.galaxycloud.app/docs/security-compliance/email-verification) ## Why Am I Seeing This? Galaxy uses automated security checks to protect the platform from bots, spam accounts, and fraudulent signups. After you verify your email address, our system analyzes it for potential risks. This helps us avoid running unnecessary checks on users who never complete registration. Sometimes, legitimate users get flagged. This doesn't mean you did anything wrong. It just means your email or account shares some characteristics with patterns our security system watches for. No human decided to flag your account. Our security system analyzes hundreds of signals automatically. If you're a real person with a legitimate email, our support team can help you get access. *** ## What We Check Galaxy's security system evaluates your email address using AI-driven analysis. Here's what it looks at (in plain terms): * **Email deliverability**: Can your email actually receive messages? Is your inbox active and reachable? * **Domain reputation**: How long has your email domain existed? Does it have proper authentication records (SPF, DKIM, DMARC)? Is it associated with known spam or fraud activity? * **Email type**: Is your address from a free provider (like Gmail), a private domain (like yourcompany.com), or a disposable service (like Tempmail)? * **Tagged addresses**: Does your email contain a `+` tag (like `user+signup@gmail.com`)? These are commonly used to create multiple accounts from a single inbox. * **Role-based addresses**: Is your email a generic role address (like `hello@`, `support@`, `info@`, or `noreply@`) rather than a personal one? * **Suspicious patterns**: Does your email address contain unusual characteristics, like random strings of numbers, gibberish text, or patterns commonly used by bots? * **Risk scoring**: All these signals combine into a risk score. If the score crosses a threshold, your account is flagged for review. We don't read your emails. We don't access your inbox. We only analyze publicly available information about your email address and domain. The following email types are automatically blocked: * **Disposable emails**: Temporary services like Tempmail, Guerrilla Mail, or 10 Minute Mail. * **Tagged emails**: Addresses with a `+` tag (like `yourname+galaxy@gmail.com`). * **Role-based emails**: Generic addresses like `hello@`, `support@`, `info@`, `admin@`, or `noreply@`. If you're using any of these, you'll need to create a new account with a personal, permanent email address. *** ## What To Do If You're Flagged If you've been flagged and you're a legitimate user, [contact our support team](/docs/getting-started/support). We can review your account manually and help you get access. When you reach out, include your Galaxy username and the email address you used to sign up. Our team has access to the specific reasons your email was flagged and can explain what triggered the security check. *** ## Why Was I Flagged? There are several reasons a legitimate user might trigger a security flag. None of these mean you're doing anything wrong. * **New or unusual email domain**: If your email domain was recently registered or doesn't have complete authentication records, it may score higher on the risk scale. * **Free email provider**: While most free email addresses are fine, some providers are more commonly used for fraudulent signups. This alone won't flag you, but it contributes to the overall assessment. * **Tagged email address**: Email addresses with a `+` tag (like `user+something@gmail.com`) are blocked because they're commonly used to create multiple accounts from a single inbox. * **Role-based email address**: Generic role addresses (like `support@yourcompany.com` or `info@yourcompany.com`) are blocked because they're typically shared inboxes, not personal accounts. * **Email address patterns**: Addresses with lots of numbers, unusual characters, or random-looking strings can resemble bot-generated emails. * **VPN or proxy usage**: If you're connecting from an IP address associated with VPNs, proxies, or data centers, this can add to your risk score. * **Shared hosting or network issues**: Sometimes your IP address or network has been used for suspicious activity by others, affecting your assessment. The security system weighs all these factors together. A single flag doesn't mean rejection. It's the combination that determines whether verification is needed. *** ## Common Questions Security systems aren't perfect. They're designed to catch as many fraudulent signups as possible while minimizing friction for real users. Sometimes legitimate accounts share characteristics with risky ones. [Contact our support team](/docs/getting-started/support) and we'll review your account manually. Yes. Our support team has access to the specific reasons your email was flagged. When you reach out, they can explain what triggered the security check and help you understand what happened. The security check looks at many factors beyond just your email provider. Your specific email address, domain configuration, IP address, and other signals all contribute. Even accounts with reputable providers can be flagged if other signals raise concerns. Disposable and temporary email addresses are automatically blocked. You'll need to create a new Galaxy account using a permanent email address from an established provider. Tagged emails (like `yourname+galaxy@gmail.com`) are blocked because they're commonly used to create multiple accounts. Create a new Galaxy account using your base email address without the `+` tag. Role-based emails are blocked because they're typically shared inboxes rather than personal accounts. Create a new Galaxy account using a personal email address tied to an individual. If your current email was flagged, you can create a new Galaxy account with a different email address. Use a personal email from a well-established provider with proper authentication records. Avoid disposable services, tagged addresses, and role-based emails, as these are blocked automatically. Absolutely. We only analyze publicly available information about your email address and domain. We don't access your inbox, read your messages, or collect personal data beyond what's necessary for account verification. Our support team typically responds quickly. Once they review your account and confirm you're a legitimate user, access is restored promptly. Include your Galaxy username and email address when you reach out to speed things up. *** ## Why We Do This Fraudulent accounts are a real problem for cloud platforms. Bots and bad actors abuse free tiers, consume resources, and create security risks for everyone. By verifying accounts proactively, we keep Galaxy safe and reliable for legitimate users. This isn't about making your life harder. It's about protecting the platform you depend on. If you're stuck or have questions about the verification process, [contact our support team](/docs/getting-started/support). We're available via live chat in your dashboard or email. --- # GDPR and Data Protection (https://help.galaxycloud.app/docs/security-compliance/gdpr) If you're serving users in Europe or handling personal data, GDPR matters. Galaxy takes data protection seriously and provides the tools and transparency you need to stay compliant. Galaxy's infrastructure hosts your applications and databases. If your app handles personal data (like user accounts, contact info, or behavior tracking), GDPR applies to you. Galaxy assists with compliance obligations, but the responsibility for handling personal data correctly stays with you. *** ## What is GDPR? The General Data Protection Regulation (GDPR) came into effect on May 25, 2018. It standardizes data protection rules across the European Union and gives EU residents significant rights over their personal data. Think of it as a framework that protects people's privacy while clarifying what companies can and can't do with their information. GDPR applies to you if you're processing personal data (any information that identifies a person) of EU residents, even if your app or business is based elsewhere. It covers everything from user emails to location data, browsing history, and device identifiers. *** ## How Galaxy Helps You Stay Compliant Galaxy has been GDPR-ready since before the regulation became enforceable, and we continue to enhance our processes and infrastructure to support your compliance obligations. Galaxy processes data in a standardized, automated way across all deployments. We maintain infrastructure to meet our obligations as a data processor under GDPR. Here's what that means for you: **You Control the Processing**: As the data controller, you decide what data your app collects and how it's used. Galaxy acts as your data processor, handling the technical infrastructure. All data is processed according to your configuration. **We Help with Data Subject Requests**: When EU users exercise their rights under GDPR (like requesting a copy of their data or asking for deletion), you can turn to Galaxy for assistance. We can help compile the personal data and delete it securely. **Documentation and Assessments**: We conduct Data Protection Impact Assessments and can provide documentation about our processing activities. This helps you respond to regulatory inquiries or audits. *** ## Key Questions About GDPR at Galaxy GDPR applies if you're processing personal data of EU residents. Personal data includes anything that identifies a person: names, emails, IP addresses, device IDs, location data, cookies, browsing history, or any custom data you're collecting. If your app only processes non-personal data (like aggregate analytics or system logs), GDPR is less likely to apply. When in doubt, consult with a legal expert familiar with your app's specific use case. Processing is any operation you perform on personal data: collecting it, storing it, using it, analyzing it, deleting it, or sharing it. If your app touches personal data in any way, you're processing it. Galaxy processes data according to your app's configuration. We don't decide what gets processed, how long it's kept, or who accesses it. That's your responsibility as the controller. A Data Subject Access Request (DSAR) is when a user asks to see what personal data you have about them. When you receive a DSAR, you can contact Galaxy support for assistance. Galaxy will help you compile the applicable personal data and handle the request on a case-by-case basis. If a user requests deletion, you can ask Galaxy to securely delete their personal data. These requests are sensitive and handled on a case-by-case basis. We're committed to supporting you in meeting your data subject obligations. If you're processing EU personal data with Galaxy, you should have a Data Processing Agreement in place. This legal document clarifies the relationship between you (controller) and Galaxy (processor). Contact Galaxy support to request and sign a DPA if you don't have one already. *** ## Next Steps GDPR compliance isn't one-and-done. It's about building data protection into how you design and run your app. Start by mapping what personal data you collect, why you need it, and how long you keep it. Then make sure your privacy policy is clear and accurate. If you have specific compliance questions or need help with a Data Subject request, reach out to Galaxy support. --- # Security & Compliance (https://help.galaxycloud.app/docs/security-compliance) Galaxy takes security seriously. We protect the platform from fraudulent accounts, comply with international regulations, and maintain transparency about where our services are available. If you've been flagged by our security system or have questions about service availability, [contact our support team](/docs/getting-started/support). We're here to help. *** ## Legal Documents * [Data Processing Agreement](https://galaxycloud.app/legal/dpa/) – How we handle and process your data * [Terms of Service](https://galaxycloud.app/legal/terms-of-service) – Our service terms and conditions * [Privacy Policy](https://galaxycloud.app/legal/privacy-policy) – How we collect and use your information * [Service Level Agreement](https://galaxycloud.app/legal/sla) – How we handle service availability *** ## Our Commitment **Platform Protection**: We use automated security checks to prevent bots, spam accounts, and fraudulent signups from abusing the platform. **Legal Compliance**: We follow international sanctions, trade restrictions, and local laws that govern where cloud services can operate. **Transparency**: When something affects your account, we explain why and provide clear next steps. **Support Access**: Our team can review flagged accounts manually and help legitimate users get access. Security systems aren't perfect. If you're a legitimate user who's been flagged, our support team can help you get access. --- # Service Availability and Geographic Restrictions (https://help.galaxycloud.app/docs/security-compliance/service-availability) *** ## Where Galaxy Operates Galaxy isn't available everywhere. We'd love to serve the whole world, but legal requirements and international regulations determine where we can operate. Our service availability depends on several factors: * International sanctions and trade restrictions * Local laws governing cloud services * Regulatory compliance requirements * Our ability to maintain secure infrastructure in a region Services are not available to customers in specific geographic locations due to international sanctions and regulatory compliance requirements. *** ## What Gets Your Account Suspended Your Galaxy account will be suspended if you register from a restricted region or if you add a payment method associated with a restricted region. We use multiple detection methods internally, but what matters for you is straightforward: if Galaxy identifies you as being associated with a restricted region, your account will be suspended. These restrictions apply uniformly across all customers, and we cannot make exceptions. Registering from a restricted region or adding a payment method from a restricted region will result in account suspension. We legally cannot make exceptions regardless of individual circumstances. *** ## Why We Restrict Service in Some Regions We don't make these decisions lightly. Galaxy restricts service when: **Legal Compliance**: Operating in a region would violate international sanctions, trade restrictions, or local laws. **Risk Management**: Continued service creates unacceptable legal or operational risks that we can't mitigate. **Security Concerns**: Local conditions prevent us from delivering services securely or maintaining adequate compliance infrastructure. **Payment Processing**: Payment processors can't operate in certain regions due to financial regulations. These aren't business decisions. They're legal requirements we must follow. *** ## Compliance Framework Galaxy maintains compliance with multiple legal frameworks: * Domestic regulations in our country of incorporation * International sanctions regimes * Anti-money laundering (AML) and counter-terrorism financing (CTF) obligations * Export control regulations * Data protection and privacy laws We update our policies as laws change. These aren't static rules. *** ## Common Questions Your account was suspended because we detected you're associated with a region where we can no longer provide services due to regulatory compliance requirements. This happens when you register from a restricted region or when you add a payment method associated with a restricted region. This is a legal compliance issue, not a billing or technical problem. We're required by law to suspend service in certain regions, and these requirements apply uniformly to all customers. Unfortunately, no. These are legal compliance requirements that apply uniformly to all customers. We legally cannot make exceptions to sanctions compliance obligations, regardless of individual circumstances. We understand this is frustrating, but exceptions would violate the laws we're required to follow. Due to compliance requirements, we cannot provide services to customers who were previously served from restricted regions, even if you've relocated to a permitted country. This policy exists to prevent compliance violations and ensure we meet our legal obligations. [Contact our support team](/docs/getting-started/support). We'll discuss what options are available, though in some cases data access may no longer be possible after suspension. Service availability is determined by applicable laws and regulations, which change over time. If legal requirements change, we'll update our policies accordingly. We can't predict future changes to international sanctions or trade restrictions. Check this page periodically for updates. *** ## Your Responsibilities When using Galaxy, you're responsible for: **Accurate Information**: Provide truthful details about your payment method and geographic location. Misrepresenting either to bypass restrictions violates our terms of service. **Local Compliance**: Ensure your use of Galaxy complies with all applicable laws in your jurisdiction. We handle international compliance obligations, but you're responsible for local legal requirements. **Stay Informed**: Be aware of service availability in your region. If you travel or relocate, verify Galaxy is available in your new location before registering or updating payment methods. Providing false information about your location or payment method to bypass restrictions violates our terms of service and may result in immediate account termination. *** ## Need Help? Have questions about your account status or service availability in your region? [Contact our support team](/docs/getting-started/support). We're here to help explain policies and answer questions. **Important**: Support cannot override compliance-related restrictions or provide exceptions to this policy. These are legal requirements, not discretionary decisions. This policy is subject to change based on evolving legal and regulatory requirements. We recommend reviewing this page periodically for updates. --- # Systems Policy (https://help.galaxycloud.app/docs/security-compliance/systems-policy) ## Galaxy's Security Practices Galaxy is committed to ensuring that the application code and data stored in the Galaxy platform is accessible only by authorized individuals. Security best practices are employed consistently and evolve to meet the needs of our customers. When you sign up, you agree to our [standard SLA](https://galaxycloud.app/legal/sla). If you need a customized SLA for your account, reach out to [Galaxy Support](/docs/getting-started/support). *** ## Platform Architecture Galaxy's physical infrastructure is hosted and managed in secure data centers operated by leading cloud providers, including Amazon Web Services (AWS) and OVHCloud. Galaxy is composed of platform services built and run on top of cloud infrastructure provided by our partners. Most container orchestration is managed by the Galaxy team using modern, secure, and widely adopted tools available on the market. In specific scenarios, managed orchestration services provided directly by the cloud provider are also used. Galaxy employs container-level isolation mechanisms to ensure separation of resources, processes, and environments between applications. These mechanisms are combined with container orchestration technologies such as Docker and RKE2. Each customer application runs in its own isolated container on dedicated virtual servers within our cloud infrastructure. *** ## Risk Assessment Our cloud providers continually manage risk and undergo recurring assessments to ensure compliance with industry standards. Our cloud providers' data center operations have been accredited under: * ISO 27001 * SOC 1 and SOC 2/SSAE 16/ISAE 340 * PCI DSS * GDPR compliance Galaxy itself has not yet obtained independent certifications. SOC 2 Type II and ISO 27001 are targeted for 2026. *** ## Policy around Software Security Updates System configuration and consistency are maintained through standard images, configuration management software, and the replacement of select systems with updated deployments. Systems are deployed using up-to-date images that are updated with configuration changes and security updates before deployment. Once deployed, existing systems are decommissioned and replaced with up-to-date systems. *** ## Customer Data Security Customer application configuration secrets are stored in a Galaxy system database. This database is secured by standard system and authorization policies. Access to the database is restricted to authorized personnel only, for purposes of administration and support. Customer application certificates and keys are stored in encrypted form in the Galaxy system database. These certificates are only decrypted on the Galaxy Proxy machines and are not exposed to application containers. Access to private information is protected using Docker isolation in the application container. *** ## Application Data Galaxy provides SSL encryption to protect data transmission over the wire from external entities to the Galaxy Proxy layer. Internally in Galaxy, virtual machine and Docker container network isolation is utilized to protect data transmission over the wire. Galaxy does not maintain databases that are utilized for production application use. These databases are provisioned, configured, and maintained by the customer. Galaxy free MongoDB databases are only available for hobby projects and open-source demos. *** ## Application Logs Galaxy captures and stores Application Logs in an off-site database. This database is secured by standard system and authorization policies. Access to the database is restricted to authorized personnel for administration and support only. *** ## Operational Policies Galaxy employees do not access customer data or customer environments as part of day-to-day operations. When customers need support, authorized employees are able to view customer data when specifically requested. All company employees are trained to understand that customer data privacy and confidentiality are paramount. Under no circumstances is customer data ever disclosed to a third party. Only a limited subset of employees have the ability to view customer environments and stored data. Access is routinely evaluated to ensure those rights are retained only when necessary by job function. Galaxy maintains a policy and operational checklist for removing access for employees that are no longer associated with its operations. *** ## Two-Factor Authentication Meteor Developer Accounts support Two-Factor Authentication, so we recommend that all members of your organization have it enabled. You can check if all members of your organization have this enabled in your Members tab on your account page on Galaxy. You will see a lock icon on each member with Two-Factor Authentication enabled. Each member can enable Two-Factor Authentication on their Settings > Security Information. It's important to save the backup codes in a safe place as well. Our two-factor authentication works via email or authenticator app, so you will receive a code by email or app when you authenticate with your confirmation code. If you authenticate with GitHub, the confirmation code will not be sent as you should have two-factor on GitHub as well. So our two-factor is not going to do anything in the GitHub authentication. *** ## DNSSEC Starting from June 22, 2021, meteor.com is a domain with DNSSEC enabled. Check what DNSSEC is, and why it's important [here](https://www.icann.org/resources/pages/dnssec-what-is-it-why-important-2019-03-05-en). *** ## What's Next?