SMS-шлюз для AT-совместимых GSM-модемов. Работает как долгоживущий сервис: принимает SMS через модем, сохраняет в SQLite, отдаёт через HTTP/JSON REST API. Более полная альтернатива gammu-smsd, написанная на идиоматичном Go.
  • Go 91.8%
  • HTML 3.8%
  • JavaScript 3.2%
  • Makefile 1.1%
  • CSS 0.1%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
IK Vidya 3d5ebffe14
Some checks are pending
CI / build (push) Waiting to run
docs: PROMPT.md §8 и MODEMS.md — баг pdu/GSM-7 (garble ASCII)
Зафиксирован подтверждённый на живом хосте баг: ASCII-only SMS
при MODEM_PROFILE=generic даёт garble (Ω å Ç ¥ Π ì Θ вместо
латиницы). Причина — pdu.Build в sim800ctl упаковывает GSM-7
septets неверно при DCS=0x00, приёмник читает как packed.
UCS-2-ветка (кириллица) корректна. MODEM_PROFILE=sim800
маскирует баг через ForceUCS2ForAllSMS=true.

Изменения:
- PROMPT.md §8: новая подсекция «pdu и GSM-7» с причиной,
  обходом и указанием, где настоящий фикс (sim800ctl).
- docs/MODEMS.md: новая секция «Известные дефекты» перед
  «Обходы (Workarounds)».

Тесты:
- make build (check vet) — зелёный, дерево не меняет.
- go test ./... — код не трогали, поведение прежнее.

Проверено:
- Воспроизведено probe: pdu.Build с ASCII-текстом 43 символа
  даёт DCS=0x00, UDL=43, UD_len=38 байт — размеры сходятся,
  но содержимое UD неверное (септет 's' = 0x95 вместо 0x73;
  байт-офсет в строке gsm7Basic вместо индекса руны в
  gsm7BasicIdx). Исправление — в sim800ctl/pkg/pdu, не в
  smsgateway.
- docs-only; поведение кода не меняется.

Assisted-by: DeepSeek chat
2026-11-03 23:54:38 +02:00
.github/workflows ci: gofmt, race-тесты, vendor-check, armv7 (CI) 2026-10-17 20:08:28 +03:00
cmd/smsgateway round1: config modes, MODEM_STORAGE, telegram token leak fix 2026-10-28 15:15:52 +02:00
docs docs: PROMPT.md §8 и MODEMS.md — баг pdu/GSM-7 (garble ASCII) 2026-11-03 23:54:38 +02:00
internal r5.1: healthz под base path, target="_top" в forbidden.html 2026-11-03 21:47:12 +02:00
scripts/systemd удалено: scripts/systemd/smsgateway.service 2026-10-26 22:35:12 +02:00
.env.example docs: .env.example под v1.3.0 (Web UI/oidc, platform mode, healthz) 2026-11-03 22:01:34 +02:00
.gitattributes chore: initial scaffolding 2026-10-14 22:48:47 +03:00
.gitignore gitignore: apply-*.py (рабочие скрипты, не в коммит) 2026-11-03 18:46:07 +02:00
.gitleaksignore gitleaks: тестовый ключ API — не секрет 2026-10-29 11:36:30 +02:00
.golangci.yml fix: обновлена зависимость sim800ctl после миграции на Forgejo 2026-10-20 11:31:18 +03:00
.xdp-env.example-9f5Ns0 docs: обновление документации к v1.1.0 2026-10-20 23:19:58 +03:00
CONTRIBUTING.md fix: обновлена зависимость sim800ctl после миграции на Forgejo 2026-10-20 11:31:18 +03:00
go.mod r4: viport-client v0.3.0, make build без изменения дерева, шапка oidc 2026-11-03 18:44:44 +02:00
go.sum r4: viport-client v0.3.0, make build без изменения дерева, шапка oidc 2026-11-03 18:44:44 +02:00
LICENSE chore: initial scaffolding 2026-10-14 22:48:47 +03:00
Makefile r4: viport-client v0.3.0, make build без изменения дерева, шапка oidc 2026-11-03 18:44:44 +02:00
PROMPT.md docs: PROMPT.md §8 и MODEMS.md — баг pdu/GSM-7 (garble ASCII) 2026-11-03 23:54:38 +02:00
README.md r4: viport-client v0.3.0, make build без изменения дерева, шапка oidc 2026-11-03 18:44:44 +02:00

smsgateway

Легковесный и надежный SMS-шлюз для AT-совместимых GSM-модемов (протестирован на SIM800L). Принимает и отправляет SMS, сохраняет историю в SQLite, предоставляет HTTP/JSON REST API и Web-интерфейс. Поддерживает интеграцию с внешними системами через файловый бэкенд Gammu и синхронизацию (например, Syncthing).

