Skip to content

docs(platform): document single-container operations - #13760

Closed
ntindle wants to merge 79 commits into
devfrom
docs/single-container-06-operations
Closed

docs(platform): document single-container operations#13760
ntindle wants to merge 79 commits into
devfrom
docs/single-container-06-operations

Conversation

@ntindle

@ntindle ntindle commented Aug 1, 2026

Copy link
Copy Markdown
Member

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

  • Adds a concise localhost-bound Docker quick start to the root README.md and
    sends operators to the full documentation site guide for setup and ongoing
    operations.
  • Adds the same graceful shutdown window to the Docker Hub Overview source for
    its next synchronization.
  • Documents the official Docker Hub image and its latest, immutable release,
    and immutable source-SHA tag policy.
  • Documents the first-account flow, administrator promotion, and closing signup
    without losing data.
  • Separates provider-free startup and Builder use from model-backed functions,
    which keep the platform's normal actionable missing-credential errors.
  • Covers ports, TLS/reverse-proxy requirements, persistent state, security
    boundaries, health, resource guidance, upgrades, troubleshooting, and known
    limitations.
  • Adds fail-closed, timestamped cold-backup and new-volume restore procedures,
    including checks for PostgreSQL, RabbitMQ, FalkorDB, and all three Valkey
    directories.

How

The documentation is reconciled against current dev: the merged appliance
runtime, publication workflow, shipped environment example, Docker Hub Overview
source, and exact Buildx Bake target. Stable releases publish latest and an
immutable vX.Y.Z image.

Changes 🏗️

  • Adds the Docker quick start to README.md.
  • Updates autogpt_platform/single-container/README.md so the Docker Hub quick
    start uses the same graceful shutdown timeout.
  • Adds docs/platform/single-container.md.
  • Adds the page to docs/platform/SUMMARY.md.
  • Publishes the guide through companion GitBook PR docs(platform): publish single-container operations guide #14018 at the generated
    /platform/self-hosting/single-container route so the root README link becomes live.
  • Retains the required whole-repository formatter cleanup found in the merged
    single-container entrypoint test.
  • The effective diff against current dev is those four documentation files
    plus that behavior-neutral formatter correction.

Test plan

  • Targeted pre-commit hooks pass for all four changed documentation files.
  • All added or modified Bash command blocks parse; the operational blocks
    pass ShellCheck.
  • All 16 keys used across 11 dotenv fences exist in the shipped
    .env.example.
  • New local links and guide anchors resolve; the root README targets the generated GitBook route at /platform/self-hosting/single-container.
  • docker buildx bake --print resolves the documented image target.
  • All single-container appliance unit tests pass.
  • Public latest and v0.7.1 resolve to the same verified linux/amd64
    and linux/arm64 OCI index from the stable release workflow.
  • Docker Hub exposes the published Overview and short description.
  • Runtime, signup, provider, security, persistence, resource, and registry
    claims were checked against current dev.

Checklist 📋

  • I have clearly listed my changes.
  • I have made a test plan.
  • The guide matches the current runtime and publication boundary.
  • No Compose deployment or optional-memory behavior is claimed.

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-bound docker run, --stop-timeout 360, link to the full guide) and registers docs/platform/single-container.md in 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.md quick start now matches the same --stop-timeout 360 shutdown window. test_entrypoint.py only 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.

@coderabbitai

coderabbitai Bot commented Aug 1, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Note

Reviews paused

It 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 reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review

Walkthrough

Changes

The 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

Layer / File(s) Summary
Deployment setup and configuration
README.md, docs/platform/SUMMARY.md, docs/platform/single-container.md
Adds deployment links and documents image setup, Docker startup, URL configuration, authentication, and model and memory providers.
Security and service boundaries
docs/platform/single-container.md
Documents process identities, environment restrictions, trusted hosts, internal services, and the optional bot service.
Persistence and recovery procedures
docs/platform/single-container.md
Documents the /data layout, volume checks, cold backups, restore validation, and recovery constraints.
Upgrades and operational guidance
docs/platform/single-container.md
Documents upgrade and rollback procedures, health checks, troubleshooting, and known limitations.

Estimated code review effort: 2 (Simple) | ~15 minutes

Possibly related PRs

Suggested reviewers: 0ubbe, pwuts

Poem

