Skip to main content
Version: 9.10 (latest)

Docker Setup

FiestaBoard runs as a single Docker container that bundles the web UI, API, and display service together. This page explains the architecture for users who want to understand what's running under the hood or customize their deployment.

Most users don't need this page

If you followed the Quick Start or Beginner's Guide, everything is already configured correctly. This page is for advanced configuration and troubleshooting.

Upgrading from V1?

V1 used two containers (fiestaboard-api on port 8000 and fiestaboard-ui on port 8080). V2 consolidates everything into one container on port 4420. See the V2 Migration Guide for full upgrade instructions.

Architecture​

FiestaBoard runs in a single unified container:

ContainerServicePortDescription
fiestaboardNginx + FastAPI + Next.js4420Web UI, REST API, display service, plugin system
┌──────────────────────────────────────────────┐
│ Browser │
│ http://localhost:4420 │
└──────────────────┬───────────────────────────┘
│
┌──────────────────▼───────────────────────────┐
│ fiestaboard (Nginx) │
│ Port 4420 │
│ ┌────────────┐ ┌───────────────────────┐ │
│ │ Static UI │ │ Proxy /api → FastAPI │ │
│ └────────────┘ └───────────────────────┘ │
│ │
│ ┌──────────────────────────────────────┐ │
│ │ FastAPI Backend │ │
│ │ ┌────────────┐ ┌──────────────┐ │ │
│ │ │ REST API │ │Display Service│ │ │
│ │ │ │ │Plugin System │ │ │
│ │ └────────────┘ └──────────────┘ │ │
│ └──────────────────────────────────────┘ │
└──────────────────────────────────────────────┘

Docker Compose Files​

FileUse Case
docker-compose.ymlStandard deployment
docker-compose.dev.ymlDevelopment with hot reload
docker-compose.prod.ymlProduction-optimized
docker-compose.hub.ymlUsing pre-built images from Docker Hub

Quick Start​

# Standard deployment
docker compose up -d --build

# Development with hot reload
docker compose -f docker-compose.dev.yml up --build

# Using pre-built images (no build needed)
docker compose -f docker-compose.hub.yml up -d

Access Points​

ServiceURLDescription
Web UIhttp://localhost:4420Main application interface (from the same machine)
Web UI (network)http://<host-ip>:4420Access from other devices with the default bridge setup
Find ithttps://fiestaboard.app/find/Searches your network for FiestaBoard when you don't know the host's IP
APIhttp://localhost:4420/apiAPI access (via nginx proxy)
API Docshttp://localhost:4420/api/docsInteractive FastAPI documentation
Accessing from other devices

The default Docker bridge publishes port 4420 but does not publish its mDNS records onto your LAN. Use the host's IP address, for example http://192.168.1.50:4420. The FiestaPi image separately advertises fiestapi.local from the host. On other installations, configure a host-level mDNS service for Bonjour discovery. Host networking can expose the container advertisement, but nginx then listens on port 3000, so set MDNS_PORT=3000 unless you provide a separate port 4420 proxy.

Key API Endpoints​

EndpointMethodDescription
/healthGETHealth check
/statusGETService status and configuration
/configGETCurrent configuration
/refreshPOSTRefresh current display
/force-refreshPOSTForce refresh (bypasses cache)
/dev-modePOSTToggle development mode
/send-messagePOSTSend a message to the board
/pluginsGETList all plugins
/plugins/{id}/dataGETGet plugin data

See the API Endpoints reference for the complete list.

Data Persistence​

FiestaBoard stores all runtime state on disk so that configuration, pages, and schedules survive container restarts and image upgrades.

What is persisted​

Two host directories are bind-mounted into the container:

Host pathContainer pathContents
./data//app/data/All application state (see table below)
./external_plugins//app/external_plugins/Marketplace plugins installed via the Integrations page

Files inside data/:

FileDescription
config.jsonBoard connection settings, API keys, plugin configuration
settings.jsonDisplay preferences, transitions, schedule, MQTT, active page
pages.jsonAll board pages you have created
schedules.jsonTime-based scheduling rules
carousels.jsonCarousel display settings
logs/Application, API, and nginx log files
*.backupPre-migration backups created automatically before schema upgrades

This is configured in every Docker Compose file:

volumes:
- ./data:/app/data
- ./external_plugins:/app/external_plugins

Running with plain docker run​

If you start the container directly without Docker Compose, pass the volume flags explicitly — otherwise data is lost when the container is removed:

docker run -d \
--name fiestaboard \
-p 4420:3000 \
-v "$(pwd)/data:/app/data" \
-v "$(pwd)/external_plugins:/app/external_plugins" \
fiestaboard/fiestaboard:latest

Backup and restore​

# Backup (from the directory containing your docker compose file)
tar -czf fiestaboard-backup-$(date +%Y%m%d).tar.gz data/ external_plugins/

# Restore
tar -xzf fiestaboard-backup-20240101.tar.gz
docker compose up -d

All configuration, pages, schedules, and installed plugins are captured in a single archive.

Updating FiestaBoard​

# Pull latest code
git pull

# Rebuild and restart
docker compose down
docker compose up -d --build

Environment Variables​

The .env file holds the board connection and system settings. See the Environment Variables reference for the complete list.

Configure plugins in the web UI. A plugin variable that is set in .env (for example HOME_ASSISTANT_BASE_URL) overrides the value saved in the UI for as long as it is set, and FiestaBoard logs a warning when it does. The plugin lines in env.example are commented out for this reason. Leave them that way unless you want the environment to win. To go back to the UI value, delete the line and recreate the container with docker compose up -d. A restart does not reload .env.

Next Steps​