JavaBlox — гайд по настройке (с кодом)

Что входит в комплект

Серверная часть — это файл server.js, файлы package.json и package-lock.json, папка node_modules, папка user_places с плейсами игроков, папка data для служебных данных и папка res для ресурсов. Клиентская часть — собранный .jar файл MIDlet-приложения и папка res с музыкой и звуками. Папку res можно оставить пустой, тогда музыки не будет, но всё остальное заработает.

Что нужно для запуска

Нужен Node.js версии 16 или новее. Нужен публичный адрес сервера — туннель, свой домен, VPS с белым IP или локальный IP для тестов. И нужен файл server.txt, из которого клиент при запуске читает адрес сервера.

Шаг 1. Размещение файлов

Скопируй папку javablox на устройство или сервер, где будет работать backend. Внутри должны быть:

```
javablox/
├── server.js
├── package.json
├── package-lock.json
├── node_modules/
├── user_places/
│   └── places.json
├── data/
├── res/
└── server.txt
```

Шаг 2. Установка зависимостей

Если папки node_modules нет, открой терминал в папке javablox и выполни:

```
npm install
```

Это поставит express и всё, что прописано в package.json. После установки проверь, что появилась папка node_modules, а внутри — express.

Шаг 3. Настройка сервера

Открой server.js и в самом верху найди блок секретов:

```javascript
const ADMIN_PASSWORD = '';
const ALLSTORE_SECRET = '';
const PM_SECRET = '';
```

Пароль администратора нужен только если используешь админ-функции. Секрет AllStore нужен для входа через AllStore. Секрет PM_SECRET нужен для шифрования профилей игроков. Все три можно оставить пустыми, но тогда вход через AllStore и сохранение профилей работать не будут.

Порт по умолчанию — 8080:

```javascript
const PORT = process.env.PORT || 8080;
```

Менять его не обязательно.

Шаг 4. Запуск сервера

Из папки javablox выполни:

```
node server.js
```

В консоли появится:

```
Сервер запущен на порту 8080
```

Проверь работу — открой в браузере или через curl:

```
http://127.0.0.1:8080/places
```

Ответ должен быть ERROR|Нет плейсов или OK|.... Если получил ERROR|Нет плейсов — сервер работает, плейсов просто пока нет.

Шаг 5. Публичный адрес

Клиент не может стучаться на 127.0.0.1, потому что он работает на телефоне. Ему нужен публичный адрес. Вариантов несколько.

Первый — туннель. Ставишь любой туннель, который даёт http-ссылку на локальный порт 8080. Это может быть Tunnelmole, ngrok, Cloudflare Tunnel, bore, serveo. Все работают одинаково: запускаешь туннель на порт 8080, он выдаёт домен вида http://abc123.example.net/. Этот домен — то, что нужно клиенту.

Второй — свой домен или VPS. Если у тебя есть сервер с публичным IP и домен, настрой DNS так, чтобы твой-домен.ру указывал на этот IP, открой порт 8080 в файрволе. Публичный адрес будет http://твой-домен.ру:8080/. Если хочешь без порта в адресе, подними reverse-proxy на nginx, caddy или haproxy на 80 порту, чтобы он проксировал на 8080. Тогда адрес будет http://твой-домен.ру/.

Третий — локальная сеть для тестов. Если телефон и сервер в одной Wi-Fi-сети, можно использовать http://192.168.1.100:8080/. Работает только внутри сети.

Шаг 6. Файл server.txt

Клиент читает ссылку на сервер из server.txt по адресу, который задан в MyMidlet.java в переменной serverFileUrl:

```java
private final String serverFileUrl = "https://raw.githubusercontent.com/твой_юзер/твоя_репа/main/server.txt";
```

server.txt можно положить куда угодно: на GitHub, на свой веб-сервер, на любой хостинг, который отдаёт файл по GET-запросу. Содержимое — одна строка с адресом сервера:

```
http://abc123.example.net/
```

Слэш в конце обязателен.

Если не хочешь использовать server.txt, оставь serverFileUrl пустым:

