diff --git a/AGENTS.md b/AGENTS.md index 259adad..089bcf0 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -24,16 +24,15 @@ - Базовое правило инкремента: `+1` по последнему числовому сегменту (patch), если не оговорено иное. ## Deploy -- Все документы и заметки по деплою хранить в папке `Deploy Server/`. -- Для сервера `VPS-05` (`45.136.124.227`) доступ выполнять через пользователя `player`. -- Базовый целевой хост для деплоя по умолчанию: `player@45.136.124.227`. +- Все документы и заметки по деплою хранить в папке `Dev_Docs/deploy/`. +- Базовый целевой хост для деплоя по умолчанию: `player@93.170.12.154` (`shineup.me`). - Базовый путь на сервере для SHiNE: `/home/player` (проекты SHiNE размещать в `/home/player/SHiNE/...`). - По возможности все справки, комментарии и примечания в конфигах/документах писать на русском языке. - Для операций `git push` использовать токен из переменной окружения `$GITEA_TOKEN`. -- Деплой UI выполнять только в один целевой контур за запуск: либо `prod` (основной), либо один выбранный тестовый (`ui_1`, `ui_2`, `ui_3`, `ui_drygmira`, `ui_milana`, `ui_aidar`). -- Если из запроса неясно, куда деплоить, обязательно сначала спросить пользователя, какой именно целевой контур нужен. -- По умолчанию сначала деплой и проверка на тестовом контуре; на основной (`prod`) деплоить только после явного подтверждения пользователя, что версия проверена и готова. -- При уточняющем вопросе отдельно предупреждать: деплой на основной выполнять только если точно подтверждена корректная работа. +- Для серверного деплоя использовать один gradle task: `./gradlew deployServer`. +- Для UI деплоя использовать один gradle task: `./gradlew deployUI`. +- Для локального запуска использовать `./gradlew startLocal` (или `startLocalWithBuild`). +- Сначала предлагать локальную проверку, а деплой на сервер выполнять по запросу пользователя. ## Логи звонков (установка соединения) - Специальный поток диагностики установки звонков идёт через `CallDeliveryReport` (клиент → сервер). diff --git a/Dev_Docs/Pending_Features/2026-05-19_1620_деплой-на-93.170.12.154-caddy-systemd.md b/Dev_Docs/Pending_Features/2026-05-19_1620_деплой-на-93.170.12.154-caddy-systemd.md new file mode 100644 index 0000000..35ddb94 --- /dev/null +++ b/Dev_Docs/Pending_Features/2026-05-19_1620_деплой-на-93.170.12.154-caddy-systemd.md @@ -0,0 +1,33 @@ +# Деплой на `93.170.12.154`: Caddy + systemd + +- Статус: `pending` + +## Что сделано + +- Выполнен деплой UI и серверной части на `player@93.170.12.154`. +- Создана структура: + - `/home/player/SHiNE/caddy` + - `/home/player/SHiNE/SHiNE-server` + - `/home/player/SHiNE/SHiNE-UI` +- Перенесены локальные данные: + - `data/shine.sqlite` + - `data/*.bch` +- Настроен `shine-server.service` через `systemd`. +- Настроен `Caddy`: + - no-cache заголовки; + - SPA fallback на `index.html`; + - проксирование `/ws` на `127.0.0.1:7070`. +- Добавлена документация в `Dev_Docs/deploy/` и файл по legacy-серверу `45.136.124.227`. + +## Что проверять + +- Открыть `https://shineup.me/start-view`. +- Обновить страницу (`Ctrl+F5`) на роуте вида `/start-view` и убедиться, что нет 404. +- Проверить авторизацию и базовые действия в UI. +- Проверить, что вебсокет соединение устанавливается. + +## Ожидаемый результат + +- UI и сервер доступны на новом хосте. +- Сервисы `shine-server` и `caddy` в статусе `active`. +- Маршруты SPA и no-cache работают как ожидается. diff --git a/Dev_Docs/deploy/README.md b/Dev_Docs/deploy/README.md new file mode 100644 index 0000000..579cdae --- /dev/null +++ b/Dev_Docs/deploy/README.md @@ -0,0 +1,21 @@ +# Деплой SHiNE (шаблон) + +Этот раздел хранит актуальные инструкции по деплою. + +## Базовый сервер + +- SSH: `player@93.170.12.154` +- Домен: `shineup.me` +- Базовый путь: `/home/player/SHiNE` + +## Локальные команды + +- Деплой сервера: `./gradlew deployServer` +- Деплой UI: `./gradlew deployUI` +- Локальный запуск: `./gradlew startLocal` + +## Обязательные правила + +1. Перед серверным деплоем проверить локально. +2. При нестандартном деплое (другой хост, другая структура, ручные шаги) обязательно уточнить у пользователя, нужно ли обновить этот шаблон. +3. Если деплой-процесс изменился, этот файл и файлы в `servers/` обновлять в том же коммите. diff --git a/Dev_Docs/deploy/servers/45.136.124.227_legacy_unavailable.md b/Dev_Docs/deploy/servers/45.136.124.227_legacy_unavailable.md new file mode 100644 index 0000000..e884146 --- /dev/null +++ b/Dev_Docs/deploy/servers/45.136.124.227_legacy_unavailable.md @@ -0,0 +1,7 @@ +# Сервер `45.136.124.227` (legacy) + +- Исторический сервер SHiNE: `player@45.136.124.227`. +- Ранее на нём выполнялся рабочий деплой. +- Текущий статус (по данным пользователя): сервер недоступен, проблема на стороне провайдера, ответа нет второй день. + +Использовать для текущих деплоев новый сервер: `player@93.170.12.154` (`shineup.me`). diff --git a/Dev_Docs/deploy/servers/93.170.12.154_rapsberry.md b/Dev_Docs/deploy/servers/93.170.12.154_rapsberry.md new file mode 100644 index 0000000..5c65e68 --- /dev/null +++ b/Dev_Docs/deploy/servers/93.170.12.154_rapsberry.md @@ -0,0 +1,24 @@ +# Сервер `93.170.12.154` (`shineup.me`) + +- Пользователь: `player` +- Каталог SHiNE: `/home/player/SHiNE` +- UI исходник (после rsync): `/home/player/SHiNE/SHiNE-UI` +- UI публикация для Caddy: `/var/www/shine-ui` +- Сервер: `/home/player/SHiNE/SHiNE-server/shine-server.jar` +- Данные: `/home/player/SHiNE/SHiNE-server/data/` + - `shine.sqlite` + - `*.bch` +- Логи сервера: `/home/player/SHiNE/SHiNE-server/logs/app.log` + +## Сервисы + +- `shine-server.service` (systemd) +- `caddy.service` (systemd) + +## Caddy + +- Конфиг: `/etc/caddy/Caddyfile` +- Настройки: + - `no-store/no-cache` заголовки; + - `try_files {path} /index.html` (SPA fallback); + - `reverse_proxy /ws* -> 127.0.0.1:7070`. diff --git a/VERSION.properties b/VERSION.properties index d8ba1f9..a478dbd 100644 --- a/VERSION.properties +++ b/VERSION.properties @@ -1,2 +1,2 @@ -client.version=1.2.73 -server.version=1.2.67 +client.version=1.2.74 +server.version=1.2.68 diff --git a/build.gradle b/build.gradle index 3ca448b..be51899 100644 --- a/build.gradle +++ b/build.gradle @@ -191,58 +191,13 @@ tasks.register('deployServer', JavaExec) { dependsOn testClasses } -tasks.register('deployServerWithBackupCleanAndTests') { +tasks.register('deployUI', Exec) { group = "!!deployment" - description = "BLOCKED: удаление БД на проде запрещено, используйте только миграции" - - doLast { - def msg = """ -[BLOCKED] Удаление базы данных на продакшен-сервере отключено. -Причина: в базе уже есть пользовательские сообщения. -Дальше используйте только миграции схемы БД. -Задача остановлена намеренно. -""".stripIndent().trim() - println msg - throw new GradleException(msg) - } + description = "Deploy WEB UI (production: shineup.me)" + workingDir = rootDir + commandLine 'bash', file('deploy_shine-PWA.sh').absolutePath } -tasks.register('deployServerNoCleanNoTests', JavaExec) { - group = "!!deployment" - description = "Build → upload to server → restart service (no data clean, no IT tests)" - - classpath = sourceSets.test.runtimeClasspath - mainClass = "test.it.IT_DeployRestartNoCleanNoTestsMain" - - // можно переопределить при запуске: - // ./gradlew deployServerNoCleanNoTests -Dit.remoteHost=... - dependsOn shadowJar - systemProperty "it.remoteHost", System.getProperty("it.remoteHost", "194.87.0.247") - systemProperty "it.remoteUser", System.getProperty("it.remoteUser", "user") - systemProperty "it.remoteDir", System.getProperty("it.remoteDir", "/home/user/docker/shine-server") - systemProperty "it.service", System.getProperty("it.service", "shine-server") - systemProperty "it.localJar", System.getProperty("it.localJar", "build/libs/shine-server.jar") - - dependsOn testClasses -} - -def registerWebDeployTask = { String taskName, String target, String descriptionText -> - tasks.register(taskName, Exec) { - group = "!!deployment" - description = descriptionText - workingDir = rootDir - commandLine 'bash', file('deploy_shine-PWA.sh').absolutePath, target - } -} - -registerWebDeployTask('deployWEB_Production', 'prod', 'Deploy WEB (production: shineup.me)') -registerWebDeployTask('deployWEB_ui_1', 'ui_1', 'Deploy WEB (ui-1.shineup.me)') -registerWebDeployTask('deployWEB_ui_2', 'ui_2', 'Deploy WEB (ui-2.shineup.me)') -registerWebDeployTask('deployWEB_ui_3', 'ui_3', 'Deploy WEB (ui-3.shineup.me)') -registerWebDeployTask('deployWEB_DrygMira', 'ui_drygmira', 'Deploy WEB (ui-drygmira.shineup.me)') -registerWebDeployTask('deployWEB_Milana', 'ui_milana', 'Deploy WEB (ui-milana.shineup.me)') -registerWebDeployTask('deployWEB_Aidar', 'ui_aidar', 'Deploy WEB (ui-aidar.shineup.me)') - tasks.register('startLocal', Exec) { group = "!!run" description = "Builds server, starts local WS server and local HTTP UI for end-to-end local testing" diff --git a/deploy_shine-PWA.sh b/deploy_shine-PWA.sh index e41f957..b04dcb7 100755 --- a/deploy_shine-PWA.sh +++ b/deploy_shine-PWA.sh @@ -2,13 +2,12 @@ set -euo pipefail SRC_DIR="shine-UI" -REMOTE_HOST="${REMOTE_HOST:-player@shineup.me}" +REMOTE_HOST="${REMOTE_HOST:-player@93.170.12.154}" REMOTE_BASE_DIR="${REMOTE_BASE_DIR:-/home/player/SHiNE}" BUILD_VERSION="$(date -u +%Y%m%d%H%M%S)" VERSION_FILE="VERSION.properties" export BUILD_VERSION TMP_DIR="$(mktemp -d)" -TARGET="${1:-prod}" if [[ ! -f "$VERSION_FILE" ]]; then echo "ERROR: version file not found: $VERSION_FILE" >&2 @@ -22,43 +21,8 @@ if [[ -z "$CLIENT_VERSION" ]]; then fi export CLIENT_VERSION -TARGET_DIR="shine-UI" +TARGET_DIR="SHiNE-UI" TARGET_URL="https://shineup.me" -case "$TARGET" in - prod|production|main|shineup|shineup.me|shine-UI) - TARGET_DIR="shine-UI" - TARGET_URL="https://shineup.me" - ;; - ui_1|ui-1|1|shine-UI_1) - TARGET_DIR="test-UI/shine-UI_1" - TARGET_URL="https://ui-1.shineup.me" - ;; - ui_2|ui-2|2|shine-UI_2) - TARGET_DIR="test-UI/shine-UI_2" - TARGET_URL="https://ui-2.shineup.me" - ;; - ui_3|ui-3|3|shine-UI_3) - TARGET_DIR="test-UI/shine-UI_3" - TARGET_URL="https://ui-3.shineup.me" - ;; - ui_drygmira|ui-drygmira|drygmira|shine-UI_drygmira) - TARGET_DIR="test-UI/shine-UI_drygmira" - TARGET_URL="https://ui-drygmira.shineup.me" - ;; - ui_milana|ui-milana|milana|shine-UI_milana) - TARGET_DIR="test-UI/shine-UI_milana" - TARGET_URL="https://ui-milana.shineup.me" - ;; - ui_aidar|ui-aidar|aidar|shine-UI_aidar) - TARGET_DIR="test-UI/shine-UI_aidar" - TARGET_URL="https://ui-aidar.shineup.me" - ;; - *) - echo "ERROR: unknown target '$TARGET'" >&2 - echo "Available targets: prod, ui_1, ui_2, ui_3, ui_drygmira, ui_milana, ui_aidar" >&2 - exit 1 - ;; -esac REMOTE_DIR="${REMOTE_BASE_DIR}/${TARGET_DIR}" cleanup() { diff --git a/doc/instructions/ui-deploy-targets.md b/doc/instructions/ui-deploy-targets.md index f24a627..300ece3 100644 --- a/doc/instructions/ui-deploy-targets.md +++ b/doc/instructions/ui-deploy-targets.md @@ -1,38 +1,19 @@ -# Деплой UI по окружениям (Caddy sites) +# UI deploy -## Куда деплоит скрипт -- Базовая директория на сервере: `/home/user/docker/caddyFile/sites` -- По умолчанию деплой идёт на production (`shineup.me`) в папку `shine-UI`. +Актуальный UI-деплой выполняется одной командой: -## Gradle-команды -- Продакшен (`shineup.me`): `./gradlew deployWEB_Production` -- `ui-1.shineup.me`: `./gradlew deployWEB_ui_1` -- `ui-2.shineup.me`: `./gradlew deployWEB_ui_2` -- `ui-3.shineup.me`: `./gradlew deployWEB_ui_3` -- `ui-drygmira.shineup.me`: `./gradlew deployWEB_DrygMira` -- `ui-milana.shineup.me`: `./gradlew deployWEB_Milana` -- `ui-aidar.shineup.me`: `./gradlew deployWEB_Aidar` +```bash +./gradlew deployUI +``` -## Прямой запуск скрипта -- `bash deploy_shine-PWA.sh prod` -- `bash deploy_shine-PWA.sh ui_1` -- `bash deploy_shine-PWA.sh ui_2` -- `bash deploy_shine-PWA.sh ui_3` -- `bash deploy_shine-PWA.sh ui_drygmira` -- `bash deploy_shine-PWA.sh ui_milana` -- `bash deploy_shine-PWA.sh ui_aidar` +По умолчанию: -Также поддерживаются алиасы с дефисом: -- `bash deploy_shine-PWA.sh ui-1` -- `bash deploy_shine-PWA.sh ui-2` -- `bash deploy_shine-PWA.sh ui-3` -- `bash deploy_shine-PWA.sh ui-drygmira` -- `bash deploy_shine-PWA.sh ui-milana` -- `bash deploy_shine-PWA.sh ui-aidar` +- хост: `player@93.170.12.154` +- домен: `https://shineup.me` +- путь: `/home/player/SHiNE/SHiNE-UI` -## Поддержка переопределения -- `REMOTE_HOST` (по умолчанию `user@194.87.0.247`) -- `REMOTE_BASE_DIR` (по умолчанию `/home/user/docker/caddyFile/sites`) +Переопределение при необходимости: -Пример: -`REMOTE_HOST=user@194.87.0.247 REMOTE_BASE_DIR=/home/user/docker/caddyFile/sites bash deploy_shine-PWA.sh ui_2` +```bash +REMOTE_HOST=player@93.170.12.154 REMOTE_BASE_DIR=/home/player/SHiNE bash deploy_shine-PWA.sh +```