История изменений
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 и у хостера):
- DNS → A/AAAA для gen7x.ru и поддоменов
- Origin должен быть 193.32.188.234 (или корректный IPv6, если используется).
-
Убедиться, что запись не указывает на старый IP или внутренний адрес.
-
SSL/TLS
- Режим Full или Full (strict).
-
На origin уже установлен Cloudflare Origin Certificate (
/opt/gen7x/nginx/ssl/gen7x-origin.crt). -
Временная проверка без прокси Cloudflare
- В DNS для n8n.gen7x.ru (или другого поддомена) переключить запись в DNS only (серое облако).
-
Проверить:
curl -I https://n8n.gen7x.ru. Если ответ 200 — проблема именно в соединении Cloudflare → origin. -
Хостинг-провайдер
- Уточнить, нет ли фаервола/DDoS-защиты, блокирующей подсети Cloudflare: https://www.cloudflare.com/ips/
-
При необходимости запросить разблокировку до origin (193.32.188.234, порты 80/443).
-
Проверка порта снаружи
- Через сервис вроде 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 проект
- Создана документация
Команда проверки: