docs(platform): document single-container operations - #13760
Conversation
|
Note Reviews pausedIt looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the Use the following commands to manage reviews:
Use the checkboxes below for quick actions:
WalkthroughChangesThe documentation adds an experimental single-container deployment guide. It covers setup, configuration, security boundaries, persistence, backups, restore, upgrades, health checks, troubleshooting, and limitations. Single-container deployment
Estimated code review effort: 2 (Simple) | ~15 minutes Possibly related PRs
Suggested reviewers: Poem
🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
…-Gravitas#13755) ### Why / What / How **Why** The single-container appliance supervises backend roles in one network namespace. Internal metrics listeners should not be exposed beyond container loopback, and notification workers must stop cleanly when Supervisor terminates the process. **What** - Binds executor and Copilot executor metrics endpoints to loopback. - Gives notification queue polling an explicit task lifecycle. - Adds regression coverage for clean cancellation and shutdown. **How** The metrics servers use an explicit loopback host. The notification runner tracks its polling task, cancels and awaits it during shutdown, and avoids leaving an event-loop-bound task behind. ### Stack Part **1 of 6** in the single-container stack. This is the bottom PR and targets `dev`. Review and merge the stack bottom-up. It supersedes the corresponding backend portion of draft Significant-Gravitas#13754. ### Changes 🏗️ - 4 focused backend source/test files. - No Docker image or configuration changes in this layer. ### Checklist 📋 #### For code changes: - [x] I have clearly listed my changes in the PR description - [x] I have made a test plan - [x] Signed commit passed the repository pre-commit suite under Node 24, including backend lint, formatting, type checking, API generation, and secret checks - [x] Notification regression coverage is included - [ ] Let PR CI validate this isolated layer #### For configuration changes: - [x] Not applicable; this layer does not change configuration ### Stack navigation Bottom → top: 1. [Significant-Gravitas#13755 — backend supervision](Significant-Gravitas#13755) 2. [Significant-Gravitas#13757 — frontend routing](Significant-Gravitas#13757) 3. [Significant-Gravitas#13756 — runtime options](Significant-Gravitas#13756) 4. [Significant-Gravitas#13758 — single-container image](Significant-Gravitas#13758) 5. [Significant-Gravitas#13759 — validation and publication CI](Significant-Gravitas#13759) 6. [Significant-Gravitas#13760 — operations documentation](Significant-Gravitas#13760) The base refs already form GitHub's required linear chain. The native Stack association is pending GitHub's repository-by-repository public-preview rollout; the Stack API currently returns its documented not-enabled response for this repository. <!-- CURSOR_SUMMARY --> --- > [!NOTE] > **Medium Risk** > Changes shutdown ordering and timeouts for the notification RabbitMQ path and alters metrics bind behavior; mistakes could hang supervisor restarts or affect scrape access, though behavior is heavily tested and bounded. > > **Overview** > Hardens backend processes for **single-container supervision**: internal Prometheus listeners follow the same bind address as other service RPC (`pyro_host`), and the notification service shuts down RabbitMQ consumers with **bounded, non-blocking** teardown. > > **Graph and Copilot executors** now pass `addr=settings.config.pyro_host` into `start_http_server`, so metrics stay on loopback in the appliance runtime while docker-compose can still scrape via `0.0.0.0`. > > **NotificationManager** keeps strong references to the background `_run_service` future/task, routes shutdown through a new `_shutdown_service` barrier (cancel consumers, then disconnect with per-stage timeouts), and replaces the old synchronous disconnect in `cleanup()` with `run_and_wait(..., timeout=CLEANUP_TIMEOUT_SECONDS)` plus handling for already-closed or racing event loops. > > **AppService** gains an optional timeout on `run_and_wait` and skips scheduling `loop.stop()` when the shared loop is already closed. > > Regression tests cover future retention, ordered shutdown, cancellation timeouts, and loop-edge cases. > > <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit c38bd9e. Bugbot is set up for automated code reviews on this repo. Configure [here](https://www.cursor.com/dashboard/bugbot).</sup> <!-- /CURSOR_SUMMARY --> --------- Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…into codex/pr13756-merge
…into codex/pr13756-polish
…thub.com/Significant-Gravitas/AutoGPT into codex/pr13758-polish
…into codex/pr13758-polish
There was a problem hiding this comment.
📋 Automated Review — PR #13760
PR #13760 — docs(platform): document single-container operations
Author: ntindle | Files: 5
🎯 Verdict: REQUEST_CHANGES
PR Description Quality
✅ Has Why + What + How — clear scope (operator guide + safe loopback quick start + SUMMARY wiring + shutdown-timeout alignment), a 9-item test plan, and a completed checklist. Every inline reviewer thread has an author response.
What This PR Does
Adds a comprehensive operator guide (docs/platform/single-container.md) for the experimental single-container AutoGPT appliance — covering ports, TLS, persistence, the security boundary, backup/restore, upgrade/rollback, and troubleshooting — and surfaces a loopback-only Docker quick start in the root README. It also wires the new page into the docs SUMMARY and aligns --stop-timeout 360 across both READMEs. The only non-doc change is a provably behavior-neutral quote-style normalization in test_entrypoint.py:126.
Specialist Findings
🛡️ Security ✅ — Verified every security claim in the guide against the actual runtime (entrypoint.sh, runtime_config.py, nginx conf): secrets stored root:root 0600, changed-secret rotation fails closed, email-verification halts startup, Valkey/FalkorDB require auth, loopback-only binding throughout. All accurate. One low note: the root README snippet omits allowlist/signup-closure guidance.
🟠 Root README quick start leaves account registration open by default (README.md:128).
🏗️ Architecture ✅ — Documented env-key contract matches single-container/.env.example; SUMMARY placement and cross-links resolve; added Bash comments pass the durability test. Only debt is the docker run snippet now living in three hand-synced copies.
🟡 Doc duplication of the boot command across three files (README.md:128).
⚡ Performance ✅ — No runtime, query, or algorithmic code changed. The documented cold backup/restore is inherently serial and correctly disclosed as full-downtime behavior. Zero performance impact.
🧪 Testing ✅ — The lone .py change is a single→double quote swap in an implicitly-concatenated bash string with no interpolation; the -c payload is byte-for-byte identical (test_entrypoint.py:126). Assertions and coverage unchanged. No new code paths require tests.
📖 Quality ✅ — Readability grade A: clear prose, fail-closed shell blocks (set -euo pipefail), ShellCheck-conscious. Flag-style drift between README (short flags) and guide (long flags) noted as minor.
📦 Product
🔴 Root-README CTA deep-link may 404 for every reader (README.md:143).
📬 Discussion --add-host scope, LAN publish origin) all fixed. Current bot review is CHANGES_REQUESTED over the README link; Human Review Needed: YES (all reviews to date are bots). 3 CI checks still pending.
🔎 QA ✅ — Docs-only PR with no UI surface, so verification = claims-vs-source. 17/17 env keys exist in .env.example; 18/18 bash blocks parse; buildx bake target and tag match; autogpt-admin promote, autogpt-healthcheck, /healthz, and /data/config/* paths all confirmed in image source; test change proven identical. Could not run pytest locally (no pyproject.toml in the single-container dir; runs under backend poetry env in CI) — mitigated by the byte-identical string proof.
🔴 Blockers
- Root README CTA is a dead link (
README.md:143) — The headline "Follow the single-container guide →" links tohttps://docs.agpt.co/platform/self-hosting/single-container. Live testing confirmed the sibling page under the same## Self-HostingSUMMARY group publishes without aself-hosting/segment:/platform/getting-startedreturns 200 while/platform/self-hosting/single-containerreturns 404. By the repo's own GitBook routing convention the page resolves to/platform/single-container, so the PR's single most important click is currently broken — defeating its stated goal. Lines 126 and 143 are also internally inconsistent (/self-hosting/on one, absent on the other). Fix: point the link at/platform/single-container(one-line change), or confirm the live route and gate merge on companion GitBook PR #14018 publishing the exact slug. (Flagged by: product, ui-reviewer, discussion, architect — 4 specialists)
🟠 Should Fix
- Quick start leaves signup open with no allowlist (
README.md:128) — BecauseAUTH_ALLOW_NEW_ACCOUNTSdefaults totrue, an operator copy-pasting only the README snippet leaves account registration open indefinitely. Loopback binding contains it, but a later port-forward/republish becomes an open-admin-registration footgun. Add-e AUTH_SIGNUP_ALLOWLIST=owner@example.comor a one-line note pointing to the guide's Account policy section. (Flagged by: security, product, discussion — 3 specialists)
🟡 Nice to Have
- Consolidate the triplicated
docker runsnippet (README.md:128) — The boot command now lives in three hand-synced copies with stylistic divergence; this PR already had to touch two just to add--stop-timeout 360. Designate one canonical copy and link to it, or add a maintainer sync note. (architect, quality)
🔵 Nits
- SUMMARY nav title vs H1 casing (
docs/platform/SUMMARY.md:23) — Nav "Run AutoGPT in One Docker Container (Experimental)" doesn't match page H1 casing "...in one Docker container...". (discussion) - Flag-style drift (
README.md:128) — README uses short flags (-d/-p/-e/-v); the guide uses long flags. Standardize for maintainability. (quality)
Note: the previously-raised Qwen model-tag concern is settled — the identifier mirrors the shipped .env.example:53 and was verified/waived by the author; not re-flagged.
Human Review Needed
YES — Required because at least one matrix variant reported a blocking result.
Risk Assessment
Merge risk: LOW | Rollback: EASY — docs-only; the sole code change is provably behavior-neutral. The blocker is a one-line link correction with no runtime impact.
CI Status
Local harness: ✅ all 5 checks pass (frontend lint/types/test:unit/build, backend lint).
GitHub CI: 20/23 checks green (lint, types, CodeQL, e2e, CodeRabbit, Bugbot, Seer, Snyk, scope, size, CLA); 3 pending (Build/smoke/scan amd64 + arm64, Check PR Status) — must go green before merge. Current bot review: CHANGES_REQUESTED.
UI Testing — Variant Results
✅ local: Documentation-only PR whose every operational claim (env keys, bash blocks, bake target, commands, paths, links) verifies against the real single-container source, with a provably behavior-neutral test quote change.
✅ hosted: Documentation-only PR whose every verifiable claim (bash blocks parse, 16 env keys exist, links/anchors resolve, bake target matches, documented internals match source, model refs are live) passed independent re-testing, with a provably behavior-neutral one-line test fix.
|
/reapprove |
|
/review |
There was a problem hiding this comment.
📋 Automated Review — PR #13760
PR #13760 — docs(platform): document single-container operations
Author: ntindle | Files: 5
🎯 Verdict: REQUEST_CHANGES
PR Description Quality
✅ Has Why + What + How — the description explains the operator-facing goal, enumerates the doc surface added, and includes a self-run test plan (dotenv-key existence, buildx bake, ShellCheck, link resolution). It also honestly discloses the companion GitBook dependency (#14018).
What This PR Does
Adds a comprehensive operator guide for running AutoGPT as a single co-located "appliance" container (docs/platform/single-container.md), wires it into the Self-Hosting nav (SUMMARY.md), and surfaces a loopback-bound Docker quick start from both the root README.md and the single-container README. The only non-doc change is a behavior-neutral quote-style normalization in test_entrypoint.py:126. The guide covers ports, account policy, models/memory, security boundary, persistence, backup/restore, upgrade, and troubleshooting.
Specialist Findings
🛡️ Security --network none restore isolation). One medium note: the root README quick start (README.md:128-138) boots with account signup open and no allowlist pointer — safe under the loopback bind, but a footgun on a shared host. No critical/high.
🏗️ Architecture ✅ — Documented contract reconciles against actual sources: /_agpt/ws and /_agpt/api routing (nginx/nginx.conf:59,90,97), /healthz nginx-only caveat, all dotenv keys exist in .env.example, and the page is correctly registered at SUMMARY.md:22. No new tech debt; comments in Bash fences are durable.
⚡ Performance ✅ — No runtime code, queries, or hot paths. Backup is inherently O(size of /data) and the doc correctly discloses cold-backup downtime and 5–6 GiB memory expectations. Nothing to optimize.
🧪 Testing ✅ — Sole test change (test_entrypoint.py:126) converts a single-quoted literal to double-quoted inside an implicit concatenation; the string has no interpolation/escapes, so the bash command is byte-identical and coverage is intact. No test obligation for docs.
📖 Quality -d/-p/-e/-v) while the guide uses long flags, and the README teaser injects config inline via -e while the guide standardizes on --env-file.
📦 Product
📬 Discussion reviewDecision is CHANGES_REQUESTED over the README guide link. Confirmed objective inconsistency: README.md:126 omits the self-hosting/ URL segment while README.md:143 includes it — both cannot be correct. All reviews to date are bots (no human review yet).
🔎 QA autogpt-platform:single-container-dev, 19/19 bash segments parse, internal links/anchors resolve, --stop-timeout 360 consistent across both READMEs. One negative test failed: curl returned 404 for https://docs.agpt.co/platform/self-hosting/single-container while the sibling /platform/getting-started returned 200 — confirming it is this specific route that is missing, not a site outage.
🔴 Blockers
- Root README headline CTA is a live 404 (
README.md:143) — The "Follow the single-container guide →" link targetshttps://docs.agpt.co/platform/self-hosting/single-container, which QA verified returns HTTP 404 viacurl(sibling route returns 200). Traced failure path: any reader of the repo's most-visited page clicks the PR's flagship link and lands on a dead page, defeating the PR's stated deliverable. It is also internally inconsistent withREADME.md:126, which links the sibling Self-Hosting page without theself-hosting/segment — both conventions cannot be correct. Resolve by confirming the published GitBook slug, aligning lines 126 and 143 to the same convention, and gating merge on companion PR #14018 publishing that exact route. (Flagged by: discussion, product, ui-reviewer, quality, architect — 5 specialists)
🟠 Should Fix
- README quick start leaves signup open with no allowlist pointer (
README.md:128-138) — The copy-pastedocker runsets onlyAUTOGPT_PUBLIC_URL;AUTH_ALLOW_NEW_ACCOUNTSdefaults open (persingle-container.md:191), so on a shared host any local user can self-register before the operator. Add a one-line pointer to the guide's account-policy step (promote first admin, then close signup). Mitigated by the loopback bind, so not a blocker. (Flagged by: security, product, discussion — 3 specialists)
🟡 Nice to Have
- Firewall-bypass caveat for the publish spec (
docs/platform/single-container.md:335) — Note that Docker port publishing bypasses hostiptables/ufwon Linux, so an operator who changes the bind to-p 3000:3000is exposed despite a host firewall. (security) - Backup checksum not verified before restore (
docs/platform/single-container.md:470) — The restore validation extracts the archive without verifying the checksum recorded atsingle-container.md:250. Recommend verifying integrity before extraction. (security)
🔵 Nits
- Docker flag style diverges across quick starts (
README.md:130vsdocs/platform/single-container.md:95) — Short flags vs long flags for the same command; standardize on one (prefer long). (quality) - README teaser omits
--env-file(README.md:130) — Inline-evs the guide's--env-file autogpt.env; add a note that the teaser is minimal and the guide is authoritative. (quality)
QA Screenshots
| Screenshot | Description |
|---|---|
![]() |
Frontend root renders as a baseline sanity check ✅ |
Human Review Needed
YES — Required because at least one matrix variant reported a blocking result.
Risk Assessment
Merge risk: LOW | Rollback: EASY — Docs-only content plus a byte-identical test string; a revert is trivial and carries no runtime impact. The blocker is a user-facing dead link, not a stability or data risk.
CI Status
Local harness: ✅ 5/5 checks pass (frontend lint, backend lint, frontend types, frontend unit tests, frontend build). GitHub CI (per discussion specialist's live fetch): 34/34 required checks green, mergeable: MERGEABLE; standing reviewDecision is CHANGES_REQUESTED over the README link (all reviews to date are bots).
UI Testing — Variant Results
✅ local: Documentation-only PR whose factual claims (16 dotenv keys, buildx target, bash-block syntax, internal links) all verify against the repo; only concern is the root README linking to a GitBook route (PR #14018) that currently 404s.
- low: The 'Follow the single-container guide' link targets https://docs.agpt.co/platform/self-hosting/single-container, which currently returns HTTP 404. The route is published by companion GitBook PR #14018, so if this PR merges to dev before that PR the default-branch README will contain a dead user-facing link (the sibling getting-started link returns 200, confirming it is this specific route that is missing).
✅ hosted: Documentation-only PR (plus a behavior-neutral test quote fix); all test-plan claims independently verified — test passes, 18/18 bash blocks parse, 16/16 env keys present, buildx bake target resolves, links/anchors resolve.
|
/review |
|
/review |
|
There was a problem hiding this comment.
📋 Automated Review — PR #13760
PR #13760 — docs(platform): document single-container operations
Author: ntindle | Files: 5
🎯 Verdict: REQUEST_CHANGES
PR Description Quality
✅ Has Why + What + How — the body explains the motivation (document single-container operations for self-hosters), enumerates the five changed files, and includes a 9-point test plan with all boxes checked. It also honestly discloses the merge-order dependency on companion GitBook PR #14018.
What This PR Does
Adds operator-facing documentation for running AutoGPT as a single container: a full operations guide (docs/platform/single-container.md), a loopback-bound Docker quick start in the root README.md, a SUMMARY.md TOC entry, and a --stop-timeout 360 graceful-shutdown addition to the single-container README. The only non-doc change is a behavior-neutral single→double quote normalization in test_entrypoint.py:126. No runtime, auth, or application code is modified.
Specialist Findings
🛡️ Security ✅ — Confirmed no code attack surface. The documented backup/restore scripts are genuinely hardened (set -euo pipefail, umask 077, path-traversal rejection, checksum validation, --network none restore validation). One 🟢 low note: the README quick-start ships open signup with no allowlist pointer (README.md:128) — low-risk under loopback bind.
🏗️ Architecture ✅ — Reconciled every documented env key, build target, admin/healthcheck command, /data layout, and nginx route (/_agpt/ws, /_agpt/api) against the real runtime; all match. 🟠 One integration-point concern: the README.md:143 link path diverges from the repo's own SUMMARY route convention (/platform/<file>) and depends on external PR #14018.
⚡ Performance ✅ — No runtime code, no hot path. Only operator-cadence shell tooling; one 🟡 low I/O note that the cold-backup checksums the archive in a second full-read pass (single-container.md:437) instead of piping tar | tee | sha256sum.
🧪 Testing ✅ — The lone test edit (test_entrypoint.py:126) is provably byte-identical string content — verified behavior-neutral. Existing suite carries real negative/boundary coverage (invalid-integer, invalid-toggle, closed-signup paths). No new code paths require tests.
📖 Quality ✅ — Readability grade A: consistent terminology, logical flow, defensive shell blocks. 🔵 Nits only: three copies of the docker run command may drift; SUMMARY.md title-case vs H1 sentence-case.
📦 Product Qwen3.5-4B-GGUF model slug — the latter was ✅ Addressed: QA independently confirmed the HF repo and Q4_K_M artifact resolve.
📬 Discussion reviewDecision: CHANGES_REQUESTED is held solely by the README 404. All reviews to date are automated; bot requests human eyes but no security-boundary code changed.
🔎 QA ✅ — Every falsifiable test-plan claim independently reproduced: 17/17 env keys present, documented defaults match .env.example, all 18 bash blocks parse (bash -n), internal links/anchors resolve, HF model + Q4_K_M artifact exist, Docker Hub latest/v0.7.1 resolve to the identical digest sha256:4f8b92b8…994754, --stop-timeout 360 consistent across all three files. Confirmed README.md:143 returns HTTP 404 (sibling route returns 200). Could not boot the single-container image locally (environment runs multi-container compose) — verified claims directly instead.
🔴 Blockers
- Root README headline CTA 404s (
README.md:143) — "Follow the single-container guide →" links tohttps://docs.agpt.co/platform/self-hosting/single-container, which QA confirmed returns a live HTTP 404 (sibling route returns 200). Traced reachable failure: a reader clicks the flagship README's primary CTA and lands on a dead page. It is also internally inconsistent withREADME.md:126, which links a sibling doc as/platform/getting-started(noself-hosting/segment) — the convention this repo's ownSUMMARY.mdactually produces. Fix in-PR by pointing the link at/platform/single-container, or gate merge on companion GitBook PR #14018 publishing the/platform/self-hosting/single-containerroute and re-verify 200 at merge time. (Flagged by: product, discussion, architect, ui-reviewer — 4 specialists)
🟡 Nice to Have
- Single-pass backup checksum (
docs/platform/single-container.md:437) — pipetarthroughtee archive | sha256sumto avoid a second full read of a large/dataarchive. (performance) - README quick-start signup pointer (
README.md:128) — add a one-line note to lock signup (AUTH_ALLOW_NEW_ACCOUNTS=false/ allowlist) after first admin; low-risk under loopback bind. (security, discussion)
🔵 Nits
- Canonical run-command drift (
README.md:131,single-container/README.md:13,single-container.md:95) — three copies of thedocker runblock; consider a source-of-truth note. - TOC casing (
SUMMARY.md:23vssingle-container.md:1) — title-case TOC entry vs sentence-case H1.
Human Review Needed
YES — Required because at least one matrix variant reported a blocking result.
Risk Assessment
Merge risk: LOW | Rollback: EASY — docs-only; reverting is a clean file revert. The sole blocker is a link-correctness/merge-ordering issue, not a runtime hazard.
CI Status
Local harness: ✅ All 5 checks pass (frontend lint, backend lint, frontend typecheck, frontend unit tests, frontend build).
GitHub CI (per discussion report): ~34/38 checks green, none failing; multi-arch build/smoke/scan jobs and "Check PR Status" pending. Merge state BLOCKED by the standing CHANGES_REQUESTED, not by CI. Live CI not re-fetched in this pass — treat as reported, not independently reverified.
UI Testing — Variant Results
✅ local: Documentation-only PR whose every falsifiable claim (env keys/defaults, bash syntax, links, HF model, Docker Hub tags, digest equality) was independently reproduced and passed.
- low: The quick-start links to https://docs.agpt.co/platform/self-hosting/single-container, a route generated by companion GitBook PR #14018 (not in this repo). The link will 404 until that PR is merged/published.
✅ hosted: Docs-only PR verified end-to-end: entrypoint tests pass, all documented env keys/bash blocks/links/bake target and the source operator contract check out; only a low-severity note about the README link depending on companion GitBook PR #14018.
- low: The root README links to https://docs.agpt.co/platform/self-hosting/single-container, a route generated by companion GitBook PR #14018 rather than this PR. If this PR merges before #14018, the public link returns 404.
|
/dev-review |
|
|
/dev-review |
There was a problem hiding this comment.
📋 Automated Review — PR #13760
PR #13760 — docs(platform): document single-container operations
Author: ntindle | Files: 5
🎯 Verdict: APPROVE
PR Description Quality
✅ Has Why + What + How — the description states the motivation (operators had to reconstruct the appliance contract from runtime scripts), enumerates the four docs files touched, explains the one non-docs change (a Black quote normalization in test_entrypoint.py), and ships a 9-item test plan with runnable commands. QA re-ran all nine independently and every one held.
What This PR Does
AutoGPT publishes a single-container "appliance" image, but the only operator-facing documentation was a short quick start — everything about admin promotion, closing open signup, TLS, backups, upgrades, and the /data layout had to be reverse-engineered from entrypoint.sh and the supervisor config. This PR adds a full operations guide at docs/platform/single-container.md (~640 lines), registers it in the docs TOC, adds a loopback-bound docker run quick start to the root README.md, and backfills the missing --stop-timeout 360 flag into autogpt_platform/single-container/README.md so the three copies of that command agree. No runtime behavior changes.
Specialist Findings
🛡️ Security ✅ — Audited every security claim in the guide against the actual runtime and found them all accurate: 0600 root:root secrets at /data/config/runtime.env (entrypoint.sh:21-22), the passwordless column-scoped frontend Postgres role (bootstrap.sh:147-180), loopback+requirepass on Valkey/FalkorDB (entrypoint.sh:275-288), fail-closed toggle parsing (entrypoint.sh:220-230), and the honest "Docker port-forwarding bypasses UFW" / "no antivirus bundled" caveats. Net effect on self-hosted security posture is positive.
🟠 The root README quick start ships default-open registration with no allowlist and no warning (README.md:131).
🟠 The "provider keys stay backend-side" framing is wrong for OPENAI_API_KEY, which run-frontend.sh:31 passes into the browser-facing Next.js process and /api/transcribe spends (docs/platform/single-container.md:317).
🏗️ Architecture ✅ — Reconciled ~30 discrete factual claims against the runtime; the /data layout table matches prepare_directories exactly, the tag policy matches the publish workflow, and --stop-timeout 360 is derived correctly (worst-case serialized supervisor teardown ≈ 310–320s, ~40-50s headroom). Docker Hub Overview single-source-of-truth wiring is genuine. Comment durability across 640 new lines is clean — no diff-relative language.
🟠 The GRAPHITI_* override claim is overbroad: GRAPHITI_FALKORDB_HOST/_PORT are hard-exported at entrypoint.sh:134 and _PASSWORD is generated at common.sh:73, so operator values there are silently discarded (docs/platform/single-container.md:293).
⚡ Performance ✅ — No runtime code paths touched, so zero hot-path impact. Reviewed the operational performance contract instead: the 360s stop window is well-calibrated, HEALTHCHECK --interval=30s --timeout=45s cannot overlap, and the 5–6 GiB figure is honestly framed as measured guidance rather than a floor. The cold backup is O(size of /data) with a single-threaded gzip constant (~30–60 MB/s → ~6–11 min for a 20 GiB volume) executed entirely inside the downtime window, and it archives regenerable /data/cache.
🟠 Both README quick starts omit the log-rotation flags the guide includes, leaving ~18 supervised processes writing unbounded to the default json-file driver.
🧪 Testing ✅ — Full appliance suite is green (61/61) and the test_entrypoint.py:126 edit is verified byte-identical in effect ('…; ' → "…; " with adjacent-literal concatenation unchanged). Verified the PR's own claim of 16 keys across 11 dotenv fences reproduces exactly. I checked rule 10 here: the drift guards below genuinely do not exist anywhere in autogpt_platform/single-container/tests/ — the suite already parses supervisord.conf (test_entrypoint.py:247, test_frontend_environment.py:137), so the pattern exists but not these assertions.
🟠 The newly published 360 value and the restore structural-check path list are hard-coded in operator instructions with no test tying them to supervisord.conf / entrypoint.sh.
📖 Quality ✅ — Readability A-. Consistent prose wrapping, uniform fence languages, well-formed tables, correct ${VAR} bracing, and a justified # shellcheck disable=SC2329. The backup block's fail-closed EXIT trap, .partial → final promotion, SHA-256 digest regex, and --network none structural probe are better engineering than most runbooks contain. Note: this specialist's concern that the README link would 404 pending GitBook PR #14018 was superseded by QA, which fetched the URL live and confirmed real content — dropping it.
📦 Product ✅ — Requirements match the diff exactly; documented CLI names, env keys, and model identifiers all reconcile against Dockerfile:208-209, .env.example, and installer/setup-autogpt.sh:36. This specialist predicted the README link route was wrong (/platform/self-hosting/single-container vs the sibling's /platform/getting-started); QA disproved that by fetching it — the nested route is live and the sibling link is the broken one. Its remaining valid point is that the quick start sets no first-boot time/memory expectation.
🟠 A detached first boot takes several minutes and ~6 GiB with no note saying so; the likely first-run experience is connection-refused → "it's broken."
📬 Discussion
🔎 QA ✅ — Unusually strong verification pass. All 9 author test-plan claims independently re-run: 11 fences/16 keys/0 missing; 22 bash fences parse clean under bash -n; bake target resolves to autogpt-platform:single-container-dev; 61 tests pass; latest and v0.7.1 confirmed byte-identical OCI indexes (4f8b92b8…94754); the documented docker run flags verified live via docker inspect (StopTimeout: 360, ShmSize: 2147483648, nofile=65536, 3000/tcp->127.0.0.1:3999 loopback-only); the restore validation block exits 1 on a volume with /data/valkey/17002 removed, proving the fail-closed claim; unauthenticated API returns 401. Honest scope limit: the multi-GB appliance image was not booted (sandbox runs the multi-container dev stack), so provider-free startup, health-check behavior, and resource guidance were verified only statically.
🟠 Should Fix
-
README quick starts omit log rotation (
README.md:131,autogpt_platform/single-container/README.md:13) — both ship--restart unless-stoppedwithout the--log-driver json-file --log-opt max-size=50m --log-opt max-file=5flags the guide correctly includes atdocs/platform/single-container.md:95-97. ~18 supervised programs write to container stdout; the default driver has no size cap, so the highest-traffic copy-paste path is the one that eventually fills the host disk and takes bundled PostgreSQL down with it. (Flagged by: performance, product — 2 specialists) -
Upgrade step 2 contradicts the backup block's own precondition (
docs/platform/single-container.md:583) — step 2 says "Stop the container and take a cold backup," but the backup block fails closed when the container is not running (:420-423,Refusing backup because the autogpt container is not running) and issues its owndocker stopat:435. Following the upgrade runbook literally produces a hard failure mid-maintenance-window. Reword to "Take a cold backup (the block stops and restarts the container for you)." -
Root README quick start has no open-signup warning (
README.md:128-141) — registration defaults open (entrypoint.sh:184;signup-gate.ts:48treats only the literal"false"as closed), and the siblingsingle-container/README.md:26-29carries the warning while the repo's most-read file does not. Changing-p 127.0.0.1:3000:3000to-p 3000:3000is a one-token edit operators routinely make for LAN access. One sentence, or-e AUTH_SIGNUP_ALLOWLIST=you@example.comin the snippet. (Flagged by: security, architect, quality — 3 specialists) -
GRAPHITI_*override claim is overbroad (docs/platform/single-container.md:293) — true forGRAPHITI_LLM_MODEL/_EMBEDDER_MODEL/_RERANKER_MODEL, false forGRAPHITI_FALKORDB_HOST/_PORT(hard-exported,entrypoint.sh:134) and_PASSWORD(generated and pinned,common.sh:73). The glob promises override capability the runtime silently discards. Scope the sentence to the three routing model variables and state that FalkorDB connection variables are appliance-managed. -
OPENAI_API_KEYcrosses the documented security boundary (docs/platform/single-container.md:317) — the "not indiscriminately to the public frontend process" framing is wrong for this key:run-frontend.sh:31injects it into the browser-facing Next.js process andsrc/app/api/transcribe/route.ts:34uses it as the default transcription credential. The guide tells operators to set it in two of three model profiles (:243,:258) framed purely as an embeddings setting. Impact is capped by the session-token gate atroute.ts:49-53, but any authenticated appliance user can spend the key. Add a line in the Models section. -
Two published operational constants have no drift guard (
docs/platform/single-container.md:435,:556) — the360stop timeout now appears in four operator-facing places, and the restore structural check hard-codes a/datapath list matchingentrypoint.sh:41-55. Raising anystopwaitsecssilently makes the documented timeout too short, and the failure mode is DockerSIGKILLing PostgreSQL inside the documented backup window, producing a torn archive the SHA-256 check will happily validate. Adding a/datasubdirectory silently makes the restore gate a false-positive. Both are ~15-line tests in a suite that already parsessupervisord.conf(test_entrypoint.py:247) and lands on the right side of theautogpt_platform/**CI path filter. -
Missing first-boot expectation in the README quick start (
README.md:131) — neither "GiB" nor "minutes" appears in the file, though the guide states both plainly at:49-52and:111-113. Detached container + immediatelocalhost:3000= connection refused = "broken." Add one sentence plusdocker inspect --format '{{.State.Health.Status}}' autogpt. -
Docker Hub Overview doesn't link the new guide (
autogpt_platform/single-container/README.md:65-68) — this file is the auto-published Docker Hub Overview source (platform-single-container-docker.yml:319). The root README got the pointer; the audience actually running the published image did not.
🟡 Nice to Have
- Cold backup gzips regenerable cache during a full outage (
docs/platform/single-container.md:445) —tar -czfover all of/datawith no excludes includes/data/cache(entrypoint.sh:59-61, backend + Next build cache), costing downtime, CPU, and backup storage for zero recovery value. Add--exclude=./cacheand mentiontar -cf - | pigzfor large installs. (performance) - Downtime extends through checksumming (
docs/platform/single-container.md:447) — therestart_autogpttrap only fires at subshell exit, so the appliance stays down through thesha256sumre-read and bothmvcalls even though the archive is immutable oncetarreturns. Restart earlier, or single-pass viatee >(sha256sum). (performance) - CI check for quick-start triplication (
README.md:128,single-container/README.md:16,single-container.md:90) — three hand-synced copies with no drift check; this PR is the drift symptom, since it exists partly to backfill--stop-timeout 360into a stale copy, and copy #2 auto-publishes to Docker Hub. Genuinely follow-up scope. (architect, quality — 2 specialists) - Sizing guidance is memory-only (
docs/platform/single-container.md:111) — no vCPU minimum, no/datagrowth expectation, and no note that--shm-size 2gis additive (plan ~8 GiB) for an appliance whose own limitations section says six services contend for one host. (performance) - Foreground boot check is misplaced and its cost understated (
docs/platform/single-container.md:42-52) —docker run --rm "${IMAGE}"performs a complete throwaway first boot (initdb, Prisma migrations, 3-node Valkey cluster, RabbitMQ mnesia) against a discarded anonymous volume, and sits before Quick start; the troubleshooting table at:617exists to rescue readers who ran it. (performance, quality — 2 specialists) - Parameterize the backup block's container name (
docs/platform/single-container.md:398) — hardcodesautogptin six places while the restore blocks are cleanly parameterized viaBACKUP_FILE/RESTORE_IMAGE/RESTORE_VOLUME. HoistCONTAINER="${CONTAINER:-autogpt}". (quality)
🔵 Nits
- Pre-existing broken sibling link (
README.md:126) —https://docs.agpt.co/platform/getting-startedwas fetched live and returns "The URLgetting-starteddoes not exist"; the working route is/platform/self-hosting/getting-started. Not introduced here, but the correct new link added by this PR sits 17 lines below it, making the stale one conspicuous. (architect) - Short vs long flag style (
README.md:131) —-d/-p/-e/-vhere vs--detach/--publish/--env-file/--volumein the guide block added by the same PR. (quality) - H1 vs TOC casing (
docs/platform/single-container.md:1vsSUMMARY.md:23) — sentence case vs Title Case; GitBook surfaces both. (quality) CHAT_FAST_STANDARD_MODELis commented out in.env.example:53whiledocs/platform/single-container.md:286instructs setting it and:64-66says the example shows "every optional setting." Failure surfaces late atcopilot/config.py:988, not at boot. (architect):latestpinning note (README.md:140) — QA verifiedlatestandv0.7.1are byte-identical today, so no present drift, but a re-pull under--restart unless-stoppedsilently changes versions. A parenthetical pointing at the guide's tag policy closes it. (security, qa — 2 specialists)- Test name overpromises (
test_entrypoint.py:126) —test_backend_cors_uses_the_validated_public_originnever invokesvalidate_public_url; it would pass unchanged ifvalidate-public-urlwere dropped fromentrypoint.sh:104-108. Rename or add a hostile-input case. (testing)
QA Screenshots
Human Review Needed
YES — Required because at least one specialist reported a high or critical finding.
Risk Assessment
Merge risk: LOW | Rollback: EASY
Zero runtime code paths change. Residual risk is entirely operator-decision risk from the documentation gaps above; rollback is a single docs revert with no data or migration implications.
Local Harness
✅ 5/5 checks pass — frontend lint (75s), backend poetry run lint (95s), frontend typecheck (43s), frontend unit tests (420s), frontend build (283s). QA additionally ran the appliance suite: 61/61 pass in 0.60s.
GitHub CI: UNVERIFIED — live repository check status was not fetched during this review.
UI Testing — Variant Results
✅ local: All 9 author test-plan claims independently re-verified and confirmed true (11 dotenv fences/16 keys/0 missing, 61 tests pass, identical latest/v0.7.1 OCI digests, fail-closed restore exits 1, live docs link is real content); one low-severity note about the README pinning the mutable :latest tag.
- low: The root README quick start pins the mutable
significantgravitas/autogpt:latesttag while combined with--restart unless-stopped. The guide it links to correctly recommends immutablevX.Y.Zorsha-<git-sha>tags for durable installs, so the README's entry point advises the opposite of its own guide. Verified live thatlatestandv0.7.1currently resolve to a byte-identical OCI index, so there is no present-day drift, but a future re-pull would silently change the running version. Acceptable for an explicitly experimental quick start; non-blocking.
✅ hosted: All documented claims independently verified by pulling and running the real appliance image — tag digests, bake target, /data layout, first-account promotion, data-preserving container replacement, and closed-signup 403 all behave exactly as written; four minor documentation-accuracy gaps found, none blocking.
- medium: Booting the appliance with zero provider credentials (the guide's documented provider-free path) produces 200 scheduler ERROR lines: 'Embedding backfill errors: RuntimeError: No embedding-capable LLM client configured ... (200x)' followed by '[Scheduler] All 200 embedding attempts failed - stopping backfill'. Verified by running significantgravitas/autogpt:latest with no API keys; the container still reached healthy at t=75s. The guide states model-backed functions return normal missing-credential errors, which is true for requested work, but this is an unrequested background job. The troubleshooting section directs operators to inspect logs for the first failed service, so these ERRORs will be the first thing a provider-free operator sees.
- low: The runtime's own missing-credential error instructs operators to set OPENAI_INTERNAL_API_KEY, but neither this guide nor the shipped autogpt_platform/single-container/.env.example documents that key — both only reference OPENAI_API_KEY. An operator following the error message would set a variable the guide never mentions.
- low: The guide states 'sha- is the immutable image for an exact dev or release source revision'. Querying the Docker Hub tag list shows dev revisions are actually published as canary-sha- (canary-sha-56b2927..., canary-sha-6245b1b..., canary-sha-e5be5bb...), with only a single plain sha-9c8bb555... tag corresponding to the release commit. An operator looking for a dev-revision image by the documented sha- form will not find one.
- low: Single-container (experimental Docker appliance) variant, /signup page: after following the guide's documented flow to close registration (AUTH_ALLOW_NEW_ACCOUNTS=false plus container replacement), the /signup page still renders a complete, enabled 'Create your account' form with email, password, and confirm-password fields. The backend correctly rejects submissions with 403 'New account registration is not allowed at this time.', so this is not a security hole, but the UI gives no indication that signup is closed until the user fills in the form and submits. Observed on the appliance at http://localhost:3900/signup running significantgravitas/autogpt:latest. This is pre-existing product behavior rather than something introduced by this PR.
|
Superseded by #14170, which carries the current single-container guide through the GitBook/dev sync and incorporates the later stock-timeout shutdown work plus the latest review fixes. This branch still reintroduces the obsolete 360-second stop timeout, so it should not merge. |
### Why / What / How GitBook contains the published single-container operations guide, while `dev` contains the canonical generator and newer generated integration documentation. The branches need a deliberate content reconciliation without regressing either side. This PR brings the GitBook-authored single-container guide and its navigation entry into `dev`. It also updates the guide for the current stock Docker shutdown behavior, interrupted-migration recovery, and the `BEHAVE_AS` multi-tenant boundary introduced after the GitBook version was published. The head is a common descendant of current `dev` (`571df3a94d`) and `gitbook` (`727c4eb4d9`). All generator-owned integration documentation remains aligned with `dev`. The effective 19-file diff is limited to the reconciled docs, single-container reference env/README/bootstrap guard and focused tests, the narrow CI path for the canonical guide, focused generator title coverage, and one Stripe Link null-normalization fix with its regression test. Paired reciprocal PR: [#14171](#14171) (`dev` → GitBook). ### Changes 🏗️ - Add `docs/platform/single-container.md` to `dev`, list it in the platform `SUMMARY.md`, and cross-link it from the existing self-hosting and installer guides. - Update stop commands and first-boot migration recovery guidance for the current single-container implementation. - Document the bounded stock-timeout shutdown, abandoned `RUNNING` rows, group-qualified Supervisor names, Docker Desktop memory troubleshooting, database pool tuning, and the backend/frontend limits of `BEHAVE_AS=cloud`. - Reject anonymous `/data` volumes, make backup restart handling state-aware, restart before checksum work, show how to launch a restored volume, and eliminate the upgrade cutover write gap. - Align the single-container README and reference env with the canonical guide, including loopback-only port examples, and add direct tests for email-verification refusal plus `BEHAVE_AS` default/override behavior. - Add interrupted-migration contract coverage, document signup/proxy/server-key boundaries, exclude regenerable cache from backups, and align password/tag/image guidance with current code and publishing workflows. - Execute the published backup, checksum, restore, validation, and restored-launch Bash directly against a disposable Docker model, including concurrency, signals, failure cleanup, relative paths, Bash 3.2, and state-preservation cases. - Validate restored PostgreSQL listening and authentication policy, keep the Docker emulator in a separately linted module, and run the appliance workflow for changes to the canonical operations guide. - Label and verify per-run restore-volume ownership so a same-name creation race cannot populate or remove another process's volume; reject PostgreSQL `hba_file` redirects during offline validation. - Reject active PostgreSQL preload/archive settings during offline restore validation, make the Docker emulator execute the published shell fence before adding diagnostics, and test the direct and sourced bootstrap paths. - Document how to enable the optional chat-bot services and the required Discord/Telegram settings. - Replace every Stripe Link placeholder with implementation-backed MPP, profile, payment-method, approval, and virtual-card guidance, and directly test the generator's non-obvious brand-title mappings. - Normalize explicit `null` values in optional Stripe Link profile fields to the block's documented empty-string output and cover all five fields with a regression test. - Close superseded PR #13760, whose remaining operational changes used the obsolete 360-second stop timeout. - Preserve `dev`'s generated integration structure and every authored `MANUAL` region; replace only the previously unfilled Stripe Link placeholders. ### Checklist 📋 #### For code changes: - [x] I have clearly listed my changes in the PR description - [x] I have made a test plan - [x] I have tested my changes according to the test plan: - [x] `git diff --check origin/dev HEAD` - [x] `python3 -m unittest discover -s autogpt_platform/single-container/tests -p 'test_*.py'` (94 tests) - [x] `poetry run ruff check ../single-container` and `poetry run ruff format --check ../single-container` - [x] `scripts/generate_block_docs.py --check` using the repository backend Poetry environment (566 blocks, documentation in sync) - [x] Execute the exact fenced backup/checksum/restore/validate/launch commands against a disposable fake-Docker filesystem in both restart modes, concurrent calls, signals, and injected stop/tar/checksum/start/extract failures - [x] `poetry run pytest scripts/test_generate_block_docs.py -q` (34 tests) - [x] `poetry run pytest --confcutdir=backend/blocks/stripe_link backend/blocks/stripe_link/mpp_test.py backend/blocks/stripe_link/profile_test.py backend/blocks/stripe_link/spend_request_test.py -q` (65 tests) - [x] `poetry run pyright backend/blocks/stripe_link/profile.py` (0 errors) - [x] Verify all 22 Bash fences with stock macOS Bash 3.2, current Bash, and ShellCheck error-level checks - [x] Verify both branch tips are ancestors of the head, the effective diff is exactly the intended 19 paths, local links/anchors resolve, and all changed guides are present in `SUMMARY.md` <details> <summary>Example test plan</summary> - [ ] Create from scratch and execute an agent with at least 3 blocks - [ ] Import an agent from file upload, and confirm it executes correctly - [ ] Upload agent to marketplace - [ ] Import an agent from marketplace and confirm it executes correctly - [ ] Edit an agent from monitor, and confirm it executes correctly </details> #### For configuration changes: - [x] `.env.default` is updated or already compatible with my changes - [x] `docker-compose.yml` is updated or already compatible with my changes - [x] I have included a list of my configuration changes in the PR description (under **Changes**) The reference `.env.example` changes documentation comments only. The bootstrap change only prevents `main` from running when the script is sourced by tests; direct container execution is unchanged. <details> <summary>Examples of configuration changes</summary> - Changing ports - Adding new services that need to communicate with each other - Secrets or environment variable changes - New or infrastructure changes such as databases </details> <!-- CURSOR_SUMMARY --> --- > [!NOTE] > **Medium Risk** > Changes affect single-container bootstrap/entrypoint behavior and backup/restore operational scripts operators may rely on; Stripe Link output normalization is a small behavioral fix for null API values. > > **Overview** > Brings the **canonical single-container self-hosting guide** into `dev`, links it from the platform docs and installer paths, and aligns the single-container **README** and **`.env.example`** with current shutdown, migration recovery, memory/model setup, and security boundaries. > > Adds **executable contract tests** that run the documented cold backup, restore, validation, and launch Bash blocks against a fake Docker harness (concurrency, failures, PostgreSQL layout checks, restore-volume ownership races). **`bootstrap.sh`** now runs `main` only when executed, not when sourced; new tests cover interrupted-migration fail-closed behavior and entrypoint refusal of required email verification plus **`BEHAVE_AS`** defaults. > > **Stripe Link Get User Info** normalizes explicit API `null` profile fields to empty strings, with a regression test. **Stripe Link** integration docs replace placeholders with implementation-backed MPP/profile/spend-request guidance; block-doc generator tests cover integration title casing (e.g. DataForB2B). CI workflow path filters include the canonical guide file. > > <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit fb09a75. Bugbot is set up for automated code reviews on this repo. Configure [here](https://www.cursor.com/dashboard/bugbot).</sup> <!-- /CURSOR_SUMMARY --> --------- Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com> Co-authored-by: claude[bot] <41898282+claude[bot]@users.noreply.github.com> Co-authored-by: bobby.gaffin <bobby.gaffin@agpt.co> Co-authored-by: Toran Bruce Richards <toran.richards@gmail.com> Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com> Co-authored-by: itsababseh <36419647+itsababseh@users.noreply.github.com> Co-authored-by: Torantulino <40276179@live.napier.ac.uk> Co-authored-by: AutoPilot <autopilot@agpt.co> Co-authored-by: AutoPilot <autopilot@autogpt.com> Co-authored-by: Toran Bruce Richards <22963551+Torantulino@users.noreply.github.com> Co-authored-by: majdyz <zamil.majdy@agpt.co> Co-authored-by: Ubbe <hi@ubbe.dev> Co-authored-by: Krzysztof Czerwinski <34861343+kcze@users.noreply.github.com> Co-authored-by: zuyua9 <zichengwang152@qq.com> Co-authored-by: zuyua9 <273790187+zuyua9@users.noreply.github.com> Co-authored-by: zuyua9 <zuyua9@users.noreply.github.com> Co-authored-by: Abhimanyu Yadav <122007096+Abhi1992002@users.noreply.github.com> Co-authored-by: Swifty <craigswift13@gmail.com> Co-authored-by: Bently <Github@bentlybro.com> Co-authored-by: Lluis Agusti <hi@llu.lu> Co-authored-by: Reinier van der Leer <pwuts@agpt.co> Co-authored-by: Suraj Panickar <panickarsuraj.1@gmail.com> Co-authored-by: Mistral Vibe <vibe@mistral.ai> Co-authored-by: seer-by-sentry[bot] <157164994+seer-by-sentry[bot]@users.noreply.github.com> Co-authored-by: ANDI FAUZAN HEDIANTORO <144610468+fauzan171@users.noreply.github.com> Co-authored-by: DataBelarebia <136994453+miloudbelarebia@users.noreply.github.com> Co-authored-by: Miloud Belarebia <miloudbelarebia@users.noreply.github.com> Co-authored-by: Otto <otto@agpt.co> Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Co-authored-by: SymbolStar <jindongfu@microsoft.com> Co-authored-by: SymbolStar <symbolstar@users.noreply.github.com> Co-authored-by: abhi1992002 <abhimanyu1992002@gmail.com> Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: Rayan Salhab <r.salhab@aiyexpertsolutions.com> Co-authored-by: cyphercodes <cyphercodes@users.noreply.github.com> Co-authored-by: Cursor Agent <cursoragent@cursor.com> Co-authored-by: slepybear <108438815+slepybear@users.noreply.github.com> Co-authored-by: slepybear <slepybear@users.noreply.github.com> Co-authored-by: Zhao73 <156770117+Zhao73@users.noreply.github.com> Co-authored-by: Dex <i@dex.moe> Co-authored-by: Krzysztof Czerwinski <kpczerwinski@gmail.com> Co-authored-by: Syed Osama Ali Shah <86572800+Osamaali313@users.noreply.github.com> Co-authored-by: Reinier van der Leer <github@pwuts.nl> Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> Co-authored-by: zhifu gao <zhifu.gzf@alibaba-inc.com> Co-authored-by: LauraGPT <18321252+LauraGPT@users.noreply.github.com> Co-authored-by: tlysanhuo <166924864+tlysanhuo@users.noreply.github.com> Co-authored-by: tly <liyan.tie@aminer.cn> Co-authored-by: Shreyash <160615932+Iitian001@users.noreply.github.com> Co-authored-by: @Medyan-Naser <73041442+Medyan-Naser@users.noreply.github.com> Co-authored-by: @jashwanth-reddy-g <289575991+jashwanth-reddy-g@users.noreply.github.com> Co-authored-by: mirkosalvato1-ctrl <mirkosalvato1@gmail.com> Co-authored-by: mirkosalvato1-ctrl <227404546+mirkosalvato1-ctrl@users.noreply.github.com> Co-authored-by: zcxGGmu <72263081+zcxGGmu@users.noreply.github.com> Co-authored-by: zq <zhouquan1511@163.com> Co-authored-by: Oren Levitin <121883840+teionarr@users.noreply.github.com> Co-authored-by: Taksh <takshkothari09@gmail.com> Co-authored-by: AutoGPT <257977679+Otto-AGPT@users.noreply.github.com>




Why / What / How
Why
Operators need one current guide for installing and maintaining the dedicated
single-container appliance without reconstructing its contract from runtime and
publication code. The repository README should also expose the safe Docker
quick start directly alongside the existing self-hosting options.
What
README.mdandsends operators to the full documentation site guide for setup and ongoing
operations.
its next synchronization.
latest, immutable release,and immutable source-SHA tag policy.
without losing data.
which keep the platform's normal actionable missing-credential errors.
boundaries, health, resource guidance, upgrades, troubleshooting, and known
limitations.
including checks for PostgreSQL, RabbitMQ, FalkorDB, and all three Valkey
directories.
How
The documentation is reconciled against current
dev: the merged applianceruntime, publication workflow, shipped environment example, Docker Hub Overview
source, and exact Buildx Bake target. Stable releases publish
latestand animmutable
vX.Y.Zimage.Changes 🏗️
README.md.autogpt_platform/single-container/README.mdso the Docker Hub quickstart uses the same graceful shutdown timeout.
docs/platform/single-container.md.docs/platform/SUMMARY.md./platform/self-hosting/single-containerroute so the root README link becomes live.single-container entrypoint test.
devis those four documentation filesplus that behavior-neutral formatter correction.
Test plan
pass ShellCheck.
.env.example./platform/self-hosting/single-container.docker buildx bake --printresolves the documented image target.latestandv0.7.1resolve to the same verifiedlinux/amd64and
linux/arm64OCI index from the stable release workflow.claims were checked against current
dev.Checklist 📋
Note
Low Risk
Documentation and a cosmetic test quote change only; no runtime or application logic is modified.
Overview
Adds experimental single-container Docker self-hosting to the root
README.md(localhost-bounddocker run,--stop-timeout 360, link to the full guide) and registersdocs/platform/single-container.mdin the platform docs TOC.The new guide documents image tags (
latest,vX.Y.Z,sha-*), quick start with env file and named volume, first-account signup/allowlist,autogpt-admin promote, closing signup while keeping/data,AUTOGPT_PUBLIC_URL/ TLS proxy expectations, model profiles (OpenRouter, Anthropic, local Ollama), security boundaries, persistence layout, cold backup/restore with checksums, upgrades/rollbacks, health checks, and known limitations.autogpt_platform/single-container/README.mdquick start now matches the same--stop-timeout 360shutdown window.test_entrypoint.pyonly normalizes shell-string quoting in a CORS test (no behavior change).Reviewed by Cursor Bugbot for commit 5d034c2. Bugbot is set up for automated code reviews on this repo. Configure here.