Документация / Установка

Установка и настройка.

Порядок развёртывания серверной части и подключения рабочих мест

Редакция руководства от 7 октября 2026 года

Руководство предназначено для администратора, который устанавливает АИС ФП «Рубеж» на серверном компьютере, подключает рабочие места и планшеты, выполняет резервное копирование и обновление. Описан вариант размещения в локальной сети на компьютере под управлением Windows с Docker Desktop и Linux-контейнерами.

Серверная часть включает приложение, PostgreSQL, файловое хранилище, веб-интерфейс, обратный прокси Nginx и сервис управления HTTPS-сертификатами. Рабочие места подключаются через браузер. Для автономной работы планшет предварительно получает подписанный Offline-сеанс.

Команды ниже относятся к новой установке. Каталог D:\Rubezh, имя Compose-проекта rubezh и адрес 192.168.1.10 приведены как параметры примера. Администратор заменяет путь и IP-адрес фактическими значениями. При обслуживании существующей установки сохраняют её прежнее имя Compose-проекта: изменение имени может подключить другие, пустые тома данных.

Команды выполняют из каталога дистрибутива в PowerShell. В каждом новом окне сначала задают рабочий каталог и параметры Compose. В этой инструкции явно используется docker-compose.yml.

Set-Location 'D:\Rubezh'
$composeArgs = @('-p', 'rubezh', '-f', 'docker-compose.yml')

После каждой команды проверяют отсутствие ошибки и успешный код завершения. При ошибке следующий шаг не выполняют до устранения причины. Пароли и закрытые ключи в текст руководства, обращения и снимки экрана не включают.

01

Подготовка серверного компьютера

1

Подготовить компьютер с поддерживаемой для Docker Desktop 64-разрядной Windows, аппаратной виртуализацией и WSL 2. Для описанного варианта использовать Linux-контейнеры. Docker Desktop не предназначен для установки на Windows Server; такой вариант требует отдельной схемы развёртывания.

2

Проверить включение виртуализации в BIOS или UEFI. Объём памяти должен отвечать требованиям установленной версии Docker Desktop; действующая документация Docker указывает 8 ГБ для WSL 2. Это требование среды контейнеризации, а не подтверждение производительности «Рубежа» при определённом количестве пользователей. Ресурсы для рабочей нагрузки выделить с учётом числа подключений, объёма документов и запаса для резервных копий.

3

Установить или обновить WSL 2 и Docker Desktop по официальной инструкции Docker. При необходимости перезагрузить компьютер. Условия использования Docker Desktop проверяет организация, выполняющая установку.

4

Запустить Docker Desktop, включить Linux-контейнеры и дождаться готовности Docker Engine. Настроить запуск Docker Desktop при входе в Windows. Отключить переход серверного компьютера в сон на время эксплуатации; проверить восстановление сервисов после перезагрузки.

5

Подготовить отдельный каталог дистрибутива и место хранения резервных копий. Ограничить доступ к серверному каталогу и резервным копиям уполномоченными администраторами. Проверить свободное место на диске и синхронизацию времени.

6

Подключить компьютер к локальной сети. Для сборки из исходного дистрибутива обеспечить доступ к источникам базовых контейнеров и зависимостей. Для изолированной сети заранее перенести согласованный комплект образов и установочных компонентов.

wsl --version
docker version
docker compose version
docker info --format '{{.OSType}}'
Get-Date

Проверка результата. Docker отвечает со стороны клиента и сервера, Docker Compose доступен, тип контейнеров — linux. Компьютер подключён к сети, его часы корректны, каталог установки доступен для записи.

02

Установка серверной части

1

Распаковать дистрибутив в D:\Rubezh или другой выбранный каталог. Проверить наличие docker-compose.yml, .env.example, каталогов backend, frontend и infra. Не подменять файл Compose конфигурацией другого программного продукта.

2

