mirror of
https://github.com/EDeev/deev.space.git
synced 2026-10-07 20:49:59 +03:00
- README.md и README.en.md: что это, статус, скриншоты, быстрый старт в Docker, установка без Docker, переменные окружения, схема, развёртывание, разработка; - docs/architecture.md (модели, оценки без регистрации, антинакрутка, безопасность) и docs/deploy.md (Docker и устройство боевого сервера) вместо описания моделей в README; - файл LICENSE (MIT), который раньше был заявлен только в README.
51 lines
4 KiB
Markdown
51 lines
4 KiB
Markdown
# Как устроен deev.space
|
||
|
||
Django-проект `dspace` с одним приложением `main`. База — SQLite, статика — whitenoise (в бою — nginx),
|
||
шаблоны — Django templates, без фронтенд-фреймворков.
|
||
|
||
```
|
||
dspace/ настройки, корневые URL, WSGI
|
||
main/
|
||
models.py модели контента, оценок и настроек сайта
|
||
views.py страницы (классовые представления) и JSON-API оценок и комментариев
|
||
forms.py формы с очисткой HTML (bleach) и Yandex SmartCaptcha
|
||
middleware.py анонимный ID посетителя, хэш IP, фильтр ботов
|
||
signals.py действия после публикации статьи (автопостинг, ping Яндекса)
|
||
admin.py админка с превью и инлайнами медиа статьи
|
||
management/ load_initial_data, populate_demo
|
||
templates/ шаблоны страниц, включая includes/ и errors/
|
||
static/ CSS по слоям (variables, base, components, layout, pages, media), JS
|
||
```
|
||
|
||
## Модели
|
||
|
||
| Модель | Назначение |
|
||
|---|---|
|
||
| `SiteSettings` | синглтон с текстами сайта, контактами, карточкой-паспортом (`SiteSettings.load()`) |
|
||
| `CustomUser` | пользователь для комментариев, упрощённая регистрация |
|
||
| `Category`, `Article` | статьи блога и достижения (`is_achievement`); slug генерируется из заголовка |
|
||
| `ArticleImage`, `ArticleFile`, `ArticleLink` | галерея, вложения и ссылки статьи; у ссылок — автоматическое превью по Open Graph |
|
||
| `Project`, `ProjectStatus` | проекты портфолио с гибкими статусами |
|
||
| `Skill`, `Experience`, `Education` | стек по категориям, опыт и образование |
|
||
| `Comment` | комментарии с ответами до трёх уровней вложенности |
|
||
| `ArticleLike`, `CommentLike` | лайки и дизлайки — от пользователя или анонимного посетителя |
|
||
| `ArticleView` | уникальный просмотр статьи (один на посетителя) |
|
||
| `ContactMessage` | сообщения с формы обратной связи |
|
||
|
||
## Оценки без регистрации
|
||
|
||
1. `VisitorMiddleware` выдаёт каждому посетителю подписанную cookie `dspace_vid` (uuid4, httponly, год).
|
||
2. Голос привязан к аккаунту, если пользователь вошёл, иначе — к `visitor_id`. Повторный клик снимает
|
||
голос, клик по противоположной кнопке меняет его.
|
||
3. Антинакрутка: с одного хэша «IP + User-Agent» (соль — `SECRET_KEY`) — не больше двух новых
|
||
анонимных оценок одного объекта в сутки. Для loopback и частных адресов хэш не считается, лимит не
|
||
применяется.
|
||
4. Уникальные просмотры (`ArticleView`) пишутся только для посетителей, которых `is_bot()` не
|
||
считает роботами.
|
||
|
||
## Безопасность
|
||
|
||
- HTML комментариев проходит через `bleach` (белый список тегов), из формы обратной связи вырезается весь.
|
||
- Форма обратной связи защищена Yandex SmartCaptcha.
|
||
- Превью ссылок загружаются только с публичных http(s)-адресов.
|
||
- С `DJANGO_DEBUG=False`: HSTS, редирект на HTTPS, secure-cookie; без `DJANGO_SECRET_KEY` запуск невозможен.
|