first commit
Some checks failed
CI/CD Pipeline / Run Tests (push) Failing after 0s
CI/CD Pipeline / Code Quality Checks (push) Failing after 1m43s
CI/CD Pipeline / Build Docker Images (push) Has been skipped
CI/CD Pipeline / Push to Gitea Registry (push) Has been skipped

This commit is contained in:
2026-01-21 12:07:35 +01:00
commit e9d7f24aaa
102 changed files with 13890 additions and 0 deletions

View File

@@ -0,0 +1,80 @@
# Конфигурация Apache 2.4.57 для Django приложения
# Разместить в /etc/apache2/sites-available/project.conf
<VirtualHost *:80>
ServerName your-domain.com
ServerAlias www.your-domain.com
# Редирект на HTTPS
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
</VirtualHost>
<VirtualHost *:443>
ServerName your-domain.com
ServerAlias www.your-domain.com
# SSL конфигурация
SSLEngine on
SSLCertificateFile /etc/ssl/certs/your-cert.pem
SSLCertificateKeyFile /etc/ssl/private/your-key.pem
SSLCertificateChainFile /etc/ssl/certs/your-chain.pem
# SSL настройки безопасности
SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1
SSLCipherSuite ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256
SSLHonorCipherOrder off
SSLSessionTickets off
# Основные настройки
DocumentRoot /var/www/project
# WSGI конфигурация
WSGIDaemonProcess project python-path=/var/www/project/src python-home=/var/www/project/venv
WSGIProcessGroup project
WSGIScriptAlias / /var/www/project/src/config/wsgi.py
WSGIApplicationGroup %{GLOBAL}
# Права доступа к WSGI файлу
<Directory /var/www/project/src>
Require all granted
</Directory>
# Статические файлы
Alias /static/ /var/www/project/staticfiles/
<Directory /var/www/project/staticfiles>
Require all granted
ExpiresActive On
ExpiresDefault "access plus 1 year"
Header append Cache-Control "public"
</Directory>
# Медиа файлы
Alias /media/ /var/www/project/media/
<Directory /var/www/project/media>
Require all granted
ExpiresActive On
ExpiresDefault "access plus 1 year"
Header append Cache-Control "public"
</Directory>
# Логи
ErrorLog ${APACHE_LOG_DIR}/project_error.log
CustomLog ${APACHE_LOG_DIR}/project_access.log combined
# Заголовки безопасности
Header always set X-Frame-Options "SAMEORIGIN"
Header always set X-Content-Type-Options "nosniff"
Header always set X-XSS-Protection "1; mode=block"
Header always set Referrer-Policy "no-referrer-when-downgrade"
# Ограничение размера загрузки
LimitRequestBody 104857600
# Health check endpoint
<Location "/health/">
SetHandler none
Require all granted
</Location>
</VirtualHost>

View File

@@ -0,0 +1,36 @@
# Конфигурация мониторинга Prometheus для Django приложения
global:
scrape_interval: 15s
evaluation_interval: 15s
rule_files:
- "alert.rules"
scrape_configs:
- job_name: 'django-app'
static_configs:
- targets: ['localhost:8000']
metrics_path: '/metrics'
scrape_interval: 30s
- job_name: 'celery-exporter'
static_configs:
- targets: ['localhost:9542']
scrape_interval: 30s
- job_name: 'postgresql'
static_configs:
- targets: ['localhost:9187']
scrape_interval: 30s
- job_name: 'redis'
static_configs:
- targets: ['localhost:9121']
scrape_interval: 30s
alerting:
alertmanagers:
- static_configs:
- targets:
- alertmanager:9093

127
deploy/scripts/deploy.sh Normal file
View File

