SHiNE-server/SHiNE-promo-solana-devnet/README.md

199 lines
4.6 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# SHiNE-promo-solana-devnet
Временное промо-приложение для тестеров Web3-социальной сети SHiNE / «Сияние» в Solana Devnet.
Основной сценарий:
- приложение SHiNE открывает страницу вида `/?wallet=SOLANA_PUBLIC_KEY`;
- пользователь вводит имя и промокод;
- backend проверяет промокод и отправляет **реальную** devnet-транзакцию на `0.1 SOL`;
- использованный промокод фиксируется в файле и больше не может быть применён.
## Стек
- Java 21
- Spring Boot
- Gradle
- Thymeleaf + HTML/CSS/JS (server-side UI)
## Локальный запуск
1. Скопируйте пример настроек:
```bash
cp config/application.example.properties src/main/resources/application.properties
```
2. Положите реальный keypair-файл Solana CLI формата в:
```text
config/devnet-wallet.json
```
3. Запустите:
```bash
./gradlew bootRun
```
Приложение будет доступно на `http://localhost:8021`.
## Как указать порт
По умолчанию используется:
```properties
server.port=8021
```
Изменить можно:
- в `src/main/resources/application.properties`;
- или через параметр запуска:
```bash
./gradlew bootRun --args='--server.port=8090'
```
## Настройка Solana RPC Devnet
Параметр:
```properties
solana.rpc.url=https://api.devnet.solana.com
```
Для другого RPC достаточно заменить URL в properties.
## Настройка devnet keypair
- Файл должен быть в формате Solana keypair JSON: массив из 64 чисел (`0..255`).
- Пример лежит в `config/devnet-wallet.example.json`.
- Рабочий файл: `config/devnet-wallet.json`.
Важно: настоящий keypair **нельзя коммитить в GitHub**.
Он добавлен в `.gitignore`.
## Где лежат промокоды
Файл:
```text
data/promo-codes.txt
```
## Где лежит файл использованных промокодов
Файл:
```text
data/promo-used.txt
```
## Формат `promo-codes.txt`
- одна строка = один промокод;
- пустые строки игнорируются;
- строки с `#` игнорируются как комментарии;
- промокод должен соответствовать regex: `[a-z0-9]{8}`.
## Формат `promo-used.txt`
Каждая запись в формате:
```text
promoCode | wallet | name | yyyy.MM.dd HH:mm | signature
```
Пример:
```text
aidar2km | 8xF...abc | Иван Петров | 2026.04.27 18:45 | 5xTxSignature...
```
## Пример URL
```text
http://localhost:8021/?wallet=8zYQ...DevnetAddress
```
## Пример API-запроса
```bash
curl -X POST http://localhost:8021/api/promo/top-up \
-H "Content-Type: application/json" \
-d '{
"wallet":"SOLANA_PUBLIC_KEY",
"name":"Иван Петров",
"promoCode":"aidar2km"
}'
```
## Проверка транзакции в Solana Explorer Devnet
Explorer URL формируется по шаблону:
```text
https://explorer.solana.com/tx/{signature}?cluster=devnet
```
## Сборка jar через Gradle
```bash
./gradlew clean build
```
JAR:
```text
build/libs/SHiNE-promo-solana-devnet.jar
```
## Запуск jar
```bash
java -jar build/libs/SHiNE-promo-solana-devnet.jar
```
## Health endpoint
```text
GET /health
```
Ответ:
```json
{
"status": "ok",
"app": "SHiNE-promo-solana-devnet"
}
```
## Логи
- логируется старт приложения;
- логируются успешные пополнения;
- логируются ошибки транзакций;
- приватный ключ не логируется.
## Gradle-задачи для серверного деплоя
В `build.gradle` добавлены задачи:
- `buildServerBundle` — готовит bundle в `build/server-bundle`;
- `deployToServer` — копирует JAR и `application.properties` на сервер и перезапускает systemd-сервис.
Запуск:
```bash
./gradlew deployToServer
```
Переопределение хоста/пути:
```bash
./gradlew deployToServer \
-PdeployHost=user@10.147.20.7 \
-PdeployPath=/home/user/docker/SHiNE-promo-solana-devnet \
-PdeployService=SHiNE-promo-solana-devnet
```