Warning
This project is currently unusable. Since 1 September 2026, schools in the Sverdlovsk Region have moved from dnevnik.egov66.ru to Gosuslugi My School. Install the official mobile app using the links on the regional service notice; the diary is also available through the “Diary” widget in Sferum/MAX. The old website was the only place where users could obtain tokens for these Telegram and MAX bots, so the bots cannot currently be connected.
Проект в настоящее время не работает. С 1 сентября 2026 года школы Свердловской области перешли с dnevnik.egov66.ru на сервис «Госуслуги Моя школа». Установите официальное мобильное приложение по ссылкам на странице регионального сервиса; дневник также доступен через виджет «Дневник» в Сферуме/MAX. Старый сайт был единственным местом, где можно было получить токены для этих ботов Telegram и MAX, поэтому сейчас подключить ботов невозможно.
I use English due to open source, and Russian due to the project's purpose.
Telegram: https://t.me/dnevnik66_bot Max: https://max.ru/se13902840_bot
This is a multi-transport bot (Telegram, MAX) that makes using the Sverdlovsk Region's electronic school diary much more convenient than the diary https://dnevnik.egov66.ru itself.
Это мульти-транспортный бот (Telegram, MAX), дающий возможность гораздо удобнее пользоваться электронным школьным дневником Свердловской области, чем сам дневник https://dnevnik.egov66.ru.
To log in to the Sverdlovsk Region's electronic school diary, you first need to log in to Gosuslugi (the government services portal). To log in to Gosuslugi, you have to receive an SMS with a code. To receive the SMS code, you need to enter your username and password. And this happens every single time. Every. Damn. Time.
Чтобы залогиниться в электронный школьный дневник Свердловской области, нужно сначала залогиниться на Госуслуги. Чтобы залогиниться на Госуслуги, нужно получить СМС с кодом. Чтобы получить СМС с кодом нужно ввести логин и пароль. И так каждый раз. Каждый. Чёртов. Раз.
- No need to log in via Gosuslugi every time.
- Telegram chat keeps the full history — no admin can retroactively change anything.
- Не нужно каждый раз логиниться через госуслуги.
- Чат телеграма хранит всю историю, рука администратора ничего не исправит задним числом.
- To connect the bot to the diary, you'll need to do a couple of squats. (figuratively — it's a bit of a hassle)
- Sometimes, when the diary server is down, you have to reconnect the bot all over again.
- Чтобы подключить бота к дневнику нужно сделать пару приседаний.
- Иногда, когда сервер дневника лежит, приходится заново подключать бота.
-
Create
.envfile in the root (see.env.example) -
Start databases
docker compose up -d- Start project
npm run dev- Run tests
npm run testUsing only prepared docker images.
You may use docker-compose.prod.yml.
-
Create
.envfile on prod server (see.env.example) -
Build images
docker build . -t dnevnik-app:latest
docker build ./infra/static-server/ -t static-server:latest
docker build ./infra/load-balancer/ -t load-balancer:latest- Upload images to server
docker save dnevnik-app:latest | ssh user@server "docker load"
docker save static-server:latest | ssh user@server "docker load"
docker save load-balancer:latest | ssh user@server "docker load"- Login to server via ssh
- Go to directory with
.envanddocker-compose.yml - Down&up containers
P.S. You need to migrate database if starting first time or if you created new migrations. Use
npm run migrate-applyfrom the container
The bot supports multiple messenger platforms (transports). Currently:
- Telegram — via Telegraf, using WebApp for token delivery
- MAX — via @maxhub/max-bot-api, using a mini-app with HTTP POST for token delivery
Adding a new transport is purely additive: implement a TransportAdapter, create a transports/<platform>/bot.ts, and wire it in keystone.ts. No core files change.
At least one transport token is required (TELEGRAM_BOT_TOKEN or MAX_BOT_TOKEN).
Бот поддерживает несколько мессенджеров (транспортов). Сейчас:
- Telegram — через Telegraf, использует WebApp для передачи токенов
- MAX — через @maxhub/max-bot-api, использует мини-приложение с HTTP POST для передачи токенов
Добавление нового транспорта — чисто аддитивное: реализуйте TransportAdapter, создайте transports/<platform>/bot.ts и подключите в keystone.ts. Ядро не меняется.
Требуется хотя бы один токен транспорта (TELEGRAM_BOT_TOKEN или MAX_BOT_TOKEN).
When upgrading PostgreSQL between major versions (e.g., 16 → 18), data migration is required due to incompatible data formats.
# 1. Backup current data
docker exec postgresdb pg_dumpall > backup.sql
# 2. Stop PostgreSQL container
docker compose stop postgresdb
# 3. Update image version in docker-compose.yml
# Change: image: postgres:16 → image: postgres:18.1
# 4. Remove old data directory (WARNING: This deletes current data!)
rm -rf ./pgdata/*
# 5. Start with new version
docker compose up -d postgresdb
# 6. Restore data
docker exec -i postgresdb psql < backup.sql- Always test migration on staging first / Всегда тестируйте миграцию на стейдинге
- Keep backups before any upgrade / Сохраняйте резервные копии перед обновлением
- Check application compatibility with new PostgreSQL version / Проверьте совместимость приложения с новой версией PostgreSQL
- Plan for downtime during major version upgrades / Планируйте простой во время обновления между основными версиями







