Перейти к содержанию

История изменений

2026-04-06 08:00 UTC – sd.gen7x.ru: публикация ServiceDesk Monitor (OMC)

Проблема: Опубликовать одностраничный дашборд инцидентов по адресу sd.gen7x.ru.

Решение: Добавлен виртуальный хост Nginx с корнем /opt/omc-servicedesk-monitor, индекс index.html, Cloudflare Origin SSL (как у docs/cat).

Изменения: - /opt/gen7x/nginx/conf.d/sd.gen7x.ru.conf — HTTP→HTTPS, root /opt/omc-servicedesk-monitor, логи sd.gen7x.ru_*.log.

Проверка: nginx -t, systemctl reload nginx; curl -sI --resolve sd.gen7x.ru:443:127.0.0.1 -k https://sd.gen7x.ru/ — 200. В Cloudflare для зоны gen7x.ru нужна DNS-запись для sd (A/AAAA или CNAME на origin), режим прокси по желанию.

Дополнение (2026-04-06): в кешируемые расширения статики для sd.gen7x.ru добавлены .xlsx и .xls (на случай прямой раздачи файлов).

Дополнение (2026-04-06): для дашборда ServiceDesk добавлен location /api/ → прокси на 127.0.0.1:3910 (контейнер omc-sd-api, Node.js + PostgreSQL, upsert инцидентов по полю «Название»). База omc_sd_monitor в существующем Postgres.

Исправление (2026-04-06): для sd.gen7x.ru location для API задан как ^~ /api/, иначе location ~* \.(…|json|…)$ перехватывал запросы вида /api/health и отдавался 404 из статики.


2026-03-29 12:00 UTC – cat.gen7x.ru: статика каталога WaterSurf (YML)

Проблема: Опубликовать визуализатор YML-каталога по адресу cat.gen7x.ru.

Решение: Добавлен виртуальный хост Nginx с корнем /opt/watersurf, индексный файл yml_viewer-3.html, те же Cloudflare Origin SSL, что у docs/erp.

Изменения: - /opt/gen7x/nginx/conf.d/cat.gen7x.ru.conf — HTTP→HTTPS, root /opt/watersurf, логи cat.gen7x.ru_*.log. - Проект /opt/watersurf: README, HISTORY, артефакты репозитория.

Проверка: nginx -t, systemctl reload nginx; после записи DNS для cat.gen7x.ru — curl -sI https://cat.gen7x.ru/.


2026-03-17 12:00 UTC – LMS: Cloudflare «DNS only», переход на Let's Encrypt

Проблема: В Cloudflare для lms.gen7x.ru включён режим «DNS only» — трафик идёт напрямую на сервер, сертификат Cloudflare Origin не доверен браузерами.

Решение: Выпущен сертификат Let's Encrypt для lms.gen7x.ru, Nginx переведён на его использование.

Изменения: - В виртуальный хост lms.gen7x.ru добавлена раздача /.well-known/acme-challenge/ из /var/www/letsencrypt-lms (для HTTP-01). - Установлен certbot, получен сертификат: /etc/letsencrypt/live/lms.gen7x.ru/. - В блоке HTTPS указаны fullchain.pem и privkey.pem от Let's Encrypt вместо Cloudflare Origin. - Продление сертификата — автоматически (certbot).

Проверка: curl -sI https://lms.gen7x.ru/ — ответ 301/200, сертификат доверенный.


2026-03-16 15:30 UTC – Публикация LMS по адресу lms.gen7x.ru

Проблема: Сделать курс «Управление ИТ (ОМС)» доступным извне по адресу lms.gen7x.ru.

Решение: Добавлен виртуальный хост Nginx с проксированием на приложение LMS (порт 8000). HTTP редирект на HTTPS, те же SSL-сертификаты Cloudflare Origin.

Изменения: - Создан /opt/gen7x/nginx/conf.d/lms.gen7x.ru.conf: server_name lms.gen7x.ru, proxy_pass http://127.0.0.1:8000, логи в /var/log/nginx/lms.gen7x.ru_*.log. - В секретах и истории платформы указан домен lms.gen7x.ru.

