Dokploy

Firefly III

Firefly III is a self-hosted personal finance manager for tracking expenses, budgets, accounts, and financial reports.

Firefly III logo

Configuration

version: "3.8"

services:
  firefly-iii:
    image: fireflyiii/core:version-6.6.3
    restart: unless-stopped
    depends_on:
      firefly-iii-db:
        condition: service_healthy
    environment:
      APP_KEY: ${APP_KEY}
      APP_URL: ${APP_URL}
      TRUSTED_PROXIES: "**"
      TZ: ${TZ}
      SITE_OWNER: ${SITE_OWNER}
      DEFAULT_LANGUAGE: ${DEFAULT_LANGUAGE}
      DEFAULT_LOCALE: ${DEFAULT_LOCALE}
      DB_CONNECTION: mysql
      DB_HOST: firefly-iii-db
      DB_PORT: 3306
      DB_DATABASE: ${DB_DATABASE}
      DB_USERNAME: ${DB_USERNAME}
      DB_PASSWORD: ${DB_PASSWORD}
      STATIC_CRON_TOKEN: ${STATIC_CRON_TOKEN}
    expose:
      - "8080"
    volumes:
      - firefly-iii-upload:/var/www/html/storage/upload

  firefly-iii-db:
    image: mariadb:11.8
    restart: unless-stopped
    environment:
      MYSQL_DATABASE: ${DB_DATABASE}
      MYSQL_USER: ${DB_USERNAME}
      MYSQL_PASSWORD: ${DB_PASSWORD}
      MYSQL_RANDOM_ROOT_PASSWORD: "yes"
    volumes:
      - firefly-iii-db:/var/lib/mysql
    healthcheck:
      test: ["CMD", "healthcheck.sh", "--connect", "--innodb_initialized"]
      interval: 10s
      timeout: 5s
      retries: 5

  firefly-iii-cron:
    image: alpine:3.22
    restart: unless-stopped
    depends_on:
      - firefly-iii
    environment:
      TZ: ${TZ}
      STATIC_CRON_TOKEN: ${STATIC_CRON_TOKEN}
    command:
      - sh
      - -c
      - |
        apk add --no-cache tzdata wget && \
        (ln -snf /usr/share/zoneinfo/$$TZ /etc/localtime || true) && \
        echo "0 3 * * * wget -qO- http://firefly-iii:8080/api/v1/cron/$$STATIC_CRON_TOKEN; echo" | crontab - && \
        crond -f -L /dev/stdout

volumes:
  firefly-iii-upload: {}
  firefly-iii-db: {}
[variables]
main_domain = "${domain}"
app_key = "${base64:32}"
db_name = "firefly"
db_user = "firefly"
db_password = "${password:32}"
cron_token = "${hash:32}"
site_owner = "${email}"
timezone = "UTC"
default_language = "en_US"
default_locale = "equal"

[config]
env = [
  "APP_KEY=base64:${app_key}",
  "APP_URL=https://${main_domain}",
  "TRUSTED_PROXIES=**",
  "TZ=${timezone}",
  "SITE_OWNER=${site_owner}",
  "DEFAULT_LANGUAGE=${default_language}",
  "DEFAULT_LOCALE=${default_locale}",
  "DB_DATABASE=${db_name}",
  "DB_USERNAME=${db_user}",
  "DB_PASSWORD=${db_password}",
  "STATIC_CRON_TOKEN=${cron_token}",
  "MYSQL_DATABASE=${db_name}",
  "MYSQL_USER=${db_user}",
  "MYSQL_PASSWORD=${db_password}",
  "MYSQL_RANDOM_ROOT_PASSWORD=yes"
]
mounts = []

[[config.domains]]
serviceName = "firefly-iii"
port = 8080
host = "${main_domain}"

Base64

To import this template in Dokploy: create a Compose service → AdvancedBase64 import and paste the content below:

