Inkless0
Описание
Минималистичная блог платформа на Django для программистов и писателей. Работает в условиях сломанных cdn (без внешних зависимостей).
Языки
- Python59,9%
- HTML18,5%
- CSS17,7%
- Shell2,7%
- Dockerfile1,2%
Блог система Inkless0 beta
Персональный блог на Django 6.0 с редактором CKEditor 5 со всеми плюшками для блога и ничего лишнего...

Данное описание написано моими руками, а не ИИ, поэтому, просьба почитать.
Сам код сгенерирован Qwen 3 Coder Next 80B q8, но я бы сказал что местами я приложил свои руки чтобы добиться того, что нужно, иногда приходилось описывать некоторые скиллы, искать документацию и подкладывать, чтобы добиться нужного результата.
История изменений
Фишечки
-
Удобный редактор CKEditor 5 - позволяет загружать картинки из буфера обмена (например скриншоты), понимает markdown синтаксис, т.е. вы просто пишите
а у вас заголовок первого уровня, пишите##а у вас блок кода.``` -
Ресайз и lightbox - при загрузке картинки создается ее уменьшенная копия в папке /data/media/thumbs/ больше никаких десятков фотографий в разрешении 4к в статье, только маленькие легкие картинки, а при клике грузится оригинальная полноразмерная картинка
-
Подсветка кода - куда нам программистам без подсветки кода в статьях, тут задействована библиотека Prism.js, которая подсвечивает номера строк, подсвечивает синтаксис и есть кнопочка для копирования листинга, сконфигурирована подсветка кода большинства языков.
-
Минималистичный дизайн - шаблон сделан настолько минималистичный, что нет никаких Bootstrap, нет Jquery, стили достаточно простые, но красивые, всё это слепила ИИ-шка, я немного подточил стили, поправил верстку.
-
Никаких внешних зависимостей - может работать без интернета или когда все cdn заблокируют.
-
SQLite/PostgreSQL - запускайте на любом слабом железе (SQLite) или используйте PostgreSQL для production-среды с более надежным хранением данных.
-
Конфигурация через переменные окружения - настройка проекта через
файл или.envdocker-compose.yml
Dev
Основная инструкция про деплой в докере, но когда требуется разработка и локальный запуск, то есть отдельная статья
Запуск блога через Docker
Установка и запуск
-
Склонируйте репозиторий:
-
Настройте переменные окружения:
Создайте файл
на основе.envи задайте необходимые переменные:.env.example— имя пользователя администратора (по умолчанию: admin вDJANGO_SUPERUSER_USERNAME).env.example— пароль администратора (обязательно для production)DJANGO_SUPERUSER_PASSWORD— секретный ключ Django (генерируется автоматически при пустом значении, но лучше задать вручную для production), сделать это можно как то так:DJANGO_SECRET_KEY
python3 -c "import secrets; print(secrets.token_urlsafe(64))"или
python -c "import secrets; print(secrets.token_urlsafe(64))"— режим отладки (по умолчанию: False в docker-compose.yml)DJANGO_DEBUG— разрешенные хосты через запятую (по умолчанию: 127.0.0.1,localhost). Добавьте IP-адрес вашего сервера или домен (например:DJANGO_ALLOWED_HOSTS) если доступ будет по нему, указываем именно то, что в браузере будет вбито (без порта) — либо хост, либо IP-адрес обращения192.168.1.3
-
Запустите приложение:
Файл
автоматически проверяет, существует ли файл базы данных:entrypoint.sh- Если
не найден → применяются миграции и создается суперпользовательdb.sqlite3 - Если
существует → просто запускается серверdb.sqlite3
Суперпользователь создается из переменных окружения (из файла
или.env):docker-compose.yml- DJANGO_SUPERUSER_USERNAME
- DJANGO_SUPERUSER_PASSWORD
- Если
-
Откройте блог в браузере:
- Основной сайт: http://localhost:9123/
- Админка: http://localhost:9123/admin/
На данном этапе работает системная статика, типа стили, скрипты, но не работают картинки которые вы грузите, конфигурация предполагает использование NGINX
upstream django_app {
server 127.0.0.1:9123; # имя сервиса из docker-compose.yml
}
server {
listen 80;
server_name myblog123.ru; # или укажи свой домен/IP: example.com 192.168.1.100
# Проксируем медиа-файлы из контейнера Django
location /data/media/ {
alias /docker_apps/myapp/app/data/media/; # тут надо до папки media которая внутри data
expires 30d;
add_header Cache-Control "public, immutable";
# Для картинок внутри статики (например /media/blog/...)
try_files $uri $uri/ =404;
}
# Проксируем запросы к Django (все остальные пути)
location / {
proxy_pass http://django_app;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# Для CKEditor и загрузки файлов
client_max_body_size 10M;
}
}
Если всё работает - не забываем защититься
ports:
- "127.0.0.1:9123:8000"
Ну и снова пересоздать
docker compose up -d
PostgreSQL (опционально)
Для более надежного хранения данных в production-среде. Чтобы использовать PostgreSQL:
-
Раскомментируйте и задайте значения переменных в файле
:.env -
Используйте
:docker-compose.postgres.yml
Примечание: При переключении между SQLite и PostgreSQL может потребоваться пересоздание контейнера.
Docker Compose файлы
docker-compose.yml (SQLite по умолчанию)
Основной файл для запуска с SQLite базой данных. Не требует дополнительных сервисов.
docker-compose.postgres.yml (PostgreSQL)
Файл для запуска с PostgreSQL базой данных. Включает два сервиса:
— основное приложение Djangoweb— PostgreSQL база данныхdb
Команды Docker Compose
| Команда | Описание |
|---|---|
| Сборка и запуск контейнера с SQLite (миграции применяются автоматически) |
| Остановка и удаление контейнера |
| Запуск в фоновом режиме (detached) |
| Просмотр логов контейнера |
| Перезапуск контейнера |
| Запуск с PostgreSQL |
Кастомизация
Добавление кастомных стилей и тегов
Вы можете добавить собственный CSS, JavaScript или мета-теги в блог через специальные файлы:
Это жизненно необходимо для добавления всяких аналитик...
— код дляdata/head_include.html(CSS, мета-теги)<head>— JS код передdata/body_include.html</body>
Файлы создаются автоматически при первом запуске.
Добавление favicon
В докер мы прокинули папку data и в ней создадутся файлы шаблонов...
Положим например в папку файлик favicon.ico (есть много онлайн генераторов)
не забываем дать права
chmod 755 data/media/favicon.ico
Откроем файлик
nano data/head_include.html
и впишем
<link rel="icon" href="/favicon.ico" type="image/x-icon">
Далее, в nginx добавим alias для favicon в уже существующую конфигурацию:
server {
...
# Отдача favicon.ico напрямую
location = /favicon.ico {
alias /docker_apps/myapp/data/media/favicon.ico;
expires 30d;
add_header Cache-Control "public, immutable";
}
...
}
проверим и перезапустим
nginx -t
service nginx reload
аналогичным методом можно добавить манифесты, иконки и другое...