Вся документация

Сервер A4 в сети организации

Редакторы A4 (документы), F1 (таблицы) и P2 (презентации) работают в браузере, а сам сервер стоит в сети вашей организации. Файлы и учётные записи остаются у вас: сервер спрашивает их у вашей системы и ничего не хранит. Комплект раздаётся архивами образов Docker и ставится командой docker load — интернет и доступ к Docker Hub при установке не нужны.

Презентации. Редактор презентаций P2 входит в комплект с 02.10: образ p2-server:2026.4.0.17, установка — в разделе «Презентации P2» ниже.

Что умеет

  • F1 — таблицы: книги .xlsx, .xlsm, .xlsb открываются и правятся в браузере;
  • A4 — документы: файлы .docx открываются и правятся в браузере;
  • оба редактора поднимаются одним файлом docker-compose.yml и работают независимо: падение одного не мешает другому;
  • отдельного входа в редактор нет: пользователя узнаёт ваша система по той же браузерной куке;
  • правка возвращается в вашу систему, если вы разрешили сохранение.

Как работает

  • Кабинки. На каждого пользователя и каждый файл сервер поднимает отдельный процесс со своим ядром — «кабинку». Браузер получает страницу редактора и дальше разговаривает с кабинкой по WebSocket.
  • Где живут файлы. Файлы и пользователи хранятся в вашей системе. Сервер забирает файл по номеру, а рабочие копии держит в своём каталоге, пока файл открыт.
  • Ссылка на файл. Для таблиц: https://ваш-домен/f1/?doc=<номер вложения>. Для документов: https://ваш-домен/a4/?doc=<номер вложения>.

Требования

  • Linux x86-64 и Docker — подойдёт любой современный, проверено на 28.x;
  • память: 2 ГБ на сервер плюс примерно 250 МБ на каждую открытую книгу или документ;
  • обратный прокси с поддержкой WebSocket, если сервер смотрит в интернет.
Только x86-64. Образы собраны под linux/amd64, это не мультиархитектурная сборка. На хосте arm64 они не пойдут. Поэтому в docker-compose.yml стоит строка platform: linux/amd64: Docker откажет понятно, а не возьмёт молча не то.

Состав комплекта

ФайлЧто это
F1-2026.3.0-gaa7d3405-webhost-docker.tar.gzобраз F1 (таблицы), тег f1-webhost:2026.3.0-gaa7d3405
A4-0310-dde282c51-webhost-docker.tar.gzобраз A4 (документы), тег a4-webhost:0310-dde282c51
SHA256SUMSконтрольные суммы всех файлов комплекта
docker-compose.ymlзапуск двух редакторов сразу
nginx-primer.confобратный прокси на оба редактора за одним именем
OTKAT.mdоткат на прежнюю версию и что делать с рабочими копиями
F1-2026.3.0-gaa7d3405-webhost-INSTALL.mdподробная установка и настройка F1
A4-0310-dde282c51-webhost-INSTALL.mdто же для A4
README.mdописание комплекта

Установка

1. Сверьте и загрузите образы

Интернет на этом шаге не нужен: образы берутся из архивов комплекта.

# сверить, что архивы скачались целиком
sha256sum -c SHA256SUMS            # на маке: shasum -a 256 -c SHA256SUMS

# загрузить образы
docker load -i F1-2026.3.0-gaa7d3405-webhost-docker.tar.gz
docker load -i A4-0310-dde282c51-webhost-docker.tar.gz

2. Укажите адреса вашей системы

В docker-compose.yml у каждого редактора поправьте два адреса вашей системы — «кто это» и «файл по номеру»:

name: a4-server

