Ghostfolio
Wealth management app that tracks stocks, ETFs and cryptocurrency holdings.
- Replaces
-
Paid portfolio tracking services, such as Mint.
All open-source alternatives to Mint
- Difficulty
-
Difficulty: Medium
3 services (2 database or broker: postgres, redis), 1 volume mount, 1 env value to set, host access: cap_add. Heuristic score 5 of 11: medium. A source checkout is needed, so the rating is at least medium.
- Stack
TypeScript (language), PostgreSQL (database), Redis (database)
- Deployment
docker_compose
- Requirements
Not stated.
- License
-
AGPL-3.0(OSI-approved open source)Read from github.com/ghostfolio/ghostfolio/blob/0d58df7/LICENSE
- Business model
-
Unknown
The README at the pinned commit does not state a business model, so it stays unknown.
Source: github.com/ghostfolio/ghostfolio/blob/0d58df7/README.md, read on .
- Repository
GitHub stats
- Stars
- 9,554
- Forks
- 1,386
- Open issues and pull requests
- 337
- Last push
- 2026-10-22
- Latest release
- 3.90.0
- Released
- 2026-10-21
From the GitHub API on . These numbers are a snapshot, not live. GitHub detected the license as AGPL-3.0.
Compose file
name: ghostfolio
services:
ghostfolio:
image: docker.io/ghostfolio/ghostfolio:latest
container_name: ghostfolio
restart: unless-stopped
init: true
stop_grace_period: 1m
cap_drop:
- ALL
security_opt:
- no-new-privileges:true
env_file:
- ../.env
ports:
- 3333:3333
depends_on:
postgres:
condition: service_healthy
redis:
condition: service_healthy
healthcheck:
test: ['CMD-SHELL', 'curl -f http://localhost:3333/api/v1/health']
interval: 10s
timeout: 5s
retries: 5
postgres:
image: docker.io/library/postgres:15-alpine
container_name: gf-postgres
restart: unless-stopped
cap_drop:
- ALL
cap_add:
- CHOWN
- DAC_READ_SEARCH
- FOWNER
- SETGID
- SETUID
security_opt:
- no-new-privileges:true
env_file:
- ../.env
healthcheck:
test:
['CMD-SHELL', 'pg_isready -d "$${POSTGRES_DB}" -U $${POSTGRES_USER}']
interval: 10s
timeout: 5s
retries: 5
volumes:
- postgres:/var/lib/postgresql/data
redis:
image: docker.io/library/redis:alpine
container_name: gf-redis
restart: unless-stopped
user: '999:1000'
cap_drop:
- ALL
security_opt:
- no-new-privileges:true
env_file:
- ../.env
command:
- /bin/sh
- -c
- redis-server --requirepass "$${REDIS_PASSWORD:?REDIS_PASSWORD variable is not set}"
healthcheck:
test:
['CMD-SHELL', 'redis-cli --pass "$${REDIS_PASSWORD}" ping | grep PONG']
interval: 10s
timeout: 5s
retries: 5
volumes:
postgres:
From the app's own repository: github.com/ghostfolio/ghostfolio/blob/0d58df7/docker/docker-compose.yml.
Compose file from ghostfolio/ghostfolio, used inside a checkout of that repository (documented setup B).
Install
- Docker with the Compose plugin and git (github.com/ghostfolio/ghostfolio/blob/0d58df7/README.md)
A host with Docker, the Docker Compose plugin and git. This entry needs a checkout of the project repository.
- Get the source at commit 0d58df7 (github.com/ghostfolio/ghostfolio/blob/0d58df7/README.md)
git init ghostfolio cd ghostfolio git remote add origin https://github.com/ghostfolio/ghostfolio.git git sparse-checkout init --cone git sparse-checkout set docker git fetch --depth 1 --filter=blob:none origin 0d58df7ce77acaddb657216a03782c9fed2d935d git checkout FETCH_HEAD - The compose file in the checkout: docker/docker-compose.yml (shown here for reading) (github.com/ghostfolio/ghostfolio/blob/0d58df7/docker/docker-compose.yml)
Use the compose file shown above.
- Copy .env.example to .env (github.com/ghostfolio/ghostfolio/blob/0d58df7/README.md)
cp .env.example .env - What the compose file check ran with (github.com/ghostfolio/ghostfolio/blob/0d58df7/README.md)
The compose file check ran in a checkout of ghostfolio/ghostfolio at 0d58df7ce77acaddb657216a03782c9fed2d935d (a sparse checkout: the top-level files and the folder docker), after .env.example was copied to .env. The README tells the reader to clone the repository, copy .env.example to .env and run docker compose -f docker/docker-compose.yml up -d from the root folder.
- Start it (github.com/ghostfolio/ghostfolio/blob/0d58df7/README.md)
docker compose -f docker/docker-compose.yml up -d - Open the app (github.com/ghostfolio/ghostfolio/blob/0d58df7/docker/docker-compose.yml)
Open http://localhost:3333. The compose file publishes host port 3333 for the ghostfolio service. The README says to open this address and create the first user.
Compose file check: config_ok on 2026-10-22.
Gotchas and maintenance
Gotchas
- Some images use the latest tag or no tag. Images without a pinned version: ghostfolio: docker.io/ghostfolio/ghostfolio:latest. A later pull can get a different version. (github.com/ghostfolio/ghostfolio/blob/0d58df7/docker/docker-compose.yml, checked 2026-10-22)
- The compose file publishes host ports. Host ports: 3333 (ghostfolio). A port without a host address listens on all host network interfaces. (github.com/ghostfolio/ghostfolio/blob/0d58df7/docker/docker-compose.yml, checked 2026-10-22)
- Some services get elevated host access. postgres adds Linux capabilities. (github.com/ghostfolio/ghostfolio/blob/0d58df7/docker/docker-compose.yml, checked 2026-10-22)
Signals
- Open issues and pull requests: 337
- Last push: 2026-10-22 (0 days before this page was built)
- Latest release: 3.90.0 on 2026-10-21 (1 days before this page was built)