Возможности

  • Отправка и прием SMS: Поддержка текстовых сообщений, кириллицы (UCS-2) и длинных SMS (Multipart).
  • Web UI с ролями: Удобный интерфейс с поддержкой ролей Администратор / Пользователь (только чтение).
  • Уведомления в Telegram: 4 уровня важности (OK, Warning, Error, Critical), локализация (ru/lv/en) и имя модема в сообщениях.
  • REST API: Полноценное API для интеграции с вашими приложениями.
  • Gammu File Backend: Чтение из outbox, запись в inbox, автоматическая генерация отчетов о доставке (Delivery Reports).

Быстрый старт

Модуль viport-client

Вход через портал (Web UI, WEBUI_AUTH_MODE=oidc) использует библиотеку площадки — модуль git.vidya.lv/vidya/viport-client (пакеты viport и viporttest для тестов).

Пока репозиторий библиотеки закрытый, машине сборки нужны две вещи:

export GOPRIVATE=git.vidya.lv
git config --global url."ssh://git@git.vidya.lv/".insteadOf "https://git.vidya.lv/"

с ключом, у которого есть доступ к репозиторию. Когда библиотека станет публичной, обе настройки не нужны: go build разрешит путь через ?go-get=1 без них.

1. Сборка

Для сборки потребуется Go 1.26+.

git clone https://git.vidya.lv/vidya/smsgateway.git
cd smsgateway
make build

Бинарник появится в bin/smsgateway.

2. Настройка

Скопируйте пример конфигурации и отредактируйте его:

cp .env.example .env
nano .env

Обязательно укажите:

  • API_KEY (или API_KEYS) — ключ для доступа к REST API.
  • SERIAL_PORT — путь к модему (например, /dev/ttyUSB0 или /dev/serial/by-id/usb-...).
  • DB_PATH — путь к файлу базы данных SQLite.

3. Запуск

sudo ./bin/smsgateway --config .env

Конфигурация (.env)

Все настройки задаются через переменные окружения в файле .env.

Идентификация модема

# Человекочитаемое имя модема (для Telegram и Web UI).
# Если пусто, генерируется автоматически как <hostname>-<port> 
# (например, rsmodule-tallin1-ttyUSB0).
MODEM_DESCRIPTION=

SERIAL_PORT=/dev/serial/by-id/usb-1a86_USB2.0-Serial-if00-port0
MODEM_PROFILE=sim800

Web UI и Безопасность (RBAC)

Поддерживается два уровня доступа: Администратор (полный доступ) и Пользователь (только просмотр входящих и исходящих SMS).

WEBUI_ENABLED=true
WEBUI_ADDR=127.0.0.1:8081
WEBUI_AUTH_MODE=basic

# Пользователь (только чтение: Inbox, Outbox)
WEBUI_AUTH_USER=operator
WEBUI_AUTH_PASS=user_password

# Администратор (отправка SMS, логи, настройка модема)
WEBUI_AUTH_ADMIN=admin
WEBUI_AUTH_ADMIN_PASS=admin_password

# Если WEBUI_AUTH_ADMIN не задан, права администратора 
# наследуются от обычного пользователя (обратная совместимость).

Уведомления в Telegram

TELEGRAM_BOT_TOKEN=your_bot_token
TELEGRAM_CHAT_ID=your_chat_id
# Язык уведомлений: ru | lv | en
TELEGRAM_LANG=ru

Gammu File Backend (Опционально)

Если вы хотите обмениваться сообщениями с внешней системой (АСУ ПП, 1С) через файлы:

GAMMU_ROOT=/var/spool/sms
GAMMU_INBOX=inbox
GAMMU_OUTBOX=outbox
GAMMU_SENT=sent
GAMMU_ERROR=error

Интеграция с внешними системами (Gammu)

smsgateway может работать как замена gammu-smsd, используя файловый обмен.

  • Отправка (Outbox): Внешняя система кладет файл OUT*.txt в папку outbox. Шлюз отправляет SMS и перемещает файл в sent.
  • Получение (Inbox): Принятые SMS сохраняются в базу и дублируются в папку inbox (в формате plain text).
  • Отчеты о доставке (Delivery Reports): Если внешней системе нужно знать статус доставки, шлюз генерирует специальные файлы в папке inbox: IN<дата>_<sms_id>_<номер>_00.txt (с текстом DELIVERED или FAILED).

REST API

Базовый путь: /api/v1. Аутентификация через заголовок X-API-Key или Authorization: Bearer <key>.

  • GET /healthz — проверка работоспособности.
  • GET /api/v1/status — состояние сервиса и модема.
  • POST /api/v1/messages — поставить SMS в очередь на отправку.
  • GET /api/v1/messages — список сообщений (с фильтрами).
  • GET /api/v1/diagnostics — диагностика модема.

Подробнее в docs/API.md.

Развертывание (systemd)

Для продакшена рекомендуется использовать systemd. Пример юнита smsgateway@.service и правила udev для создания стабильного симлинка /dev/sms-gateway находятся в папке scripts/.

Разработка

make test      # запустить тесты
make test-race # запустить тесты с race detector
make ci        # полный прогон (gofmt, vet, test, build)
make deploy    # безопасный деплой на удаленный сервер (с бэкапом и откатом)

Лицензия

MIT License. См. файл LICENSE.