From 140ce705d60782ac0c6f82460622e1e27802f8f9 Mon Sep 17 00:00:00 2001 From: DireMunchkin <1665676+DireMunchkin@users.noreply.github.com> Date: Sun, 13 Aug 2023 16:28:56 +0200 Subject: [PATCH] Add Ghostfolio --- apps/ghostfolio/config.json | 45 ++++++++++++++ apps/ghostfolio/docker-compose.yml | 74 ++++++++++++++++++++++++ apps/ghostfolio/metadata/description.md | 27 +++++++++ apps/ghostfolio/metadata/logo.png | Bin 0 -> 3028 bytes 4 files changed, 146 insertions(+) create mode 100644 apps/ghostfolio/config.json create mode 100644 apps/ghostfolio/docker-compose.yml create mode 100644 apps/ghostfolio/metadata/description.md create mode 100644 apps/ghostfolio/metadata/logo.png diff --git a/apps/ghostfolio/config.json b/apps/ghostfolio/config.json new file mode 100644 index 00000000..1012bea5 --- /dev/null +++ b/apps/ghostfolio/config.json @@ -0,0 +1,45 @@ +{ + "$schema": "../schema.json", + "name": "Ghostfolio", + "port": 3333, + "available": true, + "exposable": true, + "id": "ghostfolio", + "tipi_version": 1, + "version": "1.300.0", + "categories": ["finance"], + "description": "Ghostfolio is a privacy-first, open source dashboard for your personal finances.", + "short_desc": "", + "author": "dtslvr", + "source": "https://github.com/ghostfolio/ghostfolio", + "form_fields": [ + { + "type": "random", + "min": 32, + "max": 32, + "label": "Access token salt", + "env_variable": "GHOSTFOLIO_ACCESS_TOKEN_SALT" + }, + { + "type": "random", + "min": 32, + "max": 32, + "label": "JSON Web Tokens secret key", + "env_variable": "GHOSTFOLIO_JWT_SECRET_KEY" + }, + { + "type": "random", + "min": 32, + "max": 32, + "label": "Database password", + "env_variable": "GHOSTFOLIO_DB_PASSWORD" + }, + { + "type": "random", + "min": 32, + "max": 32, + "label": "Redis password", + "env_variable": "GHOSTFOLIO_REDIS_PASSWORD" + } + ] + } diff --git a/apps/ghostfolio/docker-compose.yml b/apps/ghostfolio/docker-compose.yml new file mode 100644 index 00000000..31b2c700 --- /dev/null +++ b/apps/ghostfolio/docker-compose.yml @@ -0,0 +1,74 @@ +version: "3.9" + +services: + ghostfolio: + image: ghostfolio/ghostfolio:1.300.0 + restart: unless-stopped + ports: + - ${APP_PORT}:8080 + environment: + NODE_ENV: production + HOST: 0.0.0.0 + PORT: 3333 + ACCESS_TOKEN_SALT: $GHOSTFOLIO_ACCESS_TOKEN_SALT + DATABASE_URL: postgresql://ghostfolio:${GHOSTFOLIO_DB_PASSWORD}@ghostfolio-postgres:5432/ghostfolio?sslmode=prefer + JWT_SECRET_KEY: ${GHOSTFOLIO_JWT_SECRET_KEY} + POSTGRES_DB: ghostfolio + POSTGRES_USER: ghostfolio + POSTGRES_PASSWORD: ${GHOSTFOLIO_DB_PASSWORD} + REDIS_HOST: ghostfolio-redis + REDIS_PASSWORD: ${GHOSTFOLIO_REDIS_PASSWORD} + REDIS_PORT: 6379 + networks: + - tipi_main_network + labels: + # Main + traefik.enable: true + traefik.http.middlewares.ghostfolio-web-redirect.redirectscheme.scheme: https + traefik.http.services.ghostfolio.loadbalancer.server.port: 3333 + # Web + traefik.http.routers.ghostfolio-insecure.rule: Host(`${APP_DOMAIN}`) + traefik.http.routers.ghostfolio-insecure.entrypoints: web + traefik.http.routers.ghostfolio-insecure.service: ghostfolio + traefik.http.routers.ghostfolio-insecure.middlewares: ghostfolio-web-redirect + # Websecure + traefik.http.routers.ghostfolio.rule: Host(`${APP_DOMAIN}`) + traefik.http.routers.ghostfolio.entrypoints: websecure + traefik.http.routers.ghostfolio.service: ghostfolio + traefik.http.routers.ghostfolio.tls.certresolver: myresolver + # Local domain + traefik.http.routers.ghostfolio-local-insecure.rule: Host(`ghostfolio.${LOCAL_DOMAIN}`) + traefik.http.routers.ghostfolio-local-insecure.entrypoints: web + traefik.http.routers.ghostfolio-local-insecure.service: ghostfolio + traefik.http.routers.ghostfolio-local-insecure.middlewares: ghostfolio-web-redirect + # Local domain secure + traefik.http.routers.ghostfolio-local.rule: Host(`ghostfolio.${LOCAL_DOMAIN}`) + traefik.http.routers.ghostfolio-local.entrypoints: websecure + traefik.http.routers.ghostfolio-local.service: ghostfolio + traefik.http.routers.ghostfolio-local.tls: true + + ghostfolio-postgres: + image: postgres:14-bullseye + restart: unless-stopped + stop_grace_period: 1m + user: "1000:1000" + environment: + POSTGRES_DB: ghostfolio + POSTGRES_USER: ghostfolio + POSTGRES_PASSWORD: ${GHOSTFOLIO_DB_PASSWORD} + PGDATA: /var/lib/postgresql/data + volumes: + - ${APP_DATA_DIR}/data/postgres:/var/lib/postgresql/data + networks: + - tipi_main_network + + ghostfolio-redis: + image: redis:6.2-bullseye + restart: unless-stopped + user: "1000:1000" + command: > + --requirepass ${GHOSTFOLIO_REDIS_PASSWORD} + volumes: + - ${APP_DATA_DIR}/data/redis:/data + networks: + - tipi_main_network diff --git a/apps/ghostfolio/metadata/description.md b/apps/ghostfolio/metadata/description.md new file mode 100644 index 00000000..9636517f --- /dev/null +++ b/apps/ghostfolio/metadata/description.md @@ -0,0 +1,27 @@ +**Ghostfolio** is an open source wealth management software built with web technology. The application empowers busy people to keep track of stocks, ETFs or cryptocurrencies and make solid, data-driven investment decisions. The software is designed for personal use in continuous operation. + +## Why Ghostfolio? + +Ghostfolio is for you if you are... + +- ๐Ÿ’ผ trading stocks, ETFs or cryptocurrencies on multiple platforms +- ๐Ÿฆ pursuing a buy & hold strategy +- ๐ŸŽฏ interested in getting insights of your portfolio composition +- ๐Ÿ‘ป valuing privacy and data ownership +- ๐Ÿง˜ into minimalism +- ๐Ÿงบ caring about diversifying your financial resources +- ๐Ÿ†“ interested in financial independence +- ๐Ÿ™… saying no to spreadsheets +- ๐Ÿ˜Ž still reading this list + +## Features + +- โœ… Create, update and delete transactions +- โœ… Multi account management +- โœ… Portfolio performance for `Today`, `YTD`, `1Y`, `5Y`, `Max` +- โœ… Various charts +- โœ… Static analysis to identify potential risks in your portfolio +- โœ… Import and export transactions +- โœ… Dark Mode +- โœ… Zen Mode +- โœ… Progressive Web App (PWA) with a mobile-first design diff --git a/apps/ghostfolio/metadata/logo.png b/apps/ghostfolio/metadata/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..3f3ce881e29c4e3a593df1d46aff032cddb91da7 GIT binary patch literal 3028 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