A rabbit packs one container tight,
With volumes safe through day and night.
Backups, ports, and health checks align,
Providers follow each design.
Restore and upgrade with care—
The appliance guide is there.

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed The description references companion GitBook PR #14018, and no unresolved issue linkage is indicated.
Out of Scope Changes check ✅ Passed The README and platform documentation updates directly support the single-container operations objective.
Title check ✅ Passed The title clearly and concisely describes the primary change: documenting single-container operations.
Description check ✅ Passed The description directly explains the single-container documentation, README updates, operational scope, and validation performed.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch docs/single-container-06-operations

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.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actions github-actions Bot added documentation Improvements or additions to documentation size/xl labels Aug 1, 2026
ntindle added a commit to claude-dev-code/AutoGPT that referenced this pull request Aug 6, 2026
…-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>

@autogpt-pr-reviewer autogpt-pr-reviewer Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📋 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 ⚠️ — Scope matches description exactly; happy path, error handling, and edge cases all well covered. The one user-facing risk is the headline CTA link resolving to a 404.
🔴 Root-README CTA deep-link may 404 for every reader (README.md:143).

📬 Discussion ⚠️ — Excellent hygiene: ~40 inline threads, every one answered with a fix SHA or a reasoned won't-fix; prior blockers (open signup, --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

  1. Root README CTA is a dead link (README.md:143) — The headline "Follow the single-container guide →" links to https://docs.agpt.co/platform/self-hosting/single-container. Live testing confirmed the sibling page under the same ## Self-Hosting SUMMARY group publishes without a self-hosting/ segment: /platform/getting-started returns 200 while /platform/self-hosting/single-container returns 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

  1. Quick start leaves signup open with no allowlist (README.md:128) — Because AUTH_ALLOW_NEW_ACCOUNTS defaults to true, 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.com or a one-line note pointing to the guide's Account policy section. (Flagged by: security, product, discussion — 3 specialists)

🟡 Nice to Have

  1. Consolidate the triplicated docker run snippet (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

  1. 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)
  2. 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.

Comment thread README.md
Comment thread README.md
Comment thread docs/platform/single-container.md
Comment thread README.md
Comment thread README.md
Comment thread README.md
Comment thread README.md
Comment thread README.md
Comment thread docs/platform/SUMMARY.md
@ntindle

ntindle commented Aug 14, 2026

Copy link
Copy Markdown
Member Author

/reapprove

@ntindle

ntindle commented Aug 14, 2026

Copy link
Copy Markdown
Member Author

/review

@autogpt-pr-reviewer

Copy link
Copy Markdown

Queued a review for PR #13760 at e4ac878.

@autogpt-pr-reviewer autogpt-pr-reviewer Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📋 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 ⚠️ — Guide's posture is genuinely strong (loopback-only publish, TLS-in-reverse-proxy guidance, plaintext-backup warnings, --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 ⚠️ — Reads at A grade. Minor cross-doc nits: root README uses short Docker flags (-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 ⚠️ — Requirements fully met; happy path, error handling, and edge cases all covered. One concern: the headline README CTA depends on companion GitBook PR #14018 being live.