Доступ извне: В панели Cloudflare (DNS) нужно создать запись для lms.gen7x.ru: тип A — IP сервера или CNAME на тот же хост, что и другие поддомены. Режим SSL: Full (strict). Если в Origin-сертификате нет lms.gen7x.ru — выдать новый сертификат с дополнительным SAN и положить в /opt/gen7x/nginx/ssl/.

Проверка: curl -sI https://lms.gen7x.ru/ (после настройки DNS).


2026-03-16 14:00 UTC – Добавлен проект LMS «Управление ИТ (ОМС)»

Проблема: Развёрнут новый проект системы дистанционного обучения в /opt/lms-it-oms с серверной частью (FastAPI, PostgreSQL).

Решение: В /opt/gen7x/backup/include-volumes.txt добавлен volume lms-it-oms_lms_it_oms_data для резервного копирования БД участников и результатов тестирования.

Изменения: Одна строка в include-volumes.txt.

Проверка: После настройки бэкапа убедиться, что volume участвует в списке.


2026-02-25 15:10 UTC – Добавлен проект ERP WaterSurf (erp.gen7x.ru)

Проблема: Развёрнут новый проект ERP для WaterSurf в /opt/watersurf-erp; требуется интеграция с платформой (Nginx, бэкап).

Решение: - Добавлен конфиг Nginx /opt/gen7x/nginx/conf.d/erp.gen7x.ru.conf: проксирование на 127.0.0.1:8010, SSL Cloudflare Origin. - В /opt/gen7x/backup/include-volumes.txt добавлен volume watersurf-erp_watersurf_erp_data для резервного копирования БД проекта.

Изменения: - erp.gen7x.ru.conf — сервер erp.gen7x.ru (HTTP→HTTPS редирект, HTTPS proxy на порт 8010). - include-volumes.txt — одна строка с именем volume ERP.

Проверка: - После запуска приложения (cd /opt/watersurf-erp && docker compose up -d) и перезагрузки Nginx: открыть https://erp.gen7x.ru/ - В DNS Cloudflare должен быть добавлен хост erp.gen7x.ru (или использовать существующий Origin Certificate с поддержкой поддомена).


2026-02-25 14:30 UTC – Восстановление доступа к Gitea и учётная запись для агента

Проблема: Нет доступа в Gitea (git.gen7x.ru) — учётные данные для веб-входа не были сохранены; в системе не было пользователей.

Решение: - В Gitea не было ни одного пользователя (первоначальная настройка не была завершена или БД пуста). - Созданы две учётные записи через CLI в контейнере (docker exec -u git gitea gitea admin user create ...): 1. admin — основной администратор для входа в веб-интерфейс (логин/пароль записаны в /root/docs/secrets/mysecrets.md). 2. cursor-agent — учётная запись для агента с правами администратора, чтобы самостоятельно создавать пустые репозитории для новых проектов.

Изменения: - В /root/docs/secrets/mysecrets.md добавлена секция «Вход в веб-интерфейс» с логинами и паролями для admin и cursor-agent.

Проверка: - Открыть https://git.gen7x.ru и войти под admin (пароль в mysecrets.md). - Агент может использовать cursor-agent для создания репозиториев через веб или API.


2026-01-25 13:20 UTC – Диагностика Cloudflare 521 (n8n.gen7x.ru и все поддомены)

Проблема: При заходе на n8n.gen7x.ru, git.gen7x.ru, docs.gen7x.ru — Cloudflare возвращает Error 521: Web server is down.

Диагностика: - ✅ Nginx, n8n, Gitea, MkDocs на origin работают; локально curl -H "Host: n8n.gen7x.ru" https://127.0.0.1/ → 200 - ✅ UFW: 80/tcp, 443/tcp разрешены от Anywhere - ✅ Origin: 193.32.188.234, nginx слушает 0.0.0.0:443 - ❌ Запросы через Cloudflare (в т.ч. с самого сервера) → 521; в access-логах n8n.gen7x.ru — только 127.0.0.1 (локальный curl), внешних запросов от Cloudflare нет