Создать .env из .env.example только при новой установке. Указать уникальные пароли владельца PostgreSQL и прикладной роли, а также учётные данные файлового хранилища. Значения change_me и другие демонстрационные секреты заменить.

3

Сохранить предусмотренные внутренние адреса postgres, object-storage и certificate-manager. Прикладную роль PostgreSQL оставить отдельной от владельца базы. Не предоставлять ей права SUPERUSER или BYPASSRLS.

4

Для рабочей установки с HTTPS задать RUBEZH_ENVIRONMENT=production и RUBEZH_SESSION_COOKIE_SECURE=true. При включённом Secure вход выполняется по HTTPS, а не по HTTP.

5

Проверить конфигурацию без вывода содержимого секретов и собрать контейнеры.

if (-not (Test-Path '.env')) {
    Copy-Item '.env.example' '.env'
}
docker compose @composeArgs config --quiet
docker compose @composeArgs build

Первичная подготовка HTTPS

До первого запуска Nginx должны существовать локальный удостоверяющий сертификат, его закрытый ключ и сертификат сервера. Если для экземпляра уже подготовлены действующие сертификаты, сохранить их и перейти к запуску сервисов. Для нового экземпляра без сертификатов выполнить приведённую ниже одноразовую процедуру. Она создаёт отдельный локальный удостоверяющий центр и вызывает существующий механизм выпуска сертификата сервера. Повторно создавать удостоверяющий центр при обновлениях нельзя.

Указать фактический IPv4-адрес сервера. В примере имя образа rubezh-certificate-manager соответствует имени проекта rubezh, заданному выше.

$serverIp = '192.168.1.10'
New-Item -ItemType Directory -Force '.\infra\nginx\certs' | Out-Null
New-Item -ItemType Directory -Force '.\infra\nginx\runtime-certs' | Out-Null
$pkiPath = (Resolve-Path '.\infra\nginx\certs').Path
$certPath = (Resolve-Path '.\infra\nginx\runtime-certs').Path
$certificateBootstrap = @'
import os
from datetime import datetime, timedelta, timezone
from pathlib import Path
from cryptography import x509
from cryptography.hazmat.primitives import hashes, serialization
from cryptography.hazmat.primitives.asymmetric import rsa
from cryptography.x509.oid import NameOID
import app
cert_path = Path('/pki/rubezh-local-ca.crt')
key_path = Path('/pki/rubezh-local-ca.key')
server_files = [
    Path('/runtime/rubezh-server.crt'),
    Path('/runtime/rubezh-server.key'),
]
if any(p.exists() for p in [cert_path, key_path, *server_files]):
    raise SystemExit('Existing certificates found; bootstrap stopped')
key = rsa.generate_private_key(public_exponent=65537, key_size=3072)
name = x509.Name([
    x509.NameAttribute(NameOID.COMMON_NAME, 'Rubezh Local CA')
])
now = datetime.now(timezone.utc)
cert = (
    x509.CertificateBuilder()
    .subject_name(name).issuer_name(name)
    .public_key(key.public_key())
    .serial_number(x509.random_serial_number())
    .not_valid_before(now - timedelta(minutes=5))
    .not_valid_after(now + timedelta(days=3650))
    .add_extension(x509.BasicConstraints(ca=True, path_length=0), True)
    .add_extension(x509.KeyUsage(
        digital_signature=True, content_commitment=False,
        key_encipherment=False, data_encipherment=False,
        key_agreement=False, key_cert_sign=True, crl_sign=True,
        encipher_only=False, decipher_only=False,
    ), True)
    .sign(key, hashes.SHA256())
)
key_path.write_bytes(key.private_bytes(
    serialization.Encoding.PEM,
    serialization.PrivateFormat.PKCS8,
    serialization.NoEncryption(),
))
cert_path.write_bytes(cert.public_bytes(serialization.Encoding.PEM))
app.CA_CERT_PATH = cert_path
app.CA_KEY_PATH = key_path
app.rotate_certificate(app.RotateRequest(
    ip_address=os.environ['RUBEZH_INSTALL_IP']
))
print('CA and server certificates created')
'@
$certificateBootstrap | docker run --rm -i `
    --mount "type=bind,source=$pkiPath,target=/pki" `
    --mount "type=bind,source=$certPath,target=/runtime" `
    -e "RUBEZH_INSTALL_IP=$serverIp" `
    --entrypoint python rubezh-certificate-manager -

