SHA256
Исправить регистрацию и навести порядок в UI deploy
This commit is contained in:
@@ -88,13 +88,13 @@
|
||||
## Deploy
|
||||
- Все документы и заметки по деплою хранить в папке `Dev_Docs/deploy/`.
|
||||
- Production-хост SHiNE: `player@shineup.me` (`178.208.64.62`).
|
||||
- Основной test-хост SHiNE: `player@193.8.215.70` (`t.shineup.me`).
|
||||
- Второй production-хост SHiNE: `player@193.8.215.70` (`server2.shineup.me`).
|
||||
- Резервный test-хост SHiNE: `player@93.170.12.154` (`test.shineup.me`).
|
||||
- Базовый путь на сервере для SHiNE: `/home/player` (проекты SHiNE размещать в `/home/player/SHiNE/...`).
|
||||
- По возможности все справки, комментарии и примечания в конфигах/документах писать на русском языке.
|
||||
- Для операций `git push` при необходимости использовать токен из переменной окружения `$GITEA_TOKEN`.
|
||||
- Любые изменения и любой деплой на production `shineup.me` выполнять только после отдельного явного подтверждения пользователя.
|
||||
- Если пользователь пишет просто `задеплой` без уточнения production/test, по умолчанию деплоить на `t.shineup.me`.
|
||||
- Если пользователь пишет просто `задеплой` без уточнения production/test, по умолчанию деплоить на `server2.shineup.me`.
|
||||
- Default server deploy: `./gradlew deployServer` или `./gradlew deployServerTest2`.
|
||||
- Default UI deploy: `./gradlew deployUI` или `./gradlew deployUITest2`.
|
||||
- Production server deploy: `./gradlew deployServerProduction`.
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
и
|
||||
|
||||
- `player@193.8.215.70`
|
||||
- домен `t.shineup.me`
|
||||
- домен `server2.shineup.me`
|
||||
- IP `193.8.215.70`
|
||||
|
||||
Отдельно резервный хост `test.shineup.me` сейчас помечен как временно неработающий.
|
||||
@@ -55,7 +55,7 @@ Deploy:
|
||||
## 2. Второй production-сервер
|
||||
|
||||
- SSH: `player@193.8.215.70`
|
||||
- домен: `t.shineup.me`
|
||||
- домен: `server2.shineup.me`
|
||||
- IP: `193.8.215.70`
|
||||
- пользователь: `player`
|
||||
- базовый путь: `/home/player`
|
||||
|
||||
+2
-2
@@ -17,7 +17,7 @@
|
||||
- IP `178.208.64.62`
|
||||
- Второй production SHiNE:
|
||||
- `player@193.8.215.70`
|
||||
- домен `t.shineup.me`
|
||||
- домен `server2.shineup.me`
|
||||
- IP `193.8.215.70`
|
||||
- Временно неработающий резервный test:
|
||||
- `player@93.170.12.154`
|
||||
@@ -35,7 +35,7 @@
|
||||
|
||||
## Важно
|
||||
|
||||
- Production-контура SHiNE сейчас два: `shineup.me` и `t.shineup.me`.
|
||||
- Production-контура SHiNE сейчас два: `shineup.me` и `server2.shineup.me`.
|
||||
- `test.shineup.me` сейчас помечен как временно неработающий резервный test-хост.
|
||||
- `t1..t4.shineup.me` — это отдельные тестовые/devnet-контуры, не production.
|
||||
- Любые изменения на `shineup.me` делать только после отдельного подтверждения пользователя.
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
## 1. Исторический `test2`, теперь второй production-сервер
|
||||
|
||||
- SSH: `player@193.8.215.70`
|
||||
- Домен: `t.shineup.me`
|
||||
- Домен: `server2.shineup.me`
|
||||
- IP: `193.8.215.70`
|
||||
- Назначение: второй production-контур SHiNE
|
||||
|
||||
@@ -33,6 +33,7 @@ Deploy:
|
||||
|
||||
- этот хост больше не считать test-контуром;
|
||||
- исторические имена deploy-задач `deployServerTest2` / `deployUITest2` сохранены, но сам хост считать production;
|
||||
- задача `deployUITest2` по умолчанию выкладывает UI на `server2.shineup.me`, а не на `t2.shineup.me`;
|
||||
- при описании окружений перечислять его как второй production-сервер.
|
||||
|
||||
## 2. Резервный test-сервер, временно неработающий
|
||||
@@ -129,7 +130,7 @@ Operational-нюанс:
|
||||
Для любого test-контура полезны такие быстрые проверки:
|
||||
|
||||
```bash
|
||||
curl -I https://t.shineup.me
|
||||
curl -I https://server2.shineup.me
|
||||
curl -I https://test.shineup.me
|
||||
curl -I https://t1.shineup.me
|
||||
curl -I https://t2.shineup.me
|
||||
|
||||
@@ -59,7 +59,7 @@ shine-UI/server-ui.html
|
||||
./gradlew deployUI
|
||||
```
|
||||
|
||||
Default deploy по умолчанию идёт на `t.shineup.me` (`player@193.8.215.70`).
|
||||
Default deploy по умолчанию идёт на `server2.shineup.me` (`player@193.8.215.70`).
|
||||
|
||||
Production deploy:
|
||||
|
||||
|
||||
+2
-2
@@ -1,2 +1,2 @@
|
||||
client.version=1.2.313
|
||||
server.version=1.2.292
|
||||
client.version=1.2.321
|
||||
server.version=1.2.293
|
||||
|
||||
+6
-6
@@ -207,12 +207,12 @@ tasks.register('deployUIProduction', Exec) {
|
||||
group = "!!deployment"
|
||||
description = "Production UI deploy: shineup.me (только после явного подтверждения)"
|
||||
workingDir = rootDir
|
||||
commandLine 'bash', file('deploy_shine-PWA.sh').absolutePath
|
||||
commandLine 'bash', file('deploy_shine-ui_production_shineupme.sh').absolutePath
|
||||
}
|
||||
|
||||
tasks.register('deployServer', Exec) {
|
||||
group = "!!deployment"
|
||||
description = "Default deploy server: t.shineup.me"
|
||||
description = "Default deploy server: server2.shineup.me"
|
||||
dependsOn shadowJar
|
||||
workingDir = rootDir
|
||||
environment 'LOCAL_JAR', file('SHiNE-server/build/libs/shine-server.jar').absolutePath
|
||||
@@ -221,20 +221,20 @@ tasks.register('deployServer', Exec) {
|
||||
|
||||
tasks.register('deployUI', Exec) {
|
||||
group = "!!deployment"
|
||||
description = "Default deploy UI: t.shineup.me"
|
||||
description = "Default deploy UI: server2.shineup.me"
|
||||
workingDir = rootDir
|
||||
commandLine 'bash', file('deploy_shine-ui_test2.sh').absolutePath
|
||||
commandLine 'bash', file('deploy_shine-ui_production_server2shineupme.sh').absolutePath
|
||||
}
|
||||
|
||||
tasks.register('deployServerTest2') {
|
||||
group = "!!deployment"
|
||||
description = "Явный алиас основного test deploy server: t.shineup.me"
|
||||
description = "Явный алиас второго production deploy server: server2.shineup.me"
|
||||
dependsOn tasks.named('deployServer')
|
||||
}
|
||||
|
||||
tasks.register('deployUITest2') {
|
||||
group = "!!deployment"
|
||||
description = "Явный алиас основного test deploy UI: t.shineup.me"
|
||||
description = "Явный алиас второго production deploy UI: server2.shineup.me"
|
||||
dependsOn tasks.named('deployUI')
|
||||
}
|
||||
|
||||
|
||||
@@ -28,6 +28,13 @@ TARGET_URL="${TARGET_URL:-https://${EXPECTED_CADDY_SITE}}"
|
||||
REMOTE_DIR="${REMOTE_UI_DIR}"
|
||||
DEPLOY_SERVER_LOGIN="${DEPLOY_SERVER_LOGIN:-}"
|
||||
DEPLOY_SERVER_ADDRESS="${DEPLOY_SERVER_ADDRESS:-}"
|
||||
DEPLOY_SOLANA_CLUSTER="${DEPLOY_SOLANA_CLUSTER:-}"
|
||||
DEPLOY_SOLANA_ENDPOINT="${DEPLOY_SOLANA_ENDPOINT:-}"
|
||||
DEPLOY_SOLANA_CLUSTER_NORMALIZED="$DEPLOY_SOLANA_CLUSTER"
|
||||
|
||||
if [[ "$DEPLOY_SOLANA_CLUSTER_NORMALIZED" == "mainnet" ]]; then
|
||||
DEPLOY_SOLANA_CLUSTER_NORMALIZED="mainnet-beta"
|
||||
fi
|
||||
|
||||
cleanup() {
|
||||
rm -rf "$TMP_DIR"
|
||||
@@ -52,6 +59,12 @@ if [[ -f "$DEPLOY_CONFIG_FILE" ]]; then
|
||||
if [[ -n "$DEPLOY_SERVER_ADDRESS" ]]; then
|
||||
perl -0pi -e "s/export const defaultServerAddress = '.*?';/export const defaultServerAddress = '$DEPLOY_SERVER_ADDRESS';/s" "$DEPLOY_CONFIG_FILE"
|
||||
fi
|
||||
if [[ -n "$DEPLOY_SOLANA_CLUSTER_NORMALIZED" ]]; then
|
||||
perl -0pi -e "s/export const defaultSolanaCluster = '.*?';/export const defaultSolanaCluster = '$DEPLOY_SOLANA_CLUSTER_NORMALIZED';/s" "$DEPLOY_CONFIG_FILE"
|
||||
fi
|
||||
if [[ -n "$DEPLOY_SOLANA_ENDPOINT" ]]; then
|
||||
perl -0pi -e "s|export const defaultSolanaEndpoint = '.*?';|export const defaultSolanaEndpoint = '$DEPLOY_SOLANA_ENDPOINT';|s" "$DEPLOY_CONFIG_FILE"
|
||||
fi
|
||||
fi
|
||||
|
||||
INDEX_FILE="$TMP_DIR/index.html"
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
set -euo pipefail
|
||||
|
||||
TARGET_HOST="${TARGET_HOST:-player@193.8.215.70}"
|
||||
TARGET_DOMAIN="${TARGET_DOMAIN:-t.shineup.me}"
|
||||
TARGET_DOMAIN="${TARGET_DOMAIN:-server2.shineup.me}"
|
||||
REMOTE_BASE="${REMOTE_BASE:-/home/player/SHiNE}"
|
||||
REMOTE_SERVER_DIR="${REMOTE_SERVER_DIR:-$REMOTE_BASE/shine-server}"
|
||||
REMOTE_DATA_DIR="${REMOTE_DATA_DIR:-$REMOTE_SERVER_DIR/data}"
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
set -euo pipefail
|
||||
|
||||
TARGET_HOST="${TARGET_HOST:-player@193.8.215.70}"
|
||||
TARGET_DOMAIN="${TARGET_DOMAIN:-t.shineup.me}"
|
||||
TARGET_DOMAIN="${TARGET_DOMAIN:-server2.shineup.me}"
|
||||
REMOTE_UI_DIR="${REMOTE_UI_DIR:-/home/player/SHiNE/shine-ui}"
|
||||
|
||||
TARGET_HOST="$TARGET_HOST" TARGET_DOMAIN="$TARGET_DOMAIN" REMOTE_UI_DIR="$REMOTE_UI_DIR" \
|
||||
@@ -12,8 +12,10 @@ REMOTE_HOST="$TARGET_HOST" \
|
||||
REMOTE_UI_DIR="$REMOTE_UI_DIR" \
|
||||
EXPECTED_CADDY_UI_ROOT="$REMOTE_UI_DIR" \
|
||||
EXPECTED_CADDY_SITE="$TARGET_DOMAIN" \
|
||||
DEPLOY_SERVER_LOGIN="tshineupme" \
|
||||
DEPLOY_SERVER_LOGIN="server2shineupme" \
|
||||
DEPLOY_SERVER_ADDRESS="$TARGET_DOMAIN" \
|
||||
DEPLOY_SOLANA_CLUSTER="mainnet" \
|
||||
DEPLOY_SOLANA_ENDPOINT="https://solana-rpc.publicnode.com" \
|
||||
TARGET_URL="https://$TARGET_DOMAIN" \
|
||||
bash "$(dirname "$0")/deploy_shine-PWA.sh"
|
||||
|
||||
@@ -0,0 +1,13 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
REMOTE_HOST="player@shineup.me" \
|
||||
REMOTE_UI_DIR="/home/player/SHiNE/shine-ui" \
|
||||
EXPECTED_CADDY_UI_ROOT="/home/player/SHiNE/shine-ui" \
|
||||
EXPECTED_CADDY_SITE="shineup.me" \
|
||||
DEPLOY_SERVER_LOGIN="shineupme" \
|
||||
DEPLOY_SERVER_ADDRESS="shineup.me" \
|
||||
DEPLOY_SOLANA_CLUSTER="mainnet" \
|
||||
DEPLOY_SOLANA_ENDPOINT="https://solana-rpc.publicnode.com" \
|
||||
TARGET_URL="https://shineup.me" \
|
||||
bash "$(dirname "$0")/deploy_shine-PWA.sh"
|
||||
@@ -0,0 +1,13 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
REMOTE_HOST="player@178.208.90.249" \
|
||||
REMOTE_UI_DIR="/home/player/t1/UI" \
|
||||
EXPECTED_CADDY_UI_ROOT="/home/player/t1/UI" \
|
||||
EXPECTED_CADDY_SITE="t1.shineup.me" \
|
||||
DEPLOY_SERVER_LOGIN="server_t1" \
|
||||
DEPLOY_SERVER_ADDRESS="t1.shineup.me" \
|
||||
DEPLOY_SOLANA_CLUSTER="devnet" \
|
||||
DEPLOY_SOLANA_ENDPOINT="https://api.devnet.solana.com" \
|
||||
TARGET_URL="https://t1.shineup.me" \
|
||||
bash "$(dirname "$0")/deploy_shine-PWA.sh"
|
||||
@@ -0,0 +1,13 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
REMOTE_HOST="player@178.208.90.249" \
|
||||
REMOTE_UI_DIR="/home/player/t2/UI" \
|
||||
EXPECTED_CADDY_UI_ROOT="/home/player/t2/UI" \
|
||||
EXPECTED_CADDY_SITE="t2.shineup.me" \
|
||||
DEPLOY_SERVER_LOGIN="server_t2" \
|
||||
DEPLOY_SERVER_ADDRESS="t2.shineup.me" \
|
||||
DEPLOY_SOLANA_CLUSTER="devnet" \
|
||||
DEPLOY_SOLANA_ENDPOINT="https://api.devnet.solana.com" \
|
||||
TARGET_URL="https://t2.shineup.me" \
|
||||
bash "$(dirname "$0")/deploy_shine-PWA.sh"
|
||||
@@ -0,0 +1,13 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
REMOTE_HOST="player@178.208.90.249" \
|
||||
REMOTE_UI_DIR="/home/player/t3/UI" \
|
||||
EXPECTED_CADDY_UI_ROOT="/home/player/t3/UI" \
|
||||
EXPECTED_CADDY_SITE="t3.shineup.me" \
|
||||
DEPLOY_SERVER_LOGIN="server_t3" \
|
||||
DEPLOY_SERVER_ADDRESS="t3.shineup.me" \
|
||||
DEPLOY_SOLANA_CLUSTER="devnet" \
|
||||
DEPLOY_SOLANA_ENDPOINT="https://api.devnet.solana.com" \
|
||||
TARGET_URL="https://t3.shineup.me" \
|
||||
bash "$(dirname "$0")/deploy_shine-PWA.sh"
|
||||
@@ -0,0 +1,13 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
REMOTE_HOST="player@178.208.90.249" \
|
||||
REMOTE_UI_DIR="/home/player/t4/UI" \
|
||||
EXPECTED_CADDY_UI_ROOT="/home/player/t4/UI" \
|
||||
EXPECTED_CADDY_SITE="t4.shineup.me" \
|
||||
DEPLOY_SERVER_LOGIN="server_t4" \
|
||||
DEPLOY_SERVER_ADDRESS="t4.shineup.me" \
|
||||
DEPLOY_SOLANA_CLUSTER="devnet" \
|
||||
DEPLOY_SOLANA_ENDPOINT="https://api.devnet.solana.com" \
|
||||
TARGET_URL="https://t4.shineup.me" \
|
||||
bash "$(dirname "$0")/deploy_shine-PWA.sh"
|
||||
@@ -48,7 +48,7 @@
|
||||
|
||||
# 2026-06-26 17:45:18 +0400
|
||||
- Базовый коммит-ориентир: `44a1ba0`.
|
||||
- На `t.shineup.me` подтверждена рабочая схема startup sync и full-resync:
|
||||
- На `server2.shineup.me` подтверждена рабочая схема startup sync и full-resync:
|
||||
- после рестарта сервер добивает `BlockchainTmpRecovery` и `BlockchainResyncRecovery`;
|
||||
- `aidartest-001` успешно подтягивается с `shineup.me`;
|
||||
- итоговое локальное состояние по `aidartest-001` дошло до `last_block_number=13`.
|
||||
|
||||
@@ -244,7 +244,7 @@ Full resync запускается только тогда, когда:
|
||||
|
||||
### 8.1 Практическая проверка на тестовом сервере
|
||||
|
||||
Проверка на `t.shineup.me` показала, что текущая схема действительно поднимает цепочку при старте:
|
||||
Проверка на `server2.shineup.me` показала, что текущая схема действительно поднимает цепочку при старте:
|
||||
|
||||
- после рестарта сервер сначала проходит `BlockchainTmpRecovery`;
|
||||
- затем обрабатывает `BlockchainResyncRecovery`;
|
||||
|
||||
@@ -0,0 +1,13 @@
|
||||
# Исправление экрана регистрации и отдельный UI-деплой на `t2.shineup.me`
|
||||
|
||||
- краткое описание:
|
||||
Исправлен экран регистрации после регрессии: обычное поле пароля, кнопка-глаз и кнопка проверки логина снова должны быть видимы одновременно с режимом `12 слов`. Отдельно UI выложен на `t2.shineup.me` безопасным способом без использования исторического `deployUITest2`.
|
||||
- что проверять:
|
||||
Открыть экран регистрации и убедиться, что видны поле логина, статус под ним, кнопка `Проверить логин`, обычное поле пароля и квадратная кнопка-глаз.
|
||||
Включить режим `12 слов` и убедиться, что блок слов появляется, но обычное поле пароля не исчезает.
|
||||
Ввести слова и проверить, что длинный составной пароль сразу виден в обычном поле пароля.
|
||||
Проверить, что `https://t2.shineup.me` отдаёт обновлённый UI с этой правкой.
|
||||
- ожидаемый результат:
|
||||
Экран регистрации снова полностью рабочий и на `t2.shineup.me` доступна именно исправленная версия UI.
|
||||
- статус:
|
||||
pending
|
||||
@@ -0,0 +1,12 @@
|
||||
# Проверки серверных настроек через текущий выбранный Solana RPC
|
||||
|
||||
- краткое описание:
|
||||
Убрано использование `SOLANA_ENDPOINT_DEFAULT` в проверках логина сервера. Теперь проверки должны идти через текущий выбранный пользователем Solana endpoint из настроек.
|
||||
- что проверять:
|
||||
Открыть экран настроек входа или серверных настроек.
|
||||
Поменять `Адрес Solana сервера` на другой endpoint и проверить логин сервера кнопкой `Проверить`.
|
||||
Убедиться, что результат проверки соответствует именно выбранному RPC, а не значению по умолчанию.
|
||||
- ожидаемый результат:
|
||||
Все проверки логина сервера используют текущий выбранный Solana endpoint и не подмешивают дефолтный RPC.
|
||||
- статус:
|
||||
pending
|
||||
+12
@@ -0,0 +1,12 @@
|
||||
# Исправление нормализации Solana endpoint и удаление старой кнопки справки
|
||||
|
||||
- краткое описание:
|
||||
Убрана скрытая подмена выбранного Solana endpoint на дефолтный при сохранении настроек входа. Со страницы настроек входа удалена старая маленькая кнопка `?` внизу.
|
||||
- что проверять:
|
||||
Открыть настройки входа, ввести свой Solana RPC и сохранить.
|
||||
Убедиться, что после сохранения endpoint остаётся ровно тем, который был введён, без незаметной подмены.
|
||||
Проверить, что внизу страницы больше нет маленькой кнопки `?`.
|
||||
- ожидаемый результат:
|
||||
Клиент использует именно выбранный пользователем Solana endpoint, а экран настроек входа не содержит старой кнопки справки.
|
||||
- статус:
|
||||
pending
|
||||
@@ -0,0 +1,12 @@
|
||||
# UI deploy: подстановка Solana cluster и endpoint
|
||||
|
||||
- краткое описание:
|
||||
В UI deploy-скрипт добавлена подстановка `defaultSolanaCluster` и `defaultSolanaEndpoint` в `deploy-config.js`. Для production на уровне скриптов используется значение `mainnet`, которое внутри общего deploy-скрипта нормализуется в `mainnet-beta` для совместимости с кодом. Для `t2` выставляется devnet/api.devnet.solana.com.
|
||||
- что проверять:
|
||||
Выполнить production UI deploy и проверить, что в опубликованном `js/deploy-config.js` стоят `mainnet-beta` и `https://solana-rpc.publicnode.com`.
|
||||
Выполнить `t2` UI deploy и проверить, что в опубликованном `js/deploy-config.js` стоят `devnet` и `https://api.devnet.solana.com`.
|
||||
Убедиться, что логин и адрес сервера при этом тоже подставляются корректно.
|
||||
- ожидаемый результат:
|
||||
После деплоя каждый UI-инстанс получает свои правильные Solana defaults без ручной правки файла на сервере.
|
||||
- статус:
|
||||
pending
|
||||
@@ -0,0 +1,12 @@
|
||||
# Перенос второго production на `server2.shineup.me` и добавление UI-обёрток `t1/t3/t4`
|
||||
|
||||
- краткое описание:
|
||||
Второй production-контур переименован в документации и UI deploy-скриптах на `server2.shineup.me` с логином `server2shineupme`. Добавлены отдельные UI-обёртки для `t1`, `t3` и `t4`.
|
||||
- что проверять:
|
||||
Выполнить `./gradlew deployUI` и убедиться, что deploy идёт на `server2.shineup.me`.
|
||||
Проверить новые скрипты `deploy_shine-ui_t1.sh`, `deploy_shine-ui_t3.sh`, `deploy_shine-ui_t4.sh`.
|
||||
Убедиться, что в проектной документации больше нет упоминаний старого домена второго production-контура.
|
||||
- ожидаемый результат:
|
||||
Второй production везде обозначен как `server2.shineup.me`, а все четыре devnet UI-инстанса имеют отдельные короткие deploy-обёртки.
|
||||
- статус:
|
||||
pending
|
||||
@@ -0,0 +1,11 @@
|
||||
# Переименование UI-обёртки второго production в единый формат
|
||||
|
||||
- краткое описание:
|
||||
UI-обёртка второго production переименована в `deploy_shine-ui_production_server2shineupme.sh`, чтобы имя было единообразным с production-обёрткой основного домена.
|
||||
- что проверять:
|
||||
Убедиться, что `./gradlew deployUI` использует новый файл-обёртку.
|
||||
Проверить, что старое имя `deploy_shine-ui_server2shineupme.sh` больше нигде не используется.
|
||||
- ожидаемый результат:
|
||||
Для второго production используется обёртка с именем `deploy_shine-ui_production_server2shineupme.sh`.
|
||||
- статус:
|
||||
pending
|
||||
@@ -21,7 +21,7 @@
|
||||
- IP: `178.208.64.62`
|
||||
- Second production:
|
||||
- SSH: `player@193.8.215.70`
|
||||
- Домен: `t.shineup.me`
|
||||
- Домен: `server2.shineup.me`
|
||||
- IP: `193.8.215.70`
|
||||
- Reserve test (temporarily down):
|
||||
- SSH: `player@93.170.12.154`
|
||||
@@ -45,11 +45,11 @@
|
||||
|
||||
## Политика подтверждений
|
||||
|
||||
- `shineup.me` и `t.shineup.me` считать production-контурами.
|
||||
- `shineup.me` и `server2.shineup.me` считать production-контурами.
|
||||
- Любые изменения на production-контурах, включая deploy сервера, deploy UI, конфиги, перезапуски и миграции, делать только после отдельного явного подтверждения пользователя.
|
||||
- `test.shineup.me` считать резервным тестовым хостом, который сейчас временно не работает.
|
||||
|
||||
## Second production deploy (`t.shineup.me`)
|
||||
## Second production deploy (`server2.shineup.me`)
|
||||
|
||||
- Это второй production-сервер SHiNE.
|
||||
- Исторические задачи `deployServer`, `deployUI`, `deployServerTest2`, `deployUITest2` по-прежнему могут указывать сюда.
|
||||
@@ -60,8 +60,9 @@
|
||||
- перенос `application.properties` с production с поправкой `server.ui.indexPath` на `/home/player/SHiNE/shine-ui/index.html`;
|
||||
- установку `systemd` unit на `193.8.215.70`;
|
||||
- перезапуск `shine-server.service`;
|
||||
- установку/проверку Caddy для `t.shineup.me`.
|
||||
- установку/проверку Caddy для `server2.shineup.me`.
|
||||
- `deployUI` / `deployUITest2` публикуют UI в `/home/player/SHiNE/shine-ui` на `193.8.215.70`.
|
||||
- Важно: историческое имя `deployUITest2` вводит в заблуждение. По умолчанию эта задача деплоит на `server2.shineup.me`, а не на `t2.shineup.me`.
|
||||
|
||||
## Reserve test deploy (`test.shineup.me`)
|
||||
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
# Сервер `193.8.215.70` — второй production (`t.shineup.me`)
|
||||
# Сервер `193.8.215.70` — второй production (`server2.shineup.me`)
|
||||
|
||||
- Пользователь: `player`
|
||||
- Домен: `t.shineup.me`
|
||||
- Логин сервера: `tshineupme`
|
||||
- Домен: `server2.shineup.me`
|
||||
- Логин сервера: `server2shineupme`
|
||||
- Каталог SHiNE: `/home/player/SHiNE`
|
||||
- UI публикация для Caddy: `/home/player/SHiNE/shine-ui`
|
||||
- Сервер: `/home/player/SHiNE/shine-server/shine-server.jar`
|
||||
@@ -26,9 +26,9 @@
|
||||
|
||||
- Конфиг: `/etc/caddy/Caddyfile`
|
||||
- Сайты:
|
||||
- `t.shineup.me`
|
||||
- `server2.shineup.me`
|
||||
- `agent.shiningpeople.ru`
|
||||
- Для `t.shineup.me`:
|
||||
- Для `server2.shineup.me`:
|
||||
- `root * /home/player/SHiNE/shine-ui`
|
||||
- `try_files {path} /index.html`
|
||||
- `reverse_proxy /ws* -> 127.0.0.1:7070`
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
set -euo pipefail
|
||||
|
||||
TARGET_HOST="${TARGET_HOST:-player@193.8.215.70}"
|
||||
TARGET_DOMAIN="${TARGET_DOMAIN:-t.shineup.me}"
|
||||
TARGET_DOMAIN="${TARGET_DOMAIN:-server2.shineup.me}"
|
||||
REMOTE_UI_DIR="${REMOTE_UI_DIR:-/home/player/SHiNE/shine-ui}"
|
||||
REMOTE_CADDYFILE="${REMOTE_CADDYFILE:-/etc/caddy/Caddyfile}"
|
||||
|
||||
|
||||
@@ -103,7 +103,9 @@ export function render({ navigate }) {
|
||||
draft.shineServer = resolved.wsUrl;
|
||||
applyStatus(resolved.status, resolved.httpBase);
|
||||
} else {
|
||||
const next = await checkServerAvailabilityByKey(field.key, input.value);
|
||||
const next = await checkServerAvailabilityByKey(field.key, input.value, {
|
||||
solanaEndpoint: draft.solanaServer,
|
||||
});
|
||||
applyStatus(next);
|
||||
}
|
||||
} finally {
|
||||
@@ -171,16 +173,6 @@ export function render({ navigate }) {
|
||||
|
||||
actions.append(serverUiButton, cancelButton, saveButton);
|
||||
|
||||
const help = document.createElement('button');
|
||||
help.className = 'help-fab';
|
||||
help.type = 'button';
|
||||
help.textContent = '?';
|
||||
help.addEventListener('click', () => {
|
||||
window.alert(
|
||||
'Текст для разработчиков: для SHiNE вводится логин серверного аккаунта. Клиент читает его PDA, берёт server_address, показывает точный https-адрес и проверяет доступность WS-канала автоматически.',
|
||||
);
|
||||
});
|
||||
|
||||
screen.append(
|
||||
renderHeader({
|
||||
title: 'Настройки входа',
|
||||
@@ -188,7 +180,6 @@ export function render({ navigate }) {
|
||||
}),
|
||||
body,
|
||||
actions,
|
||||
help,
|
||||
);
|
||||
|
||||
screen.cleanup = () => {
|
||||
|
||||
@@ -163,6 +163,7 @@ export function render({ navigate }) {
|
||||
words: passwordWords,
|
||||
onInput: (index, value) => {
|
||||
passwordWords[index] = value;
|
||||
passwordInput.value = composePasswordFromWords(passwordWords);
|
||||
passwordWordsLinked = true;
|
||||
syncDraftState();
|
||||
updateWordsPreview();
|
||||
@@ -258,11 +259,13 @@ export function render({ navigate }) {
|
||||
let generationRunId = 0;
|
||||
|
||||
function getCurrentPassword() {
|
||||
return passwordMode === 'words' ? composePasswordFromWords(passwordWords) : String(passwordInput.value || '');
|
||||
return String(passwordInput.value || '');
|
||||
}
|
||||
|
||||
function updateWordsPreview() {
|
||||
const password = getCurrentPassword();
|
||||
const password = passwordMode === 'words'
|
||||
? composePasswordFromWords(passwordWords)
|
||||
: String(passwordInput.value || '');
|
||||
const text = `Итоговая длина пароля: ${password.length} символов.`;
|
||||
wordsPreview.textContent = text;
|
||||
passwordLengthText.textContent = text;
|
||||
@@ -306,8 +309,8 @@ export function render({ navigate }) {
|
||||
function updatePasswordModeVisibility() {
|
||||
const wordsMode = passwordMode === 'words';
|
||||
wordsSection.style.display = wordsMode ? 'grid' : 'none';
|
||||
if (passwordField) passwordField.style.display = wordsMode ? 'none' : 'grid';
|
||||
passwordInputRow.style.display = wordsMode ? 'grid' : 'none';
|
||||
if (passwordField) passwordField.style.display = 'grid';
|
||||
passwordInputRow.style.display = 'grid';
|
||||
updateWordsPreview();
|
||||
}
|
||||
|
||||
@@ -480,11 +483,11 @@ export function render({ navigate }) {
|
||||
wordInputs.forEach((input) => {
|
||||
input.value = '';
|
||||
});
|
||||
passwordInput.value = '';
|
||||
} else {
|
||||
passwordInput.value = composePasswordFromWords(passwordWords);
|
||||
}
|
||||
} else {
|
||||
} else if (passwordWordsLinked) {
|
||||
passwordInput.value = composePasswordFromWords(passwordWords);
|
||||
passwordWordsLinked = true;
|
||||
}
|
||||
passwordMode = nextMode;
|
||||
updatePasswordModeVisibility();
|
||||
|
||||
@@ -86,7 +86,9 @@ export function render({ navigate }) {
|
||||
draft.shineServer = resolved.wsUrl;
|
||||
applyStatus(resolved.status, resolved.httpBase);
|
||||
} else {
|
||||
const next = await checkServerAvailabilityByKey(field.key, input.value);
|
||||
const next = await checkServerAvailabilityByKey(field.key, input.value, {
|
||||
solanaEndpoint: draft.solanaServer,
|
||||
});
|
||||
applyStatus(next);
|
||||
}
|
||||
} finally {
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import { resolveShineServerByServerLogin } from './shine-server-resolver.js';
|
||||
import { SOLANA_ENDPOINT_DEFAULT } from '../solana-programs.js';
|
||||
import { state } from '../state.js';
|
||||
|
||||
function normalizeUrl(value) {
|
||||
return String(value || '').trim();
|
||||
@@ -121,12 +121,13 @@ export async function resolveAndCheckShineServerLogin(serverLogin, solanaEndpoin
|
||||
};
|
||||
}
|
||||
|
||||
export async function checkServerAvailabilityByKey(key, url) {
|
||||
export async function checkServerAvailabilityByKey(key, url, options = {}) {
|
||||
const selectedSolanaEndpoint = normalizeUrl(options?.solanaEndpoint || state.entrySettings.solanaServer);
|
||||
if (key === 'solanaServer') {
|
||||
return (await checkSolanaRpc(url)) ? 'available' : 'unavailable';
|
||||
}
|
||||
if (key === 'shineServerLogin') {
|
||||
return (await resolveAndCheckShineServerLogin(url, SOLANA_ENDPOINT_DEFAULT)).status;
|
||||
return (await resolveAndCheckShineServerLogin(url, selectedSolanaEndpoint)).status;
|
||||
}
|
||||
if (key === 'shineServer') {
|
||||
return (await checkShineWs(url)) ? 'available' : 'unavailable';
|
||||
|
||||
+1
-10
@@ -95,16 +95,7 @@ const DEFAULT_OPENAI_BASE_URL = 'https://api.openai.com/v1';
|
||||
function normalizeStoredSolanaServer(value) {
|
||||
const raw = String(value || '').trim();
|
||||
if (!raw) return DEFAULT_SOLANA_SERVER;
|
||||
const normalized = raw.replace(/\/+$/u, '').toLowerCase();
|
||||
if (
|
||||
normalized === 'https://api.devnet.solana.com'
|
||||
|| normalized === 'http://api.devnet.solana.com'
|
||||
|| normalized === 'https://api.mainnet-beta.solana.com'
|
||||
|| normalized === 'http://api.mainnet-beta.solana.com'
|
||||
) {
|
||||
return DEFAULT_SOLANA_SERVER;
|
||||
}
|
||||
return raw;
|
||||
return raw.replace(/\/+$/u, '');
|
||||
}
|
||||
|
||||
export function normalizeDmChatId(value) {
|
||||
|
||||
Reference in New Issue
Block a user