# F1 в браузере: установка на свой сервер

Этот архив — веб-версия F1 целиком: редактор, вычислительное
ядро и всё, что им нужно. Интернет при установке не требуется, зависимости
уже внутри. Версия 2026.3.0-gaa7d3405.

Как это работает: на каждого пользователя и книгу поднимается отдельный
процесс со своим ядром — «кабинка». Браузер получает страницу редактора и
дальше разговаривает с кабинкой по WebSocket. Файлы и учётные записи
остаются у вас: сервер F1 спрашивает их у вашей системы.

## Что нужно

- Linux x86-64 и Docker (подойдёт любой современный, проверено на 28.x).
- 2 ГБ памяти на сервер плюс примерно 250 МБ на каждую открытую книгу.
- Обратный прокси с поддержкой WebSocket, если сервер смотрит в интернет.

## Установка

```sh
# 1. загрузить образ из архива (интернет не нужен)
docker load -i F1-2026.3.0-gaa7d3405-webhost-docker.tar.gz

# 2. каталог для рабочих копий книг
sudo mkdir -p /srv/f1-cabins

# 3. запустить
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'
```

Проверка: `curl http://127.0.0.1:8092/f1/health` — ответ должен
содержать `"status": "ok"`, пустой список `"warnings"` и `"behind": null`
внутри `"version"`. Последнее означает, что редактор и вычислительное ядро из
одного выпуска: если там названа половина (`"ядро"` или `"оболочка"`), они
разошлись больше чем на 6 часов — такой образ ставить не нужно. Соседнее поле
`"skewMin"` — справка: на сколько минут расходится время сборки половин. У
годного образа это минуты (ядро и редактор собираются друг за другом), и ждать
там ровно ноль не нужно.

## Что должна уметь ваша система

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

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

Браузерная кука пользователя проходит к этим адресам как есть, поэтому
отдельного входа в редактор нет. Ссылка на книгу выглядит так:
`https://ваш-домен/f1/?doc=<номер вложения>`.

Без `--auth-url` сервер поднимается стендом: вход по токену
`--entry <секрет>`, все получают одну и ту же книгу-заготовку. Это годится
для показа, но не для работы.

## Прокси

```nginx
location /f1/ {
    proxy_pass http://127.0.0.1:8092;
    proxy_http_version 1.1;
    proxy_set_header Host $host;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Cookie $http_cookie;
    proxy_buffering off;
    client_max_body_size 64m;
    proxy_read_timeout 3600s;
}
```

Три строки обязательны: `Upgrade` и `Connection` — иначе редактор не
соединится с сервером, `Cookie` — иначе он не узнает пользователя.

## Обновление

```sh
docker load -i <новый архив>
docker rm -f f1-webhost
docker run -d ... <новый тег>   # та же команда, новый тег
```

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

## Ключи и внешние службы

Образ самодостаточен для установки: интернет нужен только при сборке.
В работе сеть требуется к вашей системе (адреса «кто я» и «файл по id»), а
если включены возможности, ходящие к внешним службам, — то и к ним.

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

```sh
docker run -d --env-file /etc/f1/agent.env ... f1-webhost:2026.3.0-gaa7d3405 ...
```

Файл держите с правами `600` и владельцем root: он не попадает ни в образ,
ни в журналы, ни на страницу.

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

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

## Если что-то не так

- `curl .../health` показывает `fault` — там же написана причина.
- `docker logs f1-webhost` — журнал менеджера и кабинок.
- Страница открывается, но редактор пустой — почти всегда прокси без
  `Upgrade` и `Connection`.
- `403` при входе — ваш адрес «кто я» не признал куку пользователя.

Свежие выпуски: https://tech.plantype.ru/
