This guide covers cPanel and Linux servers. Running it somewhere else? There is a Docker install guide and a Windows install guide — both are shorter, and none of the steps below apply to either.

Before you start

You'll need four things:

The app itself needs roughly 100 MB of disk. Memory depends on how many backups run at the same time, not on how many workspaces you have: the console allows about 1 GB for each backup running at once, runs as many as the server’s memory allows, and queues the rest. Your actual backup data is stored in your destination (Google Drive, S3-compatible storage or Azure) — not on the web server.

Up to ten workspaces on a small server. On 2 GB of memory or less, backups run one at a time. Give each workspace its own start time, an hour or more apart (in the workspace’s Settings, under Schedule), so each one finishes before the next is due, and run each new workspace’s first full backup on its own: it takes far longer than the nightly backups that follow.

Security first: where to install

Never install GWS Backup inside public_html.

The application folder contains your encrypted credentials database and encryption keys. Those must never be web-accessible.

/home/youruser/gwsbackup  ✓ correct
/home/youruser/public_html/backup  ✗ never

Use a random subdomain name.

Give the installation an unguessable address — vault‑k7x93q.yourdomain.com rather than backup.yourdomain.com — and don't link to it from anywhere public.

Always use HTTPS. Run AutoSSL on the new subdomain before your first login. Sign-in only works over https://: on an http:// address the sign-in page says so, and signing in fails.

Firewall and network access

On shared cPanel hosting there is nothing here for you to do — your host runs the firewall and its defaults already allow what the application needs. This section is for a VPS or a dedicated server, where the rules are yours.

Inbound: 443 to the web server, and nothing else.

Node listens on a local port — 3000 by default — and must only be reachable through your web server, never directly from the internet.

Outbound needs Google’s APIs, our licence server, gwsbackup.com (the update check and update downloads) and whichever storage destination you have configured. The full list, with the reason for each entry, is on the requirements page.

If you filter outbound traffic by hostname, allow googleusercontent.com as well as googleapis.com — Drive serves the actual file content from there.

Fresh installation

1Create the random subdomain

In cPanel → Domains → Create a New Domain (or Subdomains):

Then open SSL/TLS Status and run AutoSSL so the subdomain gets a certificate.

2Register the Node.js application

cPanel ships one of two tools for this — use whichever yours has. The settings are the same either way.

Route A — “Setup Node.js App” (CloudLinux Node.js Selector).
cPanel → Software → Setup Node.js App → Create Application.
Route B — “Application Manager” (cPanel’s own, on EasyApache servers).
cPanel → Software → Application Manager → Register Application. Check the system Node is 22.13 or newer before you go further (see the troubleshooting note at the foot of this page).

Whichever screen you are on, the values are:

Create or register the application, then stop it for now — there is nothing to run until the files are in place.

3Upload the application files

In File Manager, open the application root folder (e.g. /home/youruser/gwsbackup) and upload the -app.zip and -installer.php from your download. Then open the cPanel Terminal (or SSH) and run:

cd ~/gwsbackup
php gwsbackup-cpanel-1.00-installer.php

Use whichever version you downloaded. The installer extracts the application and cleans up after itself. It also adds one cron job that keeps the console awake (see Keep it awake below). No terminal access? Use File Manager's Extract on the -app.zip instead, then delete the zip, and add the keep-awake cron job yourself (see Keep it awake).

4Set the application URL variable

Back in Setup Node.js App (Route A) or Application Manager (Route B), add an environment variable so Google Drive’s sign-in has the right address to come back to:

NEXTAUTH_URL = https://vault-k7x93q.yourdomain.com

