first commit
This commit is contained in:
80
deploy/apache/project.conf
Normal file
80
deploy/apache/project.conf
Normal 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>
|
||||
36
deploy/monitoring/prometheus.yml
Normal file
36
deploy/monitoring/prometheus.yml
Normal 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
127
deploy/scripts/deploy.sh
Normal 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/"
|
||||
15
deploy/systemd/celery-beat.service
Normal file
15
deploy/systemd/celery-beat.service
Normal 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
|
||||
16
deploy/systemd/celery-worker.service
Normal file
16
deploy/systemd/celery-worker.service
Normal 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
|
||||
27
deploy/systemd/gunicorn.service
Normal file
27
deploy/systemd/gunicorn.service
Normal 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
|
||||
Reference in New Issue
Block a user