Сервер A4 в сети организации
Редакторы A4 (документы), F1 (таблицы) и P2 (презентации) работают в браузере, а сам сервер стоит в сети вашей организации. Файлы и учётные записи остаются у вас: сервер спрашивает их у вашей системы и ничего не хранит. Комплект раздаётся архивами образов Docker и ставится командой docker load — интернет и доступ к Docker Hub при установке не нужны.
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, если сервер смотрит в интернет.
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 (в этот выпуск комплекта он не входит), а также публичный адрес портала. Публичный адрес должен быть доступен и браузеру, и контейнерам редакторов.
Обновление и откат
Обновление
- Загрузите новый архив:
docker load -i <новый архив>. - Укажите новый тег образа в
docker-compose.ymlи поднимите заново:docker compose up -d. Если редактор запущен без compose —docker rm -f f1-webhost(илиa4-webhost) и та же командаdocker runс новым тегом. - Проверьте
/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).
Скачать
| Файл | Размер | Назначение |
|---|---|---|
F1-2026.3.0-gaa7d3405-webhost-docker.tar.gz | 220 614 169 байт | образ F1 (таблицы), linux/amd64 |
A4-0310-dde282c51-webhost-docker.tar.gz | 127 051 754 байт | образ A4 (документы), linux/amd64 |
P2-2026.4.0.17-server-docker.tar.gz | 94 975 217 байт | образ P2 (презентации), linux/amd64 |
docker-compose.yml | 3 489 байт | запуск двух редакторов сразу |
nginx-primer.conf | 2 947 байт | обратный прокси на оба редактора |
F1-2026.3.0-gaa7d3405-webhost-INSTALL.md | 7 198 байт | установка и настройка F1 |
A4-0310-dde282c51-webhost-INSTALL.md | 7 440 байт | установка и настройка A4 |
P2-2026.4.0.17-server-INSTALL.md | 3 727 байт | установка P2: папка с презентациями, вход по паролю, совместная правка |
OTKAT.md | 5 576 байт | откат на прежнюю версию |
README.md | 7 713 байт | описание комплекта |
SHA256SUMS | 947 байт | контрольные суммы всех файлов |
Презентации 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