ONLYOFFICE Workspace
Self-hosted collaborative office workspace combining Documents, Projects, CRM, Mail, Calendar, People, Control Panel, and real-time ONLYOFFICE Document Server editors.
This is the full ONLYOFFICE Workspace portal (users, Documents, Projects, CRM, Calendar, People, and Control Panel), with Document Server included by default. If you already run Nextcloud, Seafile, or OwnCloud and only want the standalone document editors to connect to it, see ONLYOFFICE Document Server (daemonless/onlyoffice) instead.
Tag
Description
Best For
latest
Built from the official upstream ONLYOFFICE Community Server and Control Panel releases with FreeBSD-native HyperFastCGI.
Most users — recommended.
Parts
Service
Image
Role
onlyoffice-workspace
ghcr.io/daemonless/onlyoffice-workspace:${ONLYOFFICE_WORKSPACE_TAG:-latest}
Portal web UI, API, Control Panel, and internal Redis cache
docs
onlyoffice-documentserver
ghcr.io/daemonless/onlyoffice:pkg
Online collaborative editors for documents, spreadsheets, and presentations
docs
mariadb
ghcr.io/daemonless/mariadb:latest
Portal database (users, projects, CRM, calendar, and metadata)
docs
postgres
ghcr.io/daemonless/postgres:16
Document Server database for real-time collaborative editing state
docs
Before deploying, ensure your host environment is ready. See the Quick Start Guide for host setup instructions, including the security model for host vs. container privileges.
Deployment
Database Where ONLYOFFICE Workspace keeps its portal data. The default runs its own MariaDB. The document editors keep their editing state in a PostgreSQL of their own, which is always built in.
Built-in MariaDB Your own MariaDB
Document editors Online collaborative editors for Word, Excel and PowerPoint files inside Documents.
With Document Server (Workspace) Portal only (Groups)
onlyoffice-workspace:latest · onlyoffice:pkg · mariadb:latest · postgres:16 — data in /containers /onlyoffice-workspace/data, /containers /onlyoffice-workspace/docserver, /containers /onlyoffice-workspace/mariadb, /containers /onlyoffice-workspace/postgres
A MariaDB of its own, on the stack's private network. Runs ONLYOFFICE Document Server and its PostgreSQL alongside the portal.
1. Save as .env and fill in what is empty:
WORKSPACE_DATA_LOCATION=/containers /onlyoffice-workspace/data
DOCSERVER_DATA_LOCATION=/containers /onlyoffice-workspace/docserver
MARIADB_DATA_LOCATION=/containers /onlyoffice-workspace/mariadb
POSTGRES_DATA_LOCATION=/containers /onlyoffice-workspace/postgres
DB_PASSWORD=
DB_ROOT_PASSWORD=
JWT_SECRET=
CORE_MACHINEKEY=
TZ=UTC
2. Save as compose.yaml:
name : onlyoffice-workspace
services :
onlyoffice-workspace :
image : ghcr.io/daemonless/onlyoffice-workspace:${ONLYOFFICE_WORKSPACE_TAG:-latest}
container_name : onlyoffice-workspace
network_mode : host
restart : unless-stopped
annotations :
org.freebsd.jail.allow.mlock : "true"
depends_on :
- mariadb
- onlyoffice-documentserver
environment :
- PUID=1000
- PGID=1000
- TZ=${TZ:-UTC}
- HTTP_PORT=8080
- MYSQL_SERVER_HOST=${MARIADB_HOSTNAME:-127.0.0.1}
- MYSQL_SERVER_PORT=${MARIADB_PORT:-3306}
- MYSQL_SERVER_DB_NAME=${MARIADB_DATABASE:-onlyoffice}
- MYSQL_SERVER_USER=${MARIADB_USER:-onlyoffice}
- MYSQL_SERVER_PASS=${DB_PASSWORD}
- MYSQL_SERVER_ROOT_PASS=${DB_ROOT_PASSWORD:-}
- DOCUMENT_SERVER_HOST=${DOCUMENT_SERVER_HOSTNAME-127.0.0.1}
- DOCUMENT_SERVER_PORT=8083
- JWT_ENABLED=true
- JWT_SECRET=${JWT_SECRET}
- JWT_HEADER=AuthorizationJwt
- CORE_MACHINEKEY=${CORE_MACHINEKEY:-}
volumes :
- ${WORKSPACE_DATA_LOCATION}:/config
onlyoffice-documentserver :
image : ghcr.io/daemonless/onlyoffice:pkg
container_name : onlyoffice-documentserver
network_mode : host
restart : unless-stopped
depends_on :
- postgres
environment :
- DB_HOST=${POSTGRES_HOSTNAME:-127.0.0.1}
- DB_PORT=5432
- DB_NAME=onlyoffice
- DB_USER=onlyoffice
- DB_PWD=${DB_PASSWORD}
- HTTP_PORT=8083
- JWT_ENABLED=true
- JWT_SECRET=${JWT_SECRET}
- JWT_HEADER=AuthorizationJwt
- TZ=${TZ:-UTC}
volumes :
- ${DOCSERVER_DATA_LOCATION}:/config
mariadb :
image : ghcr.io/daemonless/mariadb:latest
container_name : onlyoffice-mariadb
network_mode : host
restart : unless-stopped
environment :
- PUID=1000
- PGID=1000
- TZ=${TZ:-UTC}
- MYSQL_ROOT_PASSWORD=${DB_ROOT_PASSWORD}
- MYSQL_DATABASE=onlyoffice
- MYSQL_USER=onlyoffice
- MYSQL_PASSWORD=${DB_PASSWORD}
volumes :
- ${MARIADB_DATA_LOCATION}:/config
postgres :
image : ghcr.io/daemonless/postgres:16
container_name : onlyoffice-postgres
network_mode : host
restart : unless-stopped
annotations :
org.freebsd.jail.allow.sysvipc : "true"
environment :
- POSTGRES_DB=onlyoffice
- POSTGRES_USER=onlyoffice
- POSTGRES_PASSWORD=${DB_PASSWORD}
- POSTGRES_HOST_AUTH_METHOD=trust
volumes :
- ${POSTGRES_DATA_LOCATION}:/var/lib/postgresql/data
Then run podman-compose up -d.
onlyoffice-workspace:latest · mariadb:latest — data in /containers /onlyoffice-workspace/data, /containers /onlyoffice-workspace/mariadb
A MariaDB of its own, on the stack's private network. Projects, CRM, Mail, People and Calendar without the online document editors.
1. Save as .env and fill in what is empty:
WORKSPACE_DATA_LOCATION=/containers /onlyoffice-workspace/data
DOCSERVER_DATA_LOCATION=/containers /onlyoffice-workspace/docserver
MARIADB_DATA_LOCATION=/containers /onlyoffice-workspace/mariadb
POSTGRES_DATA_LOCATION=/containers /onlyoffice-workspace/postgres
DB_PASSWORD=
DB_ROOT_PASSWORD=
JWT_SECRET=
CORE_MACHINEKEY=
TZ=UTC
# Document editors: Portal only (Groups)
DOCUMENT_SERVER_HOSTNAME=
2. Save as compose.yaml:
name : onlyoffice-workspace
services :
onlyoffice-workspace :
image : ghcr.io/daemonless/onlyoffice-workspace:${ONLYOFFICE_WORKSPACE_TAG:-latest}
container_name : onlyoffice-workspace
network_mode : host
restart : unless-stopped
annotations :
org.freebsd.jail.allow.mlock : "true"
depends_on :
- mariadb
environment :
- PUID=1000
- PGID=1000
- TZ=${TZ:-UTC}
- HTTP_PORT=8080
- MYSQL_SERVER_HOST=${MARIADB_HOSTNAME:-127.0.0.1}
- MYSQL_SERVER_PORT=${MARIADB_PORT:-3306}
- MYSQL_SERVER_DB_NAME=${MARIADB_DATABASE:-onlyoffice}
- MYSQL_SERVER_USER=${MARIADB_USER:-onlyoffice}
- MYSQL_SERVER_PASS=${DB_PASSWORD}
- MYSQL_SERVER_ROOT_PASS=${DB_ROOT_PASSWORD:-}
- DOCUMENT_SERVER_HOST=${DOCUMENT_SERVER_HOSTNAME-127.0.0.1}
- DOCUMENT_SERVER_PORT=8083
- JWT_ENABLED=true
- JWT_SECRET=${JWT_SECRET}
- JWT_HEADER=AuthorizationJwt
- CORE_MACHINEKEY=${CORE_MACHINEKEY:-}
volumes :
- ${WORKSPACE_DATA_LOCATION}:/config
mariadb :
image : ghcr.io/daemonless/mariadb:latest
container_name : onlyoffice-mariadb
network_mode : host
restart : unless-stopped
environment :
- PUID=1000
- PGID=1000
- TZ=${TZ:-UTC}
- MYSQL_ROOT_PASSWORD=${DB_ROOT_PASSWORD}
- MYSQL_DATABASE=onlyoffice
- MYSQL_USER=onlyoffice
- MYSQL_PASSWORD=${DB_PASSWORD}
volumes :
- ${MARIADB_DATA_LOCATION}:/config
Then run podman-compose up -d.
onlyoffice-workspace:latest · onlyoffice:pkg · postgres:16 · your own database — data in /containers /onlyoffice-workspace/data, /containers /onlyoffice-workspace/docserver, /containers /onlyoffice-workspace/postgres
A MariaDB you already run. Create the database and a user with all privileges on it first, and set sql_mode=NO_ENGINE_SUBSTITUTION and max_allowed_packet=1G on that server. Runs ONLYOFFICE Document Server and its PostgreSQL alongside the portal.
1. Save as .env and fill in Host, Port, Database name, User, Password:
WORKSPACE_DATA_LOCATION=/containers /onlyoffice-workspace/data
DOCSERVER_DATA_LOCATION=/containers /onlyoffice-workspace/docserver
MARIADB_DATA_LOCATION=/containers /onlyoffice-workspace/mariadb
POSTGRES_DATA_LOCATION=/containers /onlyoffice-workspace/postgres
DB_PASSWORD= # Password
DB_ROOT_PASSWORD=
JWT_SECRET=
CORE_MACHINEKEY=
TZ=UTC
# Database: Your own MariaDB
MARIADB_HOSTNAME= # Host
MARIADB_PORT=3306 # Port
MARIADB_DATABASE=onlyoffice # Database name
MARIADB_USER=onlyoffice # User
2. Save as compose.yaml:
name : onlyoffice-workspace
services :
onlyoffice-workspace :
image : ghcr.io/daemonless/onlyoffice-workspace:${ONLYOFFICE_WORKSPACE_TAG:-latest}
container_name : onlyoffice-workspace
network_mode : host
restart : unless-stopped
annotations :
org.freebsd.jail.allow.mlock : "true"
depends_on :
- onlyoffice-documentserver
environment :
- PUID=1000
- PGID=1000
- TZ=${TZ:-UTC}
- HTTP_PORT=8080
- MYSQL_SERVER_HOST=${MARIADB_HOSTNAME:-127.0.0.1}
- MYSQL_SERVER_PORT=${MARIADB_PORT:-3306}
- MYSQL_SERVER_DB_NAME=${MARIADB_DATABASE:-onlyoffice}
- MYSQL_SERVER_USER=${MARIADB_USER:-onlyoffice}
- MYSQL_SERVER_PASS=${DB_PASSWORD}
- MYSQL_SERVER_ROOT_PASS=${DB_ROOT_PASSWORD:-}
- DOCUMENT_SERVER_HOST=${DOCUMENT_SERVER_HOSTNAME-127.0.0.1}
- DOCUMENT_SERVER_PORT=8083
- JWT_ENABLED=true
- JWT_SECRET=${JWT_SECRET}
- JWT_HEADER=AuthorizationJwt
- CORE_MACHINEKEY=${CORE_MACHINEKEY:-}
volumes :
- ${WORKSPACE_DATA_LOCATION}:/config
onlyoffice-documentserver :
image : ghcr.io/daemonless/onlyoffice:pkg
container_name : onlyoffice-documentserver
network_mode : host
restart : unless-stopped
depends_on :
- postgres
environment :
- DB_HOST=${POSTGRES_HOSTNAME:-127.0.0.1}
- DB_PORT=5432
- DB_NAME=onlyoffice
- DB_USER=onlyoffice
- DB_PWD=${DB_PASSWORD}
- HTTP_PORT=8083
- JWT_ENABLED=true
- JWT_SECRET=${JWT_SECRET}
- JWT_HEADER=AuthorizationJwt
- TZ=${TZ:-UTC}
volumes :
- ${DOCSERVER_DATA_LOCATION}:/config
postgres :
image : ghcr.io/daemonless/postgres:16
container_name : onlyoffice-postgres
network_mode : host
restart : unless-stopped
annotations :
org.freebsd.jail.allow.sysvipc : "true"
environment :
- POSTGRES_DB=onlyoffice
- POSTGRES_USER=onlyoffice
- POSTGRES_PASSWORD=${DB_PASSWORD}
- POSTGRES_HOST_AUTH_METHOD=trust
volumes :
- ${POSTGRES_DATA_LOCATION}:/var/lib/postgresql/data
Then run podman-compose up -d.
onlyoffice-workspace:latest · your own database — data in /containers /onlyoffice-workspace/data
A MariaDB you already run. Create the database and a user with all privileges on it first, and set sql_mode=NO_ENGINE_SUBSTITUTION and max_allowed_packet=1G on that server. Projects, CRM, Mail, People and Calendar without the online document editors.
1. Save as .env and fill in Host, Port, Database name, User, Password:
WORKSPACE_DATA_LOCATION=/containers /onlyoffice-workspace/data
DOCSERVER_DATA_LOCATION=/containers /onlyoffice-workspace/docserver
MARIADB_DATA_LOCATION=/containers /onlyoffice-workspace/mariadb
POSTGRES_DATA_LOCATION=/containers /onlyoffice-workspace/postgres
DB_PASSWORD= # Password
DB_ROOT_PASSWORD=
JWT_SECRET=
CORE_MACHINEKEY=
TZ=UTC
# Database: Your own MariaDB
MARIADB_HOSTNAME= # Host
MARIADB_PORT=3306 # Port
MARIADB_DATABASE=onlyoffice # Database name
MARIADB_USER=onlyoffice # User
# Document editors: Portal only (Groups)
DOCUMENT_SERVER_HOSTNAME=
2. Save as compose.yaml:
name : onlyoffice-workspace
services :
onlyoffice-workspace :
image : ghcr.io/daemonless/onlyoffice-workspace:${ONLYOFFICE_WORKSPACE_TAG:-latest}
container_name : onlyoffice-workspace
network_mode : host
restart : unless-stopped
annotations :
org.freebsd.jail.allow.mlock : "true"
environment :
- PUID=1000
- PGID=1000
- TZ=${TZ:-UTC}
- HTTP_PORT=8080
- MYSQL_SERVER_HOST=${MARIADB_HOSTNAME:-127.0.0.1}
- MYSQL_SERVER_PORT=${MARIADB_PORT:-3306}
- MYSQL_SERVER_DB_NAME=${MARIADB_DATABASE:-onlyoffice}
- MYSQL_SERVER_USER=${MARIADB_USER:-onlyoffice}
- MYSQL_SERVER_PASS=${DB_PASSWORD}
- MYSQL_SERVER_ROOT_PASS=${DB_ROOT_PASSWORD:-}
- DOCUMENT_SERVER_HOST=${DOCUMENT_SERVER_HOSTNAME-127.0.0.1}
- DOCUMENT_SERVER_PORT=8083
- JWT_ENABLED=true
- JWT_SECRET=${JWT_SECRET}
- JWT_HEADER=AuthorizationJwt
- CORE_MACHINEKEY=${CORE_MACHINEKEY:-}
volumes :
- ${WORKSPACE_DATA_LOCATION}:/config
Then run podman-compose up -d.
Database Where ONLYOFFICE Workspace keeps its portal data. The default runs its own MariaDB. The document editors keep their editing state in a PostgreSQL of their own, which is always built in.
Built-in MariaDB Your own MariaDB
Document editors Online collaborative editors for Word, Excel and PowerPoint files inside Documents.
With Document Server (Workspace) Portal only (Groups)
onlyoffice-workspace:latest · onlyoffice:pkg · mariadb:latest · postgres:16 — data in /containers /onlyoffice-workspace/data, /containers /onlyoffice-workspace/docserver, /containers /onlyoffice-workspace/mariadb, /containers /onlyoffice-workspace/postgres
A MariaDB of its own, on the stack's private network. Runs ONLYOFFICE Document Server and its PostgreSQL alongside the portal.
# .env
DIRECTOR_PROJECT=onlyoffice-workspace
PUID=1000
PGID=1000
TZ=UTC
HTTP_PORT=8080
MYSQL_SERVER_HOST=127.0.0.1
MYSQL_SERVER_PORT=3306
MYSQL_SERVER_DB_NAME=onlyoffice
MYSQL_SERVER_USER=onlyoffice
MYSQL_SERVER_PASS=<MYSQL_SERVER_PASS>
MYSQL_SERVER_ROOT_PASS=<MYSQL_SERVER_ROOT_PASS>
DOCUMENT_SERVER_HOST=${DOCUMENT_SERVER_HOSTNAME-127.0.0.1}
DOCUMENT_SERVER_PORT=8083
JWT_ENABLED=true
JWT_SECRET=<JWT_SECRET>
JWT_HEADER=AuthorizationJwt
CORE_MACHINEKEY=<CORE_MACHINEKEY>
WORKSPACE_DATA_LOCATION=/containers/onlyoffice-workspace/data
DOCSERVER_DATA_LOCATION=/containers/onlyoffice-workspace/docserver
MARIADB_DATA_LOCATION=/containers/onlyoffice-workspace/mariadb
POSTGRES_DATA_LOCATION=/containers/onlyoffice-workspace/postgres
# appjail-director.yml
options :
- alias :
- ip4_inherit :
services :
onlyoffice-workspace :
name : onlyoffice_workspace
options :
- container : 'args:--pull'
- template : !ENV '${PWD}/template.conf'
oci :
user : root
environment :
- PUID : !ENV '${PUID}'
- PGID : !ENV '${PGID}'
- TZ : !ENV '${TZ}'
- HTTP_PORT : !ENV '${HTTP_PORT}'
- MYSQL_SERVER_HOST : !ENV '${MYSQL_SERVER_HOST}'
- MYSQL_SERVER_PORT : !ENV '${MYSQL_SERVER_PORT}'
- MYSQL_SERVER_DB_NAME : !ENV '${MYSQL_SERVER_DB_NAME}'
- MYSQL_SERVER_USER : !ENV '${MYSQL_SERVER_USER}'
- MYSQL_SERVER_PASS : !ENV '${MYSQL_SERVER_PASS}'
- MYSQL_SERVER_ROOT_PASS : !ENV '${MYSQL_SERVER_ROOT_PASS}'
- DOCUMENT_SERVER_HOST : !ENV '${DOCUMENT_SERVER_HOST}'
- DOCUMENT_SERVER_PORT : !ENV '${DOCUMENT_SERVER_PORT}'
- JWT_ENABLED : !ENV '${JWT_ENABLED}'
- JWT_SECRET : !ENV '${JWT_SECRET}'
- JWT_HEADER : !ENV '${JWT_HEADER}'
- CORE_MACHINEKEY : !ENV '${CORE_MACHINEKEY}'
- WORKSPACE_DATA_LOCATION : !ENV '${WORKSPACE_DATA_LOCATION}'
- DOCSERVER_DATA_LOCATION : !ENV '${DOCSERVER_DATA_LOCATION}'
- MARIADB_DATA_LOCATION : !ENV '${MARIADB_DATA_LOCATION}'
- POSTGRES_DATA_LOCATION : !ENV '${POSTGRES_DATA_LOCATION}'
volumes :
- ONLYOFFICE_WORKSPACE_CONFIG_PATH : /config
mariadb :
name : mariadb
options :
- from : ghcr.io/daemonless/mariadb:latest
- template : !ENV '${PWD}/template.conf'
oci :
environment :
- PUID : "1000"
- PGID : "1000"
- TZ : !ENV '${TZ}'
- MYSQL_ROOT_PASSWORD : !ENV '${DB_ROOT_PASSWORD}'
- MYSQL_DATABASE : "onlyoffice"
- MYSQL_USER : "onlyoffice"
- MYSQL_PASSWORD : !ENV '${DB_PASSWORD}'
volumes :
- mariadb_data : /config
postgres :
name : postgres
options :
- from : ghcr.io/daemonless/postgres:16
- template : !ENV '${PWD}/postgres-template.conf'
oci :
environment :
- POSTGRES_DB : "onlyoffice"
- POSTGRES_USER : "onlyoffice"
- POSTGRES_PASSWORD : !ENV '${DB_PASSWORD}'
- POSTGRES_HOST_AUTH_METHOD : "trust"
volumes :
- postgres_data : /var/lib/postgresql/data
onlyoffice-documentserver :
name : onlyoffice_documentserver
options :
- from : ghcr.io/daemonless/onlyoffice:pkg
- template : !ENV '${PWD}/template.conf'
oci :
environment :
- DB_HOST : !ENV '${POSTGRES_HOSTNAME:-127.0.0.1}'
- DB_PORT : "5432"
- DB_NAME : "onlyoffice"
- DB_USER : "onlyoffice"
- DB_PWD : !ENV '${DB_PASSWORD}'
- HTTP_PORT : "8083"
- JWT_ENABLED : "true"
- JWT_SECRET : !ENV '${JWT_SECRET}'
- JWT_HEADER : "AuthorizationJwt"
- TZ : !ENV '${TZ}'
volumes :
- docserver_data : /config
volumes :
ONLYOFFICE_WORKSPACE_CONFIG_PATH :
device : '/containers /onlyoffice-workspace '
mariadb_data :
device : !ENV '${MARIADB_DATA_LOCATION}'
postgres_data :
device : !ENV '${POSTGRES_DATA_LOCATION}'
docserver_data :
device : !ENV '${DOCSERVER_DATA_LOCATION}'
# Makejail
ARG tag=latest
OPTION container=boot
OPTION overwrite=force
OPTION from=ghcr.io/daemonless /onlyoffice-workspace:${tag}
# template.conf
exec.start: "/bin/sh /etc/rc"
exec.stop: "/bin/sh /etc/rc.shutdown jail"
mount.devfs
persist
allow.mlock
Save the files above, then run appjail-director up.
onlyoffice-workspace:latest · mariadb:latest — data in /containers /onlyoffice-workspace/data, /containers /onlyoffice-workspace/mariadb
A MariaDB of its own, on the stack's private network. Projects, CRM, Mail, People and Calendar without the online document editors.
# .env
DIRECTOR_PROJECT=onlyoffice-workspace
PUID=1000
PGID=1000
TZ=UTC
HTTP_PORT=8080
MYSQL_SERVER_HOST=127.0.0.1
MYSQL_SERVER_PORT=3306
MYSQL_SERVER_DB_NAME=onlyoffice
MYSQL_SERVER_USER=onlyoffice
MYSQL_SERVER_PASS=<MYSQL_SERVER_PASS>
MYSQL_SERVER_ROOT_PASS=<MYSQL_SERVER_ROOT_PASS>
DOCUMENT_SERVER_HOST=${DOCUMENT_SERVER_HOSTNAME-127.0.0.1}
DOCUMENT_SERVER_PORT=8083
JWT_ENABLED=true
JWT_SECRET=<JWT_SECRET>
JWT_HEADER=AuthorizationJwt
CORE_MACHINEKEY=<CORE_MACHINEKEY>
WORKSPACE_DATA_LOCATION=/containers/onlyoffice-workspace/data
DOCSERVER_DATA_LOCATION=/containers/onlyoffice-workspace/docserver
MARIADB_DATA_LOCATION=/containers/onlyoffice-workspace/mariadb
POSTGRES_DATA_LOCATION=/containers/onlyoffice-workspace/postgres
# appjail-director.yml
options :
- alias :
- ip4_inherit :
services :
onlyoffice-workspace :
name : onlyoffice_workspace
options :
- container : 'args:--pull'
- template : !ENV '${PWD}/template.conf'
oci :
user : root
environment :
- PUID : !ENV '${PUID}'
- PGID : !ENV '${PGID}'
- TZ : !ENV '${TZ}'
- HTTP_PORT : !ENV '${HTTP_PORT}'
- MYSQL_SERVER_HOST : !ENV '${MYSQL_SERVER_HOST}'
- MYSQL_SERVER_PORT : !ENV '${MYSQL_SERVER_PORT}'
- MYSQL_SERVER_DB_NAME : !ENV '${MYSQL_SERVER_DB_NAME}'
- MYSQL_SERVER_USER : !ENV '${MYSQL_SERVER_USER}'
- MYSQL_SERVER_PASS : !ENV '${MYSQL_SERVER_PASS}'
- MYSQL_SERVER_ROOT_PASS : !ENV '${MYSQL_SERVER_ROOT_PASS}'
- DOCUMENT_SERVER_HOST : !ENV '${DOCUMENT_SERVER_HOST}'
- DOCUMENT_SERVER_PORT : !ENV '${DOCUMENT_SERVER_PORT}'
- JWT_ENABLED : !ENV '${JWT_ENABLED}'
- JWT_SECRET : !ENV '${JWT_SECRET}'
- JWT_HEADER : !ENV '${JWT_HEADER}'
- CORE_MACHINEKEY : !ENV '${CORE_MACHINEKEY}'
- WORKSPACE_DATA_LOCATION : !ENV '${WORKSPACE_DATA_LOCATION}'
- DOCSERVER_DATA_LOCATION : !ENV '${DOCSERVER_DATA_LOCATION}'
- MARIADB_DATA_LOCATION : !ENV '${MARIADB_DATA_LOCATION}'
- POSTGRES_DATA_LOCATION : !ENV '${POSTGRES_DATA_LOCATION}'
volumes :
- ONLYOFFICE_WORKSPACE_CONFIG_PATH : /config
mariadb :
name : mariadb
options :
- from : ghcr.io/daemonless/mariadb:latest
- template : !ENV '${PWD}/template.conf'
oci :
environment :
- PUID : "1000"
- PGID : "1000"
- TZ : !ENV '${TZ}'
- MYSQL_ROOT_PASSWORD : !ENV '${DB_ROOT_PASSWORD}'
- MYSQL_DATABASE : "onlyoffice"
- MYSQL_USER : "onlyoffice"
- MYSQL_PASSWORD : !ENV '${DB_PASSWORD}'
volumes :
- mariadb_data : /config
volumes :
ONLYOFFICE_WORKSPACE_CONFIG_PATH :
device : '/containers /onlyoffice-workspace '
mariadb_data :
device : !ENV '${MARIADB_DATA_LOCATION}'
# Makejail
ARG tag=latest
OPTION container=boot
OPTION overwrite=force
OPTION from=ghcr.io/daemonless /onlyoffice-workspace:${tag}
# template.conf
exec.start: "/bin/sh /etc/rc"
exec.stop: "/bin/sh /etc/rc.shutdown jail"
mount.devfs
persist
allow.mlock
Save the files above, then run appjail-director up.
onlyoffice-workspace:latest · onlyoffice:pkg · postgres:16 · your own database — data in /containers /onlyoffice-workspace/data, /containers /onlyoffice-workspace/docserver, /containers /onlyoffice-workspace/postgres
A MariaDB you already run. Create the database and a user with all privileges on it first, and set sql_mode=NO_ENGINE_SUBSTITUTION and max_allowed_packet=1G on that server. Runs ONLYOFFICE Document Server and its PostgreSQL alongside the portal.
# .env
DIRECTOR_PROJECT=onlyoffice-workspace
PUID=1000
PGID=1000
TZ=UTC
HTTP_PORT=8080
MYSQL_SERVER_HOST=127.0.0.1
MYSQL_SERVER_PORT=3306
MYSQL_SERVER_DB_NAME=onlyoffice
MYSQL_SERVER_USER=onlyoffice
MYSQL_SERVER_PASS=<MYSQL_SERVER_PASS>
MYSQL_SERVER_ROOT_PASS=<MYSQL_SERVER_ROOT_PASS>
DOCUMENT_SERVER_HOST=${DOCUMENT_SERVER_HOSTNAME-127.0.0.1}
DOCUMENT_SERVER_PORT=8083
JWT_ENABLED=true
JWT_SECRET=<JWT_SECRET>
JWT_HEADER=AuthorizationJwt
CORE_MACHINEKEY=<CORE_MACHINEKEY>
WORKSPACE_DATA_LOCATION=/containers/onlyoffice-workspace/data
DOCSERVER_DATA_LOCATION=/containers/onlyoffice-workspace/docserver
MARIADB_DATA_LOCATION=/containers/onlyoffice-workspace/mariadb
POSTGRES_DATA_LOCATION=/containers/onlyoffice-workspace/postgres
# appjail-director.yml
options :
- alias :
- ip4_inherit :
services :
onlyoffice-workspace :
name : onlyoffice_workspace
options :
- container : 'args:--pull'
- template : !ENV '${PWD}/template.conf'
oci :
user : root
environment :
- PUID : !ENV '${PUID}'
- PGID : !ENV '${PGID}'
- TZ : !ENV '${TZ}'
- HTTP_PORT : !ENV '${HTTP_PORT}'
- MYSQL_SERVER_HOST : !ENV '${MYSQL_SERVER_HOST}'
- MYSQL_SERVER_PORT : !ENV '${MYSQL_SERVER_PORT}'
- MYSQL_SERVER_DB_NAME : !ENV '${MYSQL_SERVER_DB_NAME}'
- MYSQL_SERVER_USER : !ENV '${MYSQL_SERVER_USER}'
- MYSQL_SERVER_PASS : !ENV '${MYSQL_SERVER_PASS}'
- MYSQL_SERVER_ROOT_PASS : !ENV '${MYSQL_SERVER_ROOT_PASS}'
- DOCUMENT_SERVER_HOST : !ENV '${DOCUMENT_SERVER_HOST}'
- DOCUMENT_SERVER_PORT : !ENV '${DOCUMENT_SERVER_PORT}'
- JWT_ENABLED : !ENV '${JWT_ENABLED}'
- JWT_SECRET : !ENV '${JWT_SECRET}'
- JWT_HEADER : !ENV '${JWT_HEADER}'
- CORE_MACHINEKEY : !ENV '${CORE_MACHINEKEY}'
- WORKSPACE_DATA_LOCATION : !ENV '${WORKSPACE_DATA_LOCATION}'
- DOCSERVER_DATA_LOCATION : !ENV '${DOCSERVER_DATA_LOCATION}'
- MARIADB_DATA_LOCATION : !ENV '${MARIADB_DATA_LOCATION}'
- POSTGRES_DATA_LOCATION : !ENV '${POSTGRES_DATA_LOCATION}'
volumes :
- ONLYOFFICE_WORKSPACE_CONFIG_PATH : /config
postgres :
name : postgres
options :
- from : ghcr.io/daemonless/postgres:16
- template : !ENV '${PWD}/postgres-template.conf'
oci :
environment :
- POSTGRES_DB : "onlyoffice"
- POSTGRES_USER : "onlyoffice"
- POSTGRES_PASSWORD : !ENV '${DB_PASSWORD}'
- POSTGRES_HOST_AUTH_METHOD : "trust"
volumes :
- postgres_data : /var/lib/postgresql/data
onlyoffice-documentserver :
name : onlyoffice_documentserver
options :
- from : ghcr.io/daemonless/onlyoffice:pkg
- template : !ENV '${PWD}/template.conf'
oci :
environment :
- DB_HOST : !ENV '${POSTGRES_HOSTNAME:-127.0.0.1}'
- DB_PORT : "5432"
- DB_NAME : "onlyoffice"
- DB_USER : "onlyoffice"
- DB_PWD : !ENV '${DB_PASSWORD}'
- HTTP_PORT : "8083"
- JWT_ENABLED : "true"
- JWT_SECRET : !ENV '${JWT_SECRET}'
- JWT_HEADER : "AuthorizationJwt"
- TZ : !ENV '${TZ}'
volumes :
- docserver_data : /config
volumes :
ONLYOFFICE_WORKSPACE_CONFIG_PATH :
device : '/containers /onlyoffice-workspace '
postgres_data :
device : !ENV '${POSTGRES_DATA_LOCATION}'
docserver_data :
device : !ENV '${DOCSERVER_DATA_LOCATION}'
# Makejail
ARG tag=latest
OPTION container=boot
OPTION overwrite=force
OPTION from=ghcr.io/daemonless /onlyoffice-workspace:${tag}
# template.conf
exec.start: "/bin/sh /etc/rc"
exec.stop: "/bin/sh /etc/rc.shutdown jail"
mount.devfs
persist
allow.mlock
Save the files above, then run appjail-director up.
onlyoffice-workspace:latest · your own database — data in /containers /onlyoffice-workspace/data
A MariaDB you already run. Create the database and a user with all privileges on it first, and set sql_mode=NO_ENGINE_SUBSTITUTION and max_allowed_packet=1G on that server. Projects, CRM, Mail, People and Calendar without the online document editors.
# .env
DIRECTOR_PROJECT=onlyoffice-workspace
PUID=1000
PGID=1000
TZ=UTC
HTTP_PORT=8080
MYSQL_SERVER_HOST=127.0.0.1
MYSQL_SERVER_PORT=3306
MYSQL_SERVER_DB_NAME=onlyoffice
MYSQL_SERVER_USER=onlyoffice
MYSQL_SERVER_PASS=<MYSQL_SERVER_PASS>
MYSQL_SERVER_ROOT_PASS=<MYSQL_SERVER_ROOT_PASS>
DOCUMENT_SERVER_HOST=${DOCUMENT_SERVER_HOSTNAME-127.0.0.1}
DOCUMENT_SERVER_PORT=8083
JWT_ENABLED=true
JWT_SECRET=<JWT_SECRET>
JWT_HEADER=AuthorizationJwt
CORE_MACHINEKEY=<CORE_MACHINEKEY>
WORKSPACE_DATA_LOCATION=/containers/onlyoffice-workspace/data
DOCSERVER_DATA_LOCATION=/containers/onlyoffice-workspace/docserver
MARIADB_DATA_LOCATION=/containers/onlyoffice-workspace/mariadb
POSTGRES_DATA_LOCATION=/containers/onlyoffice-workspace/postgres
# appjail-director.yml
options :
- alias :
- ip4_inherit :
services :
onlyoffice-workspace :
name : onlyoffice_workspace
options :
- container : 'args:--pull'
- template : !ENV '${PWD}/template.conf'
oci :
user : root
environment :
- PUID : !ENV '${PUID}'
- PGID : !ENV '${PGID}'
- TZ : !ENV '${TZ}'
- HTTP_PORT : !ENV '${HTTP_PORT}'
- MYSQL_SERVER_HOST : !ENV '${MYSQL_SERVER_HOST}'
- MYSQL_SERVER_PORT : !ENV '${MYSQL_SERVER_PORT}'
- MYSQL_SERVER_DB_NAME : !ENV '${MYSQL_SERVER_DB_NAME}'
- MYSQL_SERVER_USER : !ENV '${MYSQL_SERVER_USER}'
- MYSQL_SERVER_PASS : !ENV '${MYSQL_SERVER_PASS}'
- MYSQL_SERVER_ROOT_PASS : !ENV '${MYSQL_SERVER_ROOT_PASS}'
- DOCUMENT_SERVER_HOST : !ENV '${DOCUMENT_SERVER_HOST}'
- DOCUMENT_SERVER_PORT : !ENV '${DOCUMENT_SERVER_PORT}'
- JWT_ENABLED : !ENV '${JWT_ENABLED}'
- JWT_SECRET : !ENV '${JWT_SECRET}'
- JWT_HEADER : !ENV '${JWT_HEADER}'
- CORE_MACHINEKEY : !ENV '${CORE_MACHINEKEY}'
- WORKSPACE_DATA_LOCATION : !ENV '${WORKSPACE_DATA_LOCATION}'
- DOCSERVER_DATA_LOCATION : !ENV '${DOCSERVER_DATA_LOCATION}'
- MARIADB_DATA_LOCATION : !ENV '${MARIADB_DATA_LOCATION}'
- POSTGRES_DATA_LOCATION : !ENV '${POSTGRES_DATA_LOCATION}'
volumes :
- ONLYOFFICE_WORKSPACE_CONFIG_PATH : /config
volumes :
ONLYOFFICE_WORKSPACE_CONFIG_PATH :
device : '/containers /onlyoffice-workspace '
# Makejail
ARG tag=latest
OPTION container=boot
OPTION overwrite=force
OPTION from=ghcr.io/daemonless /onlyoffice-workspace:${tag}
# template.conf
exec.start: "/bin/sh /etc/rc"
exec.stop: "/bin/sh /etc/rc.shutdown jail"
mount.devfs
persist
allow.mlock
Save the files above, then run appjail-director up.
Setup Instructions
Modules not included. External CalDAV/CardDAV sync (Radicale) is not included; the built-in Calendar and People modules work without it. The Mail module (external IMAP/SMTP aggregation) is not included yet.
Interactive Configuration
Parameters
Environment Variables
Variable
Default
Description
PUID
1000
User ID for the application process
PGID
1000
Group ID for the application process
TZ
UTC
Timezone for the containers
HTTP_PORT
8080
HTTP listen port for the Workspace portal (default: 8080)
MYSQL_SERVER_HOST
127.0.0.1
MariaDB server hostname
MYSQL_SERVER_PORT
3306
MariaDB server port (default: 3306)
MYSQL_SERVER_DB_NAME
onlyoffice
MariaDB database name (default: onlyoffice)
MYSQL_SERVER_USER
onlyoffice
MariaDB username (default: onlyoffice)
MYSQL_SERVER_PASS
<MYSQL_SERVER_PASS>
MariaDB password
MYSQL_SERVER_ROOT_PASS
<MYSQL_SERVER_ROOT_PASS>
MariaDB root password for applying global sql_mode and max_allowed_packet settings at startup
DOCUMENT_SERVER_HOST
${DOCUMENT_SERVER_HOSTNAME-127.0.0.1}
Document Server hostname
DOCUMENT_SERVER_PORT
8083
Document Server HTTP port (default: 8083)
JWT_ENABLED
true
Enable JWT validation with Document Server (default: true)
JWT_SECRET
<JWT_SECRET>
Shared JWT secret between Workspace and Document Server
JWT_HEADER
AuthorizationJwt
JWT HTTP header name (default: AuthorizationJwt)
CORE_MACHINEKEY
<CORE_MACHINEKEY>
Portal encryption and token signing key (generated and persisted on first start if unset)
WORKSPACE_DATA_LOCATION
/containers/onlyoffice-workspace/data
Path to store ONLYOFFICE Workspace portal data, uploads, and logs
DOCSERVER_DATA_LOCATION
/containers/onlyoffice-workspace/docserver
Path to store Document Server cache and data
MARIADB_DATA_LOCATION
/containers/onlyoffice-workspace/mariadb
Path to store MariaDB database files
POSTGRES_DATA_LOCATION
/containers/onlyoffice-workspace/postgres
Path to store PostgreSQL database files
DB_PASSWORD
<DB_PASSWORD>
Database password for MariaDB and PostgreSQL
DB_ROOT_PASSWORD
<DB_ROOT_PASSWORD>
MariaDB root password (built-in MariaDB only)
MARIADB_HOSTNAME
``
Where the portal finds MariaDB (fjord sets this for the built-in one; 127.0.0.1 on host networking)
MARIADB_PORT
``
MariaDB port (your own MariaDB)
MARIADB_DATABASE
``
Database name (your own MariaDB)
MARIADB_USER
``
Database user (your own MariaDB)
POSTGRES_HOSTNAME
``
Where Document Server finds PostgreSQL (fjord sets this; 127.0.0.1 on host networking)
DOCUMENT_SERVER_HOSTNAME
``
Where the portal finds Document Server (127.0.0.1 on host networking; empty disables online editors)
Volumes
Path
Description
/config
Persistent portal data, uploads, certificates, and logs
Implementation Details
Architectures: amd64
User: bsd (UID/GID set via PUID/PGID ). Defaults to 1000:1000.
Base: Built on ghcr.io/daemonless /base (FreeBSD 15.1).
mlock: Requires --annotation 'org.freebsd.jail.allow.mlock=true' (ocijail 0.5.0+ )
Need help? Join our Discord community.