Учебный портал для изучения Python (и немного SQL) — полностью на русском, с запуском кода прямо в браузере. Два входа: учитель проверяет результаты, ученик проходит уроки.
Создан для занятий один-на-один: ученик практикуется между встречами, учитель видит прогресс и сам код. Дизайн дружелюбный, всё по-русски, а у каждой английской функции есть всплывающая подсказка с переводом и произношением.
- 📚 15 уроков от «Привет, мир» до мини-проекта (Python + 4 урока по SQL), плюс практикумы (открываются после базового курса) и «глубокие погружения» — боковая ветка, где одна тема разбирается с самых основ (доступна всегда).
▶️ Код запускается в браузере — Python через Pyodide, SQL через sql.js. Сервер код не выполняет.- ✅ Автопроверка заданий: Python — через тесты (
assertили сверка вывода), SQL — сравнением результата запроса с эталоном. - 💡 Глоссарий встроенных функций и ключевых слов с русским произношением («принт», «лэн», «рэндж»…) и объяснением, откуда взялось название. Наводишь курсор на термин в уроке — подсказка появляется прямо там.
- 👩🏫 Кабинет учителя: прогресс каждого ученика, баллы, история попыток с кодом, кнопка сброса прогресса. Учитель тоже может проходить уроки (вкладка «Уроки»).
- ➕ Легко расширять: новый урок — это один файл.
SvelteKit + @sveltejs/adapter-cloudflare → Cloudflare Pages; данные в
Cloudflare D1 (SQLite); Pyodide + sql.js (WebAssembly) в браузере; CodeMirror 6;
вход по куки-сессии, пароли через PBKDF2 (Web Crypto). Всё в рамках бесплатного тарифа Cloudflare.
Нужен Node.js 20+.
# 1. Установить зависимости
npm install
# 2. Создать базу D1 (один раз). Команда напечатает database_id —
# вставьте его в wrangler.jsonc вместо REPLACE_WITH_YOUR_DATABASE_ID
npm run db:create
# 3. Создать таблицы в ЛОКАЛЬНОЙ базе (её использует npm run dev)
npm run db:migrate:local
# 4. Создать учителя и ученика (см. раздел «Логины» ниже).
# Команда печатает SQL — запустите напечатанную строку с --local.
npm run hash -- teacher "пароль-учителя" "Роман" teacher
npm run hash -- student "пароль-ученика" "Максим" student
# 5. Запустить
npm run dev # http://localhost:5173Локальная разработка использует встроенную эмуляцию D1 (адаптер Cloudflare сам поднимает её через
getPlatformProxy()), поэтому отдельныйwranglerзапускать не нужно.
Вход выполняется по логину (username) — это первый аргумент команды hash,
а не отображаемое имя:
npm run hash -- <логин> <пароль> "<Имя для показа>" <teacher|student>
# ↑ это логин для входаКоманда npm run hash только печатает SQL — чтобы пользователь появился, нужно
выполнить напечатанную строку:
- строка с
--local→ дляnpm run dev(база на вашем компьютере); - строка с
--remote→ для развёрнутого сайта (нуженnpx wrangler login).
Сменить пароль или имя — просто запустите hash ещё раз с тем же логином: команда
делает upsert (обновляет существующего пользователя), а не падает.
--local и --remote — это две разные базы. Пользователей нужно завести в той,
куда вы заходите.
💡 Хочешь, чтобы каждый
git pushдеплоил сам (рекомендуется)? Настрой автодеплой из GitHub — пошагово в docs/deploy-github.md. Ниже — ручной вариант через CLI.
# 1. Войти в Cloudflare (откроется браузер)
npx wrangler login
# 2. Создать таблицы в БОЕВОЙ базе
npm run db:migrate:remote
# 3. Завести учителя и ученика в боевой базе
npm run hash -- teacher "пароль" "Роман" teacher # затем выполнить строку с --remote
npm run hash -- student "пароль" "Максим" student # затем выполнить строку с --remote
# 4. Собрать и задеплоить
npm run pages:deployПервый деплой попросит создать проект Pages и ветку — соглашайтесь с умолчаниями.
Привязка базы DB прикрепляется автоматически (за счёт pages_build_output_dir в
wrangler.jsonc) — кликать в дашборде не нужно.
Любое обновление в дальнейшем — одна команда:
npm run pages:deployСвоё доменное имя добавляется в дашборде Cloudflare: проект Pages → Custom domains.
Если деплой «не видит базу» — почти всегда не вставлен реальный
database_id(шаг 2 локального запуска) вwrangler.jsonc.
- Ученик заходит под своим логином → видит карточки уроков и общий прогресс →
открывает урок, читает теорию (термины подсвечены — наводи курсор), запускает код
в редакторе (кнопка «Запустить» или
Ctrl+Enter), решает упражнения. Прогресс сохраняется автоматически. - Учитель заходит под своим логином → вкладка «Ученики»: список, прогресс, и по клику — детали ученика с его кодом и кнопкой «Сбросить прогресс». Вкладка «Уроки» даёт учителю те же уроки, чтобы посмотреть/пройти самому.
- Глоссарий — отдельная страница со всеми терминами, поиском и фильтрами.
- Скопируйте любой файл из
src/lib/content/lessons/. - Заполните теорию, упражнения и квиз (формат описан в
src/lib/content/schema.js). - Подключите модуль в
src/lib/content/lessons/index.js. - Метаданные урока (название, уровень, время) — в
src/lib/content/catalog.js.
Типы упражнений:
- Python (
lang:'python') — задайтеtests: каждый тест это либоcode(Python сassert, падает при ошибке), либоexpectStdout(сверка вывода). - SQL (
lang:'sql') — задайтеseedSql(создание таблиц + данные) иcheck.expectedQuery(эталонный запрос; результат ученика сверяется с ним).
Глоссарий пополняется в src/lib/content/glossary.json — любое слово оттуда
автоматически подсвечивается в теории, если написать его в обратных кавычках.
Проверить, что все эталонные решения проходят свои тесты:
node scripts/verify-lessons.mjsmigrations/ SQL-миграции для D1
scripts/
gen-hash.mjs создание/смена пользователя (хеш пароля + SQL)
copy-sql-wasm.mjs копирует sql-wasm.wasm в static/ (авто перед dev/build)
verify-lessons.mjs проверка, что решения проходят тесты
src/
app.css дизайн-система
hooks.server.js сессии и защита маршрутов по ролям
lib/
server/ crypto (PBKDF2), доступ к D1, сессии
runtime/ python.js (Pyodide) и sqldb.js (sql.js)
content/ schema, catalog, glossary, lessons/
components/ редактор кода, упражнение, квиз, глоссарий-тултип …
routes/
login/ logout/ вход и выход
app/ кабинет ученика: список уроков и сам урок
teacher/ кабинет учителя: ученики, детали, сброс прогресса
glossary/ страница глоссария
api/progress/ сохранение прогресса и попыток
docs/research-notes.md технические заметки по интеграции
| Команда | Что делает |
|---|---|
npm run dev |
запустить локально |
npm run build |
собрать для продакшена |
npm run check |
проверка типов (svelte-check) |
node scripts/verify-lessons.mjs |
проверить, что решения проходят тесты |
npm run db:migrate:local / :remote |
миграции в локальную / боевую D1 |
npm run hash -- <логин> <пароль> "<Имя>" <роль> |
создать/обновить пользователя |
npm run pages:deploy |
собрать и задеплоить на Cloudflare Pages |
Сделано с ❤️ для тех, кто только начинает. Удачи в обучении! 🐍