OpenLogs

All tools

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

ghostfolio/ghostfolio

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

Config check passed docker compose config exited 0 on this exact file on 2026-10-22.
docker-compose.yml Version 1
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

  1. 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.

  2. 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
  3. 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.

  4. Copy .env.example to .env (github.com/ghostfolio/ghostfolio/blob/0d58df7/README.md)
    cp .env.example .env
  5. 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.

  6. Start it (github.com/ghostfolio/ghostfolio/blob/0d58df7/README.md)
    docker compose -f docker/docker-compose.yml up -d
  7. 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

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)