diff --git a/AGENTS.md b/AGENTS.md index 24adfaa..5562383 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -32,6 +32,10 @@ ## Работа с проектом +- С 13 октября 2026 года сервер содержит рабочие данные. Не выполнять серверные операции без согласованной задачи; прежнее разрешение на первоначальное развёртывание не разрешает последующие обновления. +- Миграции должны сохранять текущие данные. Перед применением на сервере проверить SQL, создать резервную копию и проверить её восстановление и миграцию в отдельной тестовой БД. Не запускать тесты на рабочей базе. +- Не пересоздавать рабочую БД, не удалять её тома и не заменять её локальной базой. Потенциально разрушающие изменения требуют отдельного согласования и плана переноса данных. +- Учитывать автоматическое применение миграций при запуске приложения: перезапуск новой версии также может изменить БД. При обнаружении проблемы на сервере остановиться и спросить пользователя до исправления. - После изменений выполнять сборку и проверки, соответствующие изменению. - Поддерживать README и `.env.example` в соответствии с реальной конфигурацией. - Не заявлять о проверке Docker, БД, PDF или UI, если соответствующая проверка не выполнена. diff --git a/Dockerfile b/Dockerfile index 3f02c11..281f0aa 100644 --- a/Dockerfile +++ b/Dockerfile @@ -14,6 +14,6 @@ FROM mcr.microsoft.com/dotnet/aspnet:10.0 AS runtime RUN apt-get update && apt-get install -y --no-install-recommends fonts-dejavu-core libgssapi-krb5-2 && rm -rf /var/lib/apt/lists/* WORKDIR /app RUN mkdir -p /app/keys && chown $APP_UID /app/keys -COPY --from=build /app ./ +COPY --from=build --chown=$APP_UID:$APP_UID /app ./ USER $APP_UID ENTRYPOINT ["dotnet", "TrainingPlanner.Web.dll"] diff --git a/docs/server-deployment.md b/docs/server-deployment.md new file mode 100644 index 0000000..5ab98e3 --- /dev/null +++ b/docs/server-deployment.md @@ -0,0 +1,34 @@ +# Развёртывание на сервере + +## Текущее правило эксплуатации — 13 октября 2026 + +Пользователь завершил настройку сервера; база содержит рабочие данные. Описанные ниже параметры первоначального развёртывания — историческая справка, а не подтверждение текущей конфигурации. + +Без согласованной задачи сервер не изменять. Перед миграцией проверить SQL на потерю данных, создать резервную копию, проверить её восстановление и выполнение миграции в отдельной тестовой БД. Сохранность текущих данных обязательна. Не пересоздавать базу, не удалять тома и не подменять рабочие данные локальными. Учитывать миграции, автоматически выполняемые при старте приложения. При обнаружении проблемы остановиться и согласовать дальнейшие действия. + +## Первоначальное развёртывание — 30 сентября 2026 + +- Подключение: `ssh trainplan` (алиас из локальной SSH-конфигурации). +- Каталог развёртывания: `/home/dimass/training-planner`. +- Исходники: подкаталог `repository`, ветка `main`, коммит `ad3cd6f`. +- Compose-проект: `trainingplanner`, отдельные сеть и тома. +- Приложение: `127.0.0.1:8001`, только через локальный reverse proxy. +- PostgreSQL не публикует порт на хосте. При первоначальном развёртывании была создана пустая база; сейчас она содержит рабочие данные. +- `compose.yaml`, `.env`, `app.env` и `access.txt` находятся вне Git-репозитория. +- Логин тренера: `trainer`; сгенерированный пароль находится в `access.txt`, доступном только владельцу. + +## Управление + +```sh +cd /home/dimass/training-planner +docker compose ps +docker compose logs --tail 100 app +``` + +Не выполнять `docker system prune`, `docker volume prune` или `docker compose down -v`: на сервере есть другие проекты, а тома этого приложения содержат базу и ключи авторизации. + +## HTTPS — исторические результаты проверки + +При проверке 30 сентября 2026 года Nginx для `trainplan.samsonium.ru` слушает только порт 80 и проксирует на `http://127.0.0.1:8001`. На порту 443 выдаётся сертификат `search.samsonium.ru`, истёкший 19 ноября 2025 года. Конфигурация Nginx и сертификаты при развёртывании приложения не изменяются. + +На момент первоначальной проверки требовалась настройка HTTPS администратором. 13 октября пользователь сообщил, что завершил настройку сервера; повторная проверка не выполнялась. Прежнюю проблему сертификата не считать актуальной без новой проверки в рамках согласованной задачи. diff --git a/src/TrainingPlanner.Infrastructure/Pdf/PdfWeekTableBuilder.cs b/src/TrainingPlanner.Infrastructure/Pdf/PdfWeekTableBuilder.cs index d2e81e4..126edab 100644 --- a/src/TrainingPlanner.Infrastructure/Pdf/PdfWeekTableBuilder.cs +++ b/src/TrainingPlanner.Infrastructure/Pdf/PdfWeekTableBuilder.cs @@ -85,8 +85,7 @@ public class PdfWeekTableBuilder(PdfOptions options) if (!string.IsNullOrWhiteSpace(exercise.VideoUrl)) { var link = row.Cells[6].AddParagraph().AddHyperlink(exercise.VideoUrl, HyperlinkType.Url); - // Invisible break opportunities keep long URLs within the cell; the target stays unchanged. - link.AddText(string.Join("\u200B", exercise.VideoUrl.Select(character => character.ToString()))); + link.AddText("Видео"); link.Font.Color = Color.Parse(options.AccentColor); link.Font.Underline = Underline.Single; }