Skip to content

Install one-liner

Every flag, env var, and stage of the install.sh script.

The installer is a single POSIX-sh script that bootstraps a Feedbot deployment from a fresh Linux server or macOS laptop. It’s designed to be safe to curl … | less for review before piping to sh.

The script lives at install.sh in the feedbot repo. We host the canonical copy at https://get.feedbot.dev/install.sh which serves the same content.

The installer is a deterministic state machine. Each stage either runs or fails and triggers a LIFO rollback of every preceding stage.

StageWhat it does
1. Pre-flightOS / arch / RAM / disk / DNS / NTP checks. No mutations.
2. Detect existing installIf /opt/feedbot or ~/.feedbot exists, asks: upgrade / reconfigure / reinstall / cancel.
3. Collect configAuto-detects mode; asks the workdir + final confirmation.
4. Ensure DockerVerifies Docker + compose v2; offers get.docker.com install on Linux.
5. Resolve portsMode-aware port resolution. Falls back to :8080 on conflict.
6. Pull imagesPulls from GHCR. Tracks images we fetched so rollback is precise.
7. Create workdirmkdir -p the tree, snapshots pre-existing files.
8. Write filesTemplates docker-compose.yml, .env, Caddyfile, .install-state.
9. Start stackdocker compose up -d.
10. Wait healthyPolls db / api / web for up to 90s. Bails with logs on failure.
11. Install CLIFetches bin/feedbot from the repo into /usr/local/bin/.
12. Final verifyOne last curl /healthz.
13. Print summaryURL + next steps.
--yes, -y Non-interactive: accept all defaults.
--local Force local mode (bind 127.0.0.1).
--server Force server mode (bind 0.0.0.0).
--upgrade Force upgrade path on existing install.
--reinstall Force reinstall (DESTROYS DATA; asks confirm).
--version=vX.Y.Z Pin image versions (default: latest).
--workdir=PATH Override install location.
--http-port=N Override port resolution.
--no-cli Skip installing 'feedbot' to PATH.
--dry-run Print actions, no mutations.
--verbose, -v Show every command run.
--help, -h Usage.
FEEDBOT_INSTALL_MODE local | server
FEEDBOT_PUBLIC_IP Override IP detection (server mode).
FEEDBOT_WORKDIR Override install location.
FEEDBOT_HTTP_PORT Override port.
FEEDBOT_VERSION Pin to specific image tag.

Every install attempt writes a transcript to:

  • Linux (root): /var/log/feedbot-install-<ts>.log
  • macOS / non-root Linux: ~/.feedbot/logs/install-<ts>.log

The log is preserved even after a rollback so you have a transcript for support.

localserver
Bind127.0.0.1 only0.0.0.0
Auto-detectmacOS, no public IPLinux with public IP matching a local interface
Domain & HTTPS UIHiddenVisible
Auto-start defaultOffOff (toggle in Settings)

The privacy guarantee in local mode: the caddy container binds 127.0.0.1:80:80 explicitly. No firewall rule, no router setting, no NAT misconfiguration can expose this port. It’s physically off-network.

Open the URL printed at the end and:

  1. Create the owner account.
  2. Configure SMTP, Telegram, domain in Settings.
  3. Use the feedbot CLI for lifecycle ops.

feedbot reconfigure (or curl … | sh -s -- --upgrade) re-runs the installer in upgrade mode against an existing install. Data is preserved.