Repository navigation
Docker
Images are published for every release at ghcr.io/anand34577/lekhamint for linux/amd64, linux/arm64 and linux/arm/v7 (Raspberry Pi). Tags: latest, the exact version (1.1.0) and the minor version (1.1, which follows patch releases).
The image is small (distroless, no shell), runs as a non-root user, works with a read-only root filesystem, and has a built-in health check.
docker run -d --name lekhamint --restart unless-stopped \
-p 8080:8080 -v lekhamint-data:/data \
ghcr.io/anand34577/lekhamint:latestOpen http://<this machine>:8080 and create your account.
No Docker yet? On Linux: curl -fsSL https://get.docker.com | sh. On Windows and macOS install Docker Desktop. Or let the installer do everything: curl -fsSL https://raw.githubusercontent.com/anand34577/lekhamint/main/install.sh | sh -s -- --docker.
mkdir lekhamint && cd lekhamint
curl -fsSLO https://raw.githubusercontent.com/anand34577/lekhamint/main/docker-compose.yml
curl -fsSL https://raw.githubusercontent.com/anand34577/lekhamint/main/.env.example -o .env
docker compose up -dEdit .env to change the port, time zone, sign-ups or backups, then docker compose up -d again. All settings are on the Configuration page.
SQLite is right for nearly everyone, including families with years of history. Use PostgreSQL if you already run it or host many users.
curl -fsSL https://raw.githubusercontent.com/anand34577/lekhamint/main/deploy/docker-compose.postgres.yml -o docker-compose.yml
# set POSTGRES_PASSWORD in .env to a long random value
docker compose --env-file .env up -dIf the machine has a public address and a domain pointing at it:
curl -fsSL https://raw.githubusercontent.com/anand34577/lekhamint/main/deploy/docker-compose.caddy.yml -o docker-compose.yml
# set LEKHAMINT_DOMAIN=money.example.com in .env, open ports 80 and 443
docker compose --env-file .env up -dCaddy gets and renews the certificate on its own. See Reverse Proxy for Nginx, Traefik, Cloudflare Tunnel and Tailscale.
Use the image ghcr.io/anand34577/lekhamint:latest with:
| Setting | Value |
|---|---|
| Port | container 8080 → any free host port |
| Volume | a folder or volume → /data (database and backups) |
| Environment (optional) |
TZ=Asia/Kolkata, LEKHAMINT_TRUST_PROXY=true behind a proxy |
| User | the image runs as uid 65532; a host folder mounted at /data must be writable by it (sudo chown 65532:65532 /path) |
This works the same in Portainer, Synology Container Manager, Unraid, CasaOS, TrueNAS SCALE and similar tools.
docker compose logs -f # follow the logs (JSON lines)
docker compose pull && docker compose up -d # upgrade
docker compose exec lekhamint /lekhamint version
docker compose exec -T lekhamint /lekhamint user add --email asha@example.com --name Asha <<< 'a-long-password'
docker compose exec lekhamint /lekhamint backup --format json # one-off backup into /data/backupsBackups are written to /data/backups every 24 hours by default. Copy them off the machine too: mount a second disk at /data/backups, as shown in the comments in docker-compose.yml. See Backup and Restore.
From a clone of the repository: docker build -t lekhamint . (the build compiles the web app and the server; nothing is downloaded at runtime). For an offline machine: docker save lekhamint | gzip > lekhamint.tar.gz, copy it over, and docker load < lekhamint.tar.gz.
LekhaMint is open source under the MIT licence · Repository · Releases · Report a problem · This wiki is generated from docs/wiki; edit it there.
Get started
Using LekhaMint
- Web App
- Android App
- Loans, Debts and Cards
- Sync and Sharing
- Sign-in and Notifications
- Backup and Restore
Running it
Developers