(your real subdomain, including https://).

5Start the app

Start the application. On first boot it generates its own keys and writes a complete .env in the app folder, including the ENCRYPTION_KEY that protects every credential it will ever store. Back that file up before you go any further. Your recovery key is generated later, inside the app, and shown to you on screen — nothing writes it to the server.

6First-run setup & licence activation

Visit https://your-random-subdomain/ in a browser:

The setup takes you through six steps, in order, and picks up at the right one if you sign out half way:

  1. Your account. Create your administrator account and save the recovery key it shows you — it is displayed once. If you forget this account’s password, or it is locked after too many wrong tries, the recovery key is your way back in.
  2. Keys. Confirm the recovery key is stored, and download a copy of the encryption key to keep off the server. The encryption key can wait, but Overview reminds you until you have it.
  3. Licence. Paste the key we emailed you — no key yet? Ask for one on the home page. The setup waits at this step until you have it. The software stays locked until a valid key is entered.
  4. Agreement. Read and accept the licence agreement.
  5. Where backups go. Choose your destination — Google Drive, S3-compatible storage (Amazon S3, Cloudflare R2, Wasabi, Backblaze B2 and others) or Azure — and test it. You can skip this and do it later in Settings → Destination.
  6. First client. Its name and Google Workspace domain, then its Connect page walks you through the service account and gives you the exact permission scopes to paste into the client’s Google Admin console. This can wait too.

That's it. Each client’s schedule is in its own Settings, and Overview shows a short checklist of anything still to do.

After installing: three belt-and-braces settings

There should not be any memory issues — these are precautions, not fixes. Five minutes now buys you an installation that looks after itself.

Cap the app’s memory

In Setup Node.js App or Application Manager, add an environment variable alongside NEXTAUTH_URL:

NODE_OPTIONS = --max-old-space-size=2048

That caps Node’s heap at 2 GB — use 1024 on a small VPS. Restart the app after adding it.

Give the server swap (VPS and dedicated only)

Check with free -h. If the swap line reads zero, add a swap file:

sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile && sudo swapon /swapfile
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

On shared cPanel hosting this is your host’s department — skip it.

Keep it awake

The installer does this one for you; just check it is there. cPanel starts the app only when somebody opens a page, and its nightly maintenance restarts the web server, which stops the app. Until somebody opens the console again, nothing runs: no scheduled backups and no licence checks. So the installer adds one cron job that asks the console for /api/health every five minutes, and leaves every other cron job alone.

In cPanel → Cron Jobs it ends in a comment starting # gws-backup keep-awake. If the installer could not add it, it printed the line for you to add yourself, on a five-minute schedule (*/5 * * * *), with your own subdomain:

curl -fsS -o /dev/null --max-time 60 https://vault-k7x93q.yourdomain.com/api/health

/api/health needs no sign-in and answers only {"ok":true}.

Updating an existing installation

Updates are one command, and your database is backed up automatically first:

  1. Download the latest release from this site.
  2. Upload the new -app.zip and its matching -installer.php into your existing application root (the folder containing gws-backup.db).
  3. Run:
cd ~/gwsbackup
php gwsbackup-cpanel-1.00-installer.php

The script backs up all your databases to db_backups/ first, then swaps in the new build. Your data, licence and settings are untouched. Finally, restart the app.

Each night, housekeeping keeps the newest three archives in db_backups/ and removes older ones, so they do not eat your hosting quota. Move any you want to keep somewhere else.

From 1.00 you update this way once. After that the console says in the sidebar when a newer version is out, and an Admin installs it from Settings → System, under Updates, with Install update. It will not start while a backup or restore is running or waiting, and starts none while it works. It backs up your databases, installs the update and restarts. If the new version does not start, the one before it is put back by itself. Updating by hand, as above, always works too.

Files you must protect

Inside your application root, treat these as crown jewels and keep your own offline copies:

Migrating servers? Stop the app first, then move the whole application folder and keep the same .env. Copy every database file together with its -wal and -shm companions — never a .db on its own. And your key may only be live on one installation at a time — retire the old server when the new one goes live.

What we can and cannot do for you

We have no access to your server. GWS Backup is self-hosted — it runs on your hosting account, writing to storage you own. We cannot see it or log into it.

Troubleshooting

Still stuck? Check the FAQ — it's searchable — or use the contact form (allow 1–2 days for free-edition support).