From 514c3a551d899ff544d3072b73837d1f3893f6e2 Mon Sep 17 00:00:00 2001 From: YellowWords <1665676+YellowWords@users.noreply.github.com> Date: Mon, 12 Jun 2023 12:23:17 +0000 Subject: [PATCH] Firefly III Data Importer and cronjob for Firefly III (#570) --- apps/firefly-iii-data-importer/config.json | 36 ++++++++++++++ .../docker-compose.yml | 47 ++++++++++++++++++ .../metadata/description.md | 32 ++++++++++++ .../metadata/logo.jpg | Bin 0 -> 33861 bytes apps/firefly-iii/config.json | 11 +++- apps/firefly-iii/docker-compose.yml | 10 +++- 6 files changed, 133 insertions(+), 3 deletions(-) create mode 100644 apps/firefly-iii-data-importer/config.json create mode 100644 apps/firefly-iii-data-importer/docker-compose.yml create mode 100644 apps/firefly-iii-data-importer/metadata/description.md create mode 100644 apps/firefly-iii-data-importer/metadata/logo.jpg diff --git a/apps/firefly-iii-data-importer/config.json b/apps/firefly-iii-data-importer/config.json new file mode 100644 index 00000000..2bb426be --- /dev/null +++ b/apps/firefly-iii-data-importer/config.json @@ -0,0 +1,36 @@ +{ + "$schema": "../schema.json", + "name": "Firefly III Data Importer", + "available": true, + "exposable": true, + "port": 8116, + "tipi_version": 2, + "version": "version-1.2.2", + "id": "firefly-iii-data-importer", + "categories": ["finance"], + "description": "", + "short_desc": "The Firefly III Data Importer can import data into Firefly III", + "author": "JC5", + "website": "https://www.firefly-iii.org/", + "source": "https://github.com/firefly-iii/data-importer", + "form_fields": [ + { + "type": "text", + "label": "Firefly III URL", + "required": false, + "env_variable": "FIREFLY_III_URL" + }, + { + "type": "number", + "label": "Firefly III Public Client ID", + "required": false, + "env_variable": "FIREFLY_III_CLIENT_ID" + }, + { + "type": "text", + "label": "Firefly III OAuth Access Token", + "required": false, + "env_variable": "FIREFLY_III_ACCESS_TOKEN" + } + ] +} diff --git a/apps/firefly-iii-data-importer/docker-compose.yml b/apps/firefly-iii-data-importer/docker-compose.yml new file mode 100644 index 00000000..f6d8b6a6 --- /dev/null +++ b/apps/firefly-iii-data-importer/docker-compose.yml @@ -0,0 +1,47 @@ +version: '3.9' + +services: + ff-iii-importer: + image: fireflyiii/data-importer:version-1.2.2 + container_name: firefly-iii-importer + restart: unless-stopped + ports: + - ${APP_PORT}:8080 + environment: + - FIREFLY_III_URL=${FIREFLY_III_URL} + - FIREFLY_III_ACCESS_TOKEN=${FIREFLY_III_ACCESS_TOKEN} + - FIREFLY_III_CLIENT_ID=${FIREFLY_III_CLIENT_ID} + - TZ=${TZ} + - TRUSTED_PROXIES=** + - VERIFY_TLS_SECURITY=false + - APP_ENV=local + - APP_DEBUG=false + - LOG_CHANNEL=stack + - LOG_LEVEL=info + networks: + - tipi_main_network + labels: + # Main + traefik.enable: true + traefik.http.middlewares.ff-iii-importer-web-redirect.redirectscheme.scheme: https + traefik.http.services.ff-iii-importer.loadbalancer.server.port: 8080 + # Web + traefik.http.routers.ff-iii-importer-insecure.rule: Host(`${APP_DOMAIN}`) + traefik.http.routers.ff-iii-importer-insecure.entrypoints: web + traefik.http.routers.ff-iii-importer-insecure.service: ff-iii-importer + traefik.http.routers.ff-iii-importer-insecure.middlewares: ff-iii-importer-web-redirect + # Websecure + traefik.http.routers.ff-iii-importer.rule: Host(`${APP_DOMAIN}`) + traefik.http.routers.ff-iii-importer.entrypoints: websecure + traefik.http.routers.ff-iii-importer.service: ff-iii-importer + traefik.http.routers.ff-iii-importer.tls.certresolver: myresolver + # Local domain + traefik.http.routers.ff-iii-importer-local-insecure.rule: Host(`firefly-iii-data-importer.${LOCAL_DOMAIN}`) + traefik.http.routers.ff-iii-importer-local-insecure.entrypoints: web + traefik.http.routers.ff-iii-importer-local-insecure.service: ff-iii-importer + traefik.http.routers.ff-iii-importer-local-insecure.middlewares: ff-iii-importer-web-redirect + # Local domain secure + traefik.http.routers.ff-iii-importer-local.rule: Host(`firefly-iii-data-importer.${LOCAL_DOMAIN}`) + traefik.http.routers.ff-iii-importer-local.entrypoints: websecure + traefik.http.routers.ff-iii-importer-local.service: ff-iii-importer + traefik.http.routers.ff-iii-importer-local.tls: true diff --git a/apps/firefly-iii-data-importer/metadata/description.md b/apps/firefly-iii-data-importer/metadata/description.md new file mode 100644 index 00000000..f23edce5 --- /dev/null +++ b/apps/firefly-iii-data-importer/metadata/description.md @@ -0,0 +1,32 @@ +# Firefly III Data Importer +"Firefly III" is a (self-hosted) manager for your personal finances. It can help you keep track of your expenses and income, so you can spend less and save more. The **data importer** is built to help you import transactions into Firefly III. It is separated from Firefly III for security and maintenance reasons. + +The data importer does not connect to your bank directly. Instead, it uses [Nordigen](https://nordigen.com/en/coverage/) and [SaltEdge](https://www.saltedge.com/products/spectre/countries) to connect to over 6000 banks worldwide. These services are free for Firefly III users, but require registration. Keep in mind these services have their own privacy and data usage policies. + +The data importer can import CSV files you've downloaded from your bank. + +You can run the data importer once, for a bulk import. You can also run it regularly to keep up with new transactions. + +Eager to get started? Go to [the documentation](https://docs.firefly-iii.org/data-importer)! + +## Features + +* Import from over 6000 banks +* Import over the command line for easy automation +* Import over an API for easy automation +* Use rules and data mapping for transaction clarity + +Many more features are listed in the [documentation](https://docs.firefly-iii.org/data-importer). + +## Who's it for? + +This application is for people who want to track their finances, keep an eye on their money **without having to upload their financial records to the cloud**. You're a bit tech-savvy, you like open source software, and you don't mind tinkering with (self-hosted) servers. + +## Need help? + +If you need support using Firefly III or the associated tools, come find us! + +- [GitHub Discussions for questions and support](https://github.com/firefly-iii/firefly-iii/discussions/) +- [Gitter.im for a good chat and a quick answer](https://gitter.im/firefly-iii/firefly-iii) +- [GitHub Issues for bugs and issues](https://github.com/firefly-iii/firefly-iii/issues) +- [Follow me around for news and updates on Mastodon](https://fosstodon.org/@ff3) \ No newline at end of file diff --git a/apps/firefly-iii-data-importer/metadata/logo.jpg b/apps/firefly-iii-data-importer/metadata/logo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e231f32d5588d13cb3eb66d0a440386e50afb57f GIT binary patch literal 33861 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

NtqyPNMTBQVij66#dSNQG_WOpk&$-zv$*TBU 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 F{|E0m`HcVo literal 0 HcmV?d00001 diff --git a/apps/firefly-iii/config.json b/apps/firefly-iii/config.json index df24cc98..ef7f5b0f 100644 --- a/apps/firefly-iii/config.json +++ b/apps/firefly-iii/config.json @@ -4,8 +4,8 @@ "available": true, "exposable": true, "port": 8115, - "tipi_version": 4, - "version": "version-5.7.11", + "tipi_version": 5, + "version": "version-6.0.10", "id": "firefly-iii", "categories": ["finance"], "description": "", @@ -33,6 +33,13 @@ "max": 32, "label": "Database password", "env_variable": "MYSQL_PASSWORD" + }, + { + "type": "random", + "min": 32, + "max": 32, + "label": "Random key", + "env_variable": "STATIC_CRON_TOKEN" } ] } diff --git a/apps/firefly-iii/docker-compose.yml b/apps/firefly-iii/docker-compose.yml index 3c6bccf7..e1d9227f 100644 --- a/apps/firefly-iii/docker-compose.yml +++ b/apps/firefly-iii/docker-compose.yml @@ -2,7 +2,7 @@ version: "3.9" services: firefly-iii: - image: fireflyiii/core:version-5.7.11 + image: fireflyiii/core:version-6.0.10 container_name: firefly-iii restart: unless-stopped volumes: @@ -16,6 +16,7 @@ services: - APP_DEBUG=false - SITE_OWNER=${EMAIL} - APP_KEY=${APP_KEY} + - STATIC_CRON_TOKEN=${STATIC_CRON_TOKEN} - TZ=${TZ} - TRUSTED_PROXIES=** @@ -82,3 +83,10 @@ services: - ${APP_DATA_DIR}/data/db:/var/lib/mysql networks: - tipi_main_network + + firefly-iii-cron: + container_name: firefly-iii-cron + image: alpine + command: sh -c "echo \"0 3 * * * wget -qO- http://${APP_DOMAIN}/api/v1/cron/${STATIC_CRON_TOKEN}\" | crontab - && crond -f -L /dev/stdout" + networks: + - tipi_main_network