HortusFox logo

HortusFox

Self-hosted collaborative plant management and tracking system

Alternative to: planta

HortusFox screenshot

HortusFox is a self-hosted, collaborative plant management system for organizing houseplants by location, scheduling care tasks, and monitoring plant health with a built-in warning system for plants that need attention. Multiple users can share access to manage plants together with family, roommates, or friends, using notes, tags, and photos for each plant. It also tracks the inventory of supplies needed for plant care and keeps a history log of actions taken.

HortusFox Docker Compose example

Self-host HortusFox on your own server, homelab, or VPS starting from this Docker Compose example. It runs HortusFox in Docker containers using the official ghcr.io/danielbrendel/hortusfox-web:latest, mariadb:latest images, with persistent volumes and automatic restarts preconfigured. Review the environment variables and adjust them to your setup, save the file as compose.yml (or docker-compose.yml), and start the stack with docker compose up -d.

services:
  app:
    image: ghcr.io/danielbrendel/hortusfox-web:latest
    restart: unless-stopped
    depends_on:
      db:
        condition: service_healthy
    volumes:
      - app_images:/var/www/html/public/img
      - app_logs:/var/www/html/app/logs
      - app_backup:/var/www/html/public/backup
      - app_themes:/var/www/html/public/themes
      - app_migrate:/var/www/html/app/migrations
    environment:
      # Email address for the initial administrator account (used to log in).
      APP_ADMIN_EMAIL: "admin@example.com"
      # Password for the initial administrator account. Change this before first login.
      APP_ADMIN_PASSWORD: "password"
      # Timezone used for timestamps throughout the app.
      APP_TIMEZONE: "UTC"
      # Hostname of the database service (matches the db service name below).
      DB_HOST: "db"
      # Port the database listens on.
      DB_PORT: "3306"
      # Database name HortusFox connects to (matches MARIADB_DATABASE).
      DB_DATABASE: "hortusfox"
      # Database user HortusFox connects as (matches MARIADB_USER).
      DB_USERNAME: "user"
      # Password for the database user (matches MARIADB_PASSWORD).
      DB_PASSWORD: "password"
      # Character set used for the database connection.
      DB_CHARSET: "utf8mb4"

  db:
    image: mariadb:latest
    restart: unless-stopped
    environment:
      # Root password for the MariaDB instance (internal to the compose network).
      MARIADB_ROOT_PASSWORD: "my-secret-pw"
      # Database created on first start.
      MARIADB_DATABASE: "hortusfox"
      # Application database user created on first start.
      MARIADB_USER: "user"
      # Password for the application database user (matches DB_PASSWORD above).
      MARIADB_PASSWORD: "password"
    volumes:
      - db_data:/var/lib/mysql
    healthcheck:
      test: ["CMD", "healthcheck.sh", "--connect", "--innodb_initialized"]
      interval: 10s
      timeout: 5s
      retries: 10

volumes:
  db_data:
  app_images:
  app_logs:
  app_backup:
  app_themes:
  app_migrate:

Prefer a managed setup? WinterFlow installs, configures, and updates HortusFox for you using this same Docker Compose configuration.