Приложение для ведения базы знаний¶
История создания¶
После того как я сделал скрипт для автоматизации создания разделов в базе знаний, ко мне пришла идея о создании полноценной утилиты для управления mkdocs и синхронизации файлов с GitHub.
Зачем я начал это делать?
В первую очередь, мне хотелось максимально автоматизировать процесс своего ведения базы знаний, но также я изначально проектировал всё так, чтобы это стало инструментом который смогут использовать и другие разработчики тоже.
Выбранный стек¶
Для реализации я выбрал уже привычный для себя стек разработки:
- FastAPI
- Vue.js
- Nuxt UI
Мне очень понравилось работать с библиотекой компонентов Nuxt UI, потому что это позволяет очень быстро собирать макеты. Ощущается как почти нативная разработка. Я уже писал однажды проектик, где не использовал никаких библиотек, и это был неплохой опыт для обучения. Но сейчас я понимаю что существует огромное количество готовых решений, и большого смысла изобретать свой велосипед я не вижу. И вероятнее всего, это будут более функционально наполненные компоненты, чем те, которые я буду создавать долго и сам.
Функционал¶
Прогресс добавления фич¶
- Добавление новых записей в базу знаний
- Синхронизация с GitHub
- Выгрузка бэкапа в zip архиве
- Выбор ветки для коммита и пуша
- Добавление картинок и гифок
- Добавление / редактирование разделов из mkdocs.yml файла
Добавление новых записей в базу знаний¶

Я создал эндпоинт на бэкенде, а затем собрал формочку для отправки новой записи в базу знаний.
Предусмотрена опция добавления как отдельного блока кода, так и просто записи, куда можно писать в свободной форме.
Модуль для конфигурации подсветки синтаксиса
Из интересного, я реализовал свой отдельный модуль конфигурации.
Это было сделано для того, чтобы через него по умолчанию задавать метки для подсветки синтаксиса внутри блоков с кодом.
# /.mkdocsutils/config.toml
docs_dir = "docs"
# Определить подсветку кода по умолчанию для раздела
[categories_codes]
Python = "python"
SQL = "sql"
Git = "git"
Bash = "bash"
Docker = "Dockerfile"
# Директории которые не попадают в GET запрос, и недоступны для того чтобы напрямую писать туда записи
[excluded_directories]
dirs = ["stylesheets", "assets"]
Но я специально оставил поле на формочке, если вдруг внутри блока нужно будет написать код с другим синтаксисом. Например внутри раздела Python нужно вставить команду запуска для bash, с соответствующей подсветкой синтаксиса.
В итоге мы просто пишем в файл заголовок, соблюдаем отступы и форматирование, автоматически или опционально задаём подсветку синтаксиса для кода.
Синхронизация с GitHub¶
Также в качестве удобной фичи, я сделал функцию которая буквально выполняет следующие команды:
git remote set-url origin https://x-access-token:${TOKEN}@github.com/${REPO_OWNER}/${REPO_NAME}.git
git status --porcelain docs # проверка на изменения чтобы не делать пустой коммит.
git add docs # добавляем в отслеживание только папочку docs, чтобы не коммитить лишнего через синхронизацию
git -c user.name=Docs Bot -c user.email=docs-bot@local commit --no-verify -m "docs: ${msg}"
git push -f origin HEAD:refs/heads/${target_branch}
git reset --soft HEAD~1
Эта комбинация команд делает коммит в соседнюю ветку, и сразу пушит все записи в удалённый репозиторий. При этом в коммите подписывается, что это автоматический коммит от бота.
Токен и остальные параметры берутся из .env файла
Ветку для пуша можно конфигурировать, но для себя я определил "bot/docs-auto-sync" ветку, чтобы не запускать GitHub Actions при добавлении каждой небольшой заметки, и делать merge вручную.
Такой подход с "git reset --soft HEAD~1" позволяет оставлять историю коммитов в main чистой
Далее я запаковал это в формочку на фронтенде.

Тут мы можем задать сообщение для коммита. Возможно имеет смысл это даже автоматизировать это: вынести в конфигурацию, и включить опцию чтобы делать синхронизацию это при каждом добавлении новой записи (сообщение будет = заголовку). Но тогда история коммитов будет невероятно раздутой и захламлённой на мой взгляд, поэтому я предпочитаю это делать вручную. Но для других разработчиков можно ввести эту отдельную настройку для автоматической синхронизации.
Как это синхронизируется если сервис запущен в Docker?
Синхронизация контейнера и файловой системы на компьютере реализована прямо в docker compose:
Это позволяет пробрасывать файлы документации и git с локального компьютера.

Добавление изображений и GIF-файлов в assets¶
В дальнейшем Также добавлю возможность добавлять файлы картинок прямо через интерфейс. На бэкенде эта возможность уже есть.
Полезные удобные мелочи¶
Из удобств, я добавил смену светлой/тёмной темы, возможность сразу перейти в представление базы знаний на github.io, и небольшую кнопку для перехода в сам репозиторий с проектом.
По итогу очень часто пользуюсь этим в процессе ведения базы знаний.