Оглавление:
Карта сайта:
Оглавление:
Карта сайта:
AI Anki — карточки для подготовки к собеседованиям и экзаменам. Ответ пишется своими словами, кодом или формулой, а модель Ollama оценивает понимание, задаёт уточняющие вопросы и по алгоритму интервальных повторений возвращает карточку в нужный момент.
https://github.com/werwolf1000/ai-anki/mnt/storage/web/ai-anki (SMB: smb://truenas.local/web/ai-anki)Состав:
| Часть | Технологии | Каталог |
|---|---|---|
| Сервер (API) | Python, FastAPI | server/, app/ |
| Веб-интерфейс | React, Motion, AutoAnimate, Tailwind CSS (Vite) | web/ |
| Приложение для Windows | Electron, окно без рамки, тот же интерфейс | desktop/ |
| Колоды | JSON | decks/ |
| Данные пользователей | SQLite + JSON | data/ (том Docker) |
Внешние сервисы: Ollama (проверка ответов, статьи учебника, собеседования) и Whisper ASR (голосовые ответы).
data/progress.json).Перед прохождением темы можно прочитать статью по ней (раздел «Учебник»).
qwen3-embedding:8b).[n] на страницы php.net. Готовая статья сохраняется и в следующий раз открывается мгновенно.9 треков: PHP-разработчик, Node.js-разработчик, Go-разработчик, DevOps-инженер, Forward Deployed Engineer, AI-тренер, специалист по промпт-инжинирингу, LLM-оценщик / AI QA, нейрокреатор / AI-художник.
| Этап | Содержание | Условие |
|---|---|---|
| Обучение | теория (8 предметов × 5 карточек) + практикум (10 заданий live-coding) | сдано ≥ 60% карточек трека |
| AI-собеседование | чат с интервьюером: 5 вопросов + практическое задание, уточняющие вопросы, отчёт с уровнем Junior/Middle/Senior | балл ≥ 65 |
| Экзамен | 9 теоретических + 3 практических задания за 60 минут, без подсказок | балл ≥ 70 |
| Сертификат | уникальный номер, печать в PDF, публичная проверка /verify/<номер> | выполнены все три условия |
Число вопросов, время и пороги настраиваются в decks/tracks.json.
node:22-alpine и npm-пакеты; учебник скачивает архив с php.net).qwen3-coder:30b (или другой) и qwen3-embedding:8b.Склонируйте репозиторий и создайте каталог данных:
cd /mnt/storage/web git clone https://github.com/werwolf1000/ai-anki.git mkdir -p /mnt/storage/web/ai-anki/data/decks
Соберите образ (несколько минут; на этапе web собирается React-интерфейс):
cd /mnt/storage/web/ai-anki docker build -t ai-anki-web:latest .
В TrueNAS: Apps → Discover Apps → Custom App → вставьте docker-compose.truenas.yml:
services: ai-anki: build: /mnt/storage/web/ai-anki image: ai-anki-web:latest container_name: ai-anki restart: unless-stopped ports: - "8080:8080" environment: AI_ANKI_DATA_DIR: /data # open — регистрация открыта; closed — новых аккаунтов после первого не создать AI_ANKI_REGISTRATION: open volumes: - /mnt/storage/web/ai-anki/data:/data - /mnt/storage/web/ai-anki/decks:/app/decks:ro extra_hosts: - "host.docker.internal:host-gateway"
Save → Deploy. Приложение доступно на http://<IP-NAS>:8080 и через прокси на https://anki.webmastermsk.ru.
AI_ANKI_REGISTRATION: closed в compose → Save.
Важно: кнопка Redeploy в TrueNAS только перезапускает контейнер из уже собранного образа ai-anki-web:latest и не пересобирает его. Новый код попадает на сайт только после docker build.
Порядок обновления:
git push origin main.ssh truenas_admin@192.168.1.135 cd /mnt/storage/web/ai-anki git pull docker build -t ai-anki-web:latest .
Проверить, что контейнер запущен с новым образом:
docker images ai-anki-web docker ps --format "{{.Names}} {{.Image}} {{.Status}}" | grep ai-anki
Время создания образа (CREATED) должно соответствовать последней сборке.
Сборка установщика (на рабочей машине):
cd F:\projects\ai_anki\web npm install cd ..\desktop npm install npm run dist
Результат: desktop\dist\AI-Anki-Setup-<версия>.exe. Запуск без установки для разработки — npm start.
https://anki.webmastermsk.ru).npm install нет node_modules\electron\dist\electron.exe: node node_modules/electron/install.js.Примечание: при изменениях интерфейса установщик нужно пересобрать — он содержит копию веб-интерфейса.
Файл (в data/) | Содержимое |
|---|---|
users.db | пользователи и токены входа |
users/<id>/progress.json | прогресс интервальных повторений пользователя |
users/<id>/settings.json | личные настройки обучения |
users/<id>/textbook.json | прочитанные темы учебника |
config.json | общие настройки сервера (Ollama, ASR, модели) |
knowledge.db | база знаний учебника и сгенерированные статьи |
tracks.db | попытки экзаменов и собеседований, реестр сертификатов |
decks/ | собственные колоды (JSON/TXT) — подхватываются без пересборки |
progress.json | прогресс версии 1.x (копируется первому аккаунту) |
Для бэкапа достаточно копировать каталог /mnt/storage/web/ai-anki/data.
decks/*.json в репозитории (монтируются в контейнер, пересборка не нужна — достаточно перезапуска).data/decks/.decks/generate_*.py запустить очистку: python decks/clean_decks.py (удаляет карточки-заглушки и дубликаты, сохраняя прогресс).decks/pro_tracks/*.py → python decks/generate_pro_tracks.py.| Проблема | Причина | Решение |
|---|---|---|
После git pull и Redeploy сайт не изменился | образ не пересобран | docker build -t ai-anki-web:latest . → Stop/Start |
| Проверка ответов идёт минутами или ошибка «Ollama: timeout» | Ollama перегружен или модель не поместилась в видеопамять и работает на CPU | curl <ollama>/api/ps — смотреть size_vram; освободить GPU (nvidia-smi), не держать параллельно тяжёлые модели |
| Голос распознаётся с ошибками в терминах | слабая модель Whisper | см. Whisper ASR: large-v3-turbo |
| Кнопки «Голосом» нет | не задан ASR URL | Настройки → Сервер → ASR URL (под администратором) |
| Учебник пишет «официальный источник не подключён» | база знаний не загружена или колода не про PHP | Настройки → База знаний → «Скачать и проиндексировать» |
| Индексация прервалась после перезапуска | фоновая задача остановилась вместе с контейнером | Настройки → База знаний → «Довекторизовать» (продолжит с места остановки) |
| Забыт пароль | — | docker exec -it ai-anki python scripts/reset_password.py <логин> <новый_пароль> |
| Незавершённый экзамен или собеседование пропали | после перезапуска сервера активные попытки не сохраняются | начать заново; сохранённые результаты не теряются |
| «Фронтенд не собран» (503) | образ собран без этапа web | пересобрать образ по текущему Dockerfile |
# обновление на NAS cd /mnt/storage/web/ai-anki && git pull && docker build -t ai-anki-web:latest . # затем в TrueNAS: Apps → anki → Stop / Start # логи docker logs -f ai-anki # состояние сервиса curl -s https://anki.webmastermsk.ru/healthz curl -s https://anki.webmastermsk.ru/api/auth/status # сброс пароля docker exec -it ai-anki python scripts/reset_password.py <логин> <новый_пароль> # какие модели загружены в Ollama и сколько видеопамяти занимают curl -s http://<ollama>:30068/api/ps