Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
39 commits
Select commit Hold shift + click to select a range
9034485
Различные фиксы (#14)
starwear3000 Mar 11, 2026
1ec1d49
Merge branch 'master' into dev/0.1.0
starwear3000 Mar 11, 2026
07dd71b
Теперь все должно работать исправно
starwear3000 Mar 12, 2026
9004566
Merge branch 'master' into dev/0.1.0
starwear3000 Mar 12, 2026
66fb40a
Merge branch 'master' into dev/0.1.0
WowInceptionGood Mar 12, 2026
db3b732
Merge branch 'dev/0.1.0' of https://github.com/openmax-server/server …
WowInceptionGood Mar 12, 2026
301e55b
Документация: описал про SESSION_INIT
WowInceptionGood Mar 12, 2026
81f5fb7
Update deviceId description in tamtam_ws.md
starwear3000 Mar 12, 2026
d4d5dd5
feat: 16 опкод для обновления профиля
zavolo Mar 15, 2026
2d09f52
feat: 23 опкод для регистрации, смс шлюз, докер
zavolo Mar 15, 2026
d5ea45c
SQLite: Ошибка
WowInceptionGood Mar 15, 2026
91453d7
Серверный конфиг снова сломался
starwear3000 Mar 18, 2026
9c3038b
Починил изменение профиля
starwear3000 Mar 18, 2026
09c1f8b
История сообщений (вроде как даже работает)
starwear3000 Mar 18, 2026
c7eace4
Дополнил немного 48 опкод, и починил отдачу истории в избранном (избр…
starwear3000 Mar 18, 2026
2dab853
Доделал авторизацию в ТамТаме
starwear3000 Mar 18, 2026
6c05b5f
Швырнул архитектуру, чтобы позже объединить контроллеры веба и сокета…
starwear3000 Mar 18, 2026
11b2e27
Удалил tamtam.proto, поскольку нигде больше не используется
starwear3000 Mar 18, 2026
9bc6c15
Поделил процессоры в таме
starwear3000 Mar 19, 2026
bbee49d
Коды стран
starwear3000 Mar 19, 2026
2cf18b8
Генерируем айди, за вместо того, чтобы писать его попорядку
starwear3000 Mar 19, 2026
ef512b0
Вынес список участников чата в отдельную таблицу
starwear3000 Mar 21, 2026
8d7a1da
Теперь мы не должны отправлять 128 опкод самому себе. вроде
starwear3000 Mar 22, 2026
f2e7e37
ТамТам: реализация 32 опкода. Надеюсь, будет работать
starwear3000 Mar 22, 2026
aa6411b
ТамТам: обработчик 5 и 1 опкода
starwear3000 Mar 22, 2026
a8732b5
ТамТам: починил 32 опкод и добавил серверный конфиг. Избранное больше…
starwear3000 Mar 22, 2026
5fcc569
TT: oops
starwear3000 Mar 22, 2026
f4ea147
MAX: заглушка в 158 опкоде
starwear3000 Mar 22, 2026
ac76015
Common: поправил 1 прикол
starwear3000 Mar 27, 2026
7a2e5a2
TamTam: websocket transport for web version
starwear3000 Mar 27, 2026
0b7282b
TamTam && MAX: история (в мохе она вроде теперь получше работает)
starwear3000 Mar 27, 2026
4014bab
Правка контроллеров небольшая
starwear3000 Mar 27, 2026
e5607ad
MAX: Разделил процессоры
starwear3000 Mar 29, 2026
0f5c06f
TG Bot: переписал на aiogram
starwear3000 Mar 30, 2026
5294960
Common: фикс года
starwear3000 Apr 3, 2026
0ffc649
Начальная реализация транспорта ws для max web и прочие улучшения
starwear3000 Apr 7, 2026
dcbcb0a
Common: добавил сжатие lz4
starwear3000 Apr 10, 2026
448b854
Исправление конфликтов
WowInceptionGood Apr 10, 2026
d9cbafc
TT: фикс вебсокета
starwear3000 Apr 12, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 6 additions & 3 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,13 @@ db_name = "openmax"

db_file = ""

certfile = "cert.pem"
keyfile = "key.pem"
certfile = "/certs/cert.pem"
keyfile = "/certs/key.pem"
domain = "openmax.su"

avatar_base_url = "http://127.0.0.1/avatar/"
telegram_bot_token = "123456789:ABCDEFGHIJKLMNOPQRSTUVWXYZ"
telegram_bot_enabled = "1"
telegram_whitelist_ids = "1,2,3"
telegram_whitelist_ids = "1,2,3"
origins="http://127.0.0.1,https://web.openmax.su"
sms_gateway_url = "http://127.0.0.1:8100/sms-gateway"
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
__pycache__
.env
*.pem
*.sqlite
*.sqlite
*.crt
16 changes: 16 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
FROM python:3.12-slim

WORKDIR /app

RUN apt-get update && apt-get install -y --no-install-recommends \
gcc \
&& rm -rf /var/lib/apt/lists/*

COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

COPY src/ ./src/

WORKDIR /app/src

CMD ["python", "main.py"]
39 changes: 39 additions & 0 deletions docker-compose.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
services:
app:
build: .
restart: unless-stopped
ports:
- "${oneme_tcp_port:-443}:443"
- "${tamtam_tcp_port:-4433}:4433"
- "${oneme_ws_port:-81}:81"
- "${tamtam_ws_port:-82}:82"
volumes:
- /etc/letsencrypt/live/${domain}/fullchain.pem:/certs/cert.pem:ro
- /etc/letsencrypt/live/${domain}/privkey.pem:/certs/key.pem:ro
env_file:
- .env
environment:
- db_host=db
depends_on:
db:
condition: service_healthy

db:
image: mysql:8.0
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: ${db_password:-openmax}
MYSQL_DATABASE: ${db_name:-openmax}
MYSQL_USER: ${db_user:-openmax}
MYSQL_PASSWORD: ${db_password:-openmax}
volumes:
- mysql_data:/var/lib/mysql
- ./tables.sql:/docker-entrypoint-initdb.d/tables.sql:ro
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
interval: 10s
timeout: 5s
retries: 5

volumes:
mysql_data:
1 change: 0 additions & 1 deletion docs/proto/oneme_tcp.md

This file was deleted.

29 changes: 0 additions & 29 deletions docs/proto/tamtam_ws.md

This file was deleted.

74 changes: 68 additions & 6 deletions faq/install.md
Original file line number Diff line number Diff line change
@@ -1,18 +1,80 @@
# Установка

## Вручную

1. Склонируйте репозиторий
2. Установите зависимости

```bash
pip install -r requirements.txt
```
3. Настройте сервер (пример в `.env.example`)
4. Импортируйте схему таблиц в свою базу данных из `tables.sql`
5. Запустите сервер

3. Сгенерируйте сертификат

Для тестирования (самоподписанный):
```bash
openssl req -x509 -newkey rsa:2048 -nodes -keyout key.pem -out cert.pem -days 365
```

Для прода — [Let's Encrypt](https://certbot.eff.org/):
```bash
apt install certbot
certbot certonly --standalone -d openmax.su
```

4. Настройте сервер (пример в `.env.example`)
5. Импортируйте схему таблиц в свою базу данных из `tables.sql`
6. Запустите сервер
```bash
python3 main.py
```

6. Создайте пользователя
7. Зайдите со своего любимого клиента
7. Создайте пользователя через Telegram бот (`/register`)
8. Зайдите со своего любимого клиента

---

## Docker

1. Склонируйте репозиторий
2. Настройте `.env` (пример в `.env.example`), укажите `db_user` отличный от `root`
3. Получите сертификат Let's Encrypt:
```bash
apt install certbot
certbot certonly --standalone -d openmax.su
```

Укажите домен и пути в `.env`:
```
certfile=/certs/cert.pem
keyfile=/certs/key.pem
domain=openmax.su
```

4. Запустите
```bash
docker compose up -d
```

База данных инициализируется автоматически из `tables.sql`.

5. Создайте пользователя через Telegram бот (`/register`)
6. Зайдите со своего любимого клиента

---

## SMS-шлюз

По умолчанию коды авторизации доставляются через Telegram бот. Если вы хотите принимать пользователей с произвольными номерами без привязки к Telegram — поднимите [SMS Gateway](https://github.com/openmax-server/server/sms-gateway), укажите его адрес в `.env` и отключите Telegram бот:
```
telegram_bot_enabled=false
sms_gateway_url=http://localhost:8100/sms-gateway
```

Клиент MAX ожидает 6-значный код. Если ваш SMS-провайдер отправляет 5-значные коды и не поддерживает настройку длины — сервер автоматически дублирует последнюю цифру: `26541` → `265411`. Пользователь получает SMS с 5 цифрами и вводит их дважды последнюю: `2-6-5-4-1-1`.

---

## Автопродление сертификата
```bash
certbot renew --deploy-hook "docker compose -f /opt/server/docker-compose.yml restart app"
```
2 changes: 1 addition & 1 deletion readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
> Проект находится на ранней стадии разработки и вероятно полон багов.
>
> Использование в профессиональных средах не рекомендовано.
>
# OpenMAX

Эмулятор сервера MAX и ТамТам
Expand Down
6 changes: 4 additions & 2 deletions requirements.txt
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
pyTelegramBotAPI
aiogram
aiomysql
msgpack
lz4
websockets
pydantic
aiosqlite
python-dotenv
aiohttp
python-dotenv
cryptography
12 changes: 12 additions & 0 deletions sms-gateway/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
FROM python:3.12-slim

WORKDIR /app

COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

COPY . .

EXPOSE 8000

CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000"]
90 changes: 90 additions & 0 deletions sms-gateway/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
# Смс шлюз

Микросервис для отправки SMS-кодов с маршрутизацией по провайдерам в зависимости от страны.

## Требования

- Docker и Docker Compose

## Запуск
```bash
docker compose up -d
```

Сервис доступен на порту `8100`, API монтируется по префиксу `/sms-gateway`.

## Конфигурация

Все настройки находятся в `config.yaml`. Перезагрузка конфига без перезапуска:
```bash
curl -X POST http://localhost:8100/sms-gateway/admin/reload
```

### Провайдеры

Два типа провайдеров:

**`sms_api`** — внешний HTTP-сервис, отправляет реальное SMS. Параметры:
- `base_url` — базовый адрес сервиса
- `send_endpoint` — эндпоинт отправки (по умолчанию `/auth/code`)
- `timeout` — таймаут запроса в секундах

**`lk_api`** — внутренний провайдер, SMS не отправляет. Генерирует код и сохраняет его в Redis для отображения в личном кабинете.

### Маршрутизация

Правила задаются в `routing.rules`. Для каждого правила указываются префиксы номеров, основной провайдер и опциональный fallback. Если ни одно правило не совпало — используется `default_provider`.

Пример: номера `+7` идут через `sms_api`, при недоступности — через `lk_api`. Все остальные номера сразу через `lk_api`.

### Rate limiting

Настраивается в `settings.rate_limit`:
- `max_attempts` — максимум запросов с одного номера
- `window_seconds` — окно в секундах

## API

### Отправка кода
```
POST /sms-gateway/sms/send
{"phone_number": "+79001234567"}
```

### Личный кабинет

Получить все ожидающие коды:
```
GET /sms-gateway/lk/codes
```

Получить код по номеру:
```
GET /sms-gateway/lk/code?phone=+79001234567
```

Получить и удалить код (разовое считывание):
```
DELETE /sms-gateway/lk/code?phone=+79001234567
```

### Администрирование

Проверить, какой провайдер выберется для номера:
```
GET /sms-gateway/admin/routing/resolve?phone=+79001234567
```

Список правил маршрутизации:
```
GET /sms-gateway/admin/routing/rules
```

Список активных провайдеров:
```
GET /sms-gateway/admin/providers
```

## Swagger

Документация доступна по адресу: `http://localhost:8100/sms-gateway/docs`
Loading