@@ -0,0 +1,127 @@
#!/bin/bash
# Скрипт развертывания проекта на сервере Astra Linux
set -e # Прекращать выполнение при ошибках
PROJECT_NAME="project"
PROJECT_PATH="/var/www/${PROJECT_NAME}"
REPO_URL=аш_репозиторий.git"
BRANCH="main"
echo "=== Начало развертывания проекта ==="
# Обновление системы
echo "Обновление системы..."
apt-get update && apt-get upgrade -y
# Установка uv
echo "Установка uv package manager..."
curl -LsSf https://astral.sh/uv/install.sh | sh
source $HOME/.cargo/env || true
# Установка необходимых пакетов
echo "Установка системных зависимостей..."
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
# Создание пользователя для проекта
echo "Создание пользователя проекта..."
if ! id "www-data" &>/dev/null; then
useradd -r -s /bin/false www-data
fi
# Создание директорий проекта
echo "Создание структуры директорий..."
mkdir -p ${PROJECT_PATH}/{src,logs,media,staticfiles,venv}
chown -R www-data:www-data ${PROJECT_PATH}
# Клонирование репозитория
echo "Клонирование репозитория..."
cd ${PROJECT_PATH}
if [ -d ".git" ]; then
git pull origin ${BRANCH}
else
git clone ${REPO_URL} .
git checkout ${BRANCH}
fi
# Создание виртуального окружения с uv
echo "Создание виртуального окружения с uv..."
uv venv ${PROJECT_PATH}/venv
source ${PROJECT_PATH}/venv/bin/activate
# Установка зависимостей через uv
echo "Установка Python зависимостей через uv..."
uv pip install --upgrade pip
uv pip install -r requirements.txt
uv pip install -r requirements-dev.txt
# Настройка переменных окружения
echo "Настройка переменных окружения..."
cp .env.example .env
# Здесь можно автоматически заполнить .env файл или запросить ввод
# Настройка базы данных
echo "Настройка базы данных..."
sudo -u postgres psql -c "CREATE DATABASE ${PROJECT_NAME}_prod;" || true
sudo -u postgres psql -c "CREATE USER ${PROJECT_NAME}_user WITH PASSWORD '${PROJECT_NAME}_password';" || true
sudo -u postgres psql -c "GRANT ALL PRIVILEGES ON DATABASE ${PROJECT_NAME}_prod TO ${PROJECT_NAME}_user;" || true
# Выполнение миграций Django
echo "Выполнение миграций..."
cd ${PROJECT_PATH}/src
python manage.py makemigrations
python manage.py migrate
python manage.py collectstatic --noinput
# Создание суперпользователя (опционально)
echo "Создание суперпользователя..."
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
# Настройка systemd сервисов
echo "Настройка systemd сервисов..."
cp ../deploy/systemd/*.service /etc/systemd/system/
systemctl daemon-reload
# Настройка Apache
echo "Настройка Apache..."
cp ../deploy/apache/project.conf /etc/apache2/sites-available/${PROJECT_NAME}.conf
a2ensite ${PROJECT_NAME}.conf
a2enmod ssl rewrite headers expires
a2dissite 000-default
# Настройка прав доступа
echo "Настройка прав доступа..."
chown -R www-data:www-data ${PROJECT_PATH}
chmod -R 755 ${PROJECT_PATH}
# Запуск сервисов
echo "Запуск сервисов..."
systemctl enable gunicorn.service
systemctl enable celery-worker.service
systemctl enable celery-beat.service
systemctl enable apache2
systemctl start gunicorn.service
systemctl start celery-worker.service
systemctl start celery-beat.service
systemctl restart apache2
echo "=== Развертывание завершено успешно ==="
echo "Проект доступен по адресу: https://ваш-ip-адрес"
echo "Админка Django: https://ваш-ip-адрес/admin/"
echo "API документация: https://ваш-ip-адрес/api/"

View File

@@ -0,0 +1,15 @@
[Unit]
Description=Celery Beat for Django project
After=network.target redis.service postgresql.service
[Service]
Type=simple
User=www-data
Group=www-data
EnvironmentFile=/var/www/project/.env
WorkingDirectory=/var/www/project/src
ExecStart=/var/www/project/venv/bin/celery -A config beat --loglevel=INFO --scheduler django_celery_beat.schedulers:DatabaseScheduler
Restart=always
[Install]
WantedBy=multi-user.target

View File

@@ -0,0 +1,16 @@
[Unit]
Description=Celery Worker for Django project
After=network.target redis.service postgresql.service
[Service]
Type=forking
User=www-data
Group=www-data
EnvironmentFile=/var/www/project/.env
WorkingDirectory=/var/www/project/src
ExecStart=/var/www/project/venv/bin/celery -A config worker --loglevel=INFO --pidfile=/run/celery/worker.pid
ExecReload=/bin/kill -HUP $MAINPID
PIDFile=/run/celery/worker.pid
[Install]
WantedBy=multi-user.target

View File

@@ -0,0 +1,27 @@
[Unit]
Description=Gunicorn daemon for Django project
After=network.target
[Service]
Type=notify
User=www-data
Group=www-data
RuntimeDirectory=gunicorn
WorkingDirectory=/var/www/project/src
ExecStart=/var/www/project/venv/bin/gunicorn config.wsgi:application \
--bind unix:/run/gunicorn.sock \
--workers 3 \
--worker-class gevent \
--worker-connections 1000 \
--timeout 30 \
--keep-alive 2 \
--max-requests 1000 \
--max-requests-jitter 100 \
--preload
ExecReload=/bin/kill -s HUP $MAINPID
KillMode=mixed
TimeoutStopSec=5
PrivateTmp=true
[Install]
WantedBy=multi-user.target