Перевести тестовый контур на t.shineup.me
This commit is contained in:
parent
112ab4d5d5
commit
f0e1ab3af8
@ -90,13 +90,13 @@
|
|||||||
## Deploy
|
## Deploy
|
||||||
- Все документы и заметки по деплою хранить в папке `Dev_Docs/deploy/`.
|
- Все документы и заметки по деплою хранить в папке `Dev_Docs/deploy/`.
|
||||||
- Production-хост SHiNE: `player@shineup.me` (`185.229.109.118`).
|
- Production-хост SHiNE: `player@shineup.me` (`185.229.109.118`).
|
||||||
- Основной test-хост SHiNE: `player@193.8.215.70` (`test2.shineup.me`).
|
- Основной test-хост SHiNE: `player@193.8.215.70` (`t.shineup.me`).
|
||||||
- Резервный test-хост SHiNE: `player@93.170.12.154` (`test.shineup.me`).
|
- Резервный test-хост SHiNE: `player@93.170.12.154` (`test.shineup.me`).
|
||||||
- Базовый путь на сервере для SHiNE: `/home/player` (проекты SHiNE размещать в `/home/player/SHiNE/...`).
|
- Базовый путь на сервере для SHiNE: `/home/player` (проекты SHiNE размещать в `/home/player/SHiNE/...`).
|
||||||
- По возможности все справки, комментарии и примечания в конфигах/документах писать на русском языке.
|
- По возможности все справки, комментарии и примечания в конфигах/документах писать на русском языке.
|
||||||
- Для операций `git push` при необходимости использовать токен из переменной окружения `$GITEA_TOKEN`.
|
- Для операций `git push` при необходимости использовать токен из переменной окружения `$GITEA_TOKEN`.
|
||||||
- Любые изменения и любой деплой на production `shineup.me` выполнять только после отдельного явного подтверждения пользователя.
|
- Любые изменения и любой деплой на production `shineup.me` выполнять только после отдельного явного подтверждения пользователя.
|
||||||
- Если пользователь пишет просто `задеплой` без уточнения production/test, по умолчанию деплоить на `test2.shineup.me`.
|
- Если пользователь пишет просто `задеплой` без уточнения production/test, по умолчанию деплоить на `t.shineup.me`.
|
||||||
- Default server deploy: `./gradlew deployServer` или `./gradlew deployServerTest2`.
|
- Default server deploy: `./gradlew deployServer` или `./gradlew deployServerTest2`.
|
||||||
- Default UI deploy: `./gradlew deployUI` или `./gradlew deployUITest2`.
|
- Default UI deploy: `./gradlew deployUI` или `./gradlew deployUITest2`.
|
||||||
- Production server deploy: `./gradlew deployServerProduction`.
|
- Production server deploy: `./gradlew deployServerProduction`.
|
||||||
|
|||||||
@ -1,22 +0,0 @@
|
|||||||
# Тестовые deploy-контуры `test2.shineup.me` и `test.shineup.me`
|
|
||||||
|
|
||||||
- краткое описание:
|
|
||||||
- default deploy-задачи `deployServer` и `deployUI` переведены на основной тестовый сервер `test2.shineup.me`;
|
|
||||||
- production-задачи вынесены в `deployServerProduction` и `deployUIProduction`;
|
|
||||||
- `test.shineup.me` оставлен как резервный тестовый сервер без обычного deploy по умолчанию.
|
|
||||||
|
|
||||||
- что проверять:
|
|
||||||
- `./gradlew deployServer` и `./gradlew deployUI` действительно направлены на `test2.shineup.me`;
|
|
||||||
- `./gradlew deployServerProduction` и `./gradlew deployUIProduction` больше не используются как default;
|
|
||||||
- `https://test2.shineup.me` открывает UI;
|
|
||||||
- `wss://test2.shineup.me/ws` отвечает;
|
|
||||||
- на `test2.shineup.me` после deploy есть копия продовой `shine.sqlite` и `.bch`.
|
|
||||||
|
|
||||||
- ожидаемый результат:
|
|
||||||
- default deploy идёт только на `test2.shineup.me`;
|
|
||||||
- production `shineup.me` меняется только после отдельного подтверждения;
|
|
||||||
- `test.shineup.me` остаётся резервным тестовым сервером;
|
|
||||||
- тестовый deploy не гоняет удалённые тесты и не создаёт пустую БД.
|
|
||||||
|
|
||||||
- статус:
|
|
||||||
- pending
|
|
||||||
@ -21,7 +21,7 @@
|
|||||||
- IP: `185.229.109.118`
|
- IP: `185.229.109.118`
|
||||||
- Main test:
|
- Main test:
|
||||||
- SSH: `player@193.8.215.70`
|
- SSH: `player@193.8.215.70`
|
||||||
- Домен: `test2.shineup.me`
|
- Домен: `t.shineup.me`
|
||||||
- IP: `193.8.215.70`
|
- IP: `193.8.215.70`
|
||||||
- Reserve test:
|
- Reserve test:
|
||||||
- SSH: `player@93.170.12.154`
|
- SSH: `player@93.170.12.154`
|
||||||
@ -42,9 +42,9 @@
|
|||||||
|
|
||||||
- `shineup.me` — production.
|
- `shineup.me` — production.
|
||||||
- Любые изменения на `shineup.me`, включая deploy сервера, deploy UI, конфиги, перезапуски и миграции, делать только после отдельного явного подтверждения пользователя.
|
- Любые изменения на `shineup.me`, включая deploy сервера, deploy UI, конфиги, перезапуски и миграции, делать только после отдельного явного подтверждения пользователя.
|
||||||
- Если пользователь пишет просто `задеплой` без уточнения, по умолчанию это означает deploy на `test2.shineup.me`.
|
- Если пользователь пишет просто `задеплой` без уточнения, по умолчанию это означает deploy на `t.shineup.me`.
|
||||||
|
|
||||||
## Main test deploy (`test2.shineup.me`)
|
## Main test deploy (`t.shineup.me`)
|
||||||
|
|
||||||
- Это основной сервер для тестов.
|
- Это основной сервер для тестов.
|
||||||
- `deployServer` и `deployUI` по умолчанию направлены именно сюда.
|
- `deployServer` и `deployUI` по умолчанию направлены именно сюда.
|
||||||
@ -55,12 +55,13 @@
|
|||||||
- перенос `application.properties` с production с поправкой `server.ui.indexPath` на `/home/player/SHiNE/shine-ui/index.html`;
|
- перенос `application.properties` с production с поправкой `server.ui.indexPath` на `/home/player/SHiNE/shine-ui/index.html`;
|
||||||
- установку `systemd` unit на `193.8.215.70`;
|
- установку `systemd` unit на `193.8.215.70`;
|
||||||
- перезапуск `shine-server.service`;
|
- перезапуск `shine-server.service`;
|
||||||
- установку/проверку Caddy для `test2.shineup.me`.
|
- установку/проверку Caddy для `t.shineup.me`.
|
||||||
- `deployUI` / `deployUITest2` публикуют UI в `/home/player/SHiNE/shine-ui` на `193.8.215.70`.
|
- `deployUI` / `deployUITest2` публикуют UI в `/home/player/SHiNE/shine-ui` на `193.8.215.70`.
|
||||||
|
|
||||||
## Reserve test deploy (`test.shineup.me`)
|
## Reserve test deploy (`test.shineup.me`)
|
||||||
|
|
||||||
- `test.shineup.me` пока не использовать для обычного deploy.
|
- `test.shineup.me` считается резервным тестовым сервером.
|
||||||
|
- Его настройки и адрес не менять без отдельной задачи.
|
||||||
- Задачи `deployServerTest` и `deployUITest` считаются резервными и требуют отдельной причины.
|
- Задачи `deployServerTest` и `deployUITest` считаются резервными и требуют отдельной причины.
|
||||||
|
|
||||||
## UI-деплой и Caddy (обязательно)
|
## UI-деплой и Caddy (обязательно)
|
||||||
|
|||||||
@ -1,7 +1,8 @@
|
|||||||
# Сервер `193.8.215.70` — основной test (`test2.shineup.me`)
|
# Сервер `193.8.215.70` — основной test (`t.shineup.me`)
|
||||||
|
|
||||||
- Пользователь: `player`
|
- Пользователь: `player`
|
||||||
- Домен: `test2.shineup.me`
|
- Домен: `t.shineup.me`
|
||||||
|
- Логин сервера: `tshineupme`
|
||||||
- Каталог SHiNE: `/home/player/SHiNE`
|
- Каталог SHiNE: `/home/player/SHiNE`
|
||||||
- UI публикация для Caddy: `/home/player/SHiNE/shine-ui`
|
- UI публикация для Caddy: `/home/player/SHiNE/shine-ui`
|
||||||
- Сервер: `/home/player/SHiNE/shine-server/shine-server.jar`
|
- Сервер: `/home/player/SHiNE/shine-server/shine-server.jar`
|
||||||
@ -25,9 +26,9 @@
|
|||||||
|
|
||||||
- Конфиг: `/etc/caddy/Caddyfile`
|
- Конфиг: `/etc/caddy/Caddyfile`
|
||||||
- Сайты:
|
- Сайты:
|
||||||
- `test2.shineup.me`
|
- `t.shineup.me`
|
||||||
- `agent.shiningpeople.ru`
|
- `agent.shiningpeople.ru`
|
||||||
- Для `test2.shineup.me`:
|
- Для `t.shineup.me`:
|
||||||
- `root * /home/player/SHiNE/shine-ui`
|
- `root * /home/player/SHiNE/shine-ui`
|
||||||
- `try_files {path} /index.html`
|
- `try_files {path} /index.html`
|
||||||
- `reverse_proxy /ws* -> 127.0.0.1:7070`
|
- `reverse_proxy /ws* -> 127.0.0.1:7070`
|
||||||
|
|||||||
@ -1,8 +1,9 @@
|
|||||||
# Сервер `93.170.12.154` — test.shineup.me
|
# Сервер `93.170.12.154` — резервный test (`test.shineup.me`)
|
||||||
|
|
||||||
- Пользователь: `player`
|
- Пользователь: `player`
|
||||||
- Каталог SHiNE: `/home/player/SHiNE`
|
- Каталог SHiNE: `/home/player/SHiNE`
|
||||||
- Домен: `test.shineup.me`
|
- Домен: `test.shineup.me`
|
||||||
|
- Роль: резервный тестовый сервер
|
||||||
- UI публикация для Caddy: `/home/player/SHiNE/shine-ui`
|
- UI публикация для Caddy: `/home/player/SHiNE/shine-ui`
|
||||||
- Сервер: `/home/player/SHiNE/shine-server/shine-server.jar`
|
- Сервер: `/home/player/SHiNE/shine-server/shine-server.jar`
|
||||||
- Данные: `/home/player/SHiNE/shine-server/data/`
|
- Данные: `/home/player/SHiNE/shine-server/data/`
|
||||||
|
|||||||
@ -59,7 +59,7 @@ shine-UI/server-ui.html
|
|||||||
./gradlew deployUI
|
./gradlew deployUI
|
||||||
```
|
```
|
||||||
|
|
||||||
Default deploy по умолчанию идёт на `test2.shineup.me` (`player@193.8.215.70`).
|
Default deploy по умолчанию идёт на `t.shineup.me` (`player@193.8.215.70`).
|
||||||
|
|
||||||
Production deploy:
|
Production deploy:
|
||||||
|
|
||||||
@ -77,7 +77,7 @@ Production deploy:
|
|||||||
./gradlew deployUITest
|
./gradlew deployUITest
|
||||||
```
|
```
|
||||||
|
|
||||||
`test.shineup.me` пока не использовать для обычного deploy.
|
`test.shineup.me` считается резервным тестовым сервером и в обычный deploy не включается.
|
||||||
|
|
||||||
Логи на проде:
|
Логи на проде:
|
||||||
- `/home/player/SHiNE/shine-server/logs/app.log`
|
- `/home/player/SHiNE/shine-server/logs/app.log`
|
||||||
|
|||||||
@ -1,2 +1,2 @@
|
|||||||
client.version=1.2.268
|
client.version=1.2.269
|
||||||
server.version=1.2.248
|
server.version=1.2.249
|
||||||
|
|||||||
@ -212,7 +212,7 @@ tasks.register('deployUIProduction', Exec) {
|
|||||||
|
|
||||||
tasks.register('deployServer', Exec) {
|
tasks.register('deployServer', Exec) {
|
||||||
group = "!!deployment"
|
group = "!!deployment"
|
||||||
description = "Default deploy server: test2.shineup.me"
|
description = "Default deploy server: t.shineup.me"
|
||||||
dependsOn shadowJar
|
dependsOn shadowJar
|
||||||
workingDir = rootDir
|
workingDir = rootDir
|
||||||
environment 'LOCAL_JAR', file('SHiNE-server/build/libs/shine-server.jar').absolutePath
|
environment 'LOCAL_JAR', file('SHiNE-server/build/libs/shine-server.jar').absolutePath
|
||||||
@ -221,20 +221,20 @@ tasks.register('deployServer', Exec) {
|
|||||||
|
|
||||||
tasks.register('deployUI', Exec) {
|
tasks.register('deployUI', Exec) {
|
||||||
group = "!!deployment"
|
group = "!!deployment"
|
||||||
description = "Default deploy UI: test2.shineup.me"
|
description = "Default deploy UI: t.shineup.me"
|
||||||
workingDir = rootDir
|
workingDir = rootDir
|
||||||
commandLine 'bash', file('deploy_shine-ui_test2.sh').absolutePath
|
commandLine 'bash', file('deploy_shine-ui_test2.sh').absolutePath
|
||||||
}
|
}
|
||||||
|
|
||||||
tasks.register('deployServerTest2') {
|
tasks.register('deployServerTest2') {
|
||||||
group = "!!deployment"
|
group = "!!deployment"
|
||||||
description = "Явный алиас основного test deploy server: test2.shineup.me"
|
description = "Явный алиас основного test deploy server: t.shineup.me"
|
||||||
dependsOn tasks.named('deployServer')
|
dependsOn tasks.named('deployServer')
|
||||||
}
|
}
|
||||||
|
|
||||||
tasks.register('deployUITest2') {
|
tasks.register('deployUITest2') {
|
||||||
group = "!!deployment"
|
group = "!!deployment"
|
||||||
description = "Явный алиас основного test deploy UI: test2.shineup.me"
|
description = "Явный алиас основного test deploy UI: t.shineup.me"
|
||||||
dependsOn tasks.named('deployUI')
|
dependsOn tasks.named('deployUI')
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -26,6 +26,8 @@ export CLIENT_VERSION
|
|||||||
|
|
||||||
TARGET_URL="${TARGET_URL:-https://${EXPECTED_CADDY_SITE}}"
|
TARGET_URL="${TARGET_URL:-https://${EXPECTED_CADDY_SITE}}"
|
||||||
REMOTE_DIR="${REMOTE_UI_DIR}"
|
REMOTE_DIR="${REMOTE_UI_DIR}"
|
||||||
|
DEPLOY_SERVER_LOGIN="${DEPLOY_SERVER_LOGIN:-}"
|
||||||
|
DEPLOY_SERVER_ADDRESS="${DEPLOY_SERVER_ADDRESS:-}"
|
||||||
|
|
||||||
cleanup() {
|
cleanup() {
|
||||||
rm -rf "$TMP_DIR"
|
rm -rf "$TMP_DIR"
|
||||||
@ -42,6 +44,16 @@ echo "==> Client version from $VERSION_FILE: $CLIENT_VERSION"
|
|||||||
echo "==> Deploy target: $TARGET_URL ($REMOTE_DIR)"
|
echo "==> Deploy target: $TARGET_URL ($REMOTE_DIR)"
|
||||||
rsync -a "$SRC_DIR"/ "$TMP_DIR"/
|
rsync -a "$SRC_DIR"/ "$TMP_DIR"/
|
||||||
|
|
||||||
|
DEPLOY_CONFIG_FILE="$TMP_DIR/js/deploy-config.js"
|
||||||
|
if [[ -f "$DEPLOY_CONFIG_FILE" ]]; then
|
||||||
|
if [[ -n "$DEPLOY_SERVER_LOGIN" ]]; then
|
||||||
|
perl -0pi -e "s/export const defaultServerLogin = '.*?';/export const defaultServerLogin = '$DEPLOY_SERVER_LOGIN';/s" "$DEPLOY_CONFIG_FILE"
|
||||||
|
fi
|
||||||
|
if [[ -n "$DEPLOY_SERVER_ADDRESS" ]]; then
|
||||||
|
perl -0pi -e "s/export const defaultServerAddress = '.*?';/export const defaultServerAddress = '$DEPLOY_SERVER_ADDRESS';/s" "$DEPLOY_CONFIG_FILE"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
INDEX_FILE="$TMP_DIR/index.html"
|
INDEX_FILE="$TMP_DIR/index.html"
|
||||||
if [[ ! -f "$INDEX_FILE" ]]; then
|
if [[ ! -f "$INDEX_FILE" ]]; then
|
||||||
echo "ERROR: index.html not found in staged UI: $INDEX_FILE" >&2
|
echo "ERROR: index.html not found in staged UI: $INDEX_FILE" >&2
|
||||||
|
|||||||
@ -3,7 +3,7 @@ set -euo pipefail
|
|||||||
|
|
||||||
PROD_HOST="${PROD_HOST:-player@shineup.me}"
|
PROD_HOST="${PROD_HOST:-player@shineup.me}"
|
||||||
TARGET_HOST="${TARGET_HOST:-player@193.8.215.70}"
|
TARGET_HOST="${TARGET_HOST:-player@193.8.215.70}"
|
||||||
TARGET_DOMAIN="${TARGET_DOMAIN:-test2.shineup.me}"
|
TARGET_DOMAIN="${TARGET_DOMAIN:-t.shineup.me}"
|
||||||
REMOTE_BASE="${REMOTE_BASE:-/home/player/SHiNE}"
|
REMOTE_BASE="${REMOTE_BASE:-/home/player/SHiNE}"
|
||||||
REMOTE_SERVER_DIR="${REMOTE_SERVER_DIR:-$REMOTE_BASE/shine-server}"
|
REMOTE_SERVER_DIR="${REMOTE_SERVER_DIR:-$REMOTE_BASE/shine-server}"
|
||||||
REMOTE_DATA_DIR="${REMOTE_DATA_DIR:-$REMOTE_SERVER_DIR/data}"
|
REMOTE_DATA_DIR="${REMOTE_DATA_DIR:-$REMOTE_SERVER_DIR/data}"
|
||||||
@ -33,7 +33,16 @@ ssh "$TARGET_HOST" "java -version >/dev/null 2>&1"
|
|||||||
mkdir -p "$TMP_DIR/data"
|
mkdir -p "$TMP_DIR/data"
|
||||||
rsync -az --delete "$PROD_HOST:$PROD_DATA_DIR/" "$TMP_DIR/data/"
|
rsync -az --delete "$PROD_HOST:$PROD_DATA_DIR/" "$TMP_DIR/data/"
|
||||||
rsync -az "$PROD_HOST:$PROD_APP_PROPS" "$TMP_DIR/application.properties"
|
rsync -az "$PROD_HOST:$PROD_APP_PROPS" "$TMP_DIR/application.properties"
|
||||||
perl -0pi -e 's@^server\.ui\.indexPath=.*$@server.ui.indexPath=/home/player/SHiNE/shine-ui/index.html@m' "$TMP_DIR/application.properties"
|
if grep -q '^server\.ui\.indexPath=' "$TMP_DIR/application.properties"; then
|
||||||
|
perl -0pi -e 's@^server\.ui\.indexPath=.*$@server.ui.indexPath=/home/player/SHiNE/shine-ui/index.html@m' "$TMP_DIR/application.properties"
|
||||||
|
else
|
||||||
|
printf '\nserver.ui.indexPath=/home/player/SHiNE/shine-ui/index.html\n' >>"$TMP_DIR/application.properties"
|
||||||
|
fi
|
||||||
|
if grep -q '^server\.SHiNE\.login=' "$TMP_DIR/application.properties"; then
|
||||||
|
perl -0pi -e 's@^server\.SHiNE\.login=.*$@server.SHiNE.login=tshineupme@m' "$TMP_DIR/application.properties"
|
||||||
|
else
|
||||||
|
printf '\nserver.SHiNE.login=tshineupme\n' >>"$TMP_DIR/application.properties"
|
||||||
|
fi
|
||||||
|
|
||||||
cat >"$TMP_DIR/shine-server.service" <<EOF
|
cat >"$TMP_DIR/shine-server.service" <<EOF
|
||||||
[Unit]
|
[Unit]
|
||||||
|
|||||||
@ -2,7 +2,7 @@
|
|||||||
set -euo pipefail
|
set -euo pipefail
|
||||||
|
|
||||||
TARGET_HOST="${TARGET_HOST:-player@193.8.215.70}"
|
TARGET_HOST="${TARGET_HOST:-player@193.8.215.70}"
|
||||||
TARGET_DOMAIN="${TARGET_DOMAIN:-test2.shineup.me}"
|
TARGET_DOMAIN="${TARGET_DOMAIN:-t.shineup.me}"
|
||||||
REMOTE_UI_DIR="${REMOTE_UI_DIR:-/home/player/SHiNE/shine-ui}"
|
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" \
|
TARGET_HOST="$TARGET_HOST" TARGET_DOMAIN="$TARGET_DOMAIN" REMOTE_UI_DIR="$REMOTE_UI_DIR" \
|
||||||
@ -12,10 +12,11 @@ REMOTE_HOST="$TARGET_HOST" \
|
|||||||
REMOTE_UI_DIR="$REMOTE_UI_DIR" \
|
REMOTE_UI_DIR="$REMOTE_UI_DIR" \
|
||||||
EXPECTED_CADDY_UI_ROOT="$REMOTE_UI_DIR" \
|
EXPECTED_CADDY_UI_ROOT="$REMOTE_UI_DIR" \
|
||||||
EXPECTED_CADDY_SITE="$TARGET_DOMAIN" \
|
EXPECTED_CADDY_SITE="$TARGET_DOMAIN" \
|
||||||
|
DEPLOY_SERVER_LOGIN="tshineupme" \
|
||||||
|
DEPLOY_SERVER_ADDRESS="$TARGET_DOMAIN" \
|
||||||
TARGET_URL="https://$TARGET_DOMAIN" \
|
TARGET_URL="https://$TARGET_DOMAIN" \
|
||||||
bash "$(dirname "$0")/deploy_shine-PWA.sh"
|
bash "$(dirname "$0")/deploy_shine-PWA.sh"
|
||||||
|
|
||||||
ssh "$TARGET_HOST" "sudo chmod o+x /home/player /home/player/SHiNE '$REMOTE_UI_DIR'; \
|
ssh "$TARGET_HOST" "sudo chmod o+x /home/player /home/player/SHiNE '$REMOTE_UI_DIR'; \
|
||||||
sudo find '$REMOTE_UI_DIR' -type d -exec chmod o+rx {} +; \
|
sudo find '$REMOTE_UI_DIR' -type d -exec chmod o+rx {} +; \
|
||||||
sudo find '$REMOTE_UI_DIR' -type f -exec chmod o+r {} +"
|
sudo find '$REMOTE_UI_DIR' -type f -exec chmod o+r {} +"
|
||||||
|
|
||||||
|
|||||||
@ -2,7 +2,7 @@
|
|||||||
set -euo pipefail
|
set -euo pipefail
|
||||||
|
|
||||||
TARGET_HOST="${TARGET_HOST:-player@193.8.215.70}"
|
TARGET_HOST="${TARGET_HOST:-player@193.8.215.70}"
|
||||||
TARGET_DOMAIN="${TARGET_DOMAIN:-test2.shineup.me}"
|
TARGET_DOMAIN="${TARGET_DOMAIN:-t.shineup.me}"
|
||||||
REMOTE_UI_DIR="${REMOTE_UI_DIR:-/home/player/SHiNE/shine-ui}"
|
REMOTE_UI_DIR="${REMOTE_UI_DIR:-/home/player/SHiNE/shine-ui}"
|
||||||
REMOTE_CADDYFILE="${REMOTE_CADDYFILE:-/etc/caddy/Caddyfile}"
|
REMOTE_CADDYFILE="${REMOTE_CADDYFILE:-/etc/caddy/Caddyfile}"
|
||||||
|
|
||||||
@ -77,4 +77,3 @@ ssh "$TARGET_HOST" "set -euo pipefail; \
|
|||||||
sudo chown root:root '$REMOTE_CADDYFILE'; \
|
sudo chown root:root '$REMOTE_CADDYFILE'; \
|
||||||
sudo caddy validate --config '$REMOTE_CADDYFILE'; \
|
sudo caddy validate --config '$REMOTE_CADDYFILE'; \
|
||||||
sudo systemctl restart caddy"
|
sudo systemctl restart caddy"
|
||||||
|
|
||||||
|
|||||||
@ -14,6 +14,7 @@ import {
|
|||||||
getBalanceSol,
|
getBalanceSol,
|
||||||
getTopupSiteUrl,
|
getTopupSiteUrl,
|
||||||
} from '../services/solana-wallet-service.js';
|
} from '../services/solana-wallet-service.js';
|
||||||
|
import { loadSolanaWeb3 } from '../vendor/solana-web3-loader.js';
|
||||||
import {
|
import {
|
||||||
formatSolanaErrorDetails,
|
formatSolanaErrorDetails,
|
||||||
isUserAlreadyExistsSolanaError,
|
isUserAlreadyExistsSolanaError,
|
||||||
@ -185,7 +186,7 @@ export function render({ navigate }) {
|
|||||||
const raw = atob(publicKeyB64);
|
const raw = atob(publicKeyB64);
|
||||||
const bytes = new Uint8Array(raw.length);
|
const bytes = new Uint8Array(raw.length);
|
||||||
for (let i = 0; i < raw.length; i++) bytes[i] = raw.charCodeAt(i);
|
for (let i = 0; i < raw.length; i++) bytes[i] = raw.charCodeAt(i);
|
||||||
const { PublicKey } = await import('https://esm.sh/@solana/web3.js@1.98.4');
|
const { PublicKey } = await loadSolanaWeb3();
|
||||||
const address = new PublicKey(bytes).toBase58();
|
const address = new PublicKey(bytes).toBase58();
|
||||||
state.registrationPayment.walletAddress = address;
|
state.registrationPayment.walletAddress = address;
|
||||||
walletValue.value = address;
|
walletValue.value = address;
|
||||||
|
|||||||
@ -5,13 +5,14 @@ import {
|
|||||||
SOLANA_CLUSTER,
|
SOLANA_CLUSTER,
|
||||||
} from '../solana-programs.js';
|
} from '../solana-programs.js';
|
||||||
import { state } from '../state.js';
|
import { state } from '../state.js';
|
||||||
|
import { loadSolanaWeb3 } from '../vendor/solana-web3-loader.js';
|
||||||
|
|
||||||
export const pageMeta = { id: 'solana-users-init-view', title: 'Solana Init (users)' };
|
export const pageMeta = { id: 'solana-users-init-view', title: 'Solana Init (users)' };
|
||||||
|
|
||||||
let solanaLibPromise = null;
|
let solanaLibPromise = null;
|
||||||
function loadSolanaLib() {
|
function loadSolanaLib() {
|
||||||
if (!solanaLibPromise) {
|
if (!solanaLibPromise) {
|
||||||
solanaLibPromise = import('https://esm.sh/@solana/web3.js@1.98.4?bundle');
|
solanaLibPromise = loadSolanaWeb3();
|
||||||
}
|
}
|
||||||
return solanaLibPromise;
|
return solanaLibPromise;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -6,6 +6,7 @@ import {
|
|||||||
getTopupSiteUrl,
|
getTopupSiteUrl,
|
||||||
requestAirdropSol,
|
requestAirdropSol,
|
||||||
} from '../services/solana-wallet-service.js';
|
} from '../services/solana-wallet-service.js';
|
||||||
|
import { loadSolanaWeb3 } from '../vendor/solana-web3-loader.js';
|
||||||
|
|
||||||
export const pageMeta = { id: 'topup-view', title: 'Пополнение счета', showAppChrome: false };
|
export const pageMeta = { id: 'topup-view', title: 'Пополнение счета', showAppChrome: false };
|
||||||
|
|
||||||
@ -20,7 +21,7 @@ async function clientWalletAddressFromBundle() {
|
|||||||
const raw = atob(keyBundle.clientPair.publicKeyB64);
|
const raw = atob(keyBundle.clientPair.publicKeyB64);
|
||||||
const bytes = new Uint8Array(raw.length);
|
const bytes = new Uint8Array(raw.length);
|
||||||
for (let i = 0; i < raw.length; i += 1) bytes[i] = raw.charCodeAt(i);
|
for (let i = 0; i < raw.length; i += 1) bytes[i] = raw.charCodeAt(i);
|
||||||
const { PublicKey } = await import('https://esm.sh/@solana/web3.js@1.98.4');
|
const { PublicKey } = await loadSolanaWeb3();
|
||||||
return new PublicKey(bytes).toBase58();
|
return new PublicKey(bytes).toBase58();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -6,6 +6,7 @@ import {
|
|||||||
SHINE_USERS_ECONOMY_CONFIG_SEED,
|
SHINE_USERS_ECONOMY_CONFIG_SEED,
|
||||||
SHINE_USERS_PROGRAM_ID,
|
SHINE_USERS_PROGRAM_ID,
|
||||||
} from '../solana-programs.js';
|
} from '../solana-programs.js';
|
||||||
|
import { loadSolanaWeb3 } from '../vendor/solana-web3-loader.js';
|
||||||
|
|
||||||
const MAGIC = 'SHiNE';
|
const MAGIC = 'SHiNE';
|
||||||
const LAST_BLOCK_STATE_PREFIX = 'SHiNE_LAST_BLOCK';
|
const LAST_BLOCK_STATE_PREFIX = 'SHiNE_LAST_BLOCK';
|
||||||
@ -30,7 +31,7 @@ const SESSION_TYPE_HOMESERVER = 100;
|
|||||||
|
|
||||||
let solanaLibPromise = null;
|
let solanaLibPromise = null;
|
||||||
function loadSolanaLib() {
|
function loadSolanaLib() {
|
||||||
if (!solanaLibPromise) solanaLibPromise = import('https://esm.sh/@solana/web3.js@1.98.4?bundle');
|
if (!solanaLibPromise) solanaLibPromise = loadSolanaWeb3();
|
||||||
return solanaLibPromise;
|
return solanaLibPromise;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -3,6 +3,7 @@ import {
|
|||||||
SHINE_USERS_PROGRAM_ID,
|
SHINE_USERS_PROGRAM_ID,
|
||||||
SHINE_LOGIN_GUARD_PROGRAM_ID,
|
SHINE_LOGIN_GUARD_PROGRAM_ID,
|
||||||
} from '../solana-programs.js';
|
} from '../solana-programs.js';
|
||||||
|
import { loadSolanaWeb3 } from '../vendor/solana-web3-loader.js';
|
||||||
|
|
||||||
const CLASSIFY_LOGIN_INSTRUCTION_TAG = 1;
|
const CLASSIFY_LOGIN_INSTRUCTION_TAG = 1;
|
||||||
const PRECHECK_SIM_PAYER = 'FUc28vNixp7F3nnkpGVt6nuJbgvJ4429v4B5wS52Df6P';
|
const PRECHECK_SIM_PAYER = 'FUc28vNixp7F3nnkpGVt6nuJbgvJ4429v4B5wS52Df6P';
|
||||||
@ -10,7 +11,7 @@ const SHINE_USERS_USER_PDA_SEED_PREFIX = 'user_login=';
|
|||||||
|
|
||||||
let solanaLibPromise = null;
|
let solanaLibPromise = null;
|
||||||
function loadSolanaLib() {
|
function loadSolanaLib() {
|
||||||
if (!solanaLibPromise) solanaLibPromise = import('https://esm.sh/@solana/web3.js@1.98.4?bundle');
|
if (!solanaLibPromise) solanaLibPromise = loadSolanaWeb3();
|
||||||
return solanaLibPromise;
|
return solanaLibPromise;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -1,6 +1,7 @@
|
|||||||
import { extractClientKey32FromStoredValue } from './client-key-utils.js';
|
import { extractClientKey32FromStoredValue } from './client-key-utils.js';
|
||||||
import { loadEncryptedUserSecrets } from './key-vault.js';
|
import { loadEncryptedUserSecrets } from './key-vault.js';
|
||||||
import { SOLANA_ENDPOINT_DEFAULT } from '../solana-programs.js';
|
import { SOLANA_ENDPOINT_DEFAULT } from '../solana-programs.js';
|
||||||
|
import { loadSolanaWeb3 } from '../vendor/solana-web3-loader.js';
|
||||||
|
|
||||||
const DEFAULT_SOLANA_ENDPOINT = SOLANA_ENDPOINT_DEFAULT;
|
const DEFAULT_SOLANA_ENDPOINT = SOLANA_ENDPOINT_DEFAULT;
|
||||||
const TOPUP_SITE_URL = '/devnet-topup-view';
|
const TOPUP_SITE_URL = '/devnet-topup-view';
|
||||||
@ -24,7 +25,7 @@ function normalizeEndpoint(url) {
|
|||||||
|
|
||||||
async function loadSolanaLib() {
|
async function loadSolanaLib() {
|
||||||
if (!solanaLibPromise) {
|
if (!solanaLibPromise) {
|
||||||
solanaLibPromise = import('https://esm.sh/@solana/web3.js@1.98.4?bundle');
|
solanaLibPromise = loadSolanaWeb3();
|
||||||
}
|
}
|
||||||
return solanaLibPromise;
|
return solanaLibPromise;
|
||||||
}
|
}
|
||||||
|
|||||||
45
shine-UI/js/vendor/solana-web3-loader.js
vendored
Normal file
45
shine-UI/js/vendor/solana-web3-loader.js
vendored
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
const SOLANA_WEB3_SCRIPT_SRC = './solana-web3.iife.min.js';
|
||||||
|
|
||||||
|
let solanaWeb3Promise = null;
|
||||||
|
|
||||||
|
function getExistingScript() {
|
||||||
|
return document.querySelector('script[data-shine-solana-web3="1"]');
|
||||||
|
}
|
||||||
|
|
||||||
|
function resolveScriptUrl() {
|
||||||
|
return new URL(SOLANA_WEB3_SCRIPT_SRC, import.meta.url).toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
export function loadSolanaWeb3() {
|
||||||
|
if (typeof window === 'undefined' || typeof document === 'undefined') {
|
||||||
|
return Promise.reject(new Error('Solana Web3 loader доступен только в браузере'));
|
||||||
|
}
|
||||||
|
if (window.solanaWeb3) {
|
||||||
|
return Promise.resolve(window.solanaWeb3);
|
||||||
|
}
|
||||||
|
if (!solanaWeb3Promise) {
|
||||||
|
solanaWeb3Promise = new Promise((resolve, reject) => {
|
||||||
|
const existing = getExistingScript();
|
||||||
|
if (existing) {
|
||||||
|
existing.addEventListener('load', () => resolve(window.solanaWeb3), { once: true });
|
||||||
|
existing.addEventListener('error', () => reject(new Error('Не удалось загрузить локальный solana-web3.js')), { once: true });
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const script = document.createElement('script');
|
||||||
|
script.src = resolveScriptUrl();
|
||||||
|
script.async = true;
|
||||||
|
script.dataset.shineSolanaWeb3 = '1';
|
||||||
|
script.onload = () => {
|
||||||
|
if (!window.solanaWeb3) {
|
||||||
|
reject(new Error('Локальный solana-web3.js загружен, но объект solanaWeb3 недоступен'));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
resolve(window.solanaWeb3);
|
||||||
|
};
|
||||||
|
script.onerror = () => reject(new Error('Не удалось загрузить локальный solana-web3.js'));
|
||||||
|
document.head.appendChild(script);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return solanaWeb3Promise;
|
||||||
|
}
|
||||||
20
shine-UI/js/vendor/solana-web3.iife.min.js
vendored
Normal file
20
shine-UI/js/vendor/solana-web3.iife.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
@ -61,11 +61,11 @@
|
|||||||
<div class="hint">Только a-z, 0-9, _ · без точки · макс. 20 символов</div>
|
<div class="hint">Только a-z, 0-9, _ · без точки · макс. 20 символов</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="field">
|
<div class="field">
|
||||||
<label>Адрес сервера (URL)</label>
|
<label>Арес сервера (URL) например shineup.me</label>
|
||||||
<input type="text" id="serverAddress" placeholder="Адрес сервера" />
|
<input type="text" id="serverAddress" placeholder="Адрес сервера" />
|
||||||
</div>
|
</div>
|
||||||
<div class="field">
|
<div class="field">
|
||||||
<label>Серверы синхронизации (sync_servers)</label>
|
<label>Логины серверов c которыми будет синхронизировать записи в блокчейн этот сервер (Например shineupme)</label>
|
||||||
<textarea id="syncServers" placeholder="По одному логину на строку (можно оставить пустым)"></textarea>
|
<textarea id="syncServers" placeholder="По одному логину на строку (можно оставить пустым)"></textarea>
|
||||||
</div>
|
</div>
|
||||||
<div class="field">
|
<div class="field">
|
||||||
|
|||||||
@ -86,11 +86,11 @@
|
|||||||
<div class="card">
|
<div class="card">
|
||||||
<h2>Новые параметры сервера</h2>
|
<h2>Новые параметры сервера</h2>
|
||||||
<div class="field">
|
<div class="field">
|
||||||
<label>Новый адрес сервера (URL)</label>
|
<label>Арес сервера (URL) например shineup.me</label>
|
||||||
<input type="text" id="serverAddress" placeholder="Адрес сервера" />
|
<input type="text" id="serverAddress" placeholder="Адрес сервера" />
|
||||||
</div>
|
</div>
|
||||||
<div class="field">
|
<div class="field">
|
||||||
<label>Новые серверы синхронизации (sync_servers)</label>
|
<label>Логины серверов c которыми будет синхронизировать записи в блокчейн этот сервер (Например shineupme)</label>
|
||||||
<textarea id="syncServers" placeholder="По одному логину на строку (можно оставить пустым)"></textarea>
|
<textarea id="syncServers" placeholder="По одному логину на строку (можно оставить пустым)"></textarea>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user