Полученные закрытые ключи остаются только на сервере и в защищённой резервной копии. На рабочие места передают исключительно файл rubezh-local-ca.crt. Закрытый ключ удостоверяющего центра и файл rubezh-server.key клиентам не передают.

Подготовка Offline ключей и запуск

Для новой установки сгенерировать серверные Offline-ключи штатной командой. Две строки RUBEZH_OFFLINE_… из результата перенести в соответствующие параметры .env. Вывод содержит закрытые ключи: хранить его как секрет и не публиковать. При наличии ключей работающей установки использовать существующие значения.

docker compose @composeArgs run --rm --no-deps backend python -m app.cli.generate_offline_keys

Запустить хранилища, создать прикладную роль PostgreSQL и применить миграции. Команда db-bootstrap должна завершиться успешно до запуска миграций.

docker compose @composeArgs up -d postgres object-storage
docker compose @composeArgs run --rm db-bootstrap
docker compose @composeArgs run --rm --no-deps backend alembic upgrade head
docker compose @composeArgs up -d
docker compose @composeArgs ps -a
docker compose @composeArgs exec backend alembic current

Проверка результата. Миграции завершились без ошибок. Долгоживущие сервисы запущены; для сервисов с проверкой здоровья отображается healthy. Завершение db-bootstrap с кодом 0 является штатным. Файлы сертификатов существуют, адрес сервера соответствует сертификату.

03

Первичная настройка

1

Создать первичного системного администратора по разделу 04 и выполнить вход по HTTPS. Сначала установить доверие к локальному удостоверяющему сертификату по разделу 06.

2

Создать организацию и её подразделения, заполнить необходимые реквизиты. Создать учётные записи пользователей, предоставить доступ к нужным организациям и назначить роли в пределах их обязанностей.

3

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

4

После импорта проверить комплектность нормативного набора и выполнить его публикацию штатной командой с кодом, номером версии и ожидаемым SHA-256 проверенного содержания. Эти параметры фиксирует ответственный за нормативную базу. Не публиковать произвольный набор и не обходить проверку содержания.

5

Проверить настройки физической подготовки, доступные нормативные наборы и правила состава упражнений. Создать тестовую проверку, назначить комиссию и инструкторов. Рабочую проверку создавать после проверки настройки на тестовом составе.

В первой команде заменить admin на логин администратора, который фактически создан. Команды ниже предназначены для первичного импорта, а не для повторного выполнения при каждом обновлении.

docker compose @composeArgs exec backend python -m app.cli.import_normatives --actor-username admin
docker compose @composeArgs exec backend python -m app.cli.import_normative_c2
docker compose @composeArgs exec backend python -m app.cli.import_normative_c3b
docker compose @composeArgs exec backend python -m app.cli.import_normative_c3c
docker compose @composeArgs exec backend python -m app.cli.publish_normative_set --help

Для публикации указать фактические параметры проверенного набора. Форма команды: python -m app.cli.publish_normative_set --code КОД --version НОМЕР --actor-username ЛОГИН --expected-sha256 SHA256. Выполнять её внутри backend через docker compose exec. Контрольная сумма состоит из 64 шестнадцатеричных символов; её нельзя заменять произвольным значением.

Проверка результата. Организация, подразделения и пользователи доступны в интерфейсе. Для проверки можно выбрать опубликованный нормативный набор, назначить комиссию и инструкторов. Пользователи видят только доступные им данные и функции.

