Dokploy

Akaunting

Akaunting is a self-hosted, open-source accounting app for small businesses.

Akaunting logo

Configuration

version: "3.8"

services:
  akaunting:
    image: docker.io/akaunting/akaunting:latest
    restart: unless-stopped
    depends_on:
      akaunting-db:
        condition: service_healthy
    environment:
      # App config
      APP_URL: ${APP_URL}
      LOCALE: ${LOCALE}

      # Database connection
      DB_HOST: akaunting-db
      DB_PORT: 3306
      DB_NAME: ${DB_NAME}
      DB_USERNAME: ${DB_USERNAME}
      DB_PASSWORD: ${DB_PASSWORD}
      DB_PREFIX: ${DB_PREFIX}

      # First-run bootstrap (company + admin)
      COMPANY_NAME: ${COMPANY_NAME}
      COMPANY_EMAIL: ${COMPANY_EMAIL}
      ADMIN_EMAIL: ${ADMIN_EMAIL}
      ADMIN_PASSWORD: ${ADMIN_PASSWORD}

    # Expose only to internal network; domain routing handled by Dokploy/Traefik
    expose:
      - "80"

    volumes:
      - akaunting-data:/var/www/html

  akaunting-db:
    image: mariadb:10.11
    restart: unless-stopped
    environment:
      MYSQL_DATABASE: ${MYSQL_DATABASE}
      MYSQL_USER: ${MYSQL_USER}
      MYSQL_PASSWORD: ${MYSQL_PASSWORD}
      # Randomizes root password on each deployment (recommended)
      MYSQL_RANDOM_ROOT_PASSWORD: "yes"
    volumes:
      - akaunting-db:/var/lib/mysql
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
      interval: 10s
      timeout: 5s
      retries: 5

volumes:
  akaunting-data: {}
  akaunting-db: {}
[variables]
# Domain & UI
main_domain = "${domain}"
locale = "en-US"

# DB credentials (safe defaults; user can override in UI)
db_name = "akaunting"
db_user = "admin"
mysql_password = "${password:24}"

# Akaunting setup variables
company_name = "My Company"
company_email = "${email}"
admin_email = "${email}"
admin_password = "${password:24}"

# Akaunting table prefix: 3 hex chars + underscore (e.g., "a1f_")
db_prefix = "${hash:3}_"

# Domain routing for the web UI
[[config.domains]]
serviceName = "akaunting"
port = 80
host = "${main_domain}"

[config]
env = [
  # App
  "APP_URL=${main_domain}",
  "LOCALE=${locale}",

  # Database (app)
  "DB_HOST=akaunting-db",
  "DB_PORT=3306",
  "DB_NAME=${db_name}",
  "DB_USERNAME=${db_user}",
  "DB_PASSWORD=${mysql_password}",
  "DB_PREFIX=${db_prefix}",

  # First-run bootstrap (app)
  "COMPANY_NAME=${company_name}",
  "COMPANY_EMAIL=${company_email}",
  "ADMIN_EMAIL=${admin_email}",
  "ADMIN_PASSWORD=${admin_password}",

  # Database (server)
  "MYSQL_DATABASE=${db_name}",
  "MYSQL_USER=${db_user}",
  "MYSQL_PASSWORD=${mysql_password}",
  "MYSQL_RANDOM_ROOT_PASSWORD=yes"
]

# No custom mounts needed; volumes are already defined in compose.
[[config.mounts]]

Base64

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

