Локально путь к сертификату вёл в ~/Downloads у каждого свой, а в контейнере задавался двумя отдельными переменными. Теперь каталог один и подменяется целиком через SECRETS_DIR: по умолчанию secrets/ в корне репозитория, в контейнере /certs (смонтированный каталог с хоста, GRAPH_CERT_DIR не меняется). Имена файлов внутри фиксированы, поэтому GRAPH_CERT_PATH и GRAPH_KEY_PATH больше не нужны. Содержимое secrets/ в .gitignore, кроме README. Отсутствие файлов теперь даёт понятную ошибку вместо ENOENT — на свежем клоне это основной сценарий отказа. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
secrets
Сертификат и приватный ключ приложения Azure AD, под которым сервис
hr-appeals-auth получает app-only токен. В git не попадают — всё
содержимое каталога, кроме этого файла, в .gitignore.
Положите сюда два файла (взять у администратора):
secrets/
SPFxDeploy_cert.pem
SPFxDeploy_key.pem
Имена фиксированные — их ждёт server/src/config.ts.
Подменить каталог целиком
Путь задаётся одной переменной SECRETS_DIR, поэтому каталог можно заменить
не трогая код:
SECRETS_DIR=/path/to/other/secrets npm run dev --prefix server
По умолчанию — этот каталог. В продовом контейнере SECRETS_DIR=/certs, куда
смонтирован каталог с хоста: путь на хосте задаёт GRAPH_CERT_DIR в .env
рядом с docker-compose.yml на сервере.
Если ключ утёк
Сертификат перевыпускается в Azure AD (App registrations → нужное приложение → Certificates & secrets), старый оттуда удаляется. Замена файлов здесь без этого ничего не даёт: Azure AD продолжит принимать подпись старым ключом.