services:
  f1:
    image: f1-webhost:2026.3.0-gaa7d3405
    platform: linux/amd64
    restart: unless-stopped
    ports: ["127.0.0.1:8092:8092"]
    volumes: ["f1-cabins:/data/cabins"]
    command:
      - --base-path
      - /f1
      - --max-cabins
      - "12"
      - --idle-min
      - "20"
      # Адреса вашей системы: «кто это» и «файл по номеру».
      - --auth-url
      - https://ваша-система/v1/me
      - --attach-url
      - https://ваша-система/v1/attachments/{id}/content

  a4:
    image: a4-webhost:0310-dde282c51
    platform: linux/amd64
    restart: unless-stopped
    ports: ["127.0.0.1:8090:8090"]
    volumes: ["a4-cabins:/data/cabins"]
    command:
      - --base-path
      - /a4
      - --max-cabins
      - "12"
      - --idle-min
      - "20"
      - --auth-url
      - https://ваша-система/v1/me
      - --attach-url
      - https://ваша-система/v1/attachments/{id}/content

volumes:
  f1-cabins:
  a4-cabins:
Значение флага — через пробел. В docker-compose.yml это две строки списка: - --auth-url и отдельной строкой сам адрес. Форма --auth-url=https://… одной строкой не работает и молчит: сервер поднимется и ответит "status": "ok", но ваши адреса будут отброшены, подпуть не применится, а пределы останутся стандартными. Та же форма в docker run: --base-path /f1, а не --base-path=/f1.

3. Запустите

docker compose up -d

4. Проверьте

curl http://127.0.0.1:8092/f1/health     # таблицы
curl http://127.0.0.1:8090/a4/health     # документы

В ответе должно быть:

  • "status": "ok";
  • верное "product" — f1 или a4;
  • пустой список "warnings" и "behind": null внутри "version" — редактор и вычислительное ядро из одного выпуска.

Если behind называет половину ("ядро" или "оболочка"), они разошлись больше чем на 6 часов, и такой образ ставить не нужно. Соседнее поле skewMin — справка: на сколько минут расходится время сборки половин. У годного образа это минуты, ровно ноль там ждать не нужно.

Если /f1/health отвечает 403, а /health в корне — 200, значит подпуть не применился: проверьте форму флагов.

Без docker compose

Каждый редактор можно запустить и отдельной командой. Рабочие копии в этом случае лежат в каталоге на диске:

# таблицы
sudo mkdir -p /srv/f1-cabins
docker run -d --name f1-webhost --restart unless-stopped \
  -p 127.0.0.1:8092:8092 \
  -v /srv/f1-cabins:/data/cabins \
  f1-webhost:2026.3.0-gaa7d3405 \
  --base-path /f1 --max-cabins 12 --idle-min 20 \
  --auth-url   'https://ваша-система/v1/me' \
  --attach-url 'https://ваша-система/v1/attachments/{id}/content'

# документы
sudo mkdir -p /srv/a4-cabins
docker run -d --name a4-webhost --restart unless-stopped \
  -p 127.0.0.1:8090:8090 \
  -v /srv/a4-cabins:/data/cabins \
  a4-webhost:0310-dde282c51 \
  --base-path /a4 --max-cabins 12 --idle-min 20 \
  --auth-url   'https://ваша-система/v1/me' \
  --attach-url 'https://ваша-система/v1/attachments/{id}/content'

Настройки запуска

КлючЧто делаетПо умолчанию
--max-cabinsсколько файлов открыто одновременно64
--idle-minчерез сколько минут простоя гасить кабинку20
--base-pathподпуть, если редактор живёт не в корне доменанет
--warmсколько кабинок держать прогретыми0
--entryстендовый режим по токену, без авторизациинет

В примере docker-compose.yml стоит --max-cabins 12. Память считайте по требованиям: 2 ГБ плюс примерно 250 МБ на каждый открытый файл.

Обратный прокси

Если редактор открывают не с самого сервера, поставьте перед ним прокси с поддержкой WebSocket. Пример из комплекта (nginx-primer.conf) — оба редактора за одним именем: таблицы на /f1/, документы на /a4/. Сами редакторы слушают свои порты на машине (8092 и 8090) и наружу не смотрят; наружу смотрит только nginx.

