Sync the self-hosting stack

This commit is contained in:
2026-09-26 15:49:04 +02:00
parent 1aa6e9d05f
commit 248d6c2d52
8 changed files with 274 additions and 18 deletions
+50 -9
View File
@@ -34,7 +34,7 @@ is listed in full below.
- [How it works](#how-it-works)
- [What you need](#what-you-need)
- [Install](#install)
- [Your reverse proxy has two requirements](#your-reverse-proxy-has-two-requirements)
- [Your reverse proxy has three requirements](#your-reverse-proxy-has-three-requirements)
- [Upgrading](#upgrading)
- [The agent](#the-agent)
- [Things worth knowing before you trust it with production](#things-worth-knowing-before-you-trust-it-with-production)
@@ -286,9 +286,9 @@ adopted into the volume rather than replaced, your `WEB_ORIGIN` becomes the stor
your model settings are adopted the same way, and an instance that already has an administrator is
marked installed by a backfill — so you will never see the install screen. Nothing to do.
## Your reverse proxy has two requirements
## Your reverse proxy has three requirements
Both are the kind that produce confusing symptoms rather than clean errors.
All three are the kind that produce confusing symptoms rather than clean errors.
- **Forward the WebSocket upgrade.** Two separate sockets ride `JARVIS_PORT`: the chat, on
`/socket.io/`, and enrolled agents, on `/api/agents/ws`. Neither falls back to plain HTTP. Without
@@ -298,6 +298,13 @@ Both are the kind that produce confusing symptoms rather than clean errors.
- **Give it a long read timeout** — 300s or so. A reasoning model can go 90+ seconds without emitting
a byte, and a 60s default cuts the response mid-stream. The client sees a connection reset rather
than a timeout, which reads like a bug in Jarvis.
- **Let uploads through.** Attaching or uploading a file posts it to `/api/uploads/`, up to 10 MB
each, and an image uploaded to a workspace travels with a copy of up to 3 MB prepared for the
model. Your proxy must accept request bodies of at least **13,376 KiB** on that path (nginx:
`client_max_body_size 13376k;` — its default is 1 MB). Below that, larger files fail with your
proxy's own error rather than Jarvis's, and smaller ones keep working, so nothing looks wrong
until somebody attaches a big screenshot or PDF. No other request body Jarvis accepts is larger
than 2 MB, so the higher ceiling can be given to that path alone.
Forward `X-Forwarded-For` too. How many proxies rewrite it is a setting, and the install screen is
where you answer it — **it shows you the chain your own request actually carried and the address the
@@ -483,6 +490,38 @@ These are deliberate and documented rather than surprises waiting to be found.
conversation's autonomy level, and at *Full access* nothing does. See
[What decides whether a tool call runs](#what-decides-whether-a-tool-call-runs).
### Files people attach or upload
Anyone who can send a message in a conversation can attach files to it, and upload files to its
workspace from the Documents panel.
- **What is accepted.** Pictures (PNG, JPEG, WebP, GIF), plain text — logs, CSV, JSON, YAML,
configuration files, scripts, public certificates — and PDF, whose text is extracted when it
arrives. Up to 10 MB each and 10 per message; 200 files and 256 MB per conversation, 2 GB per
organization. A picture attached to a message is made smaller in the browser before it leaves, so
one of up to 40 MB can be dropped; one uploaded to the workspace is kept as it was dropped, and
scaled only past 8,000 pixels on a side or 40 megapixels. Jarvis checks what a file actually
contains rather than trusting its name, strips camera metadata from pictures, and refuses the
rest with a reason: SVG and HTML, Office documents, archives, executables, and key or secret
files — including a text file that holds a private key.
- **They are stored in Postgres, unencrypted, like documents.** Unlike the vault and terminal
recordings, nothing seals them. A secret belongs in the vault, not in a screenshot or a pasted
log, and a database dump carries every attached file in the clear.
- **Every participant in the conversation can see them**, now and later, including people added
after the file was sent — until whoever attached a file, or the conversation's owner, removes
it. Removing it deletes the file for everyone; it does not take back what the assistant already
quoted from it.
- **They go to the model when the assistant uses them.** A picture is sent as the picture itself
when the assistant answers the message it came with, and again only if the assistant asks to look
at it; a text file or a PDF is sent as the passages the assistant reads. That is the same on your
own provider and on the managed model.
- **Public links never include them.** A guest sees that a message had attachments and nothing
more. The assistant's replies are still included, though, and a reply that describes a file
describes it to the guest as well.
- **A CSV opened in Excel is Excel's business.** Jarvis serves text files as downloads and does
not rewrite them, so a cell beginning with `=` is a formula when Excel opens it, and the warning
Excel shows is the only one there is.
## When it does not come up
```sh
@@ -590,11 +629,11 @@ then the agents.
## Backups, and restoring one
Postgres holds everything except the vault key — avatars, documents, exports and terminal recordings
are all rows, not files on disk. **Two volumes are worth backing up, and they must go to different
places:** `postgres_data` and `jarvis_secrets`. `redis_data` carries nonces, rate-limit counters and the
socket fan-out, all of which rebuild themselves; `agent_releases` is refilled by the next
`docker compose pull`.
Postgres holds everything except the vault key — avatars, documents, exports, terminal recordings
and attached files are all rows, not files on disk. **Two volumes are worth backing up, and they
must go to different places:** `postgres_data` and `jarvis_secrets`. `redis_data` carries nonces,
rate-limit counters and the socket fan-out, all of which rebuild themselves; `agent_releases` is
refilled by the next `docker compose pull`.
They are separate volumes precisely so that they can be, and must be, backed up separately. A dump
that travelled with the key that opens it is a dump that opens itself.
@@ -824,7 +863,9 @@ configured.** Every request the assistant then makes to the model carries:
- each message, and the conversation so far;
- the instructions and the list of tools Jarvis gives the model;
- the output of every tool the assistant ran — command output, file contents and API responses from
the systems you administer.
the systems you administer;
- the files and images participants attach to a message or upload to a workspace, when the
assistant uses them — an image as the picture itself, a text file or PDF as the text read from it.
That includes runs nobody is watching: scheduled wake-ups, and runs resumed after a restart. Your own
provider receives exactly the same content on every request — that is how the assistant works on