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
  • Adding a provider connection with a supported API-key or account sign-in method
  • Selecting a model group

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, encrypted managed credentials, 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.