ERP WaterSurf
Веб-приложение класса ERP для компании WaterSurf: справочники, документы (заказы клиентов и поставщикам, поступления/перемещения/расход денежных средств), авторизация пользователей.
Требования
- Docker и Docker Compose
- Доступ к порту 8010 на localhost (для reverse proxy)
Установка и настройка
cd /opt/watersurf-erp
cp .env.example .env
# Отредактировать .env: пароли, SECRET_KEY, ALLOWED_HOSTS
docker compose up -d db
docker compose run --rm app python manage.py migrate --noinput
docker compose run --rm app python manage.py createsuperuser # первый пользователь
docker compose up -d app
Конфигурация
Переменные в .env (см. .env.example):
POSTGRES_*— учётные данные PostgreSQL для контейнера dbDB_*— подключение приложения к БДSECRET_KEY— секрет Django (не менее 50 символов)ALLOWED_HOSTS— через запятую (напримерerp.gen7x.ru,localhost)DEBUG— true/falseREQUIRE_LOGIN— по умолчаниюfalse: доступ без входа (для отладки);true— включить авторизацию
Использование
- Веб-интерфейс: после настройки Nginx — https://erp.gen7x.ru/
- Вход по логину/паролю (пользователи Django). При
REQUIRE_LOGIN=falseдоступ без входа (для отладки). - Меню: Справочники (валюты, виды заказов, клиенты, организации, поставщики, сотрудники, счета, товары), Документы (заказы клиентов, заказы поставщику, поступления, перемещения, расходы).
- Поле «Автор» в документах подставляется из профиля пользователя (связь User → Сотрудник в разделе «Пользователи» / админка).
Структура проекта
app/config/— настройки Djangoapp/references/— справочники (модели, админка, CRUD)app/documents/— документы (модели, формы, представления, автогенерация номера)app/users/— профиль пользователя (связь с сотрудником)app/templates/— шаблоныmanage.py— точка входа для команд Django
Docker Compose
- Сервис
db: PostgreSQL 16, volumewatersurf_erp_data - Сервис
app: Django + Gunicorn, порт 8010:8000
Запуск: ./manage.sh start или docker compose up -d
Остановка: ./manage.sh stop
Логи: ./manage.sh logs app
Volumes
watersurf_erp_data— данные PostgreSQL. Добавлен в/opt/gen7x/backup/include-volumes.txtдля бэкапа.
Логирование
- Логи приложения: stdout контейнера; при наличии каталога
app/logs— также вapp/logs/app.log. - Просмотр:
docker compose logs -f app
Резервное копирование и восстановление
- Volume БД включён в список бэкапов платформы Gen7x. Восстановление — по инструкции платформы (restore.sh и т.д.).
Troubleshooting
- Ошибка подключения к БД: проверить, что контейнер
dbзапущен и переменныеDB_*в.envсовпадают сPOSTGRES_*. - 502 от Nginx: проверить, что приложение слушает на 8010 (
docker compose ps,docker compose logs app). - После добавления полей в модели:
docker compose run --rm app python manage.py makemigrations && docker compose run --rm app python manage.py migrate.
Команды управления
- Запуск:
./manage.sh start - Остановка:
./manage.sh stop - Перезапуск:
./manage.sh restart - Логи:
./manage.sh logs [service]
Git и пуш
Репозиторий: https://git.gen7x.ru/cursor-agent/watersurf-erp (клонирование по SSH: git@git.gen7x.ru:cursor-agent/watersurf-erp.git).
На сервере настроен SSH-доступ к Gitea (ключ cursor-agent, см. /root/docs/secrets/mysecrets.md), поэтому с этого сервера можно выполнять git push и git pull без ввода пароля.
Планы развития фронтенда
Текущий интерфейс — Django-шаблоны + CSS (Material Design 3), один деплой, простая поддержка. В перспективе планируется:
- Канбан заказов (drag-and-drop по стадиям)
- Живые уведомления (обновления без перезагрузки)
- Дашборды (сводные виджеты, графики)
Для этого потребуется введение отдельного SPA-фронтенда (React + MUI или аналог) и REST API (Django REST Framework или расширение текущих views JSON-ответами). Рекомендуемый путь при переходе:
- Выделить REST API для сущностей (заказы, документы, справочники), аутентификация (JWT или session/cookies для того же домена).
- Создать отдельное приложение фронтенда (например
frontend/или отдельный репозиторий), подключать его кerp.gen7x.ruили отдельному поддомену. - Постепенная миграция: сначала дашборд и канбан как отдельные страницы SPA, остальное можно оставить на шаблонах (гибрид) или перенести позже.
Текущая кодовая база (модели, формы, логика) остаётся основой; API будет оборачивать те же данные.