administrators
-
Установка ONLYOFFICE Docs
OnlyOfficeНиже — полная инструкция по установке отдельного ONLYOFFICE Docs в контейнере Incus, с конфигом Nginx сразу на 443 (HTTPS).
Часть 1: Подготовка контейнера Incus1.1. Создание контейнера и выделение ресурсов
# На хосте incus launch images:debian/12 ooffice-docs incus config set ooffice-docs limits.memory 4GB incus config set ooffice-docs limits.cpu 21.2. Починка Docker в Incus (обязательно)
Без этих шагов Docker внутри контейнера не заработает:
# Разрешаем вложенность incus config set ooffice-docs security.nesting=true # Пробрасываем FUSE incus config set ooffice-docs linux.kernel_modules=fuse incus config device add ooffice-docs fuse unix-char path=/dev/fuse # Исправляем ошибку с ip_unprivileged_port_start incus config set ooffice-docs linux.sysctl.net.ipv4.ip_unprivileged_port_start=0 # Перезапускаем incus restart ooffice-docs1.3. Увеличение лимитов keyring на хосте
Исправляет ошибку
unable to join session keyring: disk quota exceeded:# На хосте sudo sysctl -w kernel.keys.maxkeys=20000 sudo sysctl -w kernel.keys.maxbytes=500000 sudo tee /etc/sysctl.d/99-docker-keyring.conf <<'EOF' kernel.keys.maxkeys = 20000 kernel.keys.maxbytes = 500000 EOF sudo sysctl -p /etc/sysctl.d/99-docker-keyring.conf
Часть 2: Установка зависимостей внутри контейнераincus exec ooffice-docs -- bash apt update apt install -y curl gnupg postgresql rabbitmq-server redis-server nginx-extras
️ Часть 3: Настройка PostgreSQLsu - postgres -c "psql -c \"CREATE USER onlyoffice WITH PASSWORD 'onlyoffice';\"" su - postgres -c "psql -c \"CREATE DATABASE onlyoffice OWNER onlyoffice;\"" su - postgres -c "psql -c \"ALTER ROLE onlyoffice WITH LOGIN CREATEDB;\""Если пользователь или база уже существуют — ошибки игнорируются.
️ Часть 4: Настройка debconfecho "onlyoffice-documentserver onlyoffice/ds-port select 8080" | debconf-set-selections echo "onlyoffice-documentserver onlyoffice/db-host string localhost" | debconf-set-selections echo "onlyoffice-documentserver onlyoffice/db-name string onlyoffice" | debconf-set-selections echo "onlyoffice-documentserver onlyoffice/db-user string onlyoffice" | debconf-set-selections echo "onlyoffice-documentserver onlyoffice/db-pwd password onlyoffice" | debconf-set-selections echo "onlyoffice-documentserver onlyoffice/rabbitmq-host string localhost" | debconf-set-selections echo "onlyoffice-documentserver onlyoffice/rabbitmq-user string guest" | debconf-set-selections echo "onlyoffice-documentserver onlyoffice/rabbitmq-pwd password guest" | debconf-set-selections echo "onlyoffice-documentserver onlyoffice/jwt-enabled boolean true" | debconf-set-selections echo "onlyoffice-documentserver onlyoffice/jwt-secret password my_jwt_secret_here" | debconf-set-selections # Проверка debconf-show onlyoffice-documentserver | grep -E "port|db-|jwt"
Часть 5: GPG-ключ и репозиторийmkdir -p -m 700 /root/.gnupg gpg --no-default-keyring --keyring gnupg-ring:/tmp/onlyoffice.gpg \ --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys CB2DE8E5 chmod 644 /tmp/onlyoffice.gpg chown root:root /tmp/onlyoffice.gpg mv /tmp/onlyoffice.gpg /usr/share/keyrings/onlyoffice.gpg echo "deb [signed-by=/usr/share/keyrings/onlyoffice.gpg] https://download.onlyoffice.com/repo/debian squeeze main" \ | tee /etc/apt/sources.list.d/onlyoffice.list apt update
Часть 6: Установка ONLYOFFICE Docsapt install -y onlyoffice-documentserverВо время установки debconf не должен ничего спрашивать. Если спросит — введите: host=
localhost, db=onlyoffice, user=onlyoffice, password=onlyoffice, port=8080.
Часть 7: Проверкаsystemctl status ds-docservice ss -tlnp | grep 8080 curl -I http://localhost:8080/ds-docserviceпри первом запуске может 30–60 секунд инициализировать БД.curlдолжен вернуть200или302.
Часть 8: Nginx на хосте (HTTPS, порт 443)8.1. Узнайте IP контейнера
incus list ooffice-docsДопустим, IP =
10.214.97.8.8.2. Получите SSL-сертификат (если ещё нет)
# На хосте apt install -y certbot python3-certbot-nginx mkdir -p /var/www/certbot certbot --nginx -d docs.example.comCertbot создаст сертификаты в
/etc/letsencrypt/live/docs.example.com/. Если используете самоподписанный — пропустите этот шаг и укажите свои пути в конфиге.8.3. Полный конфиг Nginx на хосте
Создайте
/etc/nginx/sites-available/onlyoffice-docs:# Редирект HTTP -> HTTPS + ACME для Let's Encrypt server { listen 80; listen [::]:80; server_name docs.example.com; location /.well-known/acme-challenge/ { root /var/www/certbot; } location / { return 301 https://$host$request_uri; } } # WebSocket map для корректного апгрейда соединения map $http_upgrade $connection_upgrade { default upgrade; '' close; } # Основной HTTPS-сервер server { listen 443 ssl; listen [::]:443 ssl; http2 on; server_name docs.example.com; # --- SSL сертификаты --- ssl_certificate /etc/letsencrypt/live/docs.example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/docs.example.com/privkey.pem; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on; ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m; add_header Strict-Transport-Security "max-age=31536000" always; client_max_body_size 512M; location / { # ЗАМЕНИТЕ на реальный IP контейнера ooffice-docs proxy_pass http://10.214.97.8:8080; proxy_http_version 1.1; proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-Host $http_host; proxy_set_header X-Forwarded-Port $server_port; # WebSocket — для совместного редактирования proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade; proxy_connect_timeout 60s; proxy_send_timeout 600s; proxy_read_timeout 600s; # КРИТИЧНО: подмена внутренних адресов на внешний HTTPS # Docs генерирует ссылки с localhost:8080 — их нужно заменить proxy_set_header Accept-Encoding ""; gzip off; sub_filter 'http://127.0.0.1:8080' 'https://docs.example.com'; sub_filter 'http://localhost:8080' 'https://docs.example.com'; sub_filter_once off; sub_filter_types text/html application/javascript application/json; } }8.4. Активация
ln -s /etc/nginx/sites-available/onlyoffice-docs /etc/nginx/sites-enabled/ nginx -t systemctl reload nginx8.5. Проверка
curl -I https://docs.example.com/Должен вернуть
HTTP/2 200илиHTTP/2 302.
Часть 9: Интеграция с Nextcloud- В Nextcloud: Приложения → Office & Text → ONLYOFFICE → Установить.
- В Настройки → ONLYOFFICE:
- Document Editing Service address:
https://docs.example.com/ - Secret key (JWT):
my_jwt_secret_here(тот же, что в debconf).
- Document Editing Service address:
- Откройте любой документ в Nextcloud — он должен открыться в редакторе.
Если редактор не загружается — проверьте в браузере (F12 → Network), что запросы к
docs.example.comвозвращают200, а не404или502. Основные причины: неверный IP вproxy_pass, отсутствиеsub_filter, несовпадение JWT-секрета.
Ключевые нюансыsub_filterобязателен — без него Docs будет ссылаться наlocalhost:8080, и редактор не загрузится через внешний домен.sub_filterзаменяет наhttps://— если оставитьhttp://, браузер заблокирует загрузку как mixed content.- WebSocket-заголовки (
Upgrade,Connection) — без них не работает совместное редактирование. - JWT-секрет должен совпадать в debconf, в конфиге Docs и в настройках плагина Nextcloud.
- Порт 8080 внутри контейнера — выбран, чтобы не конфликтовать с Nginx на хосте (порт 80/443).
Готово — Docs работает как отдельный сервис, и Nextcloud может его использовать.
-
Установка ONLYOFFICE Workspace
OnlyOfficeНиже — полная инструкция, основанная на всех нюансах, с которыми вы столкнулись при установке Docker в непривилегированном контейнере Incus и развёртывании ONLYOFFICE Workspace.
️ Часть 1: Починка Docker в непривилегированном контейнере IncusВсе команды в этом разделе выполняются на хосте (Debian 13), если не указано иное.
1.1. Разрешение вложенности и проброс FUSE
# Разрешаем вложенные контейнеры (nesting) incus config set ooffice security.nesting=true # Пробрасываем устройство FUSE (нужно для fuse-overlayfs, но может пригодиться) incus config set ooffice linux.kernel_modules=fuse incus config device add ooffice fuse unix-char path=/dev/fuse # Перезапускаем контейнер для применения настроек incus restart ooffice1.2. Увеличение лимитов keyring (исправляет
disk quota exceeded)Ошибка
unable to join session keyring: disk quota exceededвозникает из-за того, что дефолтный лимит в 200 ключей слишком мал для работы Docker внутри контейнера .# Временное увеличение (действует до перезагрузки) sudo sysctl -w kernel.keys.maxkeys=20000 sudo sysctl -w kernel.keys.maxbytes=500000 # Постоянное увеличение sudo tee /etc/sysctl.d/99-docker-keyring.conf <<'EOF' kernel.keys.maxkeys = 20000 kernel.keys.maxbytes = 500000 EOF sudo sysctl -p /etc/sysctl.d/99-docker-keyring.conf1.3. Исправление доступа к
net.ipv4.ip_unprivileged_port_startОшибка
reopen fd 8: permission denied— это известный баг взаимодействияruncи AppArmor в LXC/Incus . Обходной путь — предустановить sysctl через Incus.incus config set ooffice linux.sysctl.net.ipv4.ip_unprivileged_port_start=0 incus restart ooffice1.4. Проверка работы Docker
incus exec ooffice -- bash docker run hello-worldЕсли видите сообщение «Hello from Docker!» — Docker работает.
Часть 2: Развёртывание ONLYOFFICE Workspace через Docker ComposeВсе команды в этом разделе выполняются внутри контейнера
ooffice.2.1. Установка Docker Compose и клонирование репозитория
apt update && apt install -y docker-compose-plugin git cd /opt git clone https://github.com/ONLYOFFICE/Docker-CommunityServer cd Docker-CommunityServer2.2. Настройка
docker-compose.workspace.ymlВ официальной инструкции для Debian 11+ указано, что нужно раскомментировать строку
cgroup. Однако, как показала ваша практика, mail-server не работает на новых ядрах (ошибка Segmentation Fault, код 139). Поэтому его нужно полностью исключить из конфига.Откройте файл:
nano docker-compose.workspace.ymlВнесите следующие изменения:
- Удалите секцию
onlyoffice-mail-serverцеликом. - В секции
onlyoffice-community-server:- Уберите
onlyoffice-mail-serverизdepends_on. - Уберите все переменные
MAIL_SERVER_*изenvironment. - Важно: Добавьте переменную
MAIL_SERVER_API_HOST=127.0.0.1(не пустую). Это необходимо, чтобы скрипт инициализации не падал с ошибкойMAIL_SERVER_API_HOST not correct.
- Уберите
- В секции
onlyoffice-elasticsearch:- Удалите блок
ulimitsсmemlock: -1. Это исправляет ошибкуerror setting rlimit type 8: operation not permitted. - Убедитесь, что в
environmentустановленоbootstrap.memory_lock=false.
- Удалите блок
2.3. Увеличение
vm.max_map_countдля ElasticsearchВыполните на хосте:
sudo sysctl -w vm.max_map_count=262144 echo "vm.max_map_count = 262144" | sudo tee /etc/sysctl.d/99-elasticsearch.conf2.4. Запуск Workspace
# Внутри контейнера ooffice cd /opt/Docker-CommunityServer docker compose -f docker-compose.workspace.yml up -dПервый запуск может занять 5–15 минут — Community Server инициализирует базу данных . Дождитесь, пока все контейнеры перейдут в статус
Up(без циклов перезапуска).
Часть 3: Настройка Nginx на хосте (обратный прокси)3.1. Конфиг Nginx с HTTPS
Создайте файл
/etc/nginx/sites-available/onlyoffice-workspaceна хосте:# Редирект HTTP -> HTTPS server { listen 80; listen [::]:80; server_name office.example.com; location /.well-known/acme-challenge/ { root /var/www/certbot; } location / { return 301 https://$host$request_uri; } } # HTTPS server { listen 443 ssl; listen [::]:443 ssl; http2 on; server_name office.example.com; ssl_certificate /etc/letsencrypt/live/office.example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/office.example.com/privkey.pem; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers HIGH:!aNULL:!MD5; add_header Strict-Transport-Security "max-age=31536000" always; client_max_body_size 512M; location / { # ЗАМЕНИТЕ на реальный IP вашего контейнера ooffice proxy_pass http://10.214.97.7:80; proxy_http_version 1.1; proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-Host $http_host; proxy_set_header X-Forwarded-Port $server_port; # WebSocket для совместного редактирования proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_connect_timeout 60s; proxy_send_timeout 600s; proxy_read_timeout 600s; # Подмена внутренних ссылок на внешний HTTPS proxy_set_header Accept-Encoding ""; gzip off; sub_filter 'http://127.0.0.1' 'https://office.example.com'; sub_filter 'http://localhost' 'https://office.example.com'; sub_filter_once off; sub_filter_types text/html application/javascript application/json; } }3.2. Активация
sudo ln -s /etc/nginx/sites-available/onlyoffice-workspace /etc/nginx/sites-enabled/ sudo nginx -t sudo systemctl reload nginx
Часть 4: Первичная настройка в веб-интерфейсе- Откройте браузер и перейдите на
https://office.example.com. - Если видите страницу «We are working on it» — обновите её один раз (Ctrl+F5). Если не помогло, откройте в режиме инкогнито.
- Должна появиться страница «Welcome to Your ONLYOFFICE Portal» (
/Wizard.aspx). - Заполните поля:
- Password / Confirm password: придумайте пароль для администратора (минимум 8 символов).
- Your portal is registered from the following email: введите email (будет логином).
- Language: выберите Russian.
- Time Zone: выберите свой часовой пояс.
- Поставьте галочку «By checking this box you accept the terms of the License Agreements» (обязательно).
- Нажмите Continue.
- После этого вы попадёте на страницу входа. Войдите с указанным email и паролем.
Готово — вы в личном кабинете ONLYOFFICE Workspace с возможностью создавать документы, таблицы и презентации.
- Удалите секцию