# Installing Uchiyomi
The two-command quick start lives in the [README](../README.md). This page is everything else: the one-click
app stores, what each container is for, keeping it up to date, and putting it behind a domain.
## Other layouts
Prefer to run Postgres yourself?
Set `DATABASE_URL` on the app container and the same image talks to your database instead of starting its
own; that one variable is the whole switch (it is documented under *Database* in
[docs/CONFIGURATION.md](CONFIGURATION.md#environment-variables), and **Admin → Overview** says which one is in
use). [`deploy/docker-compose.external-db.yml`](../deploy/docker-compose.external-db.yml) is
that layout ready to use, with a Postgres container beside the app -- it is what the install instructions
used before v0.18.0, and an existing install keeps working on it unchanged. Moving between the two is a
dump and a restore, written down in both directions in **[docs/MIGRATING.md](MIGRATING.md)**.
Already running the older two-container layout?
Uchiyomi used to ship as `uchiyomi-bff` + `uchiyomi-web`, with a separate nginx serving the web app. That
layout is **deprecated but not dead**: it is still built, still published and still works, and nothing about
your install has stopped functioning. You are not required to move.
It is deprecated because the single container measured better on the same host — **265 MB instead of
441 MB**, less memory, one less network hop on every API call, and no redirect on deep links — and because
the end-to-end tests only ever drive the single container, so it is the layout that is actually proven on
every commit.
Moving to the external-database layout is a compose swap, not a data migration: both use the **same named
volumes** and the same Postgres image. Four commands, in **[docs/MIGRATING.md](MIGRATING.md)**. The
file itself is still there as [`deploy/docker-compose.split.yml`](../deploy/docker-compose.split.yml).
## File ownership
To read a library you already have, point `LIBRARY_PATH` at it. By default Uchiyomi runs as its own user and
**cannot write to your files at all**; set `PUID`/`PGID` to your own ids (`id -u`, `id -g`) if you want it to
be able to rename folders and delete chapters:
```bash
echo "LIBRARY_PATH=/path/to/your/manga" > .env
docker compose up -d
```
## One-click installs
**On CasaOS?** Use [`deploy/casaos/docker-compose.yml`](../deploy/casaos/docker-compose.yml) instead — import it
as a custom app and it appears with an icon like any store app. That manifest leaves out the extension
engine, so Mihon/Tachiyomi extensions are off there; add `uchiyomi-suwayomi` from
[`deploy/docker-compose.yml`](../deploy/docker-compose.yml) and set `SUWAYOMI_URL` if you want them.
**On Unraid?** The template is [`templates/uchiyomi.xml`](../templates/uchiyomi.xml) in this repository,
which is laid out as a Community Applications template repository (`templates/` plus the `ca_profile.xml`
at the root) and is being submitted to Community Applications. Once it is listed there, install it from the
**Apps** tab like anything else. Until it shows up, copy the file to
`/boot/config/plugins/dockerMan/templates-user/` on the server, then *Docker → Add Container* and pick
*uchiyomi* under **User templates**, as before. One container, database included; set PUID/PGID to the
owner of your library for renames.
Unraid removed the *Template repositories* field in 6.10, and since 7.3 the file behind it is not read at
all, so pointing Unraid at a template repository URL no longer works on any current version — the template
file itself has to be on the server, or come through Community Applications. The
[`unraid-templates`](https://github.com/AngeloSha/unraid-templates) repository is kept only so old links
keep working; it points here.
**On Umbrel?** Uchiyomi is [submitted to the Umbrel App Store](https://github.com/getumbrel/umbrel-apps/pull/6055); until it is listed, the package at
[`deploy/umbrel/uchiyomi`](../deploy/umbrel/uchiyomi) is the exact one under review. It runs the database inside
the container, reads your library from *Downloads/manga*, and includes the Cloudflare solver; the Mihon
extension engine is not part of it.
## What each container is for
| Container | Role |
|---|---|
| `uchiyomi` | the app: the API, the PWA it serves, and the embedded Postgres database |
| `uchiyomi-flaresolverr` | Cloudflare solver — **started automatically**; sources that need it use it with no config, and since v0.37.0 so does the extension engine |
| `uchiyomi-suwayomi` | the extension engine, so Mihon / Tachiyomi extensions work ([docs](extensions.md)); the compose file points it at the solver above (`FLARESOLVERR_ENABLED` / `FLARESOLVERR_URL` on this container) |
```bash
docker compose logs -f uchiyomi # watch it boot
```
Cloning the repo and want a CLI-seeded admin instead of the browser setup step? `bash scripts/setup.sh`
generates the secrets, creates the admin from a password you type, fixes volume ownership, and starts the
development stack — which builds the **same single container** the install ships, so what you run matches
what you would have deployed. It refuses to run in a checkout whose `docker-compose.override.yml` manages a
service it does not, so it cannot restart a server install.
Change the port with `WEB_PORT` in `.env` (default `8080`; e.g. `WEB_PORT=9000` → http://localhost:9000).
## Updating
```bash
docker compose pull
docker compose up -d
```
**`docker compose up -d` on its own is not enough.** The images are pinned to `:latest`, and Docker reuses a
tag it already has rather than checking for a newer one — so without the `pull` you stay on whatever version
you first installed, indefinitely, with nothing to tell you. Watch
[releases](https://github.com/AngeloSha/uchiyomi/releases) to know when there is something to pull.
Upgrading in place is safe: accounts, reading progress, downloads and settings live in named volumes, and the
database migrates itself on boot.
> The two upgrade warnings that used to sit here — empty backups on v0.9.0/v0.9.1, and volume ownership
> before v0.5.1 — were about releases fourteen and nineteen versions back. They are in the
> [changelog](../CHANGELOG.md) with the same detail, which is where release history belongs.
## Behind a domain (HTTPS)
The compose file is **standalone**: it publishes the app on a local port and creates its own private networks,
so a fresh install just works. To put it on a public domain with TLS, front the app with any reverse proxy
(Caddy, Traefik, Nginx Proxy Manager, …) and set `PUBLIC_ORIGIN` in `.env` to your URL.
If your proxy reaches containers over a shared Docker network, drop a `docker-compose.override.yml` next to the
compose file — Compose loads it automatically:
```yaml
# docker-compose.override.yml (server-specific; keep it out of git)
networks:
proxy:
external: true
services:
uchiyomi:
networks: [uchiyomi_app, uchiyomi_internal, proxy] # keep the first two: the solver, and the database
```
Point the proxy at **`uchiyomi` port 3000**. Once it reaches the app over a shared Docker network you no
longer need the published host port, and deleting the `ports:` entry stops the app also being served over
plain HTTP alongside your HTTPS domain.
> Using the development stack from a clone instead? Its services are named `yomi-*`, with networks
> `yomi_app` and `yomi_internal`.