Two files, two generated secrets, one command — and one thing you must not lose.
This guide covers Docker. On a cPanel or Linux server, use the server install guide; on a Windows PC, the Windows install guide.
You will need three things:
docker plus docker-compose-plugin on Linux. Check with
docker compose version — if that prints a version, you are ready.You do not need Node.js. The image carries its own runtime.
The container publishes the console on a plain HTTP port. That is fine on a machine only you can reach, and not fine facing the internet.
localhost:3000.NEXTAUTH_URL to the
https:// address people actually use. Do not publish port 3000 to the
world directly.Use an address that cannot be guessed.
Docker publishes ports straight past your firewall.
On Linux, Docker writes its own iptables rules, and they are consulted
before the ones ufw manages. A container published with
-p 3000:3000 is reachable from the internet even while
ufw status reports that port as denied.
If anything terminates TLS in front of the container — and on anything internet-facing it should — publish to loopback only. In your compose file, change:
Outbound, the container needs a great deal: Google’s APIs, our licence server, whichever storage destination you have configured — and, up to v0.9613 only, SSH out to any Linux server you protect (Linux server backup was retired in v0.9700). 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.
1 Make a directory and put the two files in it. Download them from the download page and rename them:
2 Generate the two secrets and put them
into .env:
While you are in there, set NEXTAUTH_URL to the address you will reach the
console on. Leave it blank only if that is plain localhost.
3 Start it. The image is pulled for you; there is nothing to build:
Check it came up healthy:
The status column should read Up (healthy) within about half a minute. If it
says Restarting, go to Troubleshooting —
the logs will name the reason.
4 Finish setup in the browser. Open the console, create your administrator account, and save the recovery key it shows you — it is displayed once. Then paste in your licence key, and follow the in-app wizard to connect your first Google Workspace.
.env holds ENCRYPTION_KEY, and it is not recoverable.
That key decrypts every stored client credential. If it is lost, they cannot be
recovered — by us or by anyone. Keep a copy of .env somewhere
safe and separate from this server, and never change ENCRYPTION_KEY on
an install that already holds data.
If the container ever refuses to boot over a missing key, restore the original
.env — do not work around it.
Inside a Docker named volume, not inside the container:
/app/data/gws-backup.db — the console database/app/data/gws-backup-archive.db — frozen index of retired destinations/app/data/clients/<id>.db — one index per client workspaceThis is why updating does not touch your data: the container is replaced, the volume is not. Your backups are not here at all — they go to the destination you configure, whether that is Google Drive, S3-compatible storage, Azure or a local disk.
If you swap the named volume for a host folder, chown it to uid 1000
first. The container runs as an unprivileged user, and a host directory keeps its own
ownership — which surfaces as SQLITE_READONLY, an error that
mentions nothing about permissions.
Stop the container first. Copying a live SQLite database can produce a file that will not open:
The volume name is your directory name plus _gwsbackup-data. Confirm it with
docker volume ls.
Set GWSB_VERSION in .env to the new version, then:
Your databases, licence and settings are untouched. Pinning the version keeps updating a decision you make.
Start with the logs. They are almost always explicit:
.env is missing, or the secrets are still blank. See step 2.
The key that encrypted this data is not being supplied. Restore the original
.env. Do not generate a new key unless you accept losing every stored
credential.
You have replaced the named volume with a host bind mount. Chown the directory to uid 1000, or go back to the named volume.
NEXTAUTH_URL is unset or wrong. It must be the address your browser actually
uses, including https:// if you are behind a proxy.
The health check simply asks the console for its login page. If it is failing, the app is not serving — the logs will say why.
We can help with the application: installing it, connecting a workspace, backups, restores, anything it does or fails to do. Email support@gwsbackup.com and a person reads it.
We cannot administer your Docker host, your reverse proxy or your firewall — we have no access to them.