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:
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
- json2. Start the services
docker compose up -d3. 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
| Service | Description | Port |
|---|---|---|
| frona | Frona server (API + frontend + database) | 3001 (host) |
| browserless | Headless Chromium for browser automation | internal only |
| searxng | Meta search engine for web search | internal 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.
| Path | Contents | Backup priority |
|---|---|---|
data/config.yaml | Server configuration written by setup and the administration interface | Critical |
data/db/ | Embedded SurrealDB database: users, agents, chats, messages, tasks, policies, and other platform records | Critical |
data/users/ | Per-user files: uploads, agent and MCP workspaces, channel sessions, personal skills, vault data, and tokens | Critical |
data/browser_profiles/ | Browserless session profiles, mounted into the Browserless container at /profiles | Optional |
data/skills/ | Installed shared skills | Important if you installed or modified shared skills |
data/system/ | Downloaded registries, model metadata, MCP packages, and other system caches | Usually 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
docker compose downTo stop the stack and remove Docker-managed named volumes:
docker compose down -vThis 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
docker compose pull
docker compose up -dSee Upgrades for more details on the upgrade process.