```java
private final String serverFileUrl = "";
```

Тогда при запуске клиента надо будет ввести адрес вручную в LoginForm через кнопку «Свой сервер». Он сохранится в памяти устройства и больше не спросит.

Шаг 7. Настройка клиента

Проверь в MyMidlet.java:

```java
private final String serverFileUrl = "https://raw.githubusercontent.com/твой_юзер/твоя_репа/main/server.txt";
```

Тут может быть либо URL на GitHub, либо URL на твой веб-сервер, либо пустая строка. Больше ничего в клиенте трогать не нужно.

Собери .jar файл тем инструментом, которым пользуешься. В проекте тринадцать файлов .java. Все должны компилироваться без ошибок.

Шаг 8. Проверка цепочки

Сначала убедись, что сервер запущен и пишет «Сервер запущен на порту 8080». Потом проверь, что туннель поднят и публичный адрес открывается в браузере. Потом убедись, что server.txt содержит актуальный адрес. Потом запусти клиент и убедись, что открывается LoginForm. В логе сервера должна появиться строка:

```
[2026-09-11T18:00:00.000Z] GET /places
```

Войди гостем. Убедись, что попал в лобби. Создай плейс. В логе сервера появится:

```
[2026-09-11T18:00:05.000Z] POST /create_place
[2026-09-11T18:00:06.000Z] GET /place_map?place=твой_плейс
```

Сохрани карту — в логе:

```
[2026-09-11T18:00:20.000Z] POST /place_map_save
```

Зайди в игру, проверь, что блоки видны. Поменяй скин — в логе:

```
[2026-09-11T18:01:00.000Z] POST /skin_set
```

Частые проблемы

Если в лобби «Ошибка сети» — клиент не достучался до сервера. Проверь туннель и server.txt. Если в логе сервера пусто — клиент стучится не туда, введи URL вручную в LoginForm через «Свой сервер». Если при запуске сервера Cannot find module 'express' — нет node_modules, выполни npm install в папке javablox. Если EADDRINUSE — порт занят, останови старый процесс или поменяй порт. Если список плейсов пуст — пока никто не создал ни одного плейса, создай через клиент. Если скин не отправляется — сначала войди, потом меняй скин. Если музыка не играет — нет файлов в res, положи туда menu.mid, game.mid, skin.mid.

Свой домен

Туннель удобен, но домен меняется при каждом перезапуске. Если хочешь постоянный адрес, возьми VPS с белым IP, поставь на него Node.js и положи javablox. Настрой домен через DNS-запись A на IP VPS. Запусти сервер на 80 порту или на 8080 с reverse-proxy на 80. Пропиши свой домен в server.txt. Тогда адрес будет всегда один: http://твой-домен.ру/.

Пример простого nginx-конфига для проксирования:

```
server {
    listen 80;
    server_name твой-домен.ру;

    location / {
        proxy_pass http://127.0.0.1:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}
```

Быстрая проверка

Открой в браузере http://<твой-адрес>/places. Если открывается ERROR|Нет плейсов или OK|... — сервер работает, дело за клиентом. Если ничего не открывается — сервер не запущен или адрес неверный.

Смена сервера в клиенте

В LoginForm есть кнопка «Свой сервер». Она открывает поле ввода URL. Введи адрес своего сервера со слэшем на конце:

```
http://твой-домен.ру/
```

Он сохранится в памяти устройства. Чтобы вернуться к адресу из server.txt, нажми «Сбросить» в том же окне — ручной URL удалится, и клиент снова начнёт использовать основной.

Проверка работы скинов между игроками

Запусти два клиента на двух устройствах или эмуляторах. Войди под разными никами. Первый меняет скин в SkinForm и сохраняет. В логе сервера:

```
[2026-09-11T18:05:00.000Z] POST /skin_set
```

Второй игрок заходит в тот же плейс. В логе сервера:

```
[2026-09-11T18:05:10.000Z] POST /join
```

В ответе сервера второму игроку будет строка с ником первого, координатами и восьмым полем — номером скина. Клиент второго игрока нарисует первого в этом цвете.