Skip to content

This guide walks through deploying Frona with Docker Compose.

1. Create a docker-compose.yml

Create a docker-compose.yml file with the following content:

yaml
services:
  frona:
    image: ghcr.io/fronalabs/frona:latest
    ports:
      - "3001:3001"
    volumes:
      - ./data:/app/data
    environment:
      - FRONA_BROWSER_WS_URL=ws://browserless:3333
      - FRONA_SEARCH_SEARXNG_BASE_URL=http://searxng:8080
    depends_on:
      - browserless
      - searxng
    # Only needed if you plan to restrict agent network destinations.
    # See https://docs.frona.ai/platform/security/sandbox.html
    security_opt:
      - seccomp:unconfined
    restart: unless-stopped

  browserless:
    image: ghcr.io/browserless/chromium:v2.42.0
    environment:
      - MAX_CONCURRENT_SESSIONS=10
      - PREBOOT_CHROME=true
    volumes:
      - ./data/browser_profiles:/profiles
    restart: unless-stopped

  searxng:
    image: searxng/searxng:latest
    environment:
      - SEARXNG_BASE_URL=http://searxng:8080
      - SEARXNG_SECRET=change-me-to-something-random
    configs:
      - source: searxng-settings
        target: /etc/searxng/settings.yml
    restart: unless-stopped

configs:
  searxng-settings:
    content: |
      use_default_settings: true
      search:
        formats:
          - html
          - json

2. Start the services

bash
docker compose up -d

3. Setup

Open http://localhost:3001 in your browser. The setup wizard will guide you through:

  • Creating your first account
  • Generating the encryption secret
  • Configuring your LLM provider API key

Services

ServiceDescriptionPort
fronaFrona server (API + frontend + database)3001 (host)
browserlessHeadless Chromium for browser automationinternal only
searxngMeta search engine for web searchinternal only

Data

The Compose example bind-mounts the host's ./data/ directory into the Frona container at /app/data. Browserless uses a separate bind mount from ./data/browser_profiles/ to /profiles. Because these are host directories rather than Docker-managed named volumes, they survive container recreation and docker compose down -v.

PathContentsBackup priority
data/config.yamlServer configuration written by setup and the administration interfaceCritical
data/db/Embedded SurrealDB database: users, agents, chats, messages, tasks, policies, and other platform recordsCritical
data/users/Per-user files: uploads, agent and MCP workspaces, channel sessions, personal skills, vault data, and tokensCritical
data/browser_profiles/Browserless session profiles, mounted into the Browserless container at /profilesOptional
data/skills/Installed shared skillsImportant if you installed or modified shared skills
data/system/Downloaded registries, model metadata, MCP packages, and other system cachesUsually rebuildable

The exact root can be changed with FRONA_SERVER_DATA_DIR; if you customize individual database or storage paths, mount and back up those paths separately. Read-only resources bundled in the image are not part of the data directory and are replaced when the image is upgraded.

Configuration

After the initial setup, you can further configure Frona through the settings page in the web interface, environment variables, or a config.yaml file. See Config File Reference and Environment Variables for details.

Stopping the services

bash
docker compose down

To stop the stack and remove Docker-managed named volumes:

bash
docker compose down -v

This does not delete the bind-mounted ./data/ directory used by this guide. To erase Frona's persistent data, first stop the stack, then explicitly remove or archive that host directory. Treat that as a separate destructive operation and take a backup first.

Updating

bash
docker compose pull
docker compose up -d

See Upgrades for more details on the upgrade process.