Перейти к содержимому

Устранение неполадок

Эта страница — «симптом → что ввести». Сначала соберите диагностический пакет (§0), затем откройте раздел по каналу или теме.


Если в вашей поставке есть скрипт support-bundle (спросите у поставщика путь) — запустите его. Иначе соберите вручную из каталога установки Portal:

Docker:

Окно терминала
cd /путь/к/portal-*-docker-bundle
./portal-cli/portal-cli status --mode docker > /tmp/portal-status.txt
docker compose ps > /tmp/portal-ps.txt
docker compose logs --tail=200 backend worker frontend > /tmp/portal-logs.txt
# Не присылайте файл .env целиком (там пароли). При необходимости — только имена переменных:
grep -E '^[A-Z0-9_]+=' .env | cut -d= -f1 > /tmp/portal-env-keys.txt

Kubernetes:

Окно терминала
kubectl -n portal get pods,svc,ingress > /tmp/portal-k8s.txt
kubectl -n portal logs deploy/portal-backend --tail=200 > /tmp/portal-api-logs.txt

Native Linux:

Окно терминала
systemctl status portal-api portal-worker --no-pager > /tmp/portal-systemd.txt
journalctl -u portal-api -u portal-worker -n 200 --no-pager > /tmp/portal-journal.txt

Передайте эти файлы в поддержку без паролей и LICENSE.key.


Выполните по порядку:

Окно терминала
./portal-cli/portal-cli status --mode docker
# или: --mode k8s | --mode native
curl -sS http://localhost/health
curl -sS http://localhost/api/v1/system/version
curl -sS http://localhost/api/v1/system/license-status

Ожидается: status без упавших сервисов, health отвечает, version и license-status возвращают JSON.


Окно терминала
docker compose logs db-init
docker compose --env-file .env ps
docker compose run --rm db-init

Проверьте, что PostgreSQL доступен и POSTGRES_* в .env верные.

Окно терминала
docker compose logs --tail=100 backend
docker compose ps backend
curl -sS http://127.0.0.1:3001/health

Проверьте в .env: JWT_SECRET, POSTGRES_*. Затем:

Окно терминала
docker compose up -d --force-recreate backend

Симптом: 502 от frontend / вылет на логин / /chat-hub 502

Заголовок раздела «Симптом: 502 от frontend / вылет на логин / /chat-hub 502»

Чаще всего backend/chat не слушают порт или nginx держит старый Docker IP после recreate.

Окно терминала
docker compose ps
curl -sS http://127.0.0.1:3001/health
curl -sS http://127.0.0.1:3010/health
docker compose exec frontend nginx -s reload

Frontend сам делает nginx -s reload при смене IP (20-upstream-watch.sh). Подождите 10 секунд и обновите страницу.

Модуль чата и звонки: Корпоративный чат.

Окно терминала
grep -E 'WOPI_HOST_URL|PORTAL_OFFICE' .env || true
curl -sS http://127.0.0.1:9980/hosting/discovery | head
docker compose ps office

Проверьте WOPI_HOST_URL и PORTAL_OFFICE_PUBLIC_URL. См. Portal Office.

Окно терминала
docker compose --env-file .env ps
docker compose logs -f backend worker
docker compose run --rm db-init

Окно терминала
kubectl get sc
kubectl get pvc -n portal
kubectl describe pvc -n portal

Нужен StorageClass в кластере.

Окно терминала
kubectl get jobs -n portal
kubectl logs -n portal job/portal-db-init

Проверьте секрет пароля Postgres и доступность БД.

Окно терминала
kubectl get ingress -n portal
kubectl describe ingress -n portal

Сверьте host в Ingress с адресом в браузере и наличие Ingress Controller.

Окно терминала
kubectl describe pod -n portal <имя-пода>

Сделайте docker load образов или проверьте credentials registry.

Окно терминала
kubectl get pods -n portal
kubectl describe pod -n portal <name>
helm status portal -n portal
kubectl logs -n portal -l app.kubernetes.io/component=backend -f

Окно терминала
systemctl status portal-api --no-pager
journalctl -u portal-api -n 100 --no-pager
source /etc/portal/portal.env
psql -h "$POSTGRES_HOST" -U "$POSTGRES_USER" -d "$POSTGRES_DB" -c 'SELECT 1'

Если psql падает — исправьте Postgres в /etc/portal/portal.env, затем:

Окно терминала
sudo systemctl restart portal-api portal-worker
Окно терминала
ss -tlnp | grep 3001
sudo nginx -t
curl -sS http://127.0.0.1:3001/health
sudo systemctl restart portal-api
sudo systemctl reload nginx
Окно терминала
journalctl -u portal-worker -n 50 --no-pager
journalctl -u portal-api -f

Окно терминала
Get-Service PortalApi, PortalWorker
sc.exe query PortalApi
Get-EventLog -LogName Application -Source PortalApi -Newest 20
Invoke-RestMethod http://127.0.0.1:3001/health

Если служба не Running — смотрите Event Log и C:\ProgramData\Portal\portal.env (Postgres, Redis, S3).


