17 KiB
17 KiB
РУКОВОДСТВО АДМИНИСТРАТОРА
Система ETL MOSTOVIK
Версия документа: 1.0
Дата: 2026-01-21
СОДЕРЖАНИЕ
- Общие сведения
- Архитектура системы
- Развёртывание системы
- Конфигурирование
- Управление службами
- Мониторинг и логирование
- Резервное копирование
- Безопасность
- Устранение неисправностей
1. ОБЩИЕ СВЕДЕНИЯ
1.1. Назначение системы
MOSTOVIK — система ETL (Extract, Transform, Load) для сбора и обработки данных из государственных источников:
- Минпромторг (minpromtorg.gov.ru) — сертификаты промышленного производства, реестр производителей
- Единый реестр проверок (proverki.gov.ru) — данные о проверках по ФЗ-294 и ФЗ-248
- ФНС — бухгалтерская отчётность
1.2. Технические характеристики
| Параметр | Значение |
|---|---|
| Язык программирования | Python 3.11 |
| Фреймворк | Django 3.2.25 |
| База данных | PostgreSQL 15.10 |
| Кеш/брокер | Redis 7.x |
| Очереди задач | Celery 5.3.6 |
| Веб-сервер | Apache 2.4.57 + Gunicorn |
| Автоматизация браузера | Playwright 1.52+ |
2. АРХИТЕКТУРА СИСТЕМЫ
2.1. Компоненты системы
+-------------------------------------------------------------+
| Apache 2.4.57 |
| (HTTPS termination) |
+-----------------------------+-------------------------------+
|
v
+-------------------------------------------------------------+
| Gunicorn WSGI |
| (3 workers, gevent) |
+-----------------------------+-------------------------------+
|
v
+-------------------------------------------------------------+
| Django Application |
| +--------------+ +--------------+ +------------------+ |
| | Parsers | | Core | | User | |
| | (apps) | | (apps) | | (apps) | |
| +--------------+ +--------------+ +------------------+ |
+-----------------------------+-------------------------------+
|
+-------------+-------------+
v v v
+---------------+ +-----------+ +---------------+
| PostgreSQL | | Redis | | File System |
| (port 5432) | | (port 6379)| | (logs/media) |
+---------------+ +-----------+ +---------------+
2.2. Службы Celery
| Служба | Назначение | Порт |
|---|---|---|
| celery-worker | Выполнение фоновых задач | - |
| celery-beat | Планирование периодических задач | - |
| flower | Мониторинг Celery (опционально) | 5555 |
2.3. Структура каталогов
/var/www/project/
├── src/ # Исходный код Django
│ ├── config/ # Конфигурация
│ │ ├── settings/ # Настройки (dev, prod, test)
│ │ ├── celery.py # Конфигурация Celery
│ │ └── wsgi.py # Точка входа WSGI
│ ├── apps/ # Приложения Django
│ │ ├── core/ # Базовые компоненты
│ │ ├── parsers/ # Парсеры данных
│ │ └── user/ # Пользователи и аутентификация
│ └── manage.py # Утилита управления
├── venv/ # Виртуальное окружение Python
├── logs/ # Логи приложения
├── media/ # Пользовательские файлы
├── staticfiles/ # Статические файлы
└── deploy/ # Файлы развёртывания
├── systemd/ # Unit-файлы systemd
├── apache/ # Конфигурация Apache
└── scripts/ # Скрипты развёртывания
3. РАЗВЁРТЫВАНИЕ СИСТЕМЫ
3.1. Системные требования
Минимальные:
- ЦПУ: 2 ядра
- ОЗУ: 4 ГБ
- Диск: 20 ГБ
- ОС: Astra Linux / Ubuntu 20.04+
Рекомендуемые:
- ЦПУ: 4 ядра
- ОЗУ: 8 ГБ
- Диск: 50 ГБ SSD
- ОС: Astra Linux Special Edition
3.2. Предварительная настройка
3.2.1. Установка системных зависимостей
apt-get update && apt-get upgrade -y
apt-get install -y \
python3.11 \
python3.11-venv \
python3.11-dev \
postgresql-15 \
postgresql-client-15 \
redis-server \
apache2 \
libapache2-mod-wsgi-py3 \
git \
build-essential \
libpq-dev \
libffi-dev \
libxml2-dev \
libxslt1-dev \
zlib1g-dev
3.2.2. Установка менеджера пакетов uv
curl -LsSf https://astral.sh/uv/install.sh | sh
source $HOME/.cargo/env
3.3. Автоматическое развёртывание
chmod +x deploy/scripts/deploy.sh
sudo ./deploy/scripts/deploy.sh
Скрипт выполняет:
- Обновление системы
- Установку зависимостей
- Клонирование репозитория
- Создание виртуального окружения
- Установку зависимостей Python
- Настройку базы данных
- Выполнение миграций
- Настройку systemd и Apache
3.4. Ручное развёртывание
3.4.1. Настройка базы данных
sudo -u postgres psql <<EOF
CREATE DATABASE mostovik_prod;
CREATE USER mostovik_user WITH PASSWORD 'secure_password';
GRANT ALL PRIVILEGES ON DATABASE mostovik_prod TO mostovik_user;
ALTER DATABASE mostovik_prod OWNER TO mostovik_user;
EOF
3.4.2. Установка приложения
PROJECT_PATH="/var/www/project"
mkdir -p ${PROJECT_PATH}/{src,logs,media,staticfiles}
cd ${PROJECT_PATH}
# Клонирование репозитория
git clone <repository_url> .
git checkout main
# Создание виртуального окружения
uv venv ${PROJECT_PATH}/venv
source ${PROJECT_PATH}/venv/bin/activate
# Установка зависимостей
uv pip install --upgrade pip
uv pip install -r requirements.txt
3.4.3. Настройка окружения
cp .env.example .env
nano .env
Обязательные параметры:
| Переменная | Описание | Пример |
|---|---|---|
| SECRET_KEY | Ключ шифрования Django | django-insecure-... |
| POSTGRES_DB | Имя базы данных | mostovik_prod |
| POSTGRES_USER | Пользователь БД | mostovik_user |
| POSTGRES_PASSWORD | Пароль БД | secure_password |
| POSTGRES_HOST | Узел БД | 127.0.0.1 |
| POSTGRES_PORT | Порт БД | 5432 |
| REDIS_URL | URL Redis | redis://127.0.0.1:6379/0 |
| CELERY_BROKER_URL | URL брокера | redis://127.0.0.1:6379/0 |
3.4.4. Выполнение миграций
cd ${PROJECT_PATH}/src
python manage.py makemigrations
python manage.py migrate
python manage.py collectstatic --noinput
3.4.5. Создание суперпользователя
python manage.py createsuperuser
Или автоматически:
echo "from django.contrib.auth import get_user_model; User = get_user_model(); User.objects.create_superuser('admin', 'admin@example.com', 'adminpass') if not User.objects.filter(username='admin').exists() else None" | python manage.py shell
4. КОНФИГУРИРОВАНИЕ
4.1. Настройка Apache
Конфигурационный файл: /etc/apache2/sites-available/project.conf
Основные параметры для изменения:
ServerName your-domain.com
SSLCertificateFile /etc/ssl/certs/your-cert.pem
SSLCertificateKeyFile /etc/ssl/private/your-key.pem
SSLCertificateChainFile /etc/ssl/certs/your-chain.pem
Активация сайта:
a2ensite project.conf
a2enmod ssl rewrite headers expires
a2dissite 000-default
systemctl restart apache2
4.2. Настройка systemd
Файлы служб расположены в /etc/systemd/system/:
| Файл | Служба |
|---|---|
| gunicorn.service | WSGI-сервер Gunicorn |
| celery-worker.service | Worker Celery |
| celery-beat.service | Планировщик Celery |
Перезапуск после изменений:
systemctl daemon-reload
systemctl restart gunicorn
systemctl restart celery-worker
systemctl restart celery-beat
4.3. Настройка брандмауэра
ufw allow 80/tcp
ufw allow 443/tcp
ufw deny 5432/tcp
ufw deny 6379/tcp
ufw enable
5. УПРАВЛЕНИЕ СЛУЖБАМИ
5.1. Проверка состояния служб
systemctl status gunicorn
systemctl status celery-worker
systemctl status celery-beat
systemctl status apache2
systemctl status postgresql
systemctl status redis-server
5.2. Запуск/остановка/перезапуск
systemctl start gunicorn
systemctl stop gunicorn
systemctl restart gunicorn
systemctl start celery-worker
systemctl stop celery-worker
systemctl restart celery-worker
systemctl start celery-beat
systemctl stop celery-beat
systemctl restart celery-beat
systemctl restart apache2
5.3. Включение автозагрузки
systemctl enable gunicorn celery-worker celery-beat apache2 postgresql redis-server
5.4. Управление через Makefile
cd /var/www/project
make migrate
make createsuperuser
make shell
make logs
6. МОНИТОРИНГ И ЛОГИРОВАНИЕ
6.1. Логи приложения
| Лог | Путь |
|---|---|
| Django | /var/www/project/logs/django.log |
| Celery | /var/www/project/logs/celery.log |
| Gunicorn | /var/log/gunicorn/error.log |
| Apache error | /var/log/apache2/project_error.log |
| Apache access | /var/log/apache2/project_access.log |
| PostgreSQL | /var/log/postgresql/postgresql-15-main.log |
| Redis | /var/log/redis/redis-server.log |
6.2. Просмотр логов в реальном времени
tail -f /var/www/project/logs/django.log
tail -f /var/www/project/logs/celery.log
journalctl -u gunicorn -f
journalctl -u celery-worker -f
journalctl -u celery-beat -f
journalctl -u apache2 -f
6.3. Мониторинг Celery Flower
source /var/www/project/venv/bin/activate
celery -A config flower --port=5555
Доступ: http://localhost:5555
6.4. Мониторинг базы данных
sudo -u postgres psql mostovik_prod
# Проверка размера таблиц
SELECT schemaname, tablename, pg_size_pretty(pg_total_relation_size(schemaname||'.'||tablename)) AS size
FROM pg_tables
WHERE schemaname = 'public'
ORDER BY pg_total_relation_size(schemaname||'.'||tablename) DESC;
# Проверка активных подключений
SELECT * FROM pg_stat_activity WHERE datname = 'mostovik_prod';
6.5. Мониторинг Redis
redis-cli
INFO
DBSIZE
7. РЕЗЕРВНОЕ КОПИРОВАНИЕ
7.1. Резервное копирование базы данных
#!/bin/bash
BACKUP_DIR="/var/backups/mostovik"
DATE=$(date +%Y%m%d_%H%M%S)
DB_NAME="mostovik_prod"
DB_USER="mostovik_user"
mkdir -p ${BACKUP_DIR}
pg_dump -U ${DB_USER} -h 127.0.0.1 ${DB_NAME} | gzip > ${BACKUP_DIR}/db_backup_${DATE}.sql.gz
find ${BACKUP_DIR} -name "db_backup_*.sql.gz" -mtime +7 -delete
Настройка cron:
0 2 * * * /var/www/project/scripts/backup_db.sh
7.2. Резервное копирование медиафайлов
#!/bin/bash
BACKUP_DIR="/var/backups/mostovik"
DATE=$(date +%Y%m%d_%H%M%S)
MEDIA_DIR="/var/www/project/media"
mkdir -p ${BACKUP_DIR}
tar -czf ${BACKUP_DIR}/media_backup_${DATE}.tar.gz ${MEDIA_DIR}
find ${BACKUP_DIR} -name "media_backup_*.tar.gz" -mtime +7 -delete
7.3. Восстановление
# Восстановление БД
gunzip -c db_backup_20260121_020000.sql.gz | psql -U mostovik_user -h 127.0.0.1 mostovik_prod
# Восстановление медиа
tar -xzf media_backup_20260121_020000.tar.gz -C /var/www/project/
8. БЕЗОПАСНОСТЬ
8.1. Минимальные требования
- Смена SECRET_KEY в .env
- Смена паролей БД и суперпользователя
- Настройка HTTPS с действительным сертификатом
- Ограничение доступа к портам БД и Redis
- Регулярное обновление системы
8.2. Настройка SSL/TLS
apt-get install certbot python3-certbot-apache
certbot --apache -d your-domain.com -d www.your-domain.com
certbot renew --dry-run
8.3. Обновление зависимостей
source /var/www/project/venv/bin/activate
pip-audit
uv pip install --upgrade -r requirements.txt
systemctl restart gunicorn celery-worker celery-beat
8.4. Аудит безопасности
bandit -r /var/www/project/src/
pip-audit
python manage.py check --deploy
9. УСТРАНЕНИЕ НЕИСПРАВНОСТЕЙ
9.1. Служба не запускается
journalctl -u <service_name> -n 50 --no-pager
apache2ctl configtest
systemctl cat <service_name>
9.2. Ошибки подключения к БД
systemctl status postgresql
sudo -u postgres psql -c "SELECT * FROM pg_stat_activity WHERE datname = 'mostovik_prod';"
cat /var/www/project/.env | grep POSTGRES
9.3. Ошибки Celery
journalctl -u celery-worker -n 100
source /var/www/project/venv/bin/activate
celery -A config inspect active
celery -A config inspect registered
celery -A config status
celery -A config purge # осторожно!
9.4. Проблемы с производительностью
free -h
top -p $(pgrep -d',' -f gunicorn|celery)
df -h
du -sh /var/www/project/logs
Оптимизация PostgreSQL:
SELECT query, calls, total_time, mean_time
FROM pg_stat_statements
ORDER BY mean_time DESC
LIMIT 10;
VACUUM ANALYZE;
ПРИЛОЖЕНИЕ А. КОМАНДЫ БЫСТРОГО ДОСТУПА
# Перезапуск всех служб
systemctl restart apache2 gunicorn celery-worker celery-beat
# Проверка состояния
systemctl status apache2 gunicorn celery-worker celery-beat postgresql redis-server
# Просмотр логов
journalctl -u gunicorn -n 100 --no-pager
# Django shell
cd /var/www/project/src && python manage.py shell
# Миграции
cd /var/www/project/src && python manage.py makemigrations && python manage.py migrate
# Статические файлы
cd /var/www/project/src && python manage.py collectstatic --noinput
ПРИЛОЖЕНИЕ Б. ПЕРИОДИЧЕСКИЕ ЗАДАЧИ CELERY
| Задача | Расписание | Описание |
|---|---|---|
| parse_industrial_production | Ежедневно в 3:00 | Парсинг сертификатов Минпромторга |
| parse_manufactures | Ежедневно в 4:00 | Парсинг реестра производителей |
| scan_fns_directory | Каждые 5 минут | Сканирование папки ФНС |
Изменение расписания:
Через Django Admin: /admin/django_celery_beat/periodictask/
Документ составлен на основе версии кода от 2026-01-21