server {
    listen 443 ssl;
    server_name office.ваша-организация.ru;

    ssl_certificate     /etc/ssl/certs/ваш.crt;
    ssl_certificate_key /etc/ssl/private/ваш.key;

    # Книга или документ целиком идут одним запросом: 1 МБ по умолчанию мало.
    client_max_body_size 64m;

    location /f1/ {
        proxy_pass http://127.0.0.1:8092;
        proxy_http_version 1.1;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Cookie $http_cookie;
        proxy_buffering off;
        proxy_read_timeout 3600s;
    }

    location /a4/ {
        proxy_pass http://127.0.0.1:8090;
        proxy_http_version 1.1;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Cookie $http_cookie;
        proxy_buffering off;
        proxy_read_timeout 3600s;
    }
}

Три строки обязательны: Upgrade и Connection — иначе редактор не соединится с сервером, Cookie — иначе он не узнает пользователя. Пути /f1/ и /a4/ обязаны совпадать с --base-path в docker-compose.yml: редактор строит по нему свои ссылки, и расхождение даёт пустую страницу.

Проверка снаружи:

curl -s https://office.ваша-организация.ru/f1/health
curl -s https://office.ваша-организация.ru/a4/health

Подключение к 1С, Битрикс24 и другим системам

Сервер не хранит ни пользователей, ни файлы. От вашей системы ему нужны два адреса, третий — если разрешаете сохранять:

АдресЗачемЧто должен вернуть
--auth-urlузнать, кто пришёл2xx и email или id, иначе 401 или 403
--attach-urlотдать файл по его номерусам файл тому, у кого есть право
тот же адрес с /replaceпринять правкупринять multipart с частью file

Браузерная кука пользователя проходит к этим адресам как есть, поэтому отдельного входа в редактор нет.

Сторонним системам, которые открывают файлы по WOPI, нужен адрес discovery. Он складывается из подпути редактора:

https://ваш-сервер/f1/hosting/discovery    — таблицы
https://ваш-сервер/a4/hosting/discovery    — документы

Если у вас 1С или Битрикс24

  • A4 для 1С — отдельный комплект со своим сервером и расширением для самой 1С. Если задача — открывать файлы из 1С, берите тот комплект: сервер в нём уже есть, и ставить этот не нужно.
  • A4 для Битрикс24 — только модуль портала, сервера в нём нет. Ему нужен сервер из этого комплекта. В настройках модуля указываются два адреса WOPI discovery — основной сервер таблиц и документов (он здесь) и отдельный сервер презентаций P2 (в этот выпуск комплекта он не входит), а также публичный адрес портала. Публичный адрес должен быть доступен и браузеру, и контейнерам редакторов.

Обновление и откат

Обновление

  1. Загрузите новый архив: docker load -i <новый архив>.
  2. Укажите новый тег образа в docker-compose.yml и поднимите заново: docker compose up -d. Если редактор запущен без compose — docker rm -f f1-webhost (или a4-webhost) и та же команда docker run с новым тегом.
  3. Проверьте /health: "status": "ok", пустой "warnings" и "behind": null.

Рабочие копии файлов лежат в примонтированном каталоге и переживают смену образа. Открытые в этот момент вкладки скажут «связь прервана» и вернутся сами, когда сервер поднимется; несохранённое при этом не теряется.

Прежние образы не удаляйте, пока новая версия не отработала хотя бы день: удалённый образ придётся снова везти архивом.

Откат

Откат — это замена тега образа в docker-compose.yml на прежний и перезапуск.

# 1. посмотреть, какие версии уже лежат на машине
docker images | grep -E 'f1-webhost|a4-webhost'

# 2. в docker-compose.yml заменить тег на прежний, например
#      image: f1-webhost:2026.3.0-gaa7d3405   →   image: f1-webhost:<прежний тег>
#    и поднять заново
docker compose up -d

# 3. проверить, что поднялось именно то
curl -s http://127.0.0.1:8092/f1/health
curl -s http://127.0.0.1:8090/a4/health