04

Создание администратора

Первичный SYSTEM_ADMIN создаётся интерактивной служебной командой после применения миграций. Общедоступного стандартного пароля в этой процедуре нет.

docker compose @composeArgs exec backend python -m app.cli.create_system_admin
1

Ввести логин первичного администратора и отображаемое имя.

2

Ввести пароль и повторить его. Ввод пароля не отображается в терминале. По стандартной конфигурации минимальная длина составляет 12 символов; использовать уникальный пароль.

3

Дождаться сообщения «Первичный SYSTEM_ADMIN успешно создан».

4

Открыть HTTPS-адрес системы и войти с созданными учётными данными. Проверить доступ к административным разделам.

5

Зафиксировать порядок хранения и восстановления административного доступа. При существующем первичном SYSTEM_ADMIN команда bootstrap повторно администратора не создаёт; управление пользователями выполняется штатными средствами.

Проверка результата. Администратор выполняет вход и получает административные функции. Пароль хранится в базе в виде Argon2id-хеша. Создание первичного администратора фиксируется в аудите.

05

Настройка локальной сети

1

Подключить сервер и рабочие места к одной доступной локальной сети. Планшеты подключить к Wi-Fi, имеющему маршрут к серверу. Гостевая сеть с изоляцией клиентов для такого подключения не подходит.

2

Закрепить IPv4-адрес сервера средствами DHCP либо назначить согласованный статический адрес. В примере используется 192.168.1.10. Проверить фактический адрес командой ipconfig.

3

Разрешить входящие подключения TCP 8443 от рабочих мест. В стандартной конфигурации 8443 используется для HTTPS, 8080 — для HTTP. Для работы пользователей и планшетов использовать HTTPS. PostgreSQL и внутренние сервисы напрямую в локальную сеть не публиковать.

4

При использовании Windows Firewall создать правило для доверенного сетевого профиля. Приведённый пример рассчитан на профиль Private и клиентов из локальной подсети; для маршрутизируемых подсетей администратор задаёт согласованные диапазоны доступа.

5

С рабочего места проверить доступность TCP 8443. Если адрес сервера изменился, перевыпустить серверный сертификат для нового IP в административном разделе «Устройства», блок «Защищённое подключение». Использовать прежний локальный удостоверяющий центр.

ipconfig
New-NetFirewallRule -DisplayName 'Rubezh HTTPS' `
    -Direction Inbound -Action Allow -Protocol TCP `
    -LocalPort 8443 -Profile Private -RemoteAddress LocalSubnet
Test-NetConnection -ComputerName 192.168.1.10 -Port 8443

Команду создания правила выполняют на сервере с правами администратора Windows; Test-NetConnection — на подключаемом рабочем месте. Не отключать межсетевой экран целиком.

Проверка результата. Проверка TCP-подключения возвращает TcpTestSucceeded: True. С рабочего места открывается https://192.168.1.10:8443. Сертификат содержит используемый IP-адрес.

06

Подключение рабочих мест

1

Подготовить браузер, поддерживающий функции приложения. Установку PostgreSQL, backend и Docker на обычное рабочее место выполнять не требуется.

2

Получить у администратора публичный удостоверяющий сертификат infra\nginx\certs\rubezh-local-ca.crt. Убедиться в его происхождении; при передаче вне контролируемой сети сверить отпечаток сертификата с администратором.

3

Добавить сертификат в доверенные корневые удостоверяющие центры по правилам организации. В Windows для текущего пользователя можно использовать приведённую команду. При централизованном управлении сертификатами использовать механизм организации.

4

Открыть HTTPS-адрес сервера. Не продолжать работу через постоянное игнорирование предупреждения о недоверенном сертификате.

5

Войти под персональной учётной записью. Выбрать доступную организацию и проверить набор функций, соответствующий назначенной роли.

certutil -user -addstore Root '.\rubezh-local-ca.crt'
Test-NetConnection -ComputerName 192.168.1.10 -Port 8443

На рабочее место передаётся только публичный сертификат. Файлы .env, закрытые ключи сервера и удостоверяющего центра, а также пароли PostgreSQL на клиентских компьютерах не размещаются.

Проверка результата. Страница входа открывается по HTTPS без предупреждения о сертификате. Пользователь входит в систему, видит свою организацию и разрешённые разделы.

07

Подключение планшетов

1

Подключить планшет к Wi-Fi локальной сети и проверить доступность сервера. Проверить дату и время устройства.

2

Установить публичный сертификат доверия сервера средствами операционной системы планшета. При необходимости отдельно включить доверие к установленному удостоверяющему сертификату. Порядок зависит от политики и версии ОС устройства.

3

Открыть систему по HTTPS в браузере с поддержкой IndexedDB, Web Crypto, Service Worker и доступа к камере. Для QR-сканирования предоставить разрешение на использование камеры.

4

Под учётной записью с правом управления устройствами зарегистрировать этот планшет в системе, указав его код и наименование. Регистрация связана с конкретным браузером и его локальными ключами.

5

Назначить инструктору доступ к нужной проверке и точке приёма. Перейти в режим инструктора и подготовить Offline-сеанс при доступном сервере.

6

Проверить загрузку подписанного состава участников и упражнений. Убедиться, что Offline-сеанс принадлежит нужной проверке и планшету, а срок его действия достаточен для работы.

7

Провести тест автономной работы: отключить связь с сервером, идентифицировать тестового участника и записать результат. Затем восстановить связь и передать пакет по сети либо выгрузить .rbp и импортировать его штатным средством системы.

Для постоянной работы использовать один и тот же браузер и обычный профиль, без приватного режима. Пока результаты не переданы, не очищать данные сайта и не переустанавливать браузер. При изменении адреса сайта локальные данные прежнего адреса автоматически не переходят на новый; до смены адреса выгрузить непереданные пакеты.

После назначения пересдачи новый Offline-сеанс подготавливают для новой текущей попытки. Пакет предыдущей попытки нельзя использовать как результат пересдачи.

Проверка результата. Планшет зарегистрирован, Offline-сеанс подготовлен, QR-сканирование работает. При отсутствии сети тестовый результат сохраняется локально. После передачи пакет обрабатывается, а результат появляется у соответствующего участника и упражнения без дублирования.

08

Проверка работоспособности

Проверку выполняют на отдельной тестовой проверке. Тестовые результаты не вносят в рабочую ведомость.

1

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

2

Проверить вход администратора, председателя и инструктора под разными учётными записями. Убедиться, что каждому доступны только его функции и данные.

3

Создать тестовый состав, настроить упражнения и выдать QR-код участника. Записать один результат штатным способом.

4

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

5

Проверить автономную запись и последующий импорт с планшета по разделу 07. Повторно передать тот же пакет и убедиться, что дубли результатов не созданы.

6

Если пакет имеет ошибку, открыть карантин под председателем. Проверить отображение причины и доступных действий. Ошибку подписи, целостности или принадлежности попытке не устранять прямым изменением данных.

7

Проверить формирование и скачивание предусмотренных документов на тестовой проверке. Проверить наличие записей аудита для выполненных действий.

8

Зафиксировать дату проверки, версию приложения, ревизию базы, проверенные устройства и результат каждого действия.

docker compose @composeArgs ps -a
docker compose @composeArgs exec backend alembic current
docker compose @composeArgs exec backend python -c "import urllib.request; print(urllib.request.urlopen('http://127.0.0.1:8000/api/v1/health').status)"
docker compose @composeArgs logs --tail 100 backend nginx certificate-manager

Автоматические backend-тесты при приёмке релиза выполняют в отдельном тестовом экземпляре. Не запускать полный набор тестов на рабочей базе без подтверждённой изоляции тестовой конфигурации.

