mod: update README and remove legacy deploy docs

This commit is contained in:
2026-04-14 21:28:35 +03:00
parent 0a92ae7a82
commit af25b3cb2f
3 changed files with 165 additions and 1845 deletions

233
README.md
View File

@@ -1,91 +1,188 @@
# Сайт CADpoint.ru
# CADpoint.ru
Сайт с новостями (блог о 3D-печать и Систем Автоматизированного Проектирования) на Django со
встроенными свистелками-перделками:
* медиа-библиотека (filer);
* HTML-редактор на обычной textarea в админке;
* типограф [etpgrf](https://typograph.cube2.ru/);
* теги новостей (taggit).
Сайт CADpoint.ru — это Django-проект, который сейчас живёт в Docker.
[Инструкция по развертыванию на хостинге DreamHost.com](deploy_to_dreamhost.md)
Кратко о схеме:
Для локальной и продовой настройки используй файл `.env` в корне проекта.
Шаблон для него лежит в `.env.sample`.
- сам Django запускается в контейнере `cadpoint-backend`;
- локально используется `docker-compose.local.yml`;
- на проде используется `docker-compose.prod.yml`;
- внешний `nginx` стоит на хосте и проксирует запросы в контейнер;
- конфигурация и секреты лежат в `.env`;
- медиа, статика и SQLite-база живут в проектных каталогах и монтируются в контейнер.
Набор базовых переменных:
## Что есть в проекте
* `DJANGO_SECRET_KEY`
* `DJANGO_DEBUG`
* `DJANGO_ALLOWED_HOSTS`
* `DJANGO_ADMINS`
* `DJANGO_CSRF_TRUSTED_ORIGINS`
* `DJANGO_INTERNAL_IPS`
* `DJANGO_SQLITE_NAME`
* `ADMIN_URL`
* `DJANGO_EMAIL_HOST`
* `DJANGO_EMAIL_PORT`
* `DJANGO_EMAIL_HOST_USER`
* `DJANGO_EMAIL_HOST_PASSWORD`
* `DJANGO_EMAIL_FROM`
- `cadpoint/` — Django-проект, приложения, шаблоны, management commands.
- `public/static/` — исходная статика проекта.
- `public/media/` — загруженные файлы и служебные error-assets.
- `database/` — SQLite-база и дампы.
- `config/nginx/` — конфиг внешнего `nginx` для прод-хоста.
- `frontend-assembly/` — сборка CodeMirror 6 для админки.
- `Dockerfile` — финальный образ приложения.
- `docker-compose.local.yml` — локальный запуск.
- `docker-compose.prod.yml` — prod-запуск.
Для логического бэкапа базы через Django используй команду:
## Быстрый старт
### 1. Подготовить `.env`
Скопируй шаблон и заполни значения:
```bash
cd cadpoint
python manage.py backup_db
```
По умолчанию файл дампа сохраняется в `database/backups/`. Восстановление делается обычной командой
`python manage.py loaddata <fixture>.json` в пустую базу после `python manage.py migrate`.
## Замена старых Joomla-ссылок в контенте
Для массовой замены старых внутренних ссылок в HTML-контенте используй management command:
```bash
cd cadpoint
python manage.py replace_legacy_links
```
По умолчанию команда работает в режиме `dry-run`: она только показывает, какие поля и записи
будут изменены. Чтобы записать изменения в базу, добавь флаг:
```bash
cd cadpoint
python manage.py replace_legacy_links --apply
```
Сейчас команда чинит только кросс-ссылки на статьи. Ссылки на картинки и прочие медиа пока
оставлены как есть.
Для нового окружения на Poetry:
```bash
poetry install --with dev
cp .env.sample .env
poetry run python cadpoint/manage.py migrate
poetry run python cadpoint/manage.py runserver
```
Для разработки медиа-файлы и статика лежат в `public/media` и `public/static`.
`django-debug-toolbar` показывается только при `DJANGO_DEBUG=true` и заходе с локального
адреса (`127.0.0.1` / `localhost`); если нужно, свои IP можно добавить в `DJANGO_INTERNAL_IPS`.
Основные переменные:
## Сборка CodeMirror 6
- Общие:
- `DJANGO_SECRET_KEY` — секрет Django для подписи сессий, CSRF-токенов, password reset и других подписанных данных. Должен быть уникальным и храниться только в `.env`.
- `DJANGO_DEBUG` — включает режим отладки Django. Для локальной разработки обычно `True`, для прода — `False`.
- `DJANGO_ALLOWED_HOSTS` — список доменов и IP, с которых Django принимает запросы. Значения перечисляются через запятую.
- `DJANGO_ADMINS` — список админов для email-уведомлений о критических ошибках. Формат: `Имя:email@domain` (несколько значений через запятую).
- `DJANGO_CSRF_TRUSTED_ORIGINS` — список доверенных origin для CSRF. Нужен для доменов, с которых разрешены POST-запросы.
- `DJANGO_INTERNAL_IPS` — внутренние IP для `debug_toolbar` в dev-режиме. Обычно достаточно `127.0.0.1` и `::1`.
- `DJANGO_SQLITE_NAME` — имя файла SQLite-базы внутри каталога `database/`. Полный путь собирается через `BASE_DIR.parent / 'database'`.
- `ADMIN_URL` — относительный URL админки. По умолчанию `admin/`, можно заменить на любой другой сегмент вроде `a-d-m-i-n/`.
- `DJANGO_EMAIL_HOST` — SMTP-хост почтового сервера.
- `DJANGO_EMAIL_PORT` — SMTP-порт.
- `DJANGO_EMAIL_HOST_USER` — логин для SMTP.
- `DJANGO_EMAIL_HOST_PASSWORD` — пароль или токен для SMTP.
- `DJANGO_EMAIL_FROM` — адрес отправителя писем. Если не задан, берётся из `DJANGO_EMAIL_HOST_USER`.
- Специфичные для продакшена:
- `HOST_PROJECT_PATH` — полный путь к проекту на прод-хосте. Используется при генерации nginx-конфига, чтобы подставить правильный `alias` для media-файлов.
- `REPO_USER` / `REPO_PASS` — логин и токен/пароль для доступа к приватному registry, откуда Watchtower подтягивает новый образ.
Когда появится фронтенд-часть CodeMirror 6 админки, её можно пересобирать скриптом
`frontend-assembly/build-codemirror6.sh`.
Для ориентира:
Скрипт создаёт временную рабочую папку, ставит зависимости через `npm ci`, собирает
минимизированный бандл и затем сам удаляет временные `src/` и `node_modules/`.
В проекте остаётся только готовая статика:
- `DJANGO_DEBUG` управляет самим Django.
- `DEBUG` в `docker-compose.local.yml` — это служебная переменная контейнера, но в проекте используется именно `DJANGO_DEBUG`.
- `DJANGO_SETTINGS_MODULE` и `PYTHONUNBUFFERED` задаются в Docker Compose и обычно не трогаются вручную.
* `public/static/codemirror/editor.js`
### 2. Локальная разработка
```bash
docker compose -f docker-compose.local.yml up --build
```
После старта сайт будет доступен на:
```text
http://127.0.0.1:8055
```
### 3. Продакшен на сервере
На сервере должен быть:
- установлен Docker;
- настроен внешний `nginx` на хосте;
- подготовлен `.env`;
- доступен приватный registry с образом проекта.
- в корне проекта на хосте заранее созданы каталоги `database/`, `config/` и `media/` — они монтируются в контейнер как bind-mount'ы.
Запуск:
```bash
docker compose -f docker-compose.prod.yml up -d
```
Backend в контейнере слушает только localhost хоста:
```text
127.0.0.1:8050
```
А уже внешний `nginx` проксирует домен на этот порт.
## Где лежат данные
- `public/static/` — исходники статики.
- `public/staticfiles/` — результат `collectstatic`.
- `public/media/` — загруженные файлы и служебные error-pages.
- `database/` — SQLite-файл и бэкапы.
## Основные команды
### Миграции
Локально:
```bash
docker compose -f docker-compose.local.yml exec web python manage.py migrate
```
На проде:
```bash
docker compose -f docker-compose.prod.yml exec web python manage.py migrate
```
### Django shell
```bash
docker compose -f docker-compose.local.yml exec web python manage.py shell
```
### Логи
```bash
docker compose -f docker-compose.prod.yml logs -f web
```
### Бэкап базы
```bash
docker compose -f docker-compose.prod.yml exec web python manage.py backup_db
```
### Восстановление fixture
После `migrate` в пустую базу:
```bash
docker compose -f docker-compose.prod.yml exec web python manage.py loaddata <fixture>.json
```
## Замена старых Joomla-ссылок
Для массовой замены старых внутренних ссылок в HTML-контенте есть management command:
```bash
docker compose -f docker-compose.prod.yml exec web python manage.py replace_legacy_links
```
По умолчанию команда работает в режиме `dry-run`.
Чтобы применить изменения:
```bash
docker compose -f docker-compose.prod.yml exec web python manage.py replace_legacy_links --apply
```
Сейчас команда чинит только кросс-ссылки на статьи. Ссылки на картинки и прочие медиа пока остаются как есть.
## CodeMirror 6 в админке
Редактор админки собирается отдельно из npm-части.
Исходники и скрипт сборки лежат в `frontend-assembly/`.
Сборка:
```bash
bash ./frontend-assembly/build-codemirror6.sh
```
Результат сборки — только готовый бандл:
```text
public/static/codemirror/editor.js
```
## Заметки по развертыванию
- Главный источник правды по запуску — `docker-compose.local.yml` и `docker-compose.prod.yml`.
- Секреты не храним в репозитории: используем `.env`.