Self-hosting
Run temetro on your own server with Docker Compose.
temetro is designed to be self-hosted: your clinic's data stays on infrastructure you control. The supported setup is Docker Compose, which runs all three parts:
| Service | What it is | Port |
|---|---|---|
frontend | The temetro web app (Next.js) | 3000 |
backend | The API server (Node.js + Express) | 4000 |
db | PostgreSQL 17 — your clinic's database | 5432 |
adminer | Optional database browser (off by default) | 8080 |
Installing
Clone the repository and run from the backend/ folder. Pulling the prebuilt
images from Docker Hub is the fastest path; --build instead compiles from
source. No .env is required — the backend generates and persists the secrets it
needs on first start.
git clone https://github.com/temetro/temetro.git
cd temetro/backend
docker compose pull # fetch prebuilt images (or use: docker compose up --build -d)
docker compose up -dThe generated secrets are stored in the temetro_secrets Docker volume and stay stable
across restarts. You don't need to configure any addresses for other computers on your
network to reach temetro — that works automatically (see
Network access).
Create a .env (cp .env.example .env) only when you want to customize something:
serve over HTTPS (BETTER_AUTH_URL), send real email (SMTP_*), or manage your own
secrets (BETTER_AUTH_SECRET / AI_CREDENTIALS_KEY). The full list is in the
configuration reference.
Use HTTPS in production
temetro marks its session cookies as secure when BETTER_AUTH_URL starts with
https://. Run both the app and the API behind HTTPS (e.g. a reverse proxy such as
Caddy or nginx with TLS) for any real clinic data.
Updating
temetro publishes prebuilt images to Docker Hub and cuts a GitHub release for each version. To update, pull the new images and restart on the server:
docker compose pull && docker compose up -dMigrations apply automatically on backend start. Pin a specific version with
TEMETRO_VERSION=0.1.0 docker compose up -d.
The app tells you when an update is available: it checks the latest GitHub
release (via GET /api/version) and shows an optional,
dismissible banner plus a status in Settings → About & updates, where the
exact update command is one click to copy. Updating is always optional.
Network access (LAN)
You don't install temetro on every computer. It runs on one computer, and everyone else just opens it in a web browser over your clinic's network.
A couple of terms, plainly
- The server — the one computer you installed temetro on (where you ran
docker compose up). It needs to stay turned on and running for others to use temetro. - Your network (LAN) — the shared office network your computers are on: the same Wi-Fi, or the same wired router. Devices on it can reach each other.
- IP address — the server's "house number" on that network, like
192.168.1.20. That's what other computers type in to reach temetro.
Step 1 — Find the server's address
On the server computer (the one running temetro), find its network IP address:
- Open the Start menu, type
cmd, and open Command Prompt. - Type
ipconfigand press Enter. - Look for IPv4 Address under your active connection — something like
192.168.1.20.
- Open System Settings → Wi-Fi, then click Details… next to the network you're connected to.
- The IP Address is listed there — something like
192.168.1.20.
Or open the Terminal app and run ipconfig getifaddr en0.
Open a terminal and run hostname -I. Use the first address it prints that starts
with 192.168., 10., or 172. — for example 192.168.1.20.
An address that begins with 192.168., 10., or 172. is a private
network address — that's the one you want. (Ignore 127.0.0.1; that only means
"this same computer".)
Step 2 — Open temetro from another computer
On any other computer on the same network, open a web browser and go to your
server's address followed by :3000:
http://192.168.1.20:3000Replace 192.168.1.20 with the address you found in Step 1. temetro works exactly
as it does on the server — no extra setup. Bookmark it on each computer for easy
access.
Confirm the address inside temetro
Once you've opened temetro using the network address, Settings → About & updates shows that same address back to you, so you can copy it and share it with your staff.
If other computers can't connect
- They must be on the same network as the server (same Wi-Fi or router).
- The server's firewall must allow incoming connections on ports 3000 and 4000. The first time someone connects, Windows or macOS may show a prompt — choose Allow.
- The server must be on and running temetro (
docker compose up). - This uses plain
http://and is meant for a trusted internal network only. Don't open these ports to the public internet; to reach temetro from outside the clinic, put it behind HTTPS (see the HTTPS note above).
Operating temetro
Database & backups
- Patient data lives in the
dbservice's PostgreSQL database, stored in thetemetro_pgdataDocker volume — it survives restarts and rebuilds. - Database migrations run automatically when the backend starts; see Updating for the upgrade flow.
- Back up the volume (or run
pg_dumpagainst the database) on a schedule appropriate for a clinical system. - To inspect the database in a browser, start the optional Adminer service:
docker compose --profile tools up adminer
# then open http://localhost:8080 (server: db, user/password/database: temetro)temetro sends emails for password resets, verification, and invitations. Configure an
SMTP server via the SMTP_* settings in .env. Without SMTP configured, emails are
printed to the backend's logs instead — fine for evaluation, not for production.
Email verification is currently not enforced at sign-in (it's wired and planned to be enabled — see the roadmap).
Port conflicts
If port 5432 is already taken on the host (an existing Postgres installation), set
POSTGRES_PORT=5433 in .env. The containers keep talking to Postgres internally on
5432; only the host-side port changes.
Running without Docker (development)
For development you can run the pieces directly:
# Terminal 1 — backend (needs a local Postgres; point DATABASE_URL at it)
cd backend
npm install
cp .env.example .env
npm run db:migrate
npm run dev # API on http://localhost:4000
# Terminal 2 — frontend
cd frontend
npm install
npm run dev # app on http://localhost:3000The frontend finds the API automatically from the address you open it on (so
http://localhost:3000 talks to http://localhost:4000, and a LAN address works
the same way). Set NEXT_PUBLIC_API_URL only if you need to point it at a fixed or
reverse-proxied API URL.