Вывод: Cloudflare не устанавливает TCP-соединение с origin. Проблема не в n8n, а в связке Cloudflare ↔ origin (все поддомены).

Исправления: - Удалён дублирующий include /opt/gen7x/nginx/conf.d/*.conf в /etc/nginx/nginx.conf - nginx -t && systemctl reload nginx — успешно

Что проверить вручную (в Cloudflare Dashboard и у хостера):

  1. DNS → A/AAAA для gen7x.ru и поддоменов
  2. Origin должен быть 193.32.188.234 (или корректный IPv6, если используется).
  3. Убедиться, что запись не указывает на старый IP или внутренний адрес.

  4. SSL/TLS

  5. Режим Full или Full (strict).
  6. На origin уже установлен Cloudflare Origin Certificate (/opt/gen7x/nginx/ssl/gen7x-origin.crt).

  7. Временная проверка без прокси Cloudflare

  8. В DNS для n8n.gen7x.ru (или другого поддомена) переключить запись в DNS only (серое облако).
  9. Проверить: curl -I https://n8n.gen7x.ru. Если ответ 200 — проблема именно в соединении Cloudflare → origin.

  10. Хостинг-провайдер

  11. Уточнить, нет ли фаервола/DDoS-защиты, блокирующей подсети Cloudflare: https://www.cloudflare.com/ips/
  12. При необходимости запросить разблокировку до origin (193.32.188.234, порты 80/443).

  13. Проверка порта снаружи

  14. Через сервис вроде https://www.yougetsignal.com/tools/open-ports/ убедиться, что 193.32.188.234:443 открыт из интернета.

Команды для повторной проверки:

# Локально на origin
curl -sI -H "Host: n8n.gen7x.ru" https://127.0.0.1/   # ожидаем 200
curl -sI https://n8n.gen7x.ru                          # через Cloudflare — сейчас 521


2026-01-25 12:23 UTC – Завершена настройка резервного копирования с реальными S3 credentials

Проблема: Требовалось заполнить реальные S3 credentials и протестировать систему бэкапа

Решение: - Заполнены реальные credentials Backblaze B2 в .env и rclone.conf - Исправлена проблема с --s3-no-check-bucket флагом для всех rclone команд - Исправлена логика загрузки файлов (проблема с tee в pipeline) - Протестирован полный цикл бэкапа - все файлы успешно загружаются

Изменения: - Обновлен /opt/gen7x/backup/.env с реальными S3 credentials - Обновлен /opt/gen7x/backup/secrets/rclone.conf с реальными ключами - Добавлен флаг --s3-no-check-bucket во все rclone команды (copy, lsf, purge) - Добавлен force_path_style = true в rclone.conf - Исправлена логика загрузки файлов (добавлен || true для арифметических операций) - Обновлен /root/docs/secrets/mysecrets.md с реальными credentials

Результат: - ✅ Бэкап успешно создаёт дампы PostgreSQL - ✅ Бэкап успешно архивирует Docker volumes (gitea_data, n8n_data) - ✅ Бэкап успешно архивирует nginx SSL сертификаты - ✅ Все файлы шифруются через age - ✅ Все файлы успешно загружаются в S3 (Backblaze B2) - ✅ Retention работает корректно

Проверка:

export RCLONE_CONFIG=/opt/gen7x/backup/secrets/rclone.conf
rclone ls b2s3:gen7x-backups/gen7x/weekly/2026-W04/ --s3-no-check-bucket
systemctl status gen7x-backup.service

2026-01-25 11:05 UTC – Настроена система резервного копирования в S3

Проблема: Необходимо обеспечить надёжное резервное копирование всех сервисов платформы

Решение: - Реализована автоматическая система резервного копирования в S3 (Backblaze B2) - Настроено шифрование бэкапов через age - Настроен systemd timer для ежедневного автоматического бэкапа - Реализованы retentions: daily (14 дней), weekly (8 недель), monthly (12 месяцев)

Изменения: - Установлены rclone и age - Создана структура /opt/gen7x/backup/: - backup.sh - основной скрипт бэкапа - restore.sh - скрипт восстановления - .env.example - шаблон конфигурации - include-volumes.txt - список volumes для бэкапа - Создан age ключ для шифрования - Настроены systemd service и timer (gen7x-backup.service, gen7x-backup.timer) - Создана директория логов /var/log/gen7x-backup/ - Обновлен .gitignore для исключения секретов - Создана документация /root/docs/docs/backup.md

Что бэкапится: - PostgreSQL логические дампы (ежедневно) - Docker volumes: gitea_data, n8n_data - Nginx SSL сертификаты

Следующие шаги: 1. Заполнить /opt/gen7x/backup/.env с реальными S3 credentials 2. Создать /opt/gen7x/backup/secrets/rclone.conf с конфигурацией rclone 3. Протестировать бэкап: systemctl start gen7x-backup.service 4. Проверить загрузку в S3

Команда проверки:

systemctl status gen7x-backup.timer
systemctl list-timers | grep gen7x
journalctl -u gen7x-backup.service -f

2026-01-25 10:56 UTC – Установлен Cloudflare Origin Certificate с приватным ключом

Проблема: Требовалось установить правильный приватный ключ, соответствующий Cloudflare Origin Certificate

Решение: - Установлен новый Cloudflare Origin Certificate (действителен до 21 января 2041 года) - Установлен соответствующий приватный ключ - Проверено соответствие ключа сертификату (MD5 модулей совпадают) - Nginx успешно перезагружен с новым сертификатом

Изменения: - Обновлен файл /opt/gen7x/nginx/ssl/gen7x-origin.crt с новым Cloudflare Origin Certificate - Обновлен файл /opt/gen7x/nginx/ssl/gen7x-origin.key с соответствующим приватным ключом - Установлены права 600 на оба файла - Проверено соответствие ключа сертификату - Nginx успешно перезагружен, HTTPS работает

Сертификат: - Issuer: Cloudflare Origin SSL Certificate Authority - Subject: CloudFlare Origin Certificate - Действителен: с 25 января 2026 до 21 января 2041 (15 лет) - Домены: *.gen7x.ru, gen7x.ru

Следующие шаги: 1. В Cloudflare Dashboard переключить режим SSL/TLS на Full (strict) 2. Проверить работу через внешний доступ: curl -Iv https://git.gen7x.ru 3. Убедиться, что все поддомены работают по HTTPS

Команда проверки:

openssl x509 -in /opt/gen7x/nginx/ssl/gen7x-origin.crt -noout -subject -issuer -dates
nginx -t && systemctl reload nginx
curl -Iv https://git.gen7x.ru
curl -Iv https://docs.gen7x.ru
curl -Iv https://n8n.gen7x.ru

2026-01-25 10:53 UTC – Установлен Cloudflare Origin Certificate

Проблема: Требовалось заменить временный самоподписанный сертификат на реальный Cloudflare Origin Certificate

Решение: - Установлен Cloudflare Origin Certificate в /opt/gen7x/nginx/ssl/gen7x-origin.crt - Сертификат валиден до 15 ноября 2040 года - Nginx перезагружен с новым сертификатом

Изменения: - Обновлен файл /opt/gen7x/nginx/ssl/gen7x-origin.crt с реальным Cloudflare Origin Certificate - Проверена валидность сертификата (issuer: Cloudflare Origin SSL Certificate Authority) - Nginx успешно перезагружен

Следующие шаги: 1. Убедиться, что приватный ключ соответствует сертификату (если нет - заменить) 2. В Cloudflare Dashboard переключить режим SSL/TLS на Full (strict) 3. Проверить работу через внешний доступ: curl -Iv https://git.gen7x.ru

Команда проверки:

openssl x509 -in /opt/gen7x/nginx/ssl/gen7x-origin.crt -noout -subject -issuer -dates
nginx -t && systemctl reload nginx
curl -Iv https://git.gen7x.ru

2026-01-25 10:52 UTC – Настройка Cloudflare Origin SSL

Проблема: Не было защищённого соединения между Cloudflare и сервером (193.32.188.234)

Решение: - Настроен Cloudflare Origin Certificate для всех поддоменов - Обновлены конфигурации Nginx для использования единого Origin сертификата - Настроены редиректы HTTP → HTTPS - Установлен X-Forwarded-Proto: https для корректной работы прокси

Изменения: - Обновлены конфигурации Nginx в /opt/gen7x/nginx/conf.d/: - git.gen7x.ru.conf → использует /opt/gen7x/nginx/ssl/gen7x-origin.crt - n8n.gen7x.ru.conf → использует /opt/gen7x/nginx/ssl/gen7x-origin.crt - docs.gen7x.ru.conf → использует /opt/gen7x/nginx/ssl/gen7x-origin.crt - Создана директория /opt/gen7x/nginx/ssl/ с правами 700 - Создан временный самоподписанный сертификат (требуется замена на реальный Cloudflare Origin Certificate) - Добавлена инструкция /opt/gen7x/nginx/ssl/CLOUDFLARE_ORIGIN_CERT_INSTRUCTIONS.md - Обновлен /root/docs/secrets/mysecrets.md с информацией о сертификатах - Восстановлен include для конфигов в /etc/nginx/nginx.conf

Следующие шаги: 1. Создать Cloudflare Origin Certificate через Dashboard (SSL/TLS → Origin Server → Create Certificate) 2. Заменить временный сертификат на реальный в /opt/gen7x/nginx/ssl/gen7x-origin.crt и .key 3. В Cloudflare Dashboard переключить режим SSL/TLS на Full (strict) 4. Проверить работу: curl -Iv https://git.gen7x.ru

Команда проверки:

nginx -t
systemctl reload nginx
curl -Iv https://git.gen7x.ru
curl -Iv https://docs.gen7x.ru
curl -Iv https://n8n.gen7x.ru

2026-01-25 10:50 UTC – Завершение начальной настройки платформы

Проблема: Завершение развертывания и проверка работоспособности всех сервисов

Решение: - Проведена финальная проверка всех компонентов - Создана полная документация - Настроены все конфигурационные файлы

Изменения: - Создан файл rules.md с правилами работы - Создан файл mysecrets.md с секретами (не в git) - Создан cursorrules.md для Cursor IDE - Собран и развернут MkDocs - Удалена устаревшая версия из docker-compose.yml

Команда проверки:

docker compose -f /opt/gen7x/docker/docker-compose.yml ps
systemctl status nginx
curl -I http://127.0.0.1:3000
curl -I http://127.0.0.1:5678
ls -la /opt/gen7x/www/docs/

2026-01-25 10:45 UTC – Начальная настройка платформы

Проблема: Необходимо развернуть базовую платформу для публикации IT-сервисов на сервере gen7x.ru

Решение: - Установлена и настроена базовая инфраструктура - Развернуты сервисы: Gitea, n8n, PostgreSQL, MkDocs - Настроен Nginx как reverse proxy - Настроена безопасность (UFW, fail2ban, SSH)

Изменения: - Установлены Docker, Docker Compose, Nginx - Создана структура директорий /opt/gen7x - Настроен PostgreSQL с базами для Gitea и n8n - Развернуты контейнеры Gitea и n8n - Созданы конфигурации Nginx для всех доменов - Настроен MkDocs проект - Создана документация

Команда проверки:

docker compose -f /opt/gen7x/docker/docker-compose.yml ps
systemctl status nginx
curl -I http://127.0.0.1:3000
curl -I http://127.0.0.1:5678