Проверка результата. Сервисы доступны, API здоровья возвращает HTTP 200, роли работают корректно, результат отображается в ведомости, Offline-импорт не создаёт дубли, документы открываются, аудит содержит ожидаемые события.

09

Резервное копирование

Резервная копия должна позволять восстановить согласованное состояние всей системы. Копирование только базы PostgreSQL недостаточно: ссылки на документы, нормативные материалы и исходные Offline-пакеты требуют соответствующего файлового хранилища.

1

Согласовать окно обслуживания и остановить ввод данных. Выгрузить и сохранить непереданные .rbp с планшетов: локальные журналы планшетов не входят в серверную резервную копию.

2

Подготовить защищённый каталог резервной копии, желательно на отдельном носителе или хранилище. Зафиксировать установленную версию, ревизию Alembic и используемое имя Compose-проекта.

3

Остановить Nginx, backend, сервис сертификатов и файловое хранилище. PostgreSQL оставить запущенным для штатного pg_dump. В период копирования не выполнять ручные изменения базы.

4

Создать архив PostgreSQL в формате custom внутри контейнера и скопировать его на сервер через docker compose cp. Не передавать бинарный архив через текстовое перенаправление PowerShell.

5

Сохранить том файлового хранилища, .env, сертификаты и закрытые ключи, docker-compose.yml и соответствующий дистрибутив или комплект образов. Ограничить доступ к копии, поскольку она содержит персональные данные и серверные секреты.

6

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

Пример создания резервной копии

$backupRoot = 'D:\RubezhBackups'
$backupPath = Join-Path $backupRoot (Get-Date -Format 'yyyyMMdd-HHmmss')
New-Item -ItemType Directory -Force $backupPath | Out-Null
docker compose @composeArgs exec -T backend alembic current |
    Set-Content -Encoding UTF8 (Join-Path $backupPath 'alembic-current.txt')
docker compose @composeArgs stop nginx backend certificate-manager object-storage
docker compose @composeArgs exec -T postgres sh -c 'pg_dump --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" --format=custom --file=/tmp/rubezh-backup.dump'
docker compose @composeArgs exec -T postgres pg_restore --list /tmp/rubezh-backup.dump
docker compose @composeArgs cp 'postgres:/tmp/rubezh-backup.dump' (Join-Path $backupPath 'database.dump')
$storageContainer = docker compose @composeArgs ps -aq object-storage
$storageInfo = docker inspect $storageContainer | ConvertFrom-Json
$storageVolume = ($storageInfo[0].Mounts |
    Where-Object { $_.Destination -eq '/data' }).Name