В ответе /health смотрите version — она обязана совпасть с тегом, на который откатились. Если не совпала, Docker взял другой образ из кэша: укажите тег полностью, без latest.

Рабочие копии при откате

Рабочие копии книг и документов лежат в именованных томах f1-cabins и a4-cabins. При откате они остаются — docker compose up -d их не трогает.

Совместимость томов между версиями не проверялась. Том содержит рабочие копии открытых файлов, а не ваш архив: исходные файлы всё время лежат в вашей системе, сервер их только забирает и отдаёт. Поэтому перед откатом тома лучше отложить.

Docker Compose добавляет к имени тома имя проекта (a4-server), поэтому сначала посмотрите точные имена:

# например: a4-server_f1-cabins и a4-server_a4-cabins
docker volume ls | grep cabins

Безопасный откат:

# 1. дать людям закрыть файлы (или дождаться --idle-min)
docker compose stop

# 2. отложить тома прежней версии, не удаляя
docker run --rm -v a4-server_f1-cabins:/from -v /srv/backup:/to alpine \
  tar -czf /to/f1-cabins-$(date +%F).tar.gz -C /from .
docker run --rm -v a4-server_a4-cabins:/from -v /srv/backup:/to alpine \
  tar -czf /to/a4-cabins-$(date +%F).tar.gz -C /from .

# 3. заменить тег на прежний и поднять
docker compose up -d

Если после отката редактор не открывает файл, а в журнале видна жалоба на рабочую копию, очистите том и откройте файл заново из вашей системы:

# контейнеры удаляются, тома остаются
docker compose down
# удаляются рабочие копии, не ваш архив
docker volume rm a4-server_f1-cabins
docker compose up -d

Чего откат не делает:

  • не возвращает файлы, которые люди успели сохранить в вашей системе: там хранение и версии — ваши, сервер их не держит;
  • не меняет настройки: адреса --auth-url и --attach-url остаются те же.

Безопасность

  • Файлы. Сервер не хранит ни пользователей, ни файлы: он спрашивает их у вашей системы. Право на файл проверяет ваша система по куке пользователя.
  • Сеть. Интернет нужен только при сборке образа; установка идёт из архивов. В работе серверу нужна сеть к вашей системе (адреса «кто это» и «файл по номеру»), а если включены возможности, которые ходят к внешним службам, — то и к ним.
  • Порты. В примере редакторы слушают только 127.0.0.1. Наружу их выводит ваш обратный прокси.
  • Ключи. Секреты передаются окружением, в образе их нет и быть не должно: docker run -d --env-file /etc/f1/agent.env … (для A4 — /etc/a4/agent.env). Файл держите с правами 600 и владельцем root: он не попадает ни в образ, ни в журналы, ни на страницу.
  • Целостность. Перед загрузкой сверяйте архивы по SHA256SUMS.
  • Стендовый режим. Без --auth-url сервер поднимается стендом: вход по токену --entry <секрет>, все получают один и тот же файл-заготовку. Это годится для показа, но не для работы.

Типовые отказы

Что видноЧто делать
/health показывает faultТам же написана причина
behind в /health не nullРедактор и ядро из разных выпусков — такой образ не ставить
/f1/health отвечает 403, а /health — 200Подпуть не применился: флаг записан через =, а нужно через пробел
Страница открывается, но редактор пустойПочти всегда прокси без Upgrade и Connection; ещё — путь в прокси не совпадает с --base-path
403 при входеВаш адрес «кто это» не признал куку пользователя
Docker отказывается запускать образ на arm64Нужен хост x86-64: образы собраны только под linux/amd64

Журнал менеджера и кабинок: docker logs <имя контейнера> (при запуске через compose — docker compose logs f1 или docker compose logs a4).

Скачать

