Deployment¶
The quickstart gets you a working Flightlog on localhost:8080. This page covers the next step: putting it on a real domain, with TLS, in a way that survives reboots.
The two recipes below are the ones I run myself. Pick the one that matches your existing setup.
Recipe 1 — Plain Docker, single port¶
The simplest possible deployment: Flightlog listening on a port, you handle TLS some other way (or you don't need it because it's only on your LAN).
services:
flightlog:
image: ghcr.io/thulasirajkomminar/flightlog:latest
env_file: .env
ports:
- 8080:8080
volumes:
- flightlog_data:/app/data
restart: unless-stopped
volumes:
flightlog_data:
That's it. Browse to http://<host>:8080.
LAN-only is a perfectly valid threat model
Not every self-hosted app needs to be public. If Flightlog only ever needs to be reachable from devices on your home network, skip TLS entirely — bind it to a private port and call it done.
Recipe 2 — Behind Traefik with automatic TLS¶
If you're already running Traefik as your reverse proxy, drop Flightlog into your existing stack with these labels. The example assumes you have a cloudflare cert resolver and a shared proxy network — adjust the names to match your setup.
services:
flightlog:
container_name: flightlog
image: ghcr.io/thulasirajkomminar/flightlog:latest
environment:
- AERODATABOX_API_KEY=${AERODATABOX_API_KEY}
- AUTH_JWT_SECRET=${AUTH_JWT_SECRET}
labels:
- traefik.enable=true
- traefik.http.routers.flightlog.entrypoints=websecure
- traefik.http.routers.flightlog.rule=Host(`flightlog.example.com`)
- traefik.http.routers.flightlog.tls=true
- traefik.http.routers.flightlog.tls.certresolver=cloudflare
- traefik.http.services.flightlog.loadbalancer.server.port=8080
networks:
- proxy
restart: unless-stopped
volumes:
- /opt/docker/flightlog/data:/app/data
networks:
proxy:
external: true
A few things worth calling out in this version:
- No published port. Traffic reaches Flightlog over the
proxyDocker network — there's nothing on the host's port 8080. - Bind-mount instead of volume.
/opt/docker/flightlog/dataon the host is mapped to/app/datain the container. Easier to back up with the rest of your/opt/dockertree. environment:instead ofenv_file:. Lets you keep one.envat the top of your stack for all services.
Persistence checklist¶
Wherever you deploy, before you start adding flights:
- The SQLite database lives somewhere persistent (named volume or bind-mount).
- That location is included in whatever backup mechanism you trust.
-
AUTH_JWT_SECRETis stored somewhere you can recover (a password manager works) — losing it means losing the ability to keep signed-in sessions stable.
Upgrading¶
Flightlog publishes a latest tag and a :vX.Y.Z tag per release. To upgrade:
The database migrates itself on startup — there's no separate migration step to run.
Pin to a version if you prefer
For production-ish setups, replace :latest with the specific version tag you've tested. You'll see the available tags on the GitHub Container Registry page.