В этой статье мы установим ONLYOFFICE в docker на Intel NUC и на этом подойдем к завершению цикла статей «Домашнее облако на Astra Linux: от А до Я».
Рассматривал я три офиса:
- ONLYOFFICE;
- Collabora Online (CODE);
- Nextcloud office.
Collabora Online (CODE)
Это движок LibreOffice, завернутый в веб-интерфейс.
Минусы: Интерфейс хоть и имеет ленточный режим, но все равно ощущается как LibreOffice, а не MS Office. Родной формат - ODF. При открытии DOCX/XLSX происходит конвертация, что сильнее может нагружать слабый процессор Intel NUC и может иногда сломать сложное форматирование.
Nextcloud Office (встроенное приложение)
Это не отдельный офис, а просто обертка, которая ставит Collabora прямо внутрь веб-сервера Nextcloud. Запуск тяжелого офиса внутри PHP/Nginx - плохая идея для Celeron N3700. Это создаст кашу в зависимостях, и при открытии документа Nextcloud может просто лечь вместе с офисом.
По этому я решил остановится на ONLYOFFICE.
ONLYOFFICE (Document Server Community Edition)
Это практически полная копия ленты MS Office. Те же вкладки, меню и логика расположения кнопок.
Использует OOXML (DOCX, XLSX, PPTX) как свои родные форматы. Документы Word не поедут при открытии, серверу не нужно тратить ресурсы процессора на их конвертацию. Бесплатная для дома. Ограничение в 20 одновременных подключений для семьи/личного использования вообще незаметно.
Почему я решил использовать ONLYOFFICE в Docker:
Celeron N3700 (TDP 6W) - отличный процессор для роутера, базы данных или Nextcloud. Но любой облачный офис - это очень тяжелая задача. При открытии или сохранении документа процессор будет улетать в 100% на несколько секунд. Это нормально.
Главное узкое горлышко - это 8 ГБ ОЗУ. Astra Linux + Nextcloud + PostgreSQL + Redis в простое съедает около 1.5 - 2.5 ГБ ОЗУ. Стандартный Docker образ ONLYOFFICE из коробки займет еще 1.5 - 2 ГБ ОЗУ.
Итого у нас останется около 4 ГБ на кэширование и открытие самих документов. Этого хватит для комфортной работы, но систему нужно немного подстраховать в виде swap, что мы уже и сделали при установке Astra Linux. Напомню, swap сделали в размере 4 ГБ.
Intel NUC и так работает 24/7. Если ONLYOFFICE локально упадет из-за нехватки памяти или конфликта пакетов, может пострадать основной nginx/php-fpm Nextcloud. В Docker контейнер изолирован. Если он съест всю память или упадет, Nextcloud продолжит работать. Мы просто перезапустим контейнер одной командой, не трогая сервер.
Установка Docker
Для начало, установим Docker и Compose на сервер Intel NUC с Nextcloud.
sudo apt install -y docker.io docker-compose-v2
Если вы хотите запускать docker не от рута, то добавьте пользователя в группу docker
sudo usermod -aG docker $USER
Создадим директорию в которой будем хранить docker compose файл.
mkdir -p Docker/ONLYOFFICE && cd Docker/ONLYOFFICE
Подготовка SSL-сертификатов (SAN)
Так как мы будем заходить в Nextcloud и ONLYOFFICE как из локальной сети (192.168.31.60), так и через WireGuard (10.0.0.2), наши самоподписанные сертификаты обязаны содержать оба этих IP-адреса в поле SAN (Subject Alternative Name). Иначе Docker-контейнер и браузер будут отклонять соединение.
Создаем конфиг с SAN:
cat > /tmp/openssl.cnf << 'EOF'
[req]
default_bits = 2048
prompt = no
default_md = sha256
distinguished_name = dn
req_extensions = v3_req
[dn]
C = RU
ST = Moscow
L = Moscow
O = Home
CN = 192.168.31.60
[v3_req]
subjectAltName = @alt_names
[alt_names]
IP.1 = 192.168.31.60
IP.2 = 127.0.0.1
IP.3 = 10.0.0.2
DNS.1 = localhost
EOF
Генерируем сертификат для ONLYOFFICE и Nextcloud:
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/nginx/ssl/onlyoffice.key -out /etc/nginx/ssl/onlyoffice.crt -config /tmp/openssl.cnf -extensions v3_req
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/nginx/ssl/nextcloud.key -out /etc/nginx/ssl/nextcloud.crt -config /tmp/openssl.cnf -extensions v3_req
К сертификатам вернемся чуть позже.
Настройка Nginx (Reverse Proxy)
Порт 80 и 443 у нас заняты. Поэтому ONLYOFFICE внутри контейнера будет слушать 8880, а Nginx будет проксировать на него HTTPS-трафик с порта 8883.
Создаем конфиг onlyoffice:
sudo nvim /etc/nginx/sites-available/onlyoffice
server {
listen 8883 ssl http2;
listen [::]:8883 ssl http2;
server_name _;
ssl_certificate /etc/nginx/ssl/onlyoffice.crt;
ssl_certificate_key /etc/nginx/ssl/onlyoffice.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers off;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 1d;
access_log /var/log/nginx/onlyoffice_access.log;
error_log /var/log/nginx/onlyoffice_error.log;
location / {
proxy_pass http://127.0.0.1:8880;
proxy_http_version 1.1;
# ВАЖНО: порт обязателен, иначе ONLYOFFICE будет редиректить на 443
proxy_set_header Host $host:$server_port;
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 $host:$server_port;
# Динамические редиректы (вместо хардкода IP)
proxy_redirect ~^http://127\.0\.0\.1:8880(/.*)$ https://$host:$server_port$1;
proxy_redirect ~^http://127\.0\.0\.1(/.*)$ https://$host:$server_port$1;
proxy_redirect ~^https://127\.0\.0\.1(/.*)$ https://$host:$server_port$1;
# WebSocket для совместного редактирования
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_connect_timeout 300;
proxy_send_timeout 300;
proxy_read_timeout 300;
proxy_buffering off;
proxy_request_buffering off;
}
}
$host и $server_port в proxy_redirect. Это делает Nginx "умным": он автоматически подставит тот IP и порт, по которому пришел клиент (будь то 192.168.31.60 или 10.0.0.2), и нам не придется вручную править конфиг при смене сети.Создаем симлинк конфига и активируем его в enabled:
sudo ln -s /etc/nginx/sites-available/onlyoffice /etc/nginx/sites-enabled/
Перезагружаем Nginx:
sudo nginx -t && sudo systemctl reload nginx
Установка и запуск ONLYOFFICE
Подготавливаем директорию для Docker и сертификатов. Контейнер должен доверять сертификату Nextcloud, чтобы иметь возможность скачивать документы для редактирования. По этому создаем директорию certs и копируем в нее ранее созданные сертификаты о котороых обещал вернуться чуть позже.
mkdir -p ~/Docker/ONLYOFFICE/certs
sudo cp /etc/nginx/ssl/nextcloud.crt ~/Docker/ONLYOFFICE/certs/
sudo cp /etc/nginx/ssl/onlyoffice.crt ~/Docker/ONLYOFFICE/certs/
Создаем и вставляем docker-compose.yml:
nvim docker-compose.yml
services:
onlyoffice-document-server:
image: onlyoffice/documentserver
container_name: onlyoffice-document-server
restart: always
ports:
- "8880:80"
environment:
- JWT_ENABLED=true
- JWT_SECRET=ЗДЕСЬ_ОЧЕНЬ_СЛОЖНЫЙ_КЛЮЧ
- JWT_HEADER=AuthorizationJwt
- NODE_TLS_REJECT_UNAUTHORIZED=0
- NODE_EXTRA_CA_CERTS=/usr/local/share/ca-certificates/nextcloud.crt
volumes:
- ./data:/var/www/onlyoffice/Data
- ./logs:/var/log/onlyoffice
- ./lib:/var/lib/onlyoffice
- ./cache:/var/lib/onlyoffice/documentserver/App_Data/cache/files
- ./fonts:/usr/share/fonts/truetype/custom
- ./certs:/usr/local/share/ca-certificates:ro
extra_hosts:
- "host.docker.internal:host-gateway"
tmpfs:
- /run:rw,noexec,nosuid,size=64m
- /run/lock:rw,noexec,nosuid,size=64m
В этом конфиге Вам достаточно заменить только порт и придумать секретный ключ (абсолютно любой). Не буду описывать каждую строчку, все равно после прочтения вы ее 99% забудете, по этому опишу в крадце.
| Ключ | Значение | Описание |
|---|---|---|
| onlyoffice-document-server | все перечисленное ниже | любое название/можно заменить на ваше |
| image | onlyoffice/documentserver | образ (ключ) и его название (значение) |
| container_name | onlyoffice-document-server | название контейнера/можно заменить на ваше |
| restart | always | всегда перезапускать контейнер если упадет |
| ports | 8880:80 | ПОРТ_ХОСТ:ПОРТ_КОНТЕЙНЕРА (при обращении на 8880 порт, мы будем попадать на 80 порт внутри контейнера). Меняем на свое если порты отличаются от моих. |
| environment | JWT_ENABLED=true | включаем jwt токен |
| JWT_SECRET=ВСТАВЛЯЕМ_СВОЕ | здесь обязательно меняем на свое значение (придумываем любое) | |
| JWT_HEADER=AuthorizationJwt | указываем метод jwt токена. | |
| NODE_EXTRA_CA_CERTS=/usr/local/share/ca-certificates/nextcloud.crt | здесь указываем путь до корневого сертификата внутри контейнера. (меняем если у вас другой путь или название сертификата). Во всех остальных случая ничего тут не меняем. | |
| volumes | ./data:/vaw/www/onlyoffice/Data | в разделе volumes мы указываем мост между директорией Data на нашем хосте и внутри контейнера. Это нужно для сохранения настроек контейнера, если его удалить и пересоздать, то все конфиги и настройки он заберет из таких мостов и не нужно настраивать заново контейнер. Ничего тут не меняем. |
| extra_hosts | host.docker.internal:host-gateway | тоже не трогаем и не меняем. |
| tmpfs | /run:rw,noexec,nosuid,size=64m | тоже не трогаем и не меняем. |
Запускаем:
sudo docker compose up -d
Ждем 1-2 минуты (при первом запуске инициализируется база) и проверяем healthcheck:
curl -k https://192.168.31.60:8883/healthcheck (Должно вернуть true).
Добавляем сертификат ONLYOFFICE в доверенные на самом хосте (чтобы PHP-FPM Nextcloud доверял ему при внутренних запросах):
sudo cp /etc/nginx/ssl/onlyoffice.crt /usr/local/share/ca-certificates/
sudo cp /etc/nginx/ssl/nextcloud.crt /usr/local/share/ca-certificates/
sudo update-ca-certificates
sudo systemctl restart php8.2-fpm
Настройка Nextcloud и «Секретные» внутренние пути
Открываем Nextcloud → Администрирование → ONLYOFFICE.
Здесь кроется самая частая ошибка при настройке. Заполняем поля строго так, как указано ниже:
| Поле | Значение |
|---|---|
| Адрес ONLYOFFICE Docs | https://192.168.31.60:8883/(Это адрес для браузера. Его мы будем менять скриптом) |
| Секретный ключ | ВАШ_КЛЮЧ(ключ - значение (JWT_SECRET=) который указывали в docker-compose) |
| Заголовок авторизации | AuthorizationJwt |
| Адрес ONLYOFFICE Docs для внутренних запросов сервера | http://127.0.0.1:8880/(Nextcloud на хосте стучится в Docker напрямую по HTTP) |
| Адрес сервера для внутренних запросов ONLYOFFICE Docs | https://192.168.31.60:8443/(Docker скачивает файл с Nextcloud по локальному IP хоста) |
Контейнер Docker находится в изолированной сети. Если он постучится на
127.0.0.1, он попадет сам в себя, а не на хост. Если постучится на 10.0.0.2, то при работе из дома этот адрес будет недоступен. А вот локальный IP хоста (192.168.31.60) для контейнера доступен всегда, и SSL-сертификат для него идеально подходит! Это делает работу редактора независимой от местоположения.Скрипт переключения и нюанс с браузером
Так как в поле «Адрес ONLYOFFICE Docs» Nextcloud отдает URL браузеру, браузер должен иметь возможность достучаться до этого адреса. Когда мы дома - это 192.168.31.60. Когда мы в отъезде через WireGuard - это 10.0.0.2.
Чтобы не лазить каждый раз в админку, создадим скрипт на Intel NUC ~/switch-onlyoffice.sh:
#!/bin/bash
set -e
HOME_URL="https://192.168.31.60:8883/"
WG_URL="https://10.0.0.2:8883/"
if [ "$1" == "home" ]; then
TARGET_URL=$HOME_URL
echo "Переключаю ONLYOFFICE на домашнюю сеть..."
elif [ "$1" == "wireguard" ]; then
TARGET_URL=$WG_URL
echo "Переключаю ONLYOFFICE на WireGuard..."
else
echo "Использование: $0 [home|wireguard]"
exit 1
fi
# Меняем ТОЛЬКО адрес, который отдается в браузер пользователя
sudo -u www-data php /var/www/nextcloud/occ config:app:set onlyoffice DocumentServerUrl --value="$TARGET_URL"
# Сбрасываем кэш Nextcloud, чтобы настройки подхватились мгновенно
sudo -u www-data php /var/www/nextcloud/occ maintenance:repair --include-expensive
sudo systemctl restart php8.2-fpm
echo "Готово! Адрес редактора для браузера: $TARGET_URL"
Даем права на запуск: chmod +x ~/switch-onlyoffice.sh.
Теперь при отъезде достаточно зайти по SSH и выполнить ~/switch-onlyoffice.sh wireguard, а по возвращению домой - ~/switch-onlyoffice.sh home.
Когда вы подключаетесь через WireGuard и заходите в Nextcloud, он открывается нормально (вы же приняли сертификат). Но когда вы кликаете на документ, Nextcloud пытается загрузить редактор через скрытый
iframe с адреса https://10.0.0.2:8883/.Из-за того, что сертификат самоподписанный, браузер молча заблокирует загрузку iframe (политика безопасности), и вы увидите бесконечную загрузку.
Как это лечить: Перед тем как начать работать с документами через WireGuard, просто откройте в новой вкладке браузера адрес
https://10.0.0.2:8883/healthcheck, нажмите «Дополнительно» → «Перейти к узлу (небезопасно)». Как только браузер «запомнит», что вы доверяете сертификату для IP 10.0.0.2, iframe начнет грузиться, и документы будут открываться мгновенно!Полезные команды (шпаргалка)
# Логи ONLYOFFICE в реальном времениsudo docker logs -f --tail 50 onlyoffice-document-server
# Логи Nginx для ONLYOFFICEsudo tail -f /var/log/nginx/onlyoffice_error.log
# Перезапустить контейнер (если съел всю память)cd ~/Docker/ONLYOFFICE && sudo docker compose restart
# Проверка скачивания документа контейнером (внутри Docker)sudo docker exec -it onlyoffice-document-server curl -k -I https://192.168.31.60:8443/
(Должен вернуться HTTP/1.1 200 OK или 302)