ewogICJjb21wb3NlIjogInZlcnNpb246IFwiMy44XCJcblxuc2VydmljZXM6XG4gIGFrYXVudGluZzpcbiAgICBpbWFnZTogZG9ja2VyLmlvL2FrYXVudGluZy9ha2F1bnRpbmc6bGF0ZXN0XG4gICAgcmVzdGFydDogdW5sZXNzLXN0b3BwZWRcbiAgICBkZXBlbmRzX29uOlxuICAgICAgYWthdW50aW5nLWRiOlxuICAgICAgICBjb25kaXRpb246IHNlcnZpY2VfaGVhbHRoeVxuICAgIGVudmlyb25tZW50OlxuICAgICAgIyBBcHAgY29uZmlnXG4gICAgICBBUFBfVVJMOiAke0FQUF9VUkx9XG4gICAgICBMT0NBTEU6ICR7TE9DQUxFfVxuXG4gICAgICAjIERhdGFiYXNlIGNvbm5lY3Rpb25cbiAgICAgIERCX0hPU1Q6IGFrYXVudGluZy1kYlxuICAgICAgREJfUE9SVDogMzMwNlxuICAgICAgREJfTkFNRTogJHtEQl9OQU1FfVxuICAgICAgREJfVVNFUk5BTUU6ICR7REJfVVNFUk5BTUV9XG4gICAgICBEQl9QQVNTV09SRDogJHtEQl9QQVNTV09SRH1cbiAgICAgIERCX1BSRUZJWDogJHtEQl9QUkVGSVh9XG5cbiAgICAgICMgRmlyc3QtcnVuIGJvb3RzdHJhcCAoY29tcGFueSArIGFkbWluKVxuICAgICAgQ09NUEFOWV9OQU1FOiAke0NPTVBBTllfTkFNRX1cbiAgICAgIENPTVBBTllfRU1BSUw6ICR7Q09NUEFOWV9FTUFJTH1cbiAgICAgIEFETUlOX0VNQUlMOiAke0FETUlOX0VNQUlMfVxuICAgICAgQURNSU5fUEFTU1dPUkQ6ICR7QURNSU5fUEFTU1dPUkR9XG5cbiAgICAjIEV4cG9zZSBvbmx5IHRvIGludGVybmFsIG5ldHdvcms7IGRvbWFpbiByb3V0aW5nIGhhbmRsZWQgYnkgRG9rcGxveS9UcmFlZmlrXG4gICAgZXhwb3NlOlxuICAgICAgLSBcIjgwXCJcblxuICAgIHZvbHVtZXM6XG4gICAgICAtIGFrYXVudGluZy1kYXRhOi92YXIvd3d3L2h0bWxcblxuICBha2F1bnRpbmctZGI6XG4gICAgaW1hZ2U6IG1hcmlhZGI6MTAuMTFcbiAgICByZXN0YXJ0OiB1bmxlc3Mtc3RvcHBlZFxuICAgIGVudmlyb25tZW50OlxuICAgICAgTVlTUUxfREFUQUJBU0U6ICR7TVlTUUxfREFUQUJBU0V9XG4gICAgICBNWVNRTF9VU0VSOiAke01ZU1FMX1VTRVJ9XG4gICAgICBNWVNRTF9QQVNTV09SRDogJHtNWVNRTF9QQVNTV09SRH1cbiAgICAgICMgUmFuZG9taXplcyByb290IHBhc3N3b3JkIG9uIGVhY2ggZGVwbG95bWVudCAocmVjb21tZW5kZWQpXG4gICAgICBNWVNRTF9SQU5ET01fUk9PVF9QQVNTV09SRDogXCJ5ZXNcIlxuICAgIHZvbHVtZXM6XG4gICAgICAtIGFrYXVudGluZy1kYjovdmFyL2xpYi9teXNxbFxuICAgIGhlYWx0aGNoZWNrOlxuICAgICAgdGVzdDogW1wiQ01EXCIsIFwibXlzcWxhZG1pblwiLCBcInBpbmdcIiwgXCItaFwiLCBcImxvY2FsaG9zdFwiXVxuICAgICAgaW50ZXJ2YWw6IDEwc1xuICAgICAgdGltZW91dDogNXNcbiAgICAgIHJldHJpZXM6IDVcblxudm9sdW1lczpcbiAgYWthdW50aW5nLWRhdGE6IHt9XG4gIGFrYXVudGluZy1kYjoge31cbiIsCiAgImNvbmZpZyI6ICJbdmFyaWFibGVzXVxuIyBEb21haW4gJiBVSVxubWFpbl9kb21haW4gPSBcIiR7ZG9tYWlufVwiXG5sb2NhbGUgPSBcImVuLVVTXCJcblxuIyBEQiBjcmVkZW50aWFscyAoc2FmZSBkZWZhdWx0czsgdXNlciBjYW4gb3ZlcnJpZGUgaW4gVUkpXG5kYl9uYW1lID0gXCJha2F1bnRpbmdcIlxuZGJfdXNlciA9IFwiYWRtaW5cIlxubXlzcWxfcGFzc3dvcmQgPSBcIiR7cGFzc3dvcmQ6MjR9XCJcblxuIyBBa2F1bnRpbmcgc2V0dXAgdmFyaWFibGVzXG5jb21wYW55X25hbWUgPSBcIk15IENvbXBhbnlcIlxuY29tcGFueV9lbWFpbCA9IFwiJHtlbWFpbH1cIlxuYWRtaW5fZW1haWwgPSBcIiR7ZW1haWx9XCJcbmFkbWluX3Bhc3N3b3JkID0gXCIke3Bhc3N3b3JkOjI0fVwiXG5cbiMgQWthdW50aW5nIHRhYmxlIHByZWZpeDogMyBoZXggY2hhcnMgKyB1bmRlcnNjb3JlIChlLmcuLCBcImExZl9cIilcbmRiX3ByZWZpeCA9IFwiJHtoYXNoOjN9X1wiXG5cbiMgRG9tYWluIHJvdXRpbmcgZm9yIHRoZSB3ZWIgVUlcbltbY29uZmlnLmRvbWFpbnNdXVxuc2VydmljZU5hbWUgPSBcImFrYXVudGluZ1wiXG5wb3J0ID0gODBcbmhvc3QgPSBcIiR7bWFpbl9kb21haW59XCJcblxuW2NvbmZpZ11cbmVudiA9IFtcbiAgIyBBcHBcbiAgXCJBUFBfVVJMPSR7bWFpbl9kb21haW59XCIsXG4gIFwiTE9DQUxFPSR7bG9jYWxlfVwiLFxuXG4gICMgRGF0YWJhc2UgKGFwcClcbiAgXCJEQl9IT1NUPWFrYXVudGluZy1kYlwiLFxuICBcIkRCX1BPUlQ9MzMwNlwiLFxuICBcIkRCX05BTUU9JHtkYl9uYW1lfVwiLFxuICBcIkRCX1VTRVJOQU1FPSR7ZGJfdXNlcn1cIixcbiAgXCJEQl9QQVNTV09SRD0ke215c3FsX3Bhc3N3b3JkfVwiLFxuICBcIkRCX1BSRUZJWD0ke2RiX3ByZWZpeH1cIixcblxuICAjIEZpcnN0LXJ1biBib290c3RyYXAgKGFwcClcbiAgXCJDT01QQU5ZX05BTUU9JHtjb21wYW55X25hbWV9XCIsXG4gIFwiQ09NUEFOWV9FTUFJTD0ke2NvbXBhbnlfZW1haWx9XCIsXG4gIFwiQURNSU5fRU1BSUw9JHthZG1pbl9lbWFpbH1cIixcbiAgXCJBRE1JTl9QQVNTV09SRD0ke2FkbWluX3Bhc3N3b3JkfVwiLFxuXG4gICMgRGF0YWJhc2UgKHNlcnZlcilcbiAgXCJNWVNRTF9EQVRBQkFTRT0ke2RiX25hbWV9XCIsXG4gIFwiTVlTUUxfVVNFUj0ke2RiX3VzZXJ9XCIsXG4gIFwiTVlTUUxfUEFTU1dPUkQ9JHtteXNxbF9wYXNzd29yZH1cIixcbiAgXCJNWVNRTF9SQU5ET01fUk9PVF9QQVNTV09SRD15ZXNcIlxuXVxuXG4jIE5vIGN1c3RvbSBtb3VudHMgbmVlZGVkOyB2b2x1bWVzIGFyZSBhbHJlYWR5IGRlZmluZWQgaW4gY29tcG9zZS5cbltbY29uZmlnLm1vdW50c11dXG4iCn0=

Tags

finance, accounting, php, mariadb, self-hosted


Version: latest

On this page