Files
SergObsidian/WORK & PROJECTS/Mol/Планы и диаграммы/Alfa Cloud/Alfa cloud readme.md
2025-05-26 13:44:35 +05:00

183 lines
13 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#### Общая информация
Alfa Cloud — серверный API, который предоставляет доступ к управлению контейнерами и конфигурацией облаков Alfa с поддержкой нескольких облачных серверов.
Данный документ нужен для разработки полноценного фронтенда управления контейнерами.
Все запросы должны производиться только из админки Mol. Метод авторизации каждого запроса - Basic Auth (обычный логин и пароль). Учётные данные можно менять регулярно, для этого существует специальный запрос. Учётные данные НЕ синхронизированы с основными учётными данными MOL (и для безопасности и отсутствия необходимости синхронизации всех юзеров. Нужен только главный админ).
#### Точки подключения:
GET:
```
/servers — получить список активных серверов (для разворачивания новых клиентов)
/servers/{server_id} — получить подробную информацию о сервере
(TODO: с параметрами мониторинга и нагрузкой в реальном времени)
/clients — получить список контейнеров клиентов со всеми подробностями (поддерживается пагинация). С флагом доступностью контейнера. На фронте можно сделать прямой переход на облако клиента.
/clients/{id}/demo_enable - применение таблиц демо-данных (demo seeder)
/clients/{id}/demo_disable - удаление демо-данных (demo inverse seeder)
/clients/{id}/maintain/{1/0} - включить или отключить страницу "Техническое обслуживание" у клиента
/clients/{id}/send_success - отправить письмо клиенту с успешной регистрацией облака с логином и паролем
/clients/{id}/send_expire - отправить письмо клиенту о скором истечении использования (можно/нужно автоматизировать)
/clients/billing_types - получить все типы биллинга
/clients/reconfigurate - git pull и обновить все .env файлы у ВСЕХ облаков из актуального .env.example репозитория
```
POST:
```
/servers/ — создать сервер в БД (при наличии id - обновление)
/clients/ — создать клиента
здесь не нужно отправлять пароль, а задавать его командой ниже)
при создании - после проверки сразу вернётся id.
во время создания нужно таймером опрашивать
/clients/{id}/createlog и получать актуальный лог о создании контейнера (поднимать ws пока не будем). За окончание создания отвечает статус "completed" => "ok | error".
PUT /clients/{id} - обновление данных клиента
/clients/{id}/admin_password — задать новый пароль администратора лаборатории
/clients/{id}/expire_date - обновление крайней даты использования системы
TODO: перенос данных клиента с одного сервера на другой
TODO: /cloud_admin_password - задать пароль для подключения к API
```
DELETE
```
/clients/{id} — редкая функция — запуск очистки пользовательских конфигов с серверов
/servers/{server_id} не реализовано, да и пока что не надо. Тут нужно просто удаление информации о сервере из БД.
```
Команды менеджмента контейнеров и деплоя (GET)
```
/servers/check_host/{host_ip} - проверить доступность и настроенность сервера для деплоя. Применяется при создании и добавления сервера
/servers/{server_id}/images - список доступных версий образов на сервере (для переключения или создания пользователя)
/servers/{server_id}/reboot_server - перезапуск сервера
/clients/{id}/reboot - попытка перезапуска контейнера пользователя
/server/{server_id}/deploy - пересоздание ВСЕХ конфигов и перезапуск серверного кластера (действие, применяющееся после билда и/или смены версий). После этого необходимо сделать migrate_all
/clients/{id}/createlog - Получить лог создания контейнера
POST /containers/build_master_for_all/ - получение нового кода из ветки master на ВСЕХ серверах, сборка новых образов версии, отправка в БД всех лабораторий информации о новой версии (form-data):
- version: 1.3-master
- info: Описание версии и новых функций (желательно в .md)
GET /clients/{subdomain}/update_to/{version} - вызов переключения образа на выбранную версию из-под интерфейса клиента.
POST /containers/{server_id}/build_dev/{new_version} - получение кода из ветки dev, сборка фронта и нового образа (промежуточная версия/хотфикс)
/containers/{server_id}/build_master/{new_version} - получение кода из ветки master, сборка нового образа (релизная версия)
/containers/{server_id}/prune - удалить неиспользуемые версии образов (containers/image prune -a --force) (docker system prune -a --volumes --force)
/clients/{id}/switch/{image_name} - принудительно переключить клиента на образ другой версии
/server/{server_id}/switch_all/{image_name} - принудительно переключить всех клиентов на образ другой версии
/clients/{id}/migrate - запустить обновление БД клиента (artisan migrate)
/server/{server_id}/migrate_all - запустить обновление БД у всех клиентов на сервере
/clients/{id}/move_to/{server_id} - переместить клиента на другой сервер
/clients/{id}/copy_to/{client_id} - установить окружение клиента и БД в базу другого пользователя ТОЛЬКО на stage-сервер. Клиент - DEMO либо TEST.
```
Все данные в post отправляются посредством обычного post form-data.
#### Описание полей form-data:
```
POST /servers/
id - опционально - обновление при наличии/создание при отсутствии
name - наименование сервера
host - назначение хоста, на котором расположен sql-сервер и docker-контейнер клиента, доступный бэкенду. Возможен IP-адрес внутренней сети.
domain - поддомен, на котором будут работать клиенты. На этот хост должна быть направлена dns-зона основного домена
sql_user
sql_password - логин/пароль для удалённого подключения к SQL со стороны бэкенда для обновления БД клиентов. Необходимо выделить отдельные логины/пароли при настройке сервера и ограничить их подсетью.
```
```
POST /clients/
id - опционально - обновление при наличии/создание при отсутствии
server_id - id сервера, на котором создаётся клиент
name - наименование клиента (создаётся лаба с таким именем в БД клиента)
short_name - короткое наименование (для отображения у нас)
admin_f - фамилия администратора
admin_i - имя администратора
admin_o - отчество администратора
admin_login - имя пользователя администратора
password - пароль администратора (последние 5 полей пишутся в БД клиента)
subdomain - поддомен, на котором создаётся ЛИМС лабы
email - е-мейл администратора (пишется в БД клиента)
phone - телефон администратора (для будущих оповещений)
city - город
timezone - часовой пояс (для контейнера лаборатории)
version_tag - версия образа (доступные версии получаются из запроса /server/id/images)
allowed_ips - string - json-массив, в котором содержится список разрешённых IP или масок.
config - конфигурация лаборатории. Условный текст.
license - лицензия лаборатории. Условный текст.
license_expires_at - datetime окончания лицензии (пишется в БД клиента)
```
```
POST /clients/{id}/expire_date
sender - имя обновляющего дату (запишется в логи)
license_expires_at - datetime нового срока лицензии
```
```
POST /clients/{id}/admin_password
password - пароль
confirm_password - подтверждение
```
-----------
**Прочая информация**
Идеи:
- Получать количество пользователей в каждой системе для общего списка клиентов
- При билде образов автоматически вычислять версию и приписывать -dev или -master
- Также версию образа можно тащить пользователям в интерфейс
### TODO: Добавить таблицу с настройками облака в каждую пользовательскую таблицу!
- Проверка на уровне системы настройки "Техническое обслуживание" и показ блокирующей страницы
- Проверка на крайнюю дату использования и блокировка системы.
- Проверка на показ “турбостарта” при запуске
- Проверка на вопрос “краткого туториала”
### Требования к конечному серверу:
git
docker+compose
nginx
mariadb / postgresql
certbot && certbox-nginx
nginx can bash
nginx authorized key from master API
nvm.sh для пользователя nginx, содержащий импорт путей к nvm/npm
supervisor с конфигами
- reverb для websockets
**только облачном на сервере**
- php artisan queue:work --queue=client_creation - Job фонового создания клиента -
www-data/nginx sudo NOPASSWD /usr/bin/docker (remote cmd exec)
www-data/nginx sudo NOPASSWD /usr/bin/docker-compose (remote cmd exec)
```
www-data ALL=(ALL) NOPASSWD: /usr/bin/docker
www-data ALL=(ALL) NOPASSWD: /usr/sbin/nginx
www-data ALL=(ALL) NOPASSWD: /usr/bin/docker-compose
```
www-data sudo NOPASSWD certbot (remote cmd exec)
### Права на каталоги сервера (www-data:www-data 775):
/srv/www — current code (composer install && npm run build)
/srv/docker docker-compose.yml and Dockerfile (copy all from /srv/git without .git)
/srv/docker/clients/client1/.env — client files mount dir
/srv/docker/clients/client1/public
/srv/docker/clients/client1/php/add_vars.ini