ewogICJjb21wb3NlIjogInZlcnNpb246IFwiMy44XCJcblxuc2VydmljZXM6XG4gIGZpcmVmbHktaWlpOlxuICAgIGltYWdlOiBmaXJlZmx5aWlpL2NvcmU6dmVyc2lvbi02LjYuM1xuICAgIHJlc3RhcnQ6IHVubGVzcy1zdG9wcGVkXG4gICAgZGVwZW5kc19vbjpcbiAgICAgIGZpcmVmbHktaWlpLWRiOlxuICAgICAgICBjb25kaXRpb246IHNlcnZpY2VfaGVhbHRoeVxuICAgIGVudmlyb25tZW50OlxuICAgICAgQVBQX0tFWTogJHtBUFBfS0VZfVxuICAgICAgQVBQX1VSTDogJHtBUFBfVVJMfVxuICAgICAgVFJVU1RFRF9QUk9YSUVTOiBcIioqXCJcbiAgICAgIFRaOiAke1RafVxuICAgICAgU0lURV9PV05FUjogJHtTSVRFX09XTkVSfVxuICAgICAgREVGQVVMVF9MQU5HVUFHRTogJHtERUZBVUxUX0xBTkdVQUdFfVxuICAgICAgREVGQVVMVF9MT0NBTEU6ICR7REVGQVVMVF9MT0NBTEV9XG4gICAgICBEQl9DT05ORUNUSU9OOiBteXNxbFxuICAgICAgREJfSE9TVDogZmlyZWZseS1paWktZGJcbiAgICAgIERCX1BPUlQ6IDMzMDZcbiAgICAgIERCX0RBVEFCQVNFOiAke0RCX0RBVEFCQVNFfVxuICAgICAgREJfVVNFUk5BTUU6ICR7REJfVVNFUk5BTUV9XG4gICAgICBEQl9QQVNTV09SRDogJHtEQl9QQVNTV09SRH1cbiAgICAgIFNUQVRJQ19DUk9OX1RPS0VOOiAke1NUQVRJQ19DUk9OX1RPS0VOfVxuICAgIGV4cG9zZTpcbiAgICAgIC0gXCI4MDgwXCJcbiAgICB2b2x1bWVzOlxuICAgICAgLSBmaXJlZmx5LWlpaS11cGxvYWQ6L3Zhci93d3cvaHRtbC9zdG9yYWdlL3VwbG9hZFxuXG4gIGZpcmVmbHktaWlpLWRiOlxuICAgIGltYWdlOiBtYXJpYWRiOjExLjhcbiAgICByZXN0YXJ0OiB1bmxlc3Mtc3RvcHBlZFxuICAgIGVudmlyb25tZW50OlxuICAgICAgTVlTUUxfREFUQUJBU0U6ICR7REJfREFUQUJBU0V9XG4gICAgICBNWVNRTF9VU0VSOiAke0RCX1VTRVJOQU1FfVxuICAgICAgTVlTUUxfUEFTU1dPUkQ6ICR7REJfUEFTU1dPUkR9XG4gICAgICBNWVNRTF9SQU5ET01fUk9PVF9QQVNTV09SRDogXCJ5ZXNcIlxuICAgIHZvbHVtZXM6XG4gICAgICAtIGZpcmVmbHktaWlpLWRiOi92YXIvbGliL215c3FsXG4gICAgaGVhbHRoY2hlY2s6XG4gICAgICB0ZXN0OiBbXCJDTURcIiwgXCJoZWFsdGhjaGVjay5zaFwiLCBcIi0tY29ubmVjdFwiLCBcIi0taW5ub2RiX2luaXRpYWxpemVkXCJdXG4gICAgICBpbnRlcnZhbDogMTBzXG4gICAgICB0aW1lb3V0OiA1c1xuICAgICAgcmV0cmllczogNVxuXG4gIGZpcmVmbHktaWlpLWNyb246XG4gICAgaW1hZ2U6IGFscGluZTozLjIyXG4gICAgcmVzdGFydDogdW5sZXNzLXN0b3BwZWRcbiAgICBkZXBlbmRzX29uOlxuICAgICAgLSBmaXJlZmx5LWlpaVxuICAgIGVudmlyb25tZW50OlxuICAgICAgVFo6ICR7VFp9XG4gICAgICBTVEFUSUNfQ1JPTl9UT0tFTjogJHtTVEFUSUNfQ1JPTl9UT0tFTn1cbiAgICBjb21tYW5kOlxuICAgICAgLSBzaFxuICAgICAgLSAtY1xuICAgICAgLSB8XG4gICAgICAgIGFwayBhZGQgLS1uby1jYWNoZSB0emRhdGEgd2dldCAmJiBcXFxuICAgICAgICAobG4gLXNuZiAvdXNyL3NoYXJlL3pvbmVpbmZvLyQkVFogL2V0Yy9sb2NhbHRpbWUgfHwgdHJ1ZSkgJiYgXFxcbiAgICAgICAgZWNobyBcIjAgMyAqICogKiB3Z2V0IC1xTy0gaHR0cDovL2ZpcmVmbHktaWlpOjgwODAvYXBpL3YxL2Nyb24vJCRTVEFUSUNfQ1JPTl9UT0tFTjsgZWNob1wiIHwgY3JvbnRhYiAtICYmIFxcXG4gICAgICAgIGNyb25kIC1mIC1MIC9kZXYvc3Rkb3V0XG5cbnZvbHVtZXM6XG4gIGZpcmVmbHktaWlpLXVwbG9hZDoge31cbiAgZmlyZWZseS1paWktZGI6IHt9XG4iLAogICJjb25maWciOiAiW3ZhcmlhYmxlc11cbm1haW5fZG9tYWluID0gXCIke2RvbWFpbn1cIlxuYXBwX2tleSA9IFwiJHtiYXNlNjQ6MzJ9XCJcbmRiX25hbWUgPSBcImZpcmVmbHlcIlxuZGJfdXNlciA9IFwiZmlyZWZseVwiXG5kYl9wYXNzd29yZCA9IFwiJHtwYXNzd29yZDozMn1cIlxuY3Jvbl90b2tlbiA9IFwiJHtoYXNoOjMyfVwiXG5zaXRlX293bmVyID0gXCIke2VtYWlsfVwiXG50aW1lem9uZSA9IFwiVVRDXCJcbmRlZmF1bHRfbGFuZ3VhZ2UgPSBcImVuX1VTXCJcbmRlZmF1bHRfbG9jYWxlID0gXCJlcXVhbFwiXG5cbltjb25maWddXG5lbnYgPSBbXG4gIFwiQVBQX0tFWT1iYXNlNjQ6JHthcHBfa2V5fVwiLFxuICBcIkFQUF9VUkw9aHR0cHM6Ly8ke21haW5fZG9tYWlufVwiLFxuICBcIlRSVVNURURfUFJPWElFUz0qKlwiLFxuICBcIlRaPSR7dGltZXpvbmV9XCIsXG4gIFwiU0lURV9PV05FUj0ke3NpdGVfb3duZXJ9XCIsXG4gIFwiREVGQVVMVF9MQU5HVUFHRT0ke2RlZmF1bHRfbGFuZ3VhZ2V9XCIsXG4gIFwiREVGQVVMVF9MT0NBTEU9JHtkZWZhdWx0X2xvY2FsZX1cIixcbiAgXCJEQl9EQVRBQkFTRT0ke2RiX25hbWV9XCIsXG4gIFwiREJfVVNFUk5BTUU9JHtkYl91c2VyfVwiLFxuICBcIkRCX1BBU1NXT1JEPSR7ZGJfcGFzc3dvcmR9XCIsXG4gIFwiU1RBVElDX0NST05fVE9LRU49JHtjcm9uX3Rva2VufVwiLFxuICBcIk1ZU1FMX0RBVEFCQVNFPSR7ZGJfbmFtZX1cIixcbiAgXCJNWVNRTF9VU0VSPSR7ZGJfdXNlcn1cIixcbiAgXCJNWVNRTF9QQVNTV09SRD0ke2RiX3Bhc3N3b3JkfVwiLFxuICBcIk1ZU1FMX1JBTkRPTV9ST09UX1BBU1NXT1JEPXllc1wiXG5dXG5tb3VudHMgPSBbXVxuXG5bW2NvbmZpZy5kb21haW5zXV1cbnNlcnZpY2VOYW1lID0gXCJmaXJlZmx5LWlpaVwiXG5wb3J0ID0gODA4MFxuaG9zdCA9IFwiJHttYWluX2RvbWFpbn1cIlxuIgp9

Tags

finance, budgeting, self-hosted


Version: 6.6.3

On this page