if (-not $storageVolume) { throw 'Storage volume not found' }
docker run --rm --entrypoint sh `
    --mount "type=volume,source=$storageVolume,target=/data,readonly" `
    --mount "type=bind,source=$backupPath,target=/backup" `
    postgres:16 -c 'tar -czf /backup/object-storage.tar.gz -C /data .'
Copy-Item '.env' (Join-Path $backupPath '.env')
Copy-Item 'docker-compose.yml' $backupPath
Copy-Item '.\infra\nginx\certs' (Join-Path $backupPath 'certs') -Recurse
Copy-Item '.\infra\nginx\runtime-certs' (Join-Path $backupPath 'runtime-certs') -Recurse
Get-ChildItem $backupPath -File -Recurse |
    Get-FileHash -Algorithm SHA256 |
    Export-Csv (Join-Path $backupPath 'checksums.csv') -NoTypeInformation -Encoding UTF8
docker compose @composeArgs up -d
docker compose @composeArgs ps -a

При ошибке копирования сохранить диагностические сведения, проверить состояние сервисов и повторить создание копии. Не считать копию готовой по одному факту наличия файлов. Список pg_restore подтверждает читаемость структуры архива, но не заменяет проверку восстановления.

Проверка восстановления

Восстановление проверяют на отдельном компьютере, без подключения планшетов и рабочих пользователей. Разместить тот же дистрибутив, восстановить .env и сертификаты, создать роли PostgreSQL штатным db-bootstrap. Восстановить database.dump через pg_restore в подготовленную базу, а архив файлового хранилища — в пустой том object-storage до запуска этого сервиса. Использовать те же имена ролей, которые присутствуют в резервной копии. Запустить приложение той версии, для которой сделана копия, и выполнить проверки раздела 08. Обновлять схему до другой версии только после успешного исходного восстановления.

Не удалять рабочие Docker-тома для проверки резервной копии. Команда docker compose down -v удаляет данные томов и не используется в обычном обслуживании.

Проверка результата. Создан согласованный комплект базы, файлов, настроек и ключей. Контрольные суммы сохранены, сервисы возобновлены. На отдельном компьютере подтверждено восстановление пользователей, проверок, результатов и документов.

10

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

1

Получить дистрибутив новой версии и изучить сведения об изменениях, миграциях и совместимости Offline-сеансов. Сначала проверить обновление на тестовом экземпляре.

2

Согласовать окно обслуживания. До изменения адреса, ключей или правил импорта завершить передачу результатов с планшетов либо сохранить их .rbp. Не заменять серверные Offline-ключи без отдельного порядка миграции.

3

Создать и проверить резервную копию по разделу 09. Сохранить предыдущий дистрибутив и необходимые образы для восстановления.

4

Остановить доступ пользователей и backend. Заменить файлы приложения новой поставкой, сохранив действующие .env, сертификаты, серверные ключи и используемое имя Compose-проекта. Сопоставить новые параметры .env.example с рабочим .env и добавить только необходимые настройки.

5

Пересобрать контейнеры, применить миграции из новой версии отдельным контейнером backend и запустить сервисы. Не запускать старый backend одновременно с миграцией новой схемы.

6

Проверить состояние сервисов, ревизию Alembic и функции по разделу 08. На планшетах при доступном сервере открыть обновлённое приложение и убедиться, что используется новая версия; перед очисткой браузерных данных обязательно сохранить непереданные результаты.

7

Зафиксировать версию, дату обновления и результаты проверки. Если миграция или контроль не прошли, не открывать систему пользователям до устранения причины либо контролируемого восстановления.

docker compose @composeArgs stop nginx backend
# Здесь размещают файлы согласованной новой версии.
docker compose @composeArgs build
docker compose @composeArgs run --rm --no-deps backend alembic upgrade head
docker compose @composeArgs up -d
docker compose @composeArgs exec backend alembic current
docker compose @composeArgs ps -a

Изменение пароля владельца PostgreSQL только в .env не меняет пароль уже существующей роли в базе. Смена учётных данных выполняется отдельной согласованной процедурой. Закрытые документы, исходные результаты и Offline-события при обновлении вручную не изменяются.

Если применённая миграция необратима, возврат старых файлов приложения не является полноценным откатом. Для восстановления используют согласованную резервную копию всей системы и соответствующую ей предыдущую версию приложения.

Проверка результата. Новая версия запущена, схема базы соответствует её миграциям, HTTPS и вход работают, результаты и документы сохранены, тестовая передача с планшета проходит без дублей и ошибок целостности.

Справочные материалы

Документация Docker Desktop для Windows: https://docs.docker.com/desktop/setup/install/windows-install/

Документация Docker по постоянным томам и их копированию: https://docs.docker.com/engine/storage/volumes/

Документация PostgreSQL 16 по pg_dump: https://www.postgresql.org/docs/16/app-pgdump.html

Документация PostgreSQL 16 по pg_restore: https://www.postgresql.org/docs/16/app-pgrestore.html

Внешние требования Docker и поддерживаемые версии Windows уточняют перед установкой. Порядок команд АИС ФП «Рубеж» определяется поставляемой версией приложения.