release: v0.14.0
Fourteen commits since v0.13.0. See CHANGELOG.md for the full list. Two additions: `npm run doctor`, which runs the config doctor from a terminal — including inside the shipped image — and exits with the worst finding, so it can gate a deployment script; and a Playwright spec that loads all fourteen admin routes against a production build. One change, invisible on screen: the admin panel got a form-field layer (#533). Five fixes: grid.gap on both axes (#513), the dashboard status badge (#539), the journal editor's unsaved-changes guard (#538), essay paragraph markup (#537), and aria-pressed on the panel's switches and pickers.
This commit is contained in:
@@ -201,3 +201,8 @@ This is useful after making external changes to config files or when Immich data
|
||||
The panel reports the health of the installation: whether Immich answers, whether `gallery.yaml` and `settings.yaml` parse, the number of cached entries, and the backup count with the timestamp of the most recent one. `settings.yaml` is optional, so its absence is not a fault — only a file that exists and cannot be parsed counts as invalid. A check that could not run (an expired session, for example) is reported as such rather than as an outage.
|
||||
|
||||
Separately, while you are logged in, the public site shows a diagnostic banner on any album Immich returns empty — the case that otherwise looks like a broken page to you and to nobody else.
|
||||
|
||||
The same checks are available from the terminal as `npm run doctor`, which
|
||||
needs neither a running app nor this password — see
|
||||
[Config Doctor](deployment.md#config-doctor). Use it when the site does not
|
||||
come up far enough to reach this panel.
|
||||
|
||||
@@ -14,6 +14,7 @@ For the quick path — clone, `npm run dev`, open `/install` — see the
|
||||
- [Docker Compose](#docker-compose)
|
||||
- [Standalone Docker](#standalone-docker)
|
||||
- [Health Check](#health-check)
|
||||
- [Config Doctor](#config-doctor)
|
||||
- [Behaviour when Immich is Unreachable](#behaviour-when-immich-is-unreachable)
|
||||
- [Reverse Proxy](#reverse-proxy)
|
||||
|
||||
@@ -100,6 +101,68 @@ The container includes a built-in health check at `/api/health`:
|
||||
curl http://localhost:7211/api/health
|
||||
```
|
||||
|
||||
## Config Doctor
|
||||
|
||||
```bash
|
||||
npm run doctor
|
||||
```
|
||||
|
||||
Checks an installation from the terminal and prints what it finds: whether
|
||||
`AUTH_SECRET` is set and long enough, whether `gallery.yaml` and
|
||||
`settings.yaml` parse, whether Immich answers the three calls Folio depends on,
|
||||
whether every published album ID still exists in Immich (and is shared there),
|
||||
whether any password is still stored in plaintext or as an unusable bcrypt
|
||||
hash, and whether `content/` can be written to.
|
||||
|
||||
This is the same set of checks as the **Diagnostics** panel in `/admin`, but it
|
||||
needs neither a running app nor an admin password — which is the point. It is
|
||||
the tool for the case where the site will not come up at all.
|
||||
|
||||
It runs in the shipped image too:
|
||||
|
||||
```bash
|
||||
docker compose exec folio npm run doctor
|
||||
```
|
||||
|
||||
No secret is ever printed — only whether something is set, and where to look.
|
||||
The exit code is the worst thing it found, so it can gate a deployment script:
|
||||
|
||||
| Code | Meaning |
|
||||
| ---- | ------------------------------- |
|
||||
| `0` | every check passed |
|
||||
| `1` | warnings, no errors |
|
||||
| `2` | at least one error |
|
||||
| `3` | the doctor itself could not run |
|
||||
|
||||
Two findings are reported rather than judged. `content/` writability is tested
|
||||
as the user who typed the command, and on a Docker deployment that is not the
|
||||
user the app writes as — so when the paths belong to someone else, the CLI says
|
||||
whose they are and leaves it at that. Run it through the container to have it
|
||||
checked as the app itself:
|
||||
|
||||
```bash
|
||||
docker compose exec folio npm run doctor
|
||||
```
|
||||
|
||||
The other is `TRUSTED_PROXY_HOPS`, judged against the
|
||||
`X-Forwarded-For` chain of a live request, and a CLI has none. It reports the
|
||||
configured value and says so rather than guessing — use the Diagnostics panel,
|
||||
reached over your public URL, to have that one measured.
|
||||
|
||||
Both are printed under **NOTES** rather than among the passed checks, since
|
||||
nothing was established, and counted separately in the summary line for the
|
||||
same reason. Notes never affect the exit code. An unwritable path _does_ stay a
|
||||
plain error when the CLI runs as the owner, which is the case that is really
|
||||
about the app.
|
||||
|
||||
Run from a checkout, it reads `.env.local` and `.env` the way `npm run dev`
|
||||
does; real environment variables and `content/install.json` are resolved in the
|
||||
same order the app resolves them.
|
||||
|
||||
It needs **Node 22.18 or newer**, which is what runs the TypeScript directly
|
||||
and is why the CLI adds no dependency of its own. The shipped image is already
|
||||
on it; an older local Node is told so instead of crashing.
|
||||
|
||||
## Behaviour when Immich is Unreachable
|
||||
|
||||
Immich Folio buffers your gallery rather than merely proxying it:
|
||||
|
||||
Reference in New Issue
Block a user