Docs / Your server / Updates and backups
Updates and backups
MarkdownOpen in ClaudeOpen in ChatGPT
At the end, your runner runs the newest release, you can go back to the one before, and you have a backup of everything it keeps.
- Time
5 minutes for an update or a backup.
- You need
- The runner from Any Linux box
- A Terminal on the box, in the
loopgatefolder (cd ~/loopgate)
Set this up with your agent
Copy this to a coding agent on your laptop. It runs the commands and checks each step with you; what you sign in to, press or paste stays yours.
This is for a coding agent that can run commands on my laptop (Claude Code, Codex, Cursor), not a chat website.
Walk me through Loopgate's docs page "Updates and backups": https://loopgate.dev/docs/care.md. The pages it links to are beside it, each ending in .md.
Run its commands yourself, on my laptop or on my box over SSH as the page says, one step at a time, and check each "You should see" line before the next step.
These are mine: tell me when it is my turn, wait for me, and never ask me to type them into this chat. Signing in to anything (the portal, a cloud console, Slack, GitHub), pressing Add a runner, every token and password, my AI subscription's device code, and making the Slack app.
If I paste you the portal's install line, run it on the box: its token works once, for an hour.Update
Each release of Loopgate is a new compose.yaml. An update downloads only what changed, and your settings are kept.
Keep a copy of the current file, so you can go back.
cp compose.yaml compose.previous.yamlDownload the new one.
curl -fsSLO https://loopgate.dev/runner/compose.yamlPull and restart.
docker compose pull && docker compose up -dYou should see: each container
StartedorRunning, andRunner ready at …indocker compose logs runner.
Undo an update
Put the previous file back.
cp compose.previous.yaml compose.yamlRestart.
docker compose up -dYou should see: each container
StartedorRunning.
Back up
A backup copies everything the runner keeps: its runs and settings, your code on the box, and the coding tools' sign-ins. It holds those sign-ins, so store it like a password.
Stop the runner.
docker compose stopCopy everything into one file.
docker run --rm -v loopgate-runner_data:/data -v loopgate-runner_repos:/repos -v loopgate-runner_home:/home/node -v "$PWD":/backup debian:bookworm-slim tar czf /backup/loopgate-runner.tgz /data /repos /home/nodeYou should see: a file
loopgate-runner.tgzin the folder. Copy it off the box to somewhere safe.Start it again.
docker compose start
Good to know
- Browsers stay signed in across a restart. A temporary address changes, so on one each person opens the runner from the portal again.
- A step that was working when the runner restarted shows as interrupted, with Retry.
- Stop one task with Stop on the task in the workbench or in its Slack thread, or with
docker compose exec runner loopgate cancel <run>(the run's id is in its workbench address). - Shut the door for everyone: revoke the runner in the portal's Devices page, or run
docker compose exec runner loopgate logout. Within a minute nobody can open it. Tasks already working carry on until they need a person or end. docker compose logs runnerreads the runner's lines, anddocker compose logs slackthe Slack worker's.
If something is off
Runner ready at https://…. All is well.(temporary address)after it is the quick tunnel's, which changes at a restart.This runner is signed out. Run loopgate login on its host.Paste a fresh line from the portal's Devices → Add a runner, or rundocker compose exec runner loopgate login --no-open.The install token was refused: …. The rest of the line says why. Paste a fresh line from Devices → Add a runner.The runner is fetching its org policy.It is starting. Wait a minute.This runner belongs to another org. Give it a fresh data directory.The box was signed in to a different Loopgate org before. Ask us for help.This data directory has runs from before it was a runner. Give it a fresh one.The box's data predates the runner. Ask us for help.Loopgate Slack worker is connected for T…. The Slack worker is working. Settings → Slack says the same, or the worker's error in one sentence.No Loopgate daemon answers in /data: …. The runner is not up. Checkdocker compose psand the runner's lines.- "This link expired. Open the runner from the portal again." The portal's pass lasts one minute and works once. Press Open in Devices again.
- "Not a current member of this org." The person is not a member of your Loopgate org, or was removed. An owner or admin adds them in the portal; a new member gets in within about two minutes.
- "Ask an owner or admin of your org to … on this runner." Signing in engines, saving GitHub or Slack and adding workspaces on a runner are an owner's or admin's.
- Still stuck. Write to us where we shared these docs with you, with what you did, what you expected,
docker compose logs --tail 50 runneranddocker compose ps. Never send a token, a key,runner.env,slack.env,tunnel.envor a backup file.