📬 Discussion ⚠️ — CI is fully green and 100+ inline threads are all resolved, but the standing 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 ⚠️ — Independently re-ran every factual claim: 16 dotenv keys all present, buildx target resolves to 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

  1. Root README headline CTA is a live 404 (README.md:143) — The "Follow the single-container guide →" link targets https://docs.agpt.co/platform/self-hosting/single-container, which QA verified returns HTTP 404 via curl (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 with README.md:126, which links the sibling Self-Hosting page without the self-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

  1. README quick start leaves signup open with no allowlist pointer (README.md:128-138) — The copy-paste docker run sets only AUTOGPT_PUBLIC_URL; AUTH_ALLOW_NEW_ACCOUNTS defaults open (per single-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

  1. Firewall-bypass caveat for the publish spec (docs/platform/single-container.md:335) — Note that Docker port publishing bypasses host iptables/ufw on Linux, so an operator who changes the bind to -p 3000:3000 is exposed despite a host firewall. (security)
  2. Backup checksum not verified before restore (docs/platform/single-container.md:470) — The restore validation extracts the archive without verifying the checksum recorded at single-container.md:250. Recommend verifying integrity before extraction. (security)

🔵 Nits

  1. Docker flag style diverges across quick starts (README.md:130 vs docs/platform/single-container.md:95) — Short flags vs long flags for the same command; standardize on one (prefer long). (quality)
  2. README teaser omits --env-file (README.md:130) — Inline -e vs 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
app root loads 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.

Comment thread README.md
Comment thread docs/platform/single-container.md
Comment thread docs/platform/single-container.md
Comment thread docs/platform/single-container.md
Comment thread README.md
Comment thread README.md
Comment thread README.md
Comment thread README.md
Comment thread README.md
Comment thread README.md
@ntindle

ntindle commented Aug 14, 2026

Copy link
Copy Markdown
Member Author

/review

@autogpt-pr-reviewer

Copy link
Copy Markdown

Queued a review for PR #13760 at c0f0b93.

@ntindle

ntindle commented Aug 14, 2026

Copy link
Copy Markdown
Member Author

/review

@autogpt-pr-reviewer

Copy link
Copy Markdown

Queued a review for PR #13760 at 5a1c784.

@autogpt-pr-reviewer

Copy link
Copy Markdown

⚠️ Code review could not be completed

The review failed due to an unexpected error after multiple retries.

If this persists, please contact support with job ID a32bdc94-372e-4c3f-b3f1-c8b16bf4e4f0.

@autogpt-pr-reviewer autogpt-pr-reviewer Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📋 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 ⚠️ — Scope is tight and content well-verified. Flags the 🔴 README CTA link (front-door 404 risk) and questioned the Qwen3.5-4B-GGUF model slug — the latter was ✅ Addressed: QA independently confirmed the HF repo and Q4_K_M artifact resolve.

📬 Discussion ⚠️ — All 50 inline threads resolved; author 100% responsive with fixes or evidence-backed rebuttals. Standing 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

  1. Root README headline CTA 404s (README.md:143) — "Follow the single-container guide →" links to https://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 with README.md:126, which links a sibling doc as /platform/getting-started (no self-hosting/ segment) — the convention this repo's own SUMMARY.md actually 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-container route and re-verify 200 at merge time. (Flagged by: product, discussion, architect, ui-reviewer — 4 specialists)

🟡 Nice to Have

  1. Single-pass backup checksum (docs/platform/single-container.md:437) — pipe tar through tee archive | sha256sum to avoid a second full read of a large /data archive. (performance)
  2. 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

  1. Canonical run-command drift (README.md:131, single-container/README.md:13, single-container.md:95) — three copies of the docker run block; consider a source-of-truth note.
  2. TOC casing (SUMMARY.md:23 vs single-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.

✅ 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.

Comment thread README.md
Comment thread README.md
Comment thread docs/platform/single-container.md
Comment thread README.md
Comment thread docs/platform/single-container.md
Comment thread README.md
Comment thread README.md
Comment thread README.md
Comment thread README.md
Comment thread README.md
@ntindle

ntindle commented Aug 19, 2026

Copy link
Copy Markdown
Member Author

/dev-review

@autogpt-pr-reviewer-in-dev

Copy link
Copy Markdown

Queued a review for PR #13760 at 5d034c2.

@autogpt-pr-reviewer-in-dev

Copy link
Copy Markdown

⚠️ Code review could not be completed

The review failed due to an unexpected error after multiple retries.

If this persists, please contact support with job ID 9e43a22d-e942-4cb0-96e7-10112a1a074e.

@ntindle

ntindle commented Aug 19, 2026

Copy link
Copy Markdown
Member Author

/dev-review

@autogpt-pr-reviewer-in-dev

Copy link
Copy Markdown

Queued a review for PR #13760 at 5d034c2.

@autogpt-pr-reviewer-in-dev autogpt-pr-reviewer-in-dev Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📋 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 ⚠️ — The discussion specialist errored out (SDK query failure), so existing PR comment threads and prior review rounds were not checked. If a maintainer has already waived any of the findings below, treat that as settled over this review.

🔎 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

  1. README quick starts omit log rotation (README.md:131, autogpt_platform/single-container/README.md:13) — both ship --restart unless-stopped without the --log-driver json-file --log-opt max-size=50m --log-opt max-file=5 flags the guide correctly includes at docs/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)

  2. 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 own docker stop at :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)."

  3. Root README quick start has no open-signup warning (README.md:128-141) — registration defaults open (entrypoint.sh:184; signup-gate.ts:48 treats only the literal "false" as closed), and the sibling single-container/README.md:26-29 carries the warning while the repo's most-read file does not. Changing -p 127.0.0.1:3000:3000 to -p 3000:3000 is a one-token edit operators routinely make for LAN access. One sentence, or -e AUTH_SIGNUP_ALLOWLIST=you@example.com in the snippet. (Flagged by: security, architect, quality — 3 specialists)

  4. GRAPHITI_* override claim is overbroad (docs/platform/single-container.md:293) — true for GRAPHITI_LLM_MODEL/_EMBEDDER_MODEL/_RERANKER_MODEL, false for GRAPHITI_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.

  5. OPENAI_API_KEY crosses 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:31 injects it into the browser-facing Next.js process and src/app/api/transcribe/route.ts:34 uses 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 at route.ts:49-53, but any authenticated appliance user can spend the key. Add a line in the Models section.

  6. Two published operational constants have no drift guard (docs/platform/single-container.md:435, :556) — the 360 stop timeout now appears in four operator-facing places, and the restore structural check hard-codes a /data path list matching entrypoint.sh:41-55. Raising any stopwaitsecs silently makes the documented timeout too short, and the failure mode is Docker SIGKILLing PostgreSQL inside the documented backup window, producing a torn archive the SHA-256 check will happily validate. Adding a /data subdirectory silently makes the restore gate a false-positive. Both are ~15-line tests in a suite that already parses supervisord.conf (test_entrypoint.py:247) and lands on the right side of the autogpt_platform/** CI path filter.

  7. 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-52 and :111-113. Detached container + immediate localhost:3000 = connection refused = "broken." Add one sentence plus docker inspect --format '{{.State.Health.Status}}' autogpt.

  8. 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

  1. Cold backup gzips regenerable cache during a full outage (docs/platform/single-container.md:445) — tar -czf over all of /data with 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=./cache and mention tar -cf - | pigz for large installs. (performance)
  2. Downtime extends through checksumming (docs/platform/single-container.md:447) — the restart_autogpt trap only fires at subshell exit, so the appliance stays down through the sha256sum re-read and both mv calls even though the archive is immutable once tar returns. Restart earlier, or single-pass via tee >(sha256sum). (performance)
  3. 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 360 into a stale copy, and copy #2 auto-publishes to Docker Hub. Genuinely follow-up scope. (architect, quality — 2 specialists)
  4. Sizing guidance is memory-only (docs/platform/single-container.md:111) — no vCPU minimum, no /data growth expectation, and no note that --shm-size 2g is additive (plan ~8 GiB) for an appliance whose own limitations section says six services contend for one host. (performance)
  5. 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 :617 exists to rescue readers who ran it. (performance, quality — 2 specialists)
  6. Parameterize the backup block's container name (docs/platform/single-container.md:398) — hardcodes autogpt in six places while the restore blocks are cleanly parameterized via BACKUP_FILE/RESTORE_IMAGE/RESTORE_VOLUME. Hoist CONTAINER="${CONTAINER:-autogpt}". (quality)

🔵 Nits

  1. Pre-existing broken sibling link (README.md:126) — https://docs.agpt.co/platform/getting-started was fetched live and returns "The URL getting-started does 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)
  2. Short vs long flag style (README.md:131) — -d/-p/-e/-v here vs --detach/--publish/--env-file/--volume in the guide block added by the same PR. (quality)
  3. H1 vs TOC casing (docs/platform/single-container.md:1 vs SUMMARY.md:23) — sentence case vs Title Case; GitBook surfaces both. (quality)
  4. CHAT_FAST_STANDARD_MODEL is commented out in .env.example:53 while docs/platform/single-container.md:286 instructs setting it and :64-66 says the example shows "every optional setting." Failure surfaces late at copilot/config.py:988, not at boot. (architect)
  5. :latest pinning note (README.md:140) — QA verified latest and v0.7.1 are byte-identical today, so no present drift, but a re-pull under --restart unless-stopped silently changes versions. A parenthetical pointing at the guide's tag policy closes it. (security, qa — 2 specialists)
  6. Test name overpromises (test_entrypoint.py:126) — test_backend_cors_uses_the_validated_public_origin never invokes validate_public_url; it would pass unchanged if validate-public-url were dropped from entrypoint.sh:104-108. Rename or add a hostile-input case. (testing)

QA Screenshots

Screenshot Description
01-login Login surface renders cleanly ✅
02-authed Authenticated first-account onboarding — the exact flow the guide documents ✅
03-platform Platform healthy post-auth; backend logs show only pre-existing Pydantic/redis deprecation warnings ✅

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:latest tag while combined with --restart unless-stopped. The guide it links to correctly recommends immutable vX.Y.Z or sha-<git-sha> tags for durable installs, so the README's entry point advises the opposite of its own guide. Verified live that latest and v0.7.1 currently 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.

@ntindle

ntindle commented Aug 25, 2026

Copy link
Copy Markdown
Member Author

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.

@ntindle ntindle closed this Aug 25, 2026
@github-project-automation github-project-automation Bot moved this from 🚧 Needs work to ✅ Done in AutoGPT development kanban Aug 25, 2026
ntindle added a commit that referenced this pull request Aug 26, 2026
### 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>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

cla: signed CLA signed by all contributors documentation Improvements or additions to documentation size/xl

Projects

Status: ✅ Done

Development

Successfully merging this pull request may close these issues.

2 participants