统一多模态 AI 工作台
1.3K
OmniFlow is a self-hosted multi-modal AI workspace for text chat, image generation, video generation, API provider aggregation, model selection, prompt optimization, local history, user management, and Docker-based deployment.
Docker Hub: easonbobs/omniflow
The official image is published as a multi-architecture image:
linux/amd64linux/arm64| Tag | Description |
|---|---|
latest | Latest stable image |
v0.1.8 | Current stable release |
v0.1.7 | Previous release |
v0.1.6 | Previous release |
v0.1.5 | Previous release |
v0.1.4 | Previous release |
v0.1.3 | Previous release |
v0.1.2 | Previous release |
v0.1.1 | Previous release |
Recommended production usage:
docker pull easonbobs/omniflow:v0.1.8
Run OmniFlow with Docker:
docker run -d \
--name omniflow \
-p 3456:3456 \
-v ./data:/app/data \
-v ./logs:/app/logs \
-e SUPER_ADMIN_USERNAME=admin \
-e SUPER_ADMIN_PASSWORD=admin123456 \
easonbobs/omniflow:v0.1.8
Open:
http://localhost:3456
Default login values are controlled by environment variables. Change SUPER_ADMIN_PASSWORD before exposing OmniFlow to the public internet.
Recommended docker-compose.yml:
name: omniflow
services:
omniflow:
image: easonbobs/omniflow:v0.1.8
container_name: omniflow
ports:
- "${OMNIFLOW_PORT:-3456}:3456"
restart: unless-stopped
environment:
NODE_ENV: production
PORT: 3456
HOSTNAME: 0.0.0.0
DATABASE_URL: ${OMNIFLOW_DATABASE_URL:-file:/app/data/omniflow.db}
LOG_DIR: ${LOG_DIR:-/app/logs}
OMNIFLOW_PUBLIC_URL: ${OMNIFLOW_PUBLIC_URL:-}
OMNIFLOW_UPDATE_SERVICE_URL: ${OMNIFLOW_UPDATE_SERVICE_URL:-http://omniflow-updater:3001}
OMNIFLOW_UPDATE_TOKEN: ${OMNIFLOW_UPDATE_TOKEN:-}
JWT_SECRET: ${JWT_SECRET:-}
JWT_SECRET_FILE: ${JWT_SECRET_FILE:-/app/data/jwt_secret}
SESSION_MAX_AGE_SECONDS: ${SESSION_MAX_AGE_SECONDS:-604800}
SUPER_ADMIN_USERNAME: ${SUPER_ADMIN_USERNAME:-admin}
SUPER_ADMIN_PASSWORD: ${SUPER_ADMIN_PASSWORD:-admin123456}
SUPER_ADMIN_NICKNAME: ${SUPER_ADMIN_NICKNAME:-SuperAdmin}
DEFAULT_IMAGE_SIZE: ${DEFAULT_IMAGE_SIZE:-1024x1024}
DEFAULT_IMAGE_QUALITY: ${DEFAULT_IMAGE_QUALITY:-medium}
DEFAULT_IMAGE_FORMAT: ${DEFAULT_IMAGE_FORMAT:-png}
DEFAULT_VIDEO_SIZE: ${DEFAULT_VIDEO_SIZE:-1024x1024}
DEFAULT_VIDEO_DURATION: ${DEFAULT_VIDEO_DURATION:-5s}
volumes:
- ${OMNIFLOW_DATA_DIR:-./data}:/app/data
- ${OMNIFLOW_LOGS_DIR:-./logs}:/app/logs
omniflow-updater:
image: easonbobs/omniflow:v0.1.8
container_name: omniflow-updater
entrypoint: ["node"]
command: ["./scripts/update-server.mjs"]
restart: unless-stopped
environment:
PORT: 3001
OMNIFLOW_CONTAINER_NAME: ${OMNIFLOW_CONTAINER_NAME:-omniflow}
OMNIFLOW_IMAGE_REPOSITORY: ${OMNIFLOW_IMAGE_REPOSITORY:-easonbobs/omniflow}
OMNIFLOW_UPDATE_TOKEN: ${OMNIFLOW_UPDATE_TOKEN:-}
volumes:
- /var/run/docker.sock:/var/run/docker.sock
Start:
docker compose up -d
View logs:
docker compose logs -f omniflow
Stop:
docker compose down
| Variable | Description | Default |
|---|---|---|
OMNIFLOW_PORT | Host port exposed by Docker Compose | 3456 |
OMNIFLOW_DATABASE_URL | SQLite database URL inside the container | file:/app/data/omniflow.db |
OMNIFLOW_DATA_DIR | Host data directory mounted to /app/data | ./data |
OMNIFLOW_LOGS_DIR | Host log directory mounted to /app/logs | ./logs |
LOG_DIR | Log directory inside the container | /app/logs |
LOG_FILE_ENABLED | Enable file logging | true |
LOG_MAX_STRING_LENGTH | Max logged string length before truncation | 8000 |
LOG_MAX_ARRAY_ITEMS | Max logged array items before truncation | 50 |
OMNIFLOW_PUBLIC_URL | Public base URL for uploaded assets used by media APIs | empty |
OMNIFLOW_UPDATE_SERVICE_URL | Internal updater service URL | http://omniflow-updater:3001 |
OMNIFLOW_UPDATE_TOKEN | Optional token for internal update requests | empty |
JWT_SECRET | JWT signing secret. Leave empty to auto-generate one. | empty |
JWT_SECRET_FILE | Persistent JWT secret file | /app/data/jwt_secret |
SESSION_MAX_AGE_SECONDS | Login session lifetime | 604800 |
SUPER_ADMIN_USERNAME | Initial super administrator username | admin |
SUPER_ADMIN_PASSWORD | Initial super administrator password | admin123456 |
SUPER_ADMIN_NICKNAME | Initial super administrator nickname | SuperAdmin |
DEFAULT_IMAGE_SIZE | Default image generation size | 1024x1024 |
DEFAULT_IMAGE_QUALITY | Default image quality | medium |
DEFAULT_IMAGE_FORMAT | Default image format | png |
DEFAULT_VIDEO_SIZE | Default video generation size | 1024x1024 |
DEFAULT_VIDEO_DURATION | Default video duration | 5s |
Mount these directories for production deployments:
/app/data SQLite database, uploads, JWT secret, local persistent data
/app/logs File logs
The container automatically creates:
/app/data/uploads
/app/logs
/app/public/uploads -> /app/data/uploads
This allows uploaded files and generated media references to survive container rebuilds and updates.
OmniFlow does not require API keys in environment variables. Configure providers inside the application after login:
API keys are stored server-side and are not exposed as plaintext runtime defaults in the frontend.
Runtime logs are available from both Docker stdout and persisted log files.
Docker logs:
docker logs -f omniflow
File logs:
tail -f ./logs/omniflow-$(date +%F).log
The file logger automatically redacts common sensitive fields such as API keys, tokens, cookies, sessions, JWT secrets, and passwords. It also truncates oversized strings, data URLs, buffers, and large arrays.
The Compose example includes an omniflow-updater sidecar service. It uses the same easonbobs/omniflow image as the main application but starts scripts/update-server.mjs instead of the web server.
When the About page detects a newer Docker Hub version, a super administrator can trigger an update from the UI. The updater pulls the selected image and recreates the main omniflow container while keeping mounted data and logs.
For production, set OMNIFLOW_UPDATE_TOKEN so internal update calls are protected.
Manual upgrade:
docker pull easonbobs/omniflow:v0.1.8
docker compose up -d
If you use latest:
docker pull easonbobs/omniflow:latest
docker compose up -d
Pinned version tags such as v0.1.8 are recommended for production so upgrades are explicit and repeatable.
Check container status:
docker ps -a | grep omniflow
Check application logs:
docker logs -f omniflow
Check persisted file logs:
ls -lah ./logs
tail -100 ./logs/omniflow-$(date +%F).log
If login fails after recreating a container, make sure /app/data is mounted and JWT_SECRET_FILE is persistent. If uploaded images or videos disappear, make sure /app/data/uploads is included in the mounted data directory.
/api/v3 normalization, while keeping room for Ark-specific media task routes.easonbobs/omniflowContent type
Image
Digest
sha256:bf5647e2f…
Size
213.8 MB
Last updated
12 days ago
docker pull easonbobs/omniflow