Сервер A4 в сети организациивыпуск 2026-10-01 · F1 2026.3.0 · A4 0310-dde282c51 · P2 2026.4.0.17 · linux/amd64
Скачать комплект
ФайлРазмерНазначение
F1-2026.3.0-gaa7d3405-webhost-docker.tar.gz220 614 169 байтобраз F1 (таблицы), linux/amd64
A4-0310-dde282c51-webhost-docker.tar.gz127 051 754 байтобраз A4 (документы), linux/amd64
P2-2026.4.0.17-server-docker.tar.gz94 975 217 байтобраз P2 (презентации), linux/amd64
docker-compose.yml3 489 байтзапуск двух редакторов сразу
nginx-primer.conf2 947 байтобратный прокси на оба редактора
F1-2026.3.0-gaa7d3405-webhost-INSTALL.md7 198 байтустановка и настройка F1
A4-0310-dde282c51-webhost-INSTALL.md7 440 байтустановка и настройка A4
P2-2026.4.0.17-server-INSTALL.md3 727 байтустановка P2: папка с презентациями, вход по паролю, совместная правка
OTKAT.md5 576 байтоткат на прежнюю версию
README.md7 713 байтописание комплекта
SHA256SUMS947 байтконтрольные суммы всех файлов

Презентации P2

P2 открывает презентации из папки на сервере: человек входит по имени и паролю, видит список файлов, правит вместе с другими и сохраняет обратно. Установка:

gunzip -c P2-2026.4.0.17-server-docker.tar.gz | docker load
mkdir -p /srv/p2 && chown 1000:1000 /srv/p2
docker run -d --name p2 --restart unless-stopped \
  -p 127.0.0.1:8094:8090 -v /srv/p2:/data \
  p2-server:2026.4.0.17 --entry "<общий пароль>"

Доводы передаются только через пробел (--entry "пароль", не --entry=пароль). Наружу P2, как и остальные редакторы, выводите через обратный прокси с HTTPS.

Сведения о выпуске

ЧтоЗначение
F1 (таблицы)версия 2026.3.0-gaa7d3405, образ f1-webhost:2026.3.0-gaa7d3405
A4 (документы)версия 0310-dde282c51, образ a4-webhost:0310-dde282c51
Архитектураlinux/amd64
P2 (презентации)версия 2026.4.0.17, образ p2-server:2026.4.0.17; ставится отдельной командой — см. P2-2026.4.0.17-server-INSTALL.md

Контрольные суммы

d3c1e061d91624dfb0e4cced903abd348c61fc54a3eaf41fea0e0dfda7bc8a19  F1-2026.3.0-gaa7d3405-webhost-INSTALL.md
d62c49918e1ae10dce00bd2695063553b903ca413562bc5eb98f07cd637ad1b7  F1-2026.3.0-gaa7d3405-webhost-docker.tar.gz
7320ff70004db0c1eb8bc1d07afd284b91b19353cdb470b79251ee6aaac40c59  OTKAT.md
e4928758375bcd2a6dee8e3f09b2c70cadbd2448340ae66f8f82a0213984254a  nginx-primer.conf
0a4990135859bf3b72b4f67cd3a5297661e0013de2d0281809c99ee4d8f78584  P2-2026.4.0.17-server-docker.tar.gz
3ee4fcd6ba2395935520eeff80fa19cde2feeafb91a419b37ca9644b78adf8ab  P2-2026.4.0.17-server-INSTALL.md
a8eaabd11dedb213d6585527213800ed1021d31993e2c6cd896d2e3db4ce778e  A4-0310-dde282c51-webhost-docker.tar.gz
f63d9deff7019b1f0639b148c94ff5bce4c6e28360fbd1783f019773b8b3b37d  A4-0310-dde282c51-webhost-INSTALL.md
65d3002089358a80b1c30c20d566f4d1dbab9e8a1d9d913cbfd1aaa9e3c648c8  docker-compose.yml
6112a9c53b7306999a01dd3328f1ad43134546a40a52c31d5fb953617f211419  README.md

Проверка комплекта после скачивания:

shasum -a 256 -c SHA256SUMS