Что видитеЧто сделать
Доменный вход 400 LDAP not configuredАдминка → Службы → Синхронизация AD → Настройки — URL, Base DN, Bind DN, пароль; badge «Подключён»
ad-sync недоступна / available: falseLDAP не настроен или проверка не проходит — смотрите /admin/settings/ldap-status
Поиск в каталоге пустойsearchFilter, baseDn, права bind-учётки; запрос минимум 2 символа
Группы AD не появляютсяВключите Синхронизировать группы AD; запустите ad-sync вручную
Состав группы AD не совпадаетСинхронизируются только прямые member; вложенные группы не разворачиваются
Пользователь не деактивируетсяВключите «Деактивировать пользователей, отсутствующих в AD» (cronDeactivateMissing) — и при ручном запуске, и по cron. Не путать с флагами очистки групп

Проверка API (нужна cookie администратора):

Окно терминала
curl -sS http://localhost/api/v1/admin/settings/ldap-status -b cookies.txt

Локальный OpenLDAP в Docker (если включён профиль):

Окно терминала
docker compose --profile ldap ps
docker compose --profile ldap logs ldap

См. Группы доступа.


Что видитеЧто сделать
Бронирования / таймлайн со сдвигомПроверьте portal.timezone в portal.config.yaml и TZ в .env / portal.env
Службы по расписанию не вовремяWorker использует TimeZoneInfo.Local = TZ процесса — задайте зону и перезапустите API/Worker

Docker — проверка времени в контейнере:

Окно терминала
docker compose exec backend date
grep -E '^(TZ|)' .env | head

Должно совпадать с регионом организации. Затем:

Окно терминала
docker compose up -d --force-recreate backend worker

Native:

Окно терминала
grep ^TZ= /etc/portal/portal.env
sudo systemctl restart portal-api portal-worker

Подробнее: Быстрый старт: Docker.


Что видитеЧто сделать
402 LICENSE_EXPIREDАктивируйте LICENSE.key в Настройки → Продукт и лицензия или CLI ниже
402 LICENSE_CHANNEL_MISMATCHКанал/платформа ключа ≠ установка. Сверьте install.mode / install.platform в PORTAL_DATA_DIR; запросите ключ с правильным channel/platform
invalid licenseПроверьте файл ключа; выполните portal-cli install до активации (для ключей с channel) или новый ключ у поставщика
Trial истёк / нет ключаНовый signed trial или коммерческий ключ от поставщика
mode: invalid без ключаОжидаемо: без ключа запись недоступна

Активация CLI:

Окно терминала
./portal-cli/portal-cli license activate --file LICENSE.key
./portal-cli/portal-cli upgrade --mode docker # или k8s / native
curl -sS http://localhost/api/v1/system/license-status

Пробный период — подписанный LICENSE.key с "kind": "trial" (30 дней, привязка к инсталляции). Локальный сброс файлами или БД новый trial не открывает: нужен новый ключ от поставщика (повторная выдача на ту же привязку не выполняется).


Docker:

Окно терминала
docker compose run --rm db-init
docker compose logs db-init

Native Linux:

Окно терминала
sudo -u portal bash -c 'set -a; source /etc/portal/portal.env; set +a; \
MIGRATIONS_PATH=/opt/portal/migrations /opt/portal/bin/Portal.DbInit'

Затем проверьте health и вход в портал.


РежимКоманда
Dockerdocker compose logs -f backend worker
K8skubectl logs -n portal -l app.kubernetes.io/component=backend -f
Nativejournalctl -u portal-api -f

Что видитеЧто сделать
Версия релиза в админке не измениласьОбразы/бинарники из нового bundle; см. команды ниже
Миграции не применились после upgradeПовторите portal-cli upgrade --mode <канал> или §9
Проверить обновления не работаетНужен HTTPS до korport.ru; в air-gap сравнивайте RELEASE с дистрибутивом

Проверка файла RELEASE:

Окно терминала
# Docker
docker compose exec backend cat /app/RELEASE
# Native Linux
cat /opt/portal/RELEASE

Полная инструкция: Обновление Portal.


Что видитеЧто сделать
Update-runner OfflineКоманды ниже + один PORTAL_UPDATE_RUNNER_TOKEN у API и runner
Нет кнопки ОбновитьСначала Проверить обновления; нужны новая версия, лицензия, Online runner. В air-gap кнопки нет
Задание сразу failed: лицензия / entitleКлюч не просрочен; привязка и канал = установка; на korport.ru есть артефакт вашего канала
Задание зависло (running > 2 ч)Логи runner; API помечает зависшие как failed — исправьте и запустите снова
После обновления runner снова offlinedocker compose up -d update-runner

Docker:

Окно терминала
docker compose up -d update-runner
docker compose ps update-runner
docker compose logs --tail=80 update-runner

Native Linux:

Окно терминала
systemctl status portal-update-runner --no-pager
# или: portal-cli update-runner
journalctl -u portal-update-runner -n 80 --no-pager

Проверка heartbeat (подставьте токен из .env):

Окно терминала
source .env # или: grep PORTAL_UPDATE_RUNNER_TOKEN .env
curl -sS -X POST http://localhost/api/v1/internal/upgrade-queue/heartbeat \
-H "Content-Type: application/json" \
-H "X-Portal-Update-Token: $PORTAL_UPDATE_RUNNER_TOKEN" \
-d '{"source":"manual"}'

См. Обновление Portal.