chore(deploy): новый прод-контур 93.170.12.154, единые deploy task и docs

This commit is contained in:
AidarKC 2026-05-19 16:27:09 +03:00
parent 9c35567389
commit 7986184111
9 changed files with 112 additions and 128 deletions

View File

@ -24,16 +24,15 @@
- Базовое правило инкремента: `+1` по последнему числовому сегменту (patch), если не оговорено иное. - Базовое правило инкремента: `+1` по последнему числовому сегменту (patch), если не оговорено иное.
## Deploy ## Deploy
- Все документы и заметки по деплою хранить в папке `Deploy Server/`. - Все документы и заметки по деплою хранить в папке `Dev_Docs/deploy/`.
- Для сервера `VPS-05` (`45.136.124.227`) доступ выполнять через пользователя `player`. - Базовый целевой хост для деплоя по умолчанию: `player@93.170.12.154` (`shineup.me`).
- Базовый целевой хост для деплоя по умолчанию: `player@45.136.124.227`.
- Базовый путь на сервере для SHiNE: `/home/player` (проекты SHiNE размещать в `/home/player/SHiNE/...`). - Базовый путь на сервере для SHiNE: `/home/player` (проекты SHiNE размещать в `/home/player/SHiNE/...`).
- По возможности все справки, комментарии и примечания в конфигах/документах писать на русском языке. - По возможности все справки, комментарии и примечания в конфигах/документах писать на русском языке.
- Для операций `git push` использовать токен из переменной окружения `$GITEA_TOKEN`. - Для операций `git push` использовать токен из переменной окружения `$GITEA_TOKEN`.
- Деплой UI выполнять только в один целевой контур за запуск: либо `prod` (основной), либо один выбранный тестовый (`ui_1`, `ui_2`, `ui_3`, `ui_drygmira`, `ui_milana`, `ui_aidar`). - Для серверного деплоя использовать один gradle task: `./gradlew deployServer`.
- Если из запроса неясно, куда деплоить, обязательно сначала спросить пользователя, какой именно целевой контур нужен. - Для UI деплоя использовать один gradle task: `./gradlew deployUI`.
- По умолчанию сначала деплой и проверка на тестовом контуре; на основной (`prod`) деплоить только после явного подтверждения пользователя, что версия проверена и готова. - Для локального запуска использовать `./gradlew startLocal` (или `startLocalWithBuild`).
- При уточняющем вопросе отдельно предупреждать: деплой на основной выполнять только если точно подтверждена корректная работа. - Сначала предлагать локальную проверку, а деплой на сервер выполнять по запросу пользователя.
## Логи звонков (установка соединения) ## Логи звонков (установка соединения)
- Специальный поток диагностики установки звонков идёт через `CallDeliveryReport` (клиент → сервер). - Специальный поток диагностики установки звонков идёт через `CallDeliveryReport` (клиент → сервер).

View File

@ -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 работают как ожидается.

21
Dev_Docs/deploy/README.md Normal file
View File

@ -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/` обновлять в том же коммите.

View File

@ -0,0 +1,7 @@
# Сервер `45.136.124.227` (legacy)
- Исторический сервер SHiNE: `player@45.136.124.227`.
- Ранее на нём выполнялся рабочий деплой.
- Текущий статус (по данным пользователя): сервер недоступен, проблема на стороне провайдера, ответа нет второй день.
Использовать для текущих деплоев новый сервер: `player@93.170.12.154` (`shineup.me`).

View File

@ -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`.

View File

@ -1,2 +1,2 @@
client.version=1.2.73 client.version=1.2.74
server.version=1.2.67 server.version=1.2.68

View File

@ -191,57 +191,12 @@ tasks.register('deployServer', JavaExec) {
dependsOn testClasses dependsOn testClasses
} }
tasks.register('deployServerWithBackupCleanAndTests') { tasks.register('deployUI', Exec) {
group = "!!deployment" group = "!!deployment"
description = "BLOCKED: удаление БД на проде запрещено, используйте только миграции" description = "Deploy WEB UI (production: shineup.me)"
doLast {
def msg = """
[BLOCKED] Удаление базы данных на продакшен-сервере отключено.
Причина: в базе уже есть пользовательские сообщения.
Дальше используйте только миграции схемы БД.
Задача остановлена намеренно.
""".stripIndent().trim()
println msg
throw new GradleException(msg)
}
}
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 workingDir = rootDir
commandLine 'bash', file('deploy_shine-PWA.sh').absolutePath, target commandLine 'bash', file('deploy_shine-PWA.sh').absolutePath
} }
}
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) { tasks.register('startLocal', Exec) {
group = "!!run" group = "!!run"

View File

@ -2,13 +2,12 @@
set -euo pipefail set -euo pipefail
SRC_DIR="shine-UI" 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}" REMOTE_BASE_DIR="${REMOTE_BASE_DIR:-/home/player/SHiNE}"
BUILD_VERSION="$(date -u +%Y%m%d%H%M%S)" BUILD_VERSION="$(date -u +%Y%m%d%H%M%S)"
VERSION_FILE="VERSION.properties" VERSION_FILE="VERSION.properties"
export BUILD_VERSION export BUILD_VERSION
TMP_DIR="$(mktemp -d)" TMP_DIR="$(mktemp -d)"
TARGET="${1:-prod}"
if [[ ! -f "$VERSION_FILE" ]]; then if [[ ! -f "$VERSION_FILE" ]]; then
echo "ERROR: version file not found: $VERSION_FILE" >&2 echo "ERROR: version file not found: $VERSION_FILE" >&2
@ -22,43 +21,8 @@ if [[ -z "$CLIENT_VERSION" ]]; then
fi fi
export CLIENT_VERSION export CLIENT_VERSION
TARGET_DIR="shine-UI" TARGET_DIR="SHiNE-UI"
TARGET_URL="https://shineup.me" 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}" REMOTE_DIR="${REMOTE_BASE_DIR}/${TARGET_DIR}"
cleanup() { cleanup() {

View File

@ -1,38 +1,19 @@
# Деплой UI по окружениям (Caddy sites) # UI deploy
## Куда деплоит скрипт Актуальный UI-деплой выполняется одной командой:
- Базовая директория на сервере: `/home/user/docker/caddyFile/sites`
- По умолчанию деплой идёт на production (`shineup.me`) в папку `shine-UI`.
## Gradle-команды ```bash
- Продакшен (`shineup.me`): `./gradlew deployWEB_Production` ./gradlew deployUI
- `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 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`
Также поддерживаются алиасы с дефисом: - хост: `player@93.170.12.154`
- `bash deploy_shine-PWA.sh ui-1` - домен: `https://shineup.me`
- `bash deploy_shine-PWA.sh ui-2` - путь: `/home/player/SHiNE/SHiNE-UI`
- `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`
## Поддержка переопределения Переопределение при необходимости:
- `REMOTE_HOST` (по умолчанию `user@194.87.0.247`)
- `REMOTE_BASE_DIR` (по умолчанию `/home/user/docker/caddyFile/sites`)
Пример: ```bash
`REMOTE_HOST=user@194.87.0.247 REMOTE_BASE_DIR=/home/user/docker/caddyFile/sites bash deploy_shine-PWA.sh ui_2` REMOTE_HOST=player@93.170.12.154 REMOTE_BASE_DIR=/home/player/SHiNE bash deploy_shine-PWA.sh
```