chore(deploy): новый прод-контур 93.170.12.154, единые deploy task и docs
This commit is contained in:
parent
9c35567389
commit
7986184111
13
AGENTS.md
13
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` (клиент → сервер).
|
||||
|
||||
@ -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
21
Dev_Docs/deploy/README.md
Normal 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/` обновлять в том же коммите.
|
||||
@ -0,0 +1,7 @@
|
||||
# Сервер `45.136.124.227` (legacy)
|
||||
|
||||
- Исторический сервер SHiNE: `player@45.136.124.227`.
|
||||
- Ранее на нём выполнялся рабочий деплой.
|
||||
- Текущий статус (по данным пользователя): сервер недоступен, проблема на стороне провайдера, ответа нет второй день.
|
||||
|
||||
Использовать для текущих деплоев новый сервер: `player@93.170.12.154` (`shineup.me`).
|
||||
24
Dev_Docs/deploy/servers/93.170.12.154_rapsberry.md
Normal file
24
Dev_Docs/deploy/servers/93.170.12.154_rapsberry.md
Normal 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`.
|
||||
@ -1,2 +1,2 @@
|
||||
client.version=1.2.73
|
||||
server.version=1.2.67
|
||||
client.version=1.2.74
|
||||
server.version=1.2.68
|
||||
|
||||
51
build.gradle
51
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)
|
||||
}
|
||||
}
|
||||
|
||||
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
|
||||
description = "Deploy WEB UI (production: shineup.me)"
|
||||
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) {
|
||||
group = "!!run"
|
||||
description = "Builds server, starts local WS server and local HTTP UI for end-to-end local testing"
|
||||
|
||||
@ -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() {
|
||||
|
||||
@ -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
|
||||
```
|
||||
|
||||
Loading…
Reference in New Issue
Block a user