<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Установка ONLYOFFICE Docs]]></title><description><![CDATA[<p dir="auto">Ниже — <strong>полная инструкция по установке отдельного ONLYOFFICE Docs</strong> в контейнере Incus, с конфигом Nginx сразу на <strong>443 (HTTPS)</strong>.</p>
<hr />
<h3><a class="anchor-offset" name="img-src-https-baseinfo.nbics.net-assets-plugins-nodebb-plugin-emoji-emoji-android-1f4cb.png-v-e590adcca20-class-not-responsive-emoji-emoji-android-emoji-clipboard-style-height-23px-width-auto-vertical-align-middle-title-alt-часть-1-подготовка-контейнера-incus"></a><img src="https://baseinfo.nbics.net/assets/plugins/nodebb-plugin-emoji/emoji/android/1f4cb.png?v=e590adcca20" class="not-responsive emoji emoji-android emoji--clipboard" style="height:23px;width:auto;vertical-align:middle" title="📋" alt="📋" /> Часть 1: Подготовка контейнера Incus</h3>
<p dir="auto"><strong>1.1. Создание контейнера и выделение ресурсов</strong></p>
<pre><code class="language-bash"># На хосте
incus launch images:debian/12 ooffice-docs
incus config set ooffice-docs limits.memory 4GB
incus config set ooffice-docs limits.cpu 2
</code></pre>
<p dir="auto"><strong>1.2. Починка Docker в Incus (обязательно)</strong></p>
<p dir="auto">Без этих шагов Docker внутри контейнера не заработает:</p>
<pre><code class="language-bash"># Разрешаем вложенность
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-docs
</code></pre>
<p dir="auto"><strong>1.3. Увеличение лимитов keyring на хосте</strong></p>
<p dir="auto">Исправляет ошибку <code>unable to join session keyring: disk quota exceeded</code>:</p>
<pre><code class="language-bash"># На хосте
sudo sysctl -w kernel.keys.maxkeys=20000
sudo sysctl -w kernel.keys.maxbytes=500000

sudo tee /etc/sysctl.d/99-docker-keyring.conf &lt;&lt;'EOF'
kernel.keys.maxkeys = 20000
kernel.keys.maxbytes = 500000
EOF
sudo sysctl -p /etc/sysctl.d/99-docker-keyring.conf
</code></pre>
<hr />
<h3><a class="anchor-offset" name="img-src-https-baseinfo.nbics.net-assets-plugins-nodebb-plugin-emoji-emoji-android-1f4e6.png-v-e590adcca20-class-not-responsive-emoji-emoji-android-emoji-package-style-height-23px-width-auto-vertical-align-middle-title-alt-часть-2-установка-зависимостей-внутри-контейнера"></a><img src="https://baseinfo.nbics.net/assets/plugins/nodebb-plugin-emoji/emoji/android/1f4e6.png?v=e590adcca20" class="not-responsive emoji emoji-android emoji--package" style="height:23px;width:auto;vertical-align:middle" title="📦" alt="📦" /> Часть 2: Установка зависимостей внутри контейнера</h3>
<pre><code class="language-bash">incus exec ooffice-docs -- bash

apt update
apt install -y curl gnupg postgresql rabbitmq-server redis-server nginx-extras
</code></pre>
<hr />
<h3><a class="anchor-offset" name="img-src-https-baseinfo.nbics.net-assets-plugins-nodebb-plugin-emoji-emoji-android-1f5c4.png-v-e590adcca20-class-not-responsive-emoji-emoji-android-emoji-file_cabinet-style-height-23px-width-auto-vertical-align-middle-title-alt-часть-3-настройка-postgresql"></a><img src="https://baseinfo.nbics.net/assets/plugins/nodebb-plugin-emoji/emoji/android/1f5c4.png?v=e590adcca20" class="not-responsive emoji emoji-android emoji--file_cabinet" style="height:23px;width:auto;vertical-align:middle" title="🗄" alt="🗄" />️ Часть 3: Настройка PostgreSQL</h3>
<pre><code class="language-bash">su - 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;\""
</code></pre>
<p dir="auto">Если пользователь или база уже существуют — ошибки игнорируются.</p>
<hr />
<h3><a class="anchor-offset" name="img-src-https-baseinfo.nbics.net-assets-plugins-nodebb-plugin-emoji-emoji-android-2699.png-v-e590adcca20-class-not-responsive-emoji-emoji-android-emoji-gear-style-height-23px-width-auto-vertical-align-middle-title-alt-часть-4-настройка-debconf"></a><img src="https://baseinfo.nbics.net/assets/plugins/nodebb-plugin-emoji/emoji/android/2699.png?v=e590adcca20" class="not-responsive emoji emoji-android emoji--gear" style="height:23px;width:auto;vertical-align:middle" title="⚙" alt="⚙" />️ Часть 4: Настройка debconf</h3>
<pre><code class="language-bash">echo "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"
</code></pre>
<hr />
<h3><a class="anchor-offset" name="img-src-https-baseinfo.nbics.net-assets-plugins-nodebb-plugin-emoji-emoji-android-1f511.png-v-e590adcca20-class-not-responsive-emoji-emoji-android-emoji-key-style-height-23px-width-auto-vertical-align-middle-title-alt-часть-5-gpg-ключ-и-репозиторий"></a><img src="https://baseinfo.nbics.net/assets/plugins/nodebb-plugin-emoji/emoji/android/1f511.png?v=e590adcca20" class="not-responsive emoji emoji-android emoji--key" style="height:23px;width:auto;vertical-align:middle" title="🔑" alt="🔑" /> Часть 5: GPG-ключ и репозиторий</h3>
<pre><code class="language-bash">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
</code></pre>
<hr />
<h3><a class="anchor-offset" name="img-src-https-baseinfo.nbics.net-assets-plugins-nodebb-plugin-emoji-emoji-android-1f4e5.png-v-e590adcca20-class-not-responsive-emoji-emoji-android-emoji-inbox_tray-style-height-23px-width-auto-vertical-align-middle-title-alt-часть-6-установка-onlyoffice-docs"></a><img src="https://baseinfo.nbics.net/assets/plugins/nodebb-plugin-emoji/emoji/android/1f4e5.png?v=e590adcca20" class="not-responsive emoji emoji-android emoji--inbox_tray" style="height:23px;width:auto;vertical-align:middle" title="📥" alt="📥" /> Часть 6: Установка ONLYOFFICE Docs</h3>
<pre><code class="language-bash">apt install -y onlyoffice-documentserver
</code></pre>
<p dir="auto">Во время установки debconf не должен ничего спрашивать. Если спросит — введите: host=<code>localhost</code>, db=<code>onlyoffice</code>, user=<code>onlyoffice</code>, password=<code>onlyoffice</code>, port=<code>8080</code>.</p>
<hr />
<h3><a class="anchor-offset" name="img-src-https-baseinfo.nbics.net-assets-plugins-nodebb-plugin-emoji-emoji-android-2705.png-v-e590adcca20-class-not-responsive-emoji-emoji-android-emoji-white_check_mark-style-height-23px-width-auto-vertical-align-middle-title-alt-часть-7-проверка"></a><img src="https://baseinfo.nbics.net/assets/plugins/nodebb-plugin-emoji/emoji/android/2705.png?v=e590adcca20" class="not-responsive emoji emoji-android emoji--white_check_mark" style="height:23px;width:auto;vertical-align:middle" title="✅" alt="✅" /> Часть 7: Проверка</h3>
<pre><code class="language-bash">systemctl status ds-docservice
ss -tlnp | grep 8080
curl -I http://localhost:8080/
</code></pre>
<p dir="auto"><code>ds-docservice</code> при первом запуске может 30–60 секунд инициализировать БД. <code>curl</code> должен вернуть <code>200</code> или <code>302</code>.</p>
<hr />
<h3><a class="anchor-offset" name="img-src-https-baseinfo.nbics.net-assets-plugins-nodebb-plugin-emoji-emoji-android-1f310.png-v-e590adcca20-class-not-responsive-emoji-emoji-android-emoji-globe_with_meridians-style-height-23px-width-auto-vertical-align-middle-title-alt-часть-8-nginx-на-хосте-https-порт-443"></a><img src="https://baseinfo.nbics.net/assets/plugins/nodebb-plugin-emoji/emoji/android/1f310.png?v=e590adcca20" class="not-responsive emoji emoji-android emoji--globe_with_meridians" style="height:23px;width:auto;vertical-align:middle" title="🌐" alt="🌐" /> Часть 8: Nginx на хосте (HTTPS, порт 443)</h3>
<p dir="auto"><strong>8.1. Узнайте IP контейнера</strong></p>
<pre><code class="language-bash">incus list ooffice-docs
</code></pre>
<p dir="auto">Допустим, IP = <code>10.214.97.8</code>.</p>
<p dir="auto"><strong>8.2. Получите SSL-сертификат (если ещё нет)</strong></p>
<pre><code class="language-bash"># На хосте
apt install -y certbot python3-certbot-nginx
mkdir -p /var/www/certbot
certbot --nginx -d docs.example.com
</code></pre>
<p dir="auto">Certbot создаст сертификаты в <code>/etc/letsencrypt/live/docs.example.com/</code>. Если используете самоподписанный — пропустите этот шаг и укажите свои пути в конфиге.</p>
<p dir="auto"><strong>8.3. Полный конфиг Nginx на хосте</strong></p>
<p dir="auto">Создайте <code>/etc/nginx/sites-available/onlyoffice-docs</code>:</p>
<pre><code class="language-nginx"># Редирект HTTP -&gt; 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;
    }
}
</code></pre>
<p dir="auto"><strong>8.4. Активация</strong></p>
<pre><code class="language-bash">ln -s /etc/nginx/sites-available/onlyoffice-docs /etc/nginx/sites-enabled/
nginx -t
systemctl reload nginx
</code></pre>
<p dir="auto"><strong>8.5. Проверка</strong></p>
<pre><code class="language-bash">curl -I https://docs.example.com/
</code></pre>
<p dir="auto">Должен вернуть <code>HTTP/2 200</code> или <code>HTTP/2 302</code>.</p>
<hr />
<h3><a class="anchor-offset" name="img-src-https-baseinfo.nbics.net-assets-plugins-nodebb-plugin-emoji-emoji-android-1f517.png-v-e590adcca20-class-not-responsive-emoji-emoji-android-emoji-link-style-height-23px-width-auto-vertical-align-middle-title-alt-часть-9-интеграция-с-nextcloud"></a><img src="https://baseinfo.nbics.net/assets/plugins/nodebb-plugin-emoji/emoji/android/1f517.png?v=e590adcca20" class="not-responsive emoji emoji-android emoji--link" style="height:23px;width:auto;vertical-align:middle" title="🔗" alt="🔗" /> Часть 9: Интеграция с Nextcloud</h3>
<ol>
<li>В Nextcloud: <strong>Приложения → Office &amp; Text → ONLYOFFICE</strong> → Установить.</li>
<li>В <strong>Настройки → ONLYOFFICE</strong>:
<ul>
<li><strong>Document Editing Service address</strong>: <code>https://docs.example.com/</code></li>
<li><strong>Secret key (JWT)</strong>: <code>my_jwt_secret_here</code> (тот же, что в debconf).</li>
</ul>
</li>
<li>Откройте любой документ в Nextcloud — он должен открыться в редакторе.</li>
</ol>
<p dir="auto"><strong>Если редактор не загружается</strong> — проверьте в браузере (F12 → Network), что запросы к <code>docs.example.com</code> возвращают <code>200</code>, а не <code>404</code> или <code>502</code>. Основные причины: неверный IP в <code>proxy_pass</code>, отсутствие <code>sub_filter</code>, несовпадение JWT-секрета.</p>
<hr />
<h3><a class="anchor-offset" name="img-src-https-baseinfo.nbics.net-assets-plugins-nodebb-plugin-emoji-emoji-android-1f4cc.png-v-e590adcca20-class-not-responsive-emoji-emoji-android-emoji-pushpin-style-height-23px-width-auto-vertical-align-middle-title-alt-ключевые-нюансы"></a><img src="https://baseinfo.nbics.net/assets/plugins/nodebb-plugin-emoji/emoji/android/1f4cc.png?v=e590adcca20" class="not-responsive emoji emoji-android emoji--pushpin" style="height:23px;width:auto;vertical-align:middle" title="📌" alt="📌" /> Ключевые нюансы</h3>
<ul>
<li><strong><code>sub_filter</code> обязателен</strong> — без него Docs будет ссылаться на <code>localhost:8080</code>, и редактор не загрузится через внешний домен.</li>
<li><strong><code>sub_filter</code> заменяет на <code>https://</code></strong> — если оставить <code>http://</code>, браузер заблокирует загрузку как mixed content.</li>
<li><strong>WebSocket-заголовки</strong> (<code>Upgrade</code>, <code>Connection</code>) — без них не работает совместное редактирование.</li>
<li><strong>JWT-секрет</strong> должен совпадать в debconf, в конфиге Docs и в настройках плагина Nextcloud.</li>
<li><strong>Порт 8080 внутри контейнера</strong> — выбран, чтобы не конфликтовать с Nginx на хосте (порт 80/443).</li>
</ul>
<p dir="auto">Готово — Docs работает как отдельный сервис, и Nextcloud может его использовать.</p>
]]></description><link>https://baseinfo.nbics.net/topic/303/установка-onlyoffice-docs</link><generator>RSS for Node</generator><lastBuildDate>Fri, 23 Oct 2026 03:50:13 GMT</lastBuildDate><atom:link href="https://baseinfo.nbics.net/topic/303.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 07 Oct 2026 19:42:45 GMT</pubDate><ttl>60</ttl></channel></rss>