Sync the self-hosting stack

This commit is contained in:
2026-09-25 13:52:47 +02:00
parent 3228bb01a6
commit 4f7d4dabcc
3 changed files with 125 additions and 17 deletions
+78
View File
@@ -9,6 +9,84 @@ one of them changed. An entry says which artefact and which version, so `web 0.1
Every version published to a channel appears here. Nothing is written from memory afterwards: a build Every version published to a channel appears here. Nothing is written from memory afterwards: a build
cannot be published without its entry. cannot be published without its entry.
## 2026-09-25 — A licensed instance can choose the managed model while it is being installed `api 0.113.0` `web 0.138.0`
**The install screen now asks for the licence before the model, and offers the managed model
there.** The model step used to come first and knew only your own provider. The managed model can
only be offered to an instance your Jarvis provider has linked to its licence, that link is made by
the instance's licence report, and an instance being installed sent none — so a licensed customer
had to type a key for a provider they did not want, or skip the model and choose the managed one
afterwards under **Settings → Platform → Model**.
**Adding a paid or trial key on the install screen now sends the licence report straight away**,
rather than once the install is finished — and so does opening the licence step with a key the
instance already holds from `JARVIS_LICENSE_KEY`. That is a new moment of sending, so here is
exactly what it is: the same report with the same fields as every other — the licence id, this
instance's id and public key, its version, contract checksum, counts and public address, the
timestamps and the signature; no names and no conversation content. The
[README](README.md#licence-keys-and-what-your-instance-reports) lists every field. It goes early
because it is what links the instance to its licence. The licence step says so beside the key field,
and shows how the report went — linked, refused by your provider and why, or not sent and why — with
**Report now** to try again.
**Nothing else reports earlier than before.** Only the licence step sends a report while the
instance is being installed; nothing reports on its own until the install is finished, even when
the key and the address both come from the environment. An instance without a licence still sends
nothing until then, and the licence step sends nothing for a licensed one whose address is not set
yet, is `localhost` or another loopback address, or is an example address such as
`jarvis.example.com`.
**The model step is now the same choice as the settings screen**: your own provider, with the test
button and "Skip for now" as before, or the managed model, with the same statement of what it sends
and the same box to tick before it is selected. Choosing the managed model there is enough to
continue, so a licensed install can be finished without a model key of your own. Without a licence,
the managed option is shown as unavailable, with the reason and a way back to the licence step.
Reaching the model step on a licensed instance asks your provider whether the managed model is
offered, exactly as opening **Settings → Platform → Model** does: a signed request with no
conversation content.
**Also in this release.**
- "Report now", under the managed model's option in the model settings, now says what your provider
answered when a report did not link the instance — a licence it does not know, one already in use
on as many instances as it allows, one it has withdrawn — where it used to say nothing and leave
the option unavailable.
- When your provider refused to link the instance for a reason another report cannot change — the
licence is already in use on as many instances as it allows, or your provider does not know it —
the managed option now says that, on the settings screen and on the install screen, instead of
"available after this instance's next report". The licence step keeps saying it when you come back
to it.
- "Your own provider" is marked **In use** only once an endpoint's model and key are saved. A new
instance used to show it over an empty form.
- An install that has been started can be resumed from a browser that is not signed in: the install
screen asks you to sign in, and the sign-in page now opens instead of sending you back.
- The Kubernetes `02-config.yaml` no longer sets `WEB_ORIGIN` to the placeholder
`https://jarvis.example.com`; it is commented out. Applied unedited, it was stored as the
instance's address until the install screen replaced it.
**Self-hosters:** api and console. The schema gains one column, the licence server's answer to the
last report, applied automatically when the api starts; it only adds, so the schema guard has
nothing to refuse. No new environment variable. An instance that is already installed reports
exactly as before. On Kubernetes, nothing to do either: the install screen saved your real address
over the placeholder when you installed.
**Rolling back past this version** drops that column, which the schema guard refuses once a report
has filled it, and the api does not start. To go back anyway, set `SCHEMA_ACCEPT_DATA_LOSS=true`
for that one deploy — in `.env` on compose, on the `jarvis-migrate` Job on Kubernetes — then put
it back. What is lost is only that last answer, which the next report writes again.
## 2026-09-25 — The model is chosen in one place, and the form you are not using is out of the way `web 0.137.1`
Under **Settings → Platform → Model**, the choice between your own provider and the managed model is
now made with the selector and nothing else. The separate "Use your own provider" button is gone:
picking that option in the selector does the same thing, and still asks first when your own provider
is not configured, because switching would then leave the assistant with no model.
Your own provider's form now appears only while the selector is on it. While the managed model is in
use — or has been picked and is waiting for you to confirm — the form is hidden rather than shown with
a note saying it is not in use. Its settings, key included, are kept exactly as they were, and come
back with the form when you switch back.
## 2026-09-24 — A licensed instance can choose a managed model, and this is exactly what it sends `api 0.112.0` `web 0.137.0` ## 2026-09-24 — A licensed instance can choose a managed model, and this is exactly what it sends `api 0.112.0` `web 0.137.0`
**No conversation content leaves unless somebody chooses it.** The assistant keeps using your own **No conversation content leaves unless somebody chooses it.** The assistant keeps using your own
+41 -15
View File
@@ -195,8 +195,9 @@ to how the containers are scheduled.
- A hostname and a TLS terminator in front of it. Jarvis speaks plain HTTP and does not manage - A hostname and a TLS terminator in front of it. Jarvis speaks plain HTTP and does not manage
certificates. certificates.
- An API key for an OpenAI-compatible endpoint — or a paid or trial licence that includes the - An API key for an OpenAI-compatible endpoint — or a paid or trial licence that includes the
[managed model](#if-you-choose-the-managed-model), which you choose after installing. The install [managed model](#if-you-choose-the-managed-model), which the install screen offers once the licence
screen asks for the key and tests it before saving; you do not need it in hand before you start. is in. The install screen asks for either, and tests a key before saving it; you do not need
either in hand before you start.
- **No licence key.** Jarvis runs the [community edition](#the-community-edition) out of the box; a - **No licence key.** Jarvis runs the [community edition](#the-community-edition) out of the box; a
key raises the limits when you outgrow them. key raises the limits when you outgrow them.
- Roughly 2 GB of RAM for the stack and room for Postgres to grow. - Roughly 2 GB of RAM for the stack and room for Postgres to grow.
@@ -212,13 +213,23 @@ That is the whole first deployment. **There is no `.env` step.** First boot gene
secrets, syncs the database schema and runs its data backfills before the API listens, so give it secrets, syncs the database schema and runs its data backfills before the API listens, so give it
about a minute. Then point your reverse proxy at port 8080 and open the address in a browser. about a minute. Then point your reverse proxy at port 8080 and open the address in a browser.
An install screen takes it from there. It welcomes you, creates the first administrator inside a An install screen takes it from there. It welcomes you, creates the first administrator, then asks
bounded window, then asks for the address this instance answers on and who may create an account on for the address this instance answers on and who may create an account on it, a licence, the model,
it, the model, your first organization, and — every one of them skippable — mail, a licence and your first organization and mail — the licence, the model and mail all skippable. It finishes by
whether this instance reports anything about itself. It finishes by showing you what the deployment showing you what the deployment actually looks like from inside, and by making you take a backup of
actually looks like from inside, and by making you take a backup of the one value nothing can the one value nothing can reconstruct. Nine steps, about five minutes, and **only the address really
reconstruct. Ten screens, about five minutes, and **only the address really needs you**: everything needs you**: everything else has a "later" that costs nothing.
else has a "later" that costs nothing.
**The licence comes before the model, and with a paid or trial key it sends something.** Adding the
key on the install screen's licence step makes this instance send its licence report to your Jarvis
provider straight away, rather than once the install is finished — and so does opening that step
with a key the instance already holds from `JARVIS_LICENSE_KEY`. That report is what links the
instance to its licence, and the [managed model](#if-you-choose-the-managed-model) is only offered
to a linked instance. So the model step can offer it beside your own endpoint, with the same
statement of what it sends as the settings screen, and a licensed install can be finished without a
model key of your own. What the report carries is
[listed field by field below](#licence-keys-and-what-your-instance-reports). Without a key, nothing
leaves until the install is finished.
Everything it asks is a setting you can change afterwards from an ordinary screen. Nothing it asks Everything it asks is a setting you can change afterwards from an ordinary screen. Nothing it asks
needs a container restart to change. needs a container restart to change.
@@ -735,6 +746,18 @@ key; a community one to `checkin.luxit.be`, compiled into the build. The interva
to set — every ten minutes on the current arrangement, so that a renewal or a revocation reaches you to set — every ten minutes on the current arrangement, so that a renewal or a revocation reaches you
promptly rather than tomorrow. promptly rather than tomorrow.
**An instance that is still being installed reports nothing — until a licence is adopted and its
address is set, and then only from the install screen's licence step.** A community instance sends
its first report once the install screen is finished. A licensed one sends it from the licence
step, which comes after the step that sets the address: the moment the key is added there, or, for
a key that came from `JARVIS_LICENSE_KEY`, when that step opens. Nothing reports on its own before
the install is finished, so a stack that brings both its key and its address in the environment
still sends nothing until somebody reaches that step. That early report is the same report, with the
same fields — it goes early because it is what links the instance to its licence, which the managed
model needs. An address that is still `localhost` or another loopback address does not count as
set, and neither does an example one such as `jarvis.example.com`: that instance sends nothing from
the licence step.
This is everything the licence report and a licence request send, in full. The managed model, if you This is everything the licence report and a licence request send, in full. The managed model, if you
choose it, sends conversation content — see choose it, sends conversation content — see
[If you choose the managed model](#if-you-choose-the-managed-model). [If you choose the managed model](#if-you-choose-the-managed-model).
@@ -784,9 +807,11 @@ checked without a network.
**Off unless a platform administrator turns it on, and only on a paid or trial licence.** Your **Off unless a platform administrator turns it on, and only on a paid or trial licence.** Your
Jarvis provider can run a model for licensed instances, so that the assistant works without an Jarvis provider can run a model for licensed instances, so that the assistant works without an
endpoint or a key of your own. A platform administrator chooses it under **Settings → Platform → endpoint or a key of your own. A platform administrator chooses it under **Settings → Platform →
Model**, on a screen that states everything below and asks them to confirm they have read it. Model**, or on the model step of the install screen, which shows the same choice once the licence
Nothing else selects it: no environment variable, no licence, no answer from the licence server. A step before it has linked the instance to its licence. Either way it is chosen on a screen that
community instance cannot use it; its assistant runs on your own provider, as it always has. states everything below and asks them to confirm they have read it. Nothing else selects it: no
environment variable, no licence, no answer from the licence server. A community instance cannot use
it; its assistant runs on your own provider, as it always has.
**While it is chosen, conversation content goes to your Jarvis provider instead of the endpoint you **While it is chosen, conversation content goes to your Jarvis provider instead of the endpoint you
configured.** Every request the assistant then makes to the model carries: configured.** Every request the assistant then makes to the model carries:
@@ -805,9 +830,10 @@ exactly as its licence report is, which carries the product (`jarvis`), the lice
id and public key, and the version — nothing else — and it keeps the credential in memory only. id and public key, and the version — nothing else — and it keeps the credential in memory only.
**Opening the screen already asks.** On a licensed instance, opening **Settings → Platform → Model** **Opening the screen already asks.** On a licensed instance, opening **Settings → Platform → Model**
sends that signed request, so the screen can say whether the managed model is offered to you and — or reaching the model step of the install screen — sends that signed request, so the screen can
which model it is — whether or not anybody then chooses it. It carries the fields above and no say whether the managed model is offered to you and which model it is, whether or not anybody then
conversation content, and your Jarvis provider sees that this instance asked. chooses it. It carries the fields above and no conversation content, and your Jarvis provider sees
that this instance asked.
**Where it goes.** Over HTTPS to the host your licence reports to — the address written into your **Where it goes.** Over HTTPS to the host your licence reports to — the address written into your
licence key, `checkin.luxit.be` on current licences, which is where its licence report goes too. The licence key, `checkin.luxit.be` on current licences, which is where its licence report goes too. The
+6 -2
View File
@@ -45,8 +45,12 @@ data:
TRUST_PROXY_HOPS: "1" TRUST_PROXY_HOPS: "1"
# The seed for the address enrolled agents dial back to. Whatever the install screen stores wins # The seed for the address enrolled agents dial back to. Whatever the install screen stores wins
# from then on, so this is a starting value rather than the answer. # from then on, so this is a starting value rather than the answer — and it is COMMENTED OUT
WEB_ORIGIN: "https://jarvis.example.com" # because a placeholder is a worse start than none. Seeded as it stood, `jarvis.example.com` was
# stored as this instance's address before anybody had opened the install screen, which asks for
# the address anyway, prefilled with the one your browser used. Uncomment it only with your real
# address.
# WEB_ORIGIN: "https://jarvis.example.com"
# Where the agent binaries are, filled per pod by an initContainer. Leaving it unset is # Where the agent binaries are, filled per pod by an initContainer. Leaving it unset is
# supported: everything works except the agent installer, which answers 503 saying no build is # supported: everything works except the agent installer, which answers 503 saying no build is