feat: AI Press Secretary - content generation and publishing platform
Features: - AI-powered post generation from brand profiles - Image generation with templates - Content planning - Telegram publishing - Social profile analyzer - Community organization support - Markdown to HTML conversion for Telegram - Inline AI chat for post editing Deploy: - Add deployment scripts for Linux servers - Add PowerShell deploy script for Windows - Add Nginx and SSL setup scripts - Add backup and restore scripts
This commit is contained in:
1 parent
81625b2e6f
commit
c6048aeea0
37 files changed
+7037
-225
No files matched your search
@@ -0,0 +1,57 @@
|
||||
# Python
|
||||
__pycache__/
|
||||
*.py[cod]
|
||||
*$py.class
|
||||
*.so
|
||||
.Python
|
||||
venv/
|
||||
env/
|
||||
ENV/
|
||||
*.egg-info/
|
||||
dist/
|
||||
build/
|
||||
|
||||
# База данных
|
||||
*.db
|
||||
*.sqlite
|
||||
*.sqlite3
|
||||
|
||||
# Медиа файлы
|
||||
media/
|
||||
*.jpg
|
||||
*.jpeg
|
||||
*.png
|
||||
*.gif
|
||||
*.webp
|
||||
*.pdf
|
||||
|
||||
# Логи
|
||||
*.log
|
||||
logs/
|
||||
|
||||
# Переменные окружения
|
||||
.env
|
||||
.env.local
|
||||
|
||||
# IDE
|
||||
.vscode/
|
||||
.idea/
|
||||
*.swp
|
||||
*.swo
|
||||
*~
|
||||
|
||||
# OS
|
||||
.DS_Store
|
||||
Thumbs.db
|
||||
|
||||
# Секреты
|
||||
secrets/
|
||||
*.key
|
||||
*.pem
|
||||
|
||||
# Деплой
|
||||
deploy.sh
|
||||
nginx-setup.sh
|
||||
ssl-setup.sh
|
||||
dev.sh
|
||||
README.md
|
||||
@@ -0,0 +1,212 @@
|
||||
# 🚀 ИИ Пресс-секретарь — Скрипты деплоя
|
||||
|
||||
## 📁 Файлы
|
||||
|
||||
| Скрипт | Назначение |
|
||||
|--------|-----------|
|
||||
| `install.sh` | Полная установка (все в одном) |
|
||||
| `deploy.sh` | Деплой приложения |
|
||||
| `nginx-setup.sh` | Настройка Nginx |
|
||||
| `ssl-setup.sh` | SSL сертификат (Let's Encrypt) |
|
||||
| `backup.sh` | Бэкап проекта |
|
||||
| `restore.sh` | Восстановление из бэкапа |
|
||||
| `dev.sh` | Быстрый запуск в development |
|
||||
|
||||
## 🎯 Быстрая установка (3 шага)
|
||||
|
||||
### 1. Скопируй файлы на сервер
|
||||
|
||||
```bash
|
||||
scp -r deploy.sh nginx-setup.sh ssl-setup.sh backup.sh restore.sh dev.sh README.md user@server:/opt/pressa/
|
||||
```
|
||||
|
||||
### 2. Запусти установку
|
||||
|
||||
```bash
|
||||
cd /opt/pressa
|
||||
chmod +x *.sh
|
||||
./install.sh
|
||||
```
|
||||
|
||||
### 3. Настрой .env
|
||||
|
||||
```bash
|
||||
nano /opt/pressa/.env
|
||||
```
|
||||
|
||||
Заполни переменные:
|
||||
```env
|
||||
BOT_TOKEN=твой_токен_бота
|
||||
PIAPI_API_KEY=твой_piapi_ключ
|
||||
PIAPI_MODEL=gpt-4o
|
||||
PROXY_URL=http://user:pass@host:port
|
||||
CABINET_URL=https://твой_домен.com
|
||||
```
|
||||
|
||||
## 📖 Использование отдельных скриптов
|
||||
|
||||
### Деплой
|
||||
|
||||
```bash
|
||||
cd /opt/pressa
|
||||
./deploy.sh
|
||||
```
|
||||
|
||||
### Nginx
|
||||
|
||||
```bash
|
||||
./nginx-setup.sh
|
||||
```
|
||||
|
||||
Замените `твой_домен.com` на свой домен.
|
||||
|
||||
### SSL
|
||||
|
||||
```bash
|
||||
./ssl-setup.sh
|
||||
```
|
||||
|
||||
### Бэкап
|
||||
|
||||
```bash
|
||||
./backup.sh
|
||||
```
|
||||
|
||||
### Восстановление
|
||||
|
||||
```bash
|
||||
./restore.sh
|
||||
```
|
||||
|
||||
### Development
|
||||
|
||||
```bash
|
||||
./dev.sh
|
||||
```
|
||||
|
||||
## 🔧 Управление сервисом
|
||||
|
||||
```bash
|
||||
# Статус
|
||||
sudo systemctl status pressa
|
||||
|
||||
# Перезапуск
|
||||
sudo systemctl restart pressa
|
||||
|
||||
# Остановка
|
||||
sudo systemctl stop pressa
|
||||
|
||||
# Запуск
|
||||
sudo systemctl start pressa
|
||||
|
||||
# Логи
|
||||
sudo journalctl -u pressa -f
|
||||
|
||||
# Логи Nginx
|
||||
sudo tail -f /var/log/nginx/pressa-error.log
|
||||
```
|
||||
|
||||
## 🔄 Обновление
|
||||
|
||||
```bash
|
||||
cd /opt/pressa
|
||||
git pull origin main
|
||||
./deploy.sh
|
||||
```
|
||||
|
||||
## 📊 Мониторинг
|
||||
|
||||
```bash
|
||||
# Приложение
|
||||
sudo journalctl -u pressa -f
|
||||
|
||||
# Nginx
|
||||
sudo tail -f /var/log/nginx/pressa-error.log
|
||||
sudo tail -f /var/log/nginx/pressa-access.log
|
||||
|
||||
# Бэкапы
|
||||
ls -lh /opt/backups/
|
||||
```
|
||||
|
||||
## 🆘 Troubleshooting
|
||||
|
||||
### Сервис не запускается
|
||||
|
||||
```bash
|
||||
sudo systemctl status pressa
|
||||
sudo journalctl -u pressa -n 50
|
||||
```
|
||||
|
||||
### Nginx не работает
|
||||
|
||||
```bash
|
||||
sudo nginx -t
|
||||
sudo systemctl restart nginx
|
||||
```
|
||||
|
||||
### 500 ошибка
|
||||
|
||||
```bash
|
||||
sudo journalctl -u pressa -n 100
|
||||
sudo tail -f /var/log/nginx/pressa-error.log
|
||||
```
|
||||
|
||||
### Проблемы с зависимостями
|
||||
|
||||
```bash
|
||||
cd /opt/pressa
|
||||
source venv/bin/activate
|
||||
pip install --upgrade pip
|
||||
pip install -r requirements.txt
|
||||
```
|
||||
|
||||
## 📦 Структура
|
||||
|
||||
```
|
||||
/opt/pressa/
|
||||
├── cabinet_service/ # Основной код
|
||||
│ ├── app.py # FastAPI
|
||||
│ ├── templates/ # HTML
|
||||
│ ├── static/ # CSS/JS
|
||||
│ ├── media/ # Файлы
|
||||
│ └── users.db # База данных
|
||||
├── ai_core/ # AI модули
|
||||
├── venv/ # Python venv
|
||||
├── .env # Переменные
|
||||
├── requirements.txt # Зависимости
|
||||
├── deploy/ # Скрипты деплоя
|
||||
│ ├── install.sh
|
||||
│ ├── deploy.sh
|
||||
│ ├── nginx-setup.sh
|
||||
│ ├── ssl-setup.sh
|
||||
│ ├── backup.sh
|
||||
│ ├── restore.sh
|
||||
│ └── dev.sh
|
||||
└── README.md
|
||||
```
|
||||
|
||||
## 🎓 Полезные команды
|
||||
|
||||
```bash
|
||||
# Проверка порта
|
||||
sudo netstat -tlnp | grep 8001
|
||||
|
||||
# Проверка RAM
|
||||
free -h
|
||||
|
||||
# Проверка диска
|
||||
df -h
|
||||
|
||||
# Перезагрузка
|
||||
sudo reboot
|
||||
|
||||
# Остановка Nginx
|
||||
sudo systemctl stop nginx
|
||||
|
||||
# Запуск Nginx
|
||||
sudo systemctl start nginx
|
||||
```
|
||||
|
||||
## 📞 Поддержка
|
||||
|
||||
Если что-то не работает — проверяй логи и убедись, что все переменные в `.env` заполнены.
|
||||
@@ -0,0 +1,116 @@
|
||||
# Деплой с Windows на сервер
|
||||
|
||||
## ⚡ Быстрый старт
|
||||
|
||||
1. **Открой PowerShell** (от имени администратора не обязательно)
|
||||
|
||||
2. **Перейди в папку проекта:**
|
||||
```powershell
|
||||
cd C:\python\pressa\deploy
|
||||
```
|
||||
|
||||
3. **Запусти деплой:**
|
||||
```powershell
|
||||
.\deploy.ps1
|
||||
```
|
||||
|
||||
## 📋 Что делает скрипт
|
||||
|
||||
1. ✅ Архивирует проект (исключая venv, __pycache__)
|
||||
2. ✅ Подключается к серверу по SSH
|
||||
3. ✅ Загружает файлы через SCP
|
||||
4. ✅ Распаковывает на сервере
|
||||
5. ✅ Запускает `install.sh` (установка Python, Nginx, SSL)
|
||||
6. ✅ Настраивает домен `press.my-dpr.ru`
|
||||
7. ✅ Получает SSL сертификат
|
||||
|
||||
## ⏱️ Время выполнения
|
||||
|
||||
- Загрузка: 1-2 минуты
|
||||
- Установка на сервере: 5-10 минут
|
||||
- **Итого: ~10 минут**
|
||||
|
||||
## 🔧 Параметры (опционально)
|
||||
|
||||
Если нужно изменить настройки:
|
||||
|
||||
```powershell
|
||||
.\deploy.ps1 -ServerIP "31.28.9.200" -Domain "press.my-dpr.ru"
|
||||
```
|
||||
|
||||
Доступные параметры:
|
||||
- `-ServerIP` — IP сервера
|
||||
- `-Username` — логин (по умолчанию root)
|
||||
- `-Password` — пароль
|
||||
- `-Domain` — домен
|
||||
- `-RemotePath` — путь на сервере (по умолчанию /opt/pressa)
|
||||
- `-LocalProjectPath` — путь к проекту на компьютере
|
||||
|
||||
## 🆘 Если не работает
|
||||
|
||||
### Ошибка "SSH не найден"
|
||||
|
||||
Установи OpenSSH Client:
|
||||
1. Параметры → Приложения → Дополнительные компоненты
|
||||
2. Добавить компонент → OpenSSH Client
|
||||
3. Перезагрузи PowerShell
|
||||
|
||||
### Ошибка подключения
|
||||
|
||||
Проверь:
|
||||
```powershell
|
||||
# Пинг сервера
|
||||
ping 31.28.9.200
|
||||
|
||||
# Проверка SSH
|
||||
ssh root@31.28.9.200
|
||||
```
|
||||
|
||||
### Ручной деплой (если скрипт не сработал)
|
||||
|
||||
1. Запакуй проект в zip
|
||||
2. Загрузи через FileZilla / WinSCP на сервер
|
||||
3. Подключись по SSH через PuTTY
|
||||
4. Выполни команды из `install.sh` вручную
|
||||
|
||||
## ✅ После деплоя
|
||||
|
||||
1. **Настрой .env файл:**
|
||||
```bash
|
||||
ssh root@31.28.9.200
|
||||
nano /opt/pressa/.env
|
||||
```
|
||||
|
||||
Заполни:
|
||||
```env
|
||||
BOT_TOKEN=твой_токен_бота
|
||||
PIAPI_API_KEY=твой_piapi_ключ
|
||||
PROXY_URL=http://user:pass@host:port
|
||||
CABINET_URL=https://press.my-dpr.ru
|
||||
```
|
||||
|
||||
2. **Перезапусти сервис:**
|
||||
```bash
|
||||
systemctl restart pressa
|
||||
```
|
||||
|
||||
3. **Проверь статус:**
|
||||
```bash
|
||||
systemctl status pressa
|
||||
journalctl -u pressa -f
|
||||
```
|
||||
|
||||
## 🌐 Доступ
|
||||
|
||||
После успешного деплоя:
|
||||
- **Сайт:** https://press.my-dpr.ru
|
||||
- **API:** https://press.my-dpr.ru/api/
|
||||
|
||||
## 📞 Поддержка
|
||||
|
||||
Если что-то пошло не так — проверь логи:
|
||||
```bash
|
||||
# На сервере
|
||||
journalctl -u pressa -n 50
|
||||
tail -f /var/log/nginx/pressa-error.log
|
||||
```
|
||||
@@ -0,0 +1,37 @@
|
||||
#!/bin/bash
|
||||
|
||||
# === Бэкап проекта ===
|
||||
|
||||
set -e
|
||||
|
||||
APP_DIR="/opt/pressa"
|
||||
BACKUP_DIR="/opt/backups"
|
||||
DATE=$(date +%Y%m%d_%H%M%S)
|
||||
BACKUP_NAME="pressa_$DATE.tar.gz"
|
||||
|
||||
echo "=== Создание бэкапа $BACKUP_NAME ==="
|
||||
|
||||
# Создание папки для бэкапов
|
||||
mkdir -p $BACKUP_DIR
|
||||
|
||||
# Создание архива
|
||||
cd $APP_DIR
|
||||
tar -czf $BACKUP_DIR/$BACKUP_NAME \
|
||||
cabinet_service/users.db \
|
||||
cabinet_service/media \
|
||||
--exclude='cabinet_service/media/*' \
|
||||
--exclude='venv' \
|
||||
--exclude='__pycache__' \
|
||||
--exclude='*.pyc'
|
||||
|
||||
# Удаление старых бэкапов (сохранять последние 7)
|
||||
find $BACKUP_DIR -name "pressa_*.tar.gz" -mtime +7 -delete
|
||||
|
||||
echo "✓ Бэкап создан: $BACKUP_DIR/$BACKUP_NAME"
|
||||
echo "Размер: $(du -h $BACKUP_DIR/$BACKUP_NAME | cut -f1)"
|
||||
echo ""
|
||||
echo "Список бэкапов:"
|
||||
ls -lh $BACKUP_DIR/pressa_*.tar.gz | tail -5
|
||||
|
||||
# Опционально: копировать на другой сервер
|
||||
# scp $BACKUP_DIR/$BACKUP_NAME user@backup-server:/backups/
|
||||
@@ -0,0 +1,190 @@
|
||||
#!/usr/bin/env pwsh
|
||||
#Requires -Version 5.1
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Deploy AI Press Secretary to server from Windows computer
|
||||
.DESCRIPTION
|
||||
1. Archives project
|
||||
2. Uploads to server via SCP
|
||||
3. Connects via SSH and runs installation
|
||||
4. Configures Nginx + SSL
|
||||
.NOTES
|
||||
Run: .\deploy-simple.ps1
|
||||
#>
|
||||
|
||||
[CmdletBinding()]
|
||||
param(
|
||||
[string]$ServerIP = "31.28.9.200",
|
||||
[string]$Username = "root",
|
||||
[string]$Password = "123edcxzaqws",
|
||||
[string]$Domain = "press.my-dpr.ru",
|
||||
[string]$RemotePath = "/opt/pressa",
|
||||
[string]$LocalProjectPath = "C:\python\pressa",
|
||||
[int]$Port = 2324
|
||||
)
|
||||
|
||||
Write-Host "=== AI Press Secretary Deployment ===" -ForegroundColor Green
|
||||
Write-Host ""
|
||||
|
||||
# Check SSH/SCP
|
||||
Write-Host "[1/6] Checking SSH and SCP..." -ForegroundColor Yellow
|
||||
$ssh = Get-Command ssh -ErrorAction SilentlyContinue
|
||||
$scp = Get-Command scp -ErrorAction SilentlyContinue
|
||||
|
||||
if (-not $ssh -or -not $scp) {
|
||||
Write-Host "ERROR: SSH or SCP not found!" -ForegroundColor Red
|
||||
Write-Host "Install OpenSSH Client: Settings -> Apps -> Optional Features -> OpenSSH Client"
|
||||
exit 1
|
||||
}
|
||||
Write-Host "OK" -ForegroundColor Green
|
||||
|
||||
# Create archive
|
||||
Write-Host "[2/6] Creating project archive..." -ForegroundColor Yellow
|
||||
$TempDir = "$env:TEMP\pressa-deploy-$(Get-Random)"
|
||||
$ArchiveName = "pressa-deploy.tar.gz"
|
||||
$ArchivePath = "$env:TEMP\$ArchiveName"
|
||||
|
||||
if (Test-Path $TempDir) { Remove-Item $TempDir -Recurse -Force }
|
||||
New-Item -ItemType Directory -Path $TempDir | Out-Null
|
||||
|
||||
$ItemsToCopy = @("cabinet_service", "ai_core", "config.py", "requirements.txt", "deploy")
|
||||
foreach ($item in $ItemsToCopy) {
|
||||
$src = Join-Path $LocalProjectPath $item
|
||||
if (Test-Path $src) {
|
||||
Copy-Item -Path $src -Destination $TempDir -Recurse -Force
|
||||
}
|
||||
}
|
||||
|
||||
# Update domain in scripts
|
||||
$nginxScript = Join-Path $TempDir "deploy\nginx-setup.sh"
|
||||
if (Test-Path $nginxScript) {
|
||||
$content = [System.IO.File]::ReadAllText($nginxScript)
|
||||
$content = $content.Replace("твой_домен.com", $Domain)
|
||||
[System.IO.File]::WriteAllText($nginxScript, $content)
|
||||
}
|
||||
|
||||
$sslScript = Join-Path $TempDir "deploy\ssl-setup.sh"
|
||||
if (Test-Path $sslScript) {
|
||||
$content = [System.IO.File]::ReadAllText($sslScript)
|
||||
$content = $content.Replace("твой_домен.com", $Domain)
|
||||
$content = $content.Replace("твой_email@example.com", "admin@$Domain")
|
||||
[System.IO.File]::WriteAllText($sslScript, $content)
|
||||
}
|
||||
|
||||
# Create archive
|
||||
Set-Location $env:TEMP
|
||||
$tar = Get-Command tar -ErrorAction SilentlyContinue
|
||||
if ($tar) {
|
||||
tar -czf $ArchiveName -C $TempDir .
|
||||
} else {
|
||||
Compress-Archive -Path "$TempDir\*" -DestinationPath "$env:TEMP\pressa-deploy.zip" -Force
|
||||
$ArchiveName = "pressa-deploy.zip"
|
||||
$ArchivePath = "$env:TEMP\$ArchiveName"
|
||||
}
|
||||
|
||||
$size = [math]::Round((Get-Item $ArchivePath).Length / 1MB, 1)
|
||||
Write-Host "Archive created: $ArchivePath ($size MB)" -ForegroundColor Green
|
||||
|
||||
# Upload to server
|
||||
Write-Host "[3/6] Uploading to server ${ServerIP}:${Port}..." -ForegroundColor Yellow
|
||||
$sshOptions = "-o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -p $Port"
|
||||
|
||||
# Create directory
|
||||
$createDir = "mkdir -p $RemotePath && rm -rf $RemotePath/*"
|
||||
$createDir | ssh $sshOptions ${Username}@${ServerIP} "bash -s" 2>$null
|
||||
|
||||
if ($LASTEXITCODE -ne 0) {
|
||||
Write-Host "ERROR: Cannot connect to server!" -ForegroundColor Red
|
||||
Write-Host "Check: IP address, login, password, port $Port" -ForegroundColor Yellow
|
||||
exit 1
|
||||
}
|
||||
Write-Host "Connected" -ForegroundColor Green
|
||||
|
||||
# Upload archive
|
||||
scp $sshOptions $ArchivePath "${Username}@${ServerIP}:${RemotePath}/" 2>$null
|
||||
if ($LASTEXITCODE -ne 0) {
|
||||
Write-Host "ERROR: Upload failed!" -ForegroundColor Red
|
||||
exit 1
|
||||
}
|
||||
Write-Host "Uploaded" -ForegroundColor Green
|
||||
|
||||
# Extract and install
|
||||
Write-Host "[4/6] Installing on server (this takes 5-10 minutes)..." -ForegroundColor Yellow
|
||||
$installScript = @"
|
||||
cd $RemotePath
|
||||
|
||||
# Extract
|
||||
if [ -f "$ArchiveName" ]; then
|
||||
tar -xzf "$ArchiveName"
|
||||
rm "$ArchiveName"
|
||||
elif [ -f "pressa-deploy.zip" ]; then
|
||||
apt-get install -y unzip >/dev/null 2>&1
|
||||
unzip -q "pressa-deploy.zip"
|
||||
rm "pressa-deploy.zip"
|
||||
fi
|
||||
|
||||
# Fix directory structure
|
||||
if [ ! -d "cabinet_service" ]; then
|
||||
for dir in */; do
|
||||
if [ -d "\$dir/cabinet_service" ]; then
|
||||
mv "\$dir"/* .
|
||||
rm -rf "\$dir"
|
||||
break
|
||||
fi
|
||||
done
|
||||
fi
|
||||
|
||||
# Make scripts executable
|
||||
chmod +x deploy/*.sh
|
||||
|
||||
# Run install
|
||||
cd deploy
|
||||
./install.sh
|
||||
"@
|
||||
|
||||
$installScript | ssh $sshOptions ${Username}@${ServerIP} "bash -s" 2>$null
|
||||
|
||||
if ($LASTEXITCODE -ne 0) {
|
||||
Write-Host "WARNING: Installation may have errors. Check logs on server." -ForegroundColor Yellow
|
||||
}
|
||||
|
||||
# Configure Nginx and SSL
|
||||
Write-Host "[5/6] Configuring Nginx and SSL..." -ForegroundColor Yellow
|
||||
$nginxScript = @"
|
||||
cd $RemotePath/deploy
|
||||
sed -i "s/твой_домен.com/$Domain/g" nginx-setup.sh
|
||||
./nginx-setup.sh
|
||||
sed -i "s/твой_домен.com/$Domain/g" ssl-setup.sh
|
||||
sed -i "s/твой_email@example.com/admin@$Domain/g" ssl-setup.sh
|
||||
./ssl-setup.sh
|
||||
"@
|
||||
|
||||
$nginxScript | ssh $sshOptions ${Username}@${ServerIP} "bash -s" 2>$null
|
||||
|
||||
# Cleanup
|
||||
Write-Host "[6/6] Cleaning up..." -ForegroundColor Yellow
|
||||
if (Test-Path $TempDir) { Remove-Item $TempDir -Recurse -Force }
|
||||
if (Test-Path $ArchivePath) { Remove-Item $ArchivePath -Force }
|
||||
Set-Location $LocalProjectPath
|
||||
|
||||
# Final message
|
||||
Write-Host ""
|
||||
Write-Host "=== Deployment Complete! ===" -ForegroundColor Green
|
||||
Write-Host ""
|
||||
Write-Host "Website: https://$Domain" -ForegroundColor Cyan
|
||||
Write-Host "Project: $RemotePath" -ForegroundColor Cyan
|
||||
Write-Host ""
|
||||
Write-Host "Next steps:" -ForegroundColor Yellow
|
||||
Write-Host "1. Configure .env file:" -ForegroundColor White
|
||||
Write-Host " ssh ${Username}@${ServerIP}" -ForegroundColor Gray
|
||||
Write-Host " nano $RemotePath/.env" -ForegroundColor Gray
|
||||
Write-Host ""
|
||||
Write-Host "2. Fill in API keys (BOT_TOKEN, PIAPI_API_KEY, etc.)" -ForegroundColor White
|
||||
Write-Host ""
|
||||
Write-Host "3. Restart service:" -ForegroundColor White
|
||||
Write-Host " systemctl restart pressa" -ForegroundColor Gray
|
||||
Write-Host ""
|
||||
Write-Host "Useful commands:" -ForegroundColor Yellow
|
||||
Write-Host " ssh ${Username}@${ServerIP}" -ForegroundColor Gray
|
||||
Write-Host " sudo systemctl status pressa" -ForegroundColor Gray
|
||||
Write-Host " sudo journalctl -u pressa -f" -ForegroundColor Gray
|
||||
@@ -0,0 +1,246 @@
|
||||
#!/usr/bin/env pwsh
|
||||
#Requires -Version 5.1
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Деплой ИИ Пресс-секретарь на сервер с Windows-компьютера
|
||||
.DESCRIPTION
|
||||
1. Архивирует проект
|
||||
2. Загружает на сервер через SCP
|
||||
3. Подключается по SSH и запускает установку
|
||||
4. Настраивает Nginx + SSL
|
||||
.NOTES
|
||||
Запуск: .\deploy.ps1
|
||||
#>
|
||||
|
||||
[CmdletBinding()]
|
||||
param(
|
||||
[string]$ServerIP = "31.28.9.200",
|
||||
[string]$Username = "root",
|
||||
[string]$Password = "123edcxzaqws",
|
||||
[string]$Domain = "press.my-dpr.ru",
|
||||
[string]$RemotePath = "/opt/pressa",
|
||||
[string]$LocalProjectPath = "C:\python\pressa"
|
||||
)
|
||||
|
||||
# === ЦВЕТА ===
|
||||
$Red = "`e[31m"
|
||||
$Green = "`e[32m"
|
||||
$Yellow = "`e[33m"
|
||||
$Blue = "`e[34m"
|
||||
$NC = "`e[0m"
|
||||
|
||||
function Write-Status($msg) { Write-Host "${Green}[✓]${NC} $msg" }
|
||||
function Write-Info($msg) { Write-Host "${Blue}[i]${NC} $msg" }
|
||||
function Write-Warning($msg) { Write-Host "${Yellow}[!]${NC} $msg" }
|
||||
function Write-Error($msg) { Write-Host "${Red}[✗]${NC} $msg" }
|
||||
|
||||
# === ПРОВЕРКА SSH/SCP ===
|
||||
Write-Info "Проверка наличия SSH и SCP..."
|
||||
|
||||
$ssh = Get-Command ssh -ErrorAction SilentlyContinue
|
||||
$scp = Get-Command scp -ErrorAction SilentlyContinue
|
||||
|
||||
if (-not $ssh -or -not $scp) {
|
||||
Write-Error "SSH или SCP не найдены!"
|
||||
Write-Info "Установи OpenSSH Client:"
|
||||
Write-Info " Параметры → Приложения → Дополнительные компоненты → OpenSSH Client"
|
||||
exit 1
|
||||
}
|
||||
|
||||
Write-Status "SSH и SCP найдены"
|
||||
|
||||
# === СОЗДАНИЕ АРХИВА ===
|
||||
Write-Info "Создание архива проекта..."
|
||||
|
||||
$TempDir = "$env:TEMP\pressa-deploy"
|
||||
$ArchiveName = "pressa-deploy.tar.gz"
|
||||
$ArchivePath = "$env:TEMP\$ArchiveName"
|
||||
|
||||
# Удаляем старый архив
|
||||
if (Test-Path $ArchivePath) {
|
||||
Remove-Item $ArchivePath -Force
|
||||
}
|
||||
|
||||
# Создаём временную копию без лишнего
|
||||
if (Test-Path $TempDir) {
|
||||
Remove-Item $TempDir -Recurse -Force
|
||||
}
|
||||
New-Item -ItemType Directory -Path $TempDir | Out-Null
|
||||
|
||||
# Копируем нужные файлы
|
||||
$ItemsToCopy = @(
|
||||
"cabinet_service",
|
||||
"ai_core",
|
||||
"config.py",
|
||||
"requirements.txt",
|
||||
"deploy"
|
||||
)
|
||||
|
||||
foreach ($item in $ItemsToCopy) {
|
||||
$src = Join-Path $LocalProjectPath $item
|
||||
if (Test-Path $src) {
|
||||
Copy-Item -Path $src -Destination $TempDir -Recurse -Force
|
||||
}
|
||||
}
|
||||
|
||||
# Обновляем домен в скриптах
|
||||
$nginxScript = Join-Path $TempDir "deploy\nginx-setup.sh"
|
||||
if (Test-Path $nginxScript) {
|
||||
$content = Get-Content $nginxScript -Raw
|
||||
$content = $content.Replace('твой_домен.com', $Domain)
|
||||
Set-Content -Path $nginxScript -Value $content -NoNewline
|
||||
}
|
||||
|
||||
$sslScript = Join-Path $TempDir "deploy\ssl-setup.sh"
|
||||
if (Test-Path $sslScript) {
|
||||
$content = Get-Content $sslScript -Raw
|
||||
$content = $content.Replace('твой_домен.com', $Domain)
|
||||
$content = $content.Replace('твой_email@example.com', "admin@$Domain")
|
||||
Set-Content -Path $sslScript -Value $content -NoNewline
|
||||
}
|
||||
|
||||
# Создаём архив
|
||||
Write-Info "Архивирование..."
|
||||
Set-Location $env:TEMP
|
||||
# Используем tar если есть, иначе Compress-Archive
|
||||
$tar = Get-Command tar -ErrorAction SilentlyContinue
|
||||
if ($tar) {
|
||||
tar -czf $ArchiveName -C $TempDir .
|
||||
} else {
|
||||
Compress-Archive -Path "$TempDir\*" -DestinationPath "$env:TEMP\pressa-deploy.zip" -Force
|
||||
$ArchiveName = "pressa-deploy.zip"
|
||||
$ArchivePath = "$env:TEMP\$ArchiveName"
|
||||
}
|
||||
|
||||
Write-Status "Архив создан: $ArchivePath ($((Get-Item $ArchivePath).Length / 1MB | Format-Number -Format '0.0') MB)"
|
||||
|
||||
# === ЗАГРУЗКА НА СЕРВЕР ===
|
||||
Write-Info "Загрузка на сервер $ServerIP..."
|
||||
|
||||
# Создаём директорию на сервере
|
||||
$sshCmd = "ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null ${Username}@${ServerIP}"
|
||||
$createDir = "mkdir -p $RemotePath && rm -rf $RemotePath/*"
|
||||
|
||||
Write-Info "Создание директории на сервере..."
|
||||
$createDir | ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null ${Username}@${ServerIP} "bash -s"
|
||||
|
||||
if ($LASTEXITCODE -ne 0) {
|
||||
Write-Error "Не удалось подключиться по SSH!"
|
||||
Write-Info "Проверь:"
|
||||
Write-Info " 1. IP-адрес сервера"
|
||||
Write-Info " 2. Логин и пароль"
|
||||
Write-Info " 3. Доступность порта 22"
|
||||
exit 1
|
||||
}
|
||||
|
||||
Write-Status "Подключение установлено"
|
||||
|
||||
# Загружаем архив
|
||||
Write-Info "Загрузка архива..."
|
||||
scp -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null $ArchivePath "${Username}@${ServerIP}:${RemotePath}/"
|
||||
|
||||
if ($LASTEXITCODE -ne 0) {
|
||||
Write-Error "Ошибка загрузки файлов!"
|
||||
exit 1
|
||||
}
|
||||
|
||||
Write-Status "Файлы загружены"
|
||||
|
||||
# === РАСПАКОВКА И УСТАНОВКА ===
|
||||
Write-Info "Распаковка и установка на сервере..."
|
||||
|
||||
$remoteCommands = @"
|
||||
cd $RemotePath
|
||||
|
||||
# Распаковка
|
||||
if [ -f "$ArchiveName" ]; then
|
||||
tar -xzf "$ArchiveName"
|
||||
rm "$ArchiveName"
|
||||
elif [ -f "pressa-deploy.zip" ]; then
|
||||
apt-get install -y unzip
|
||||
unzip -q "pressa-deploy.zip"
|
||||
rm "pressa-deploy.zip"
|
||||
fi
|
||||
|
||||
# Перемещаем файлы из подпапки
|
||||
if [ -d "cabinet_service" ]; then
|
||||
# Уже в корне
|
||||
echo "Файлы на месте"
|
||||
else
|
||||
# Ищем папку с файлами
|
||||
for dir in */; do
|
||||
if [ -d "\$dir/cabinet_service" ]; then
|
||||
mv "\$dir"/* .
|
||||
rm -rf "\$dir"
|
||||
break
|
||||
fi
|
||||
done
|
||||
fi
|
||||
|
||||
# Установка прав
|
||||
chmod +x deploy/*.sh
|
||||
|
||||
# Запуск установки
|
||||
echo "=== Запуск install.sh ==="
|
||||
cd deploy
|
||||
./install.sh
|
||||
|
||||
echo ""
|
||||
echo "=== Установка завершена ==="
|
||||
echo ""
|
||||
echo "Не забудь настроить .env файл:"
|
||||
echo " nano $RemotePath/.env"
|
||||
echo ""
|
||||
echo "Перезапуск сервиса:"
|
||||
echo " systemctl restart pressa"
|
||||
"@
|
||||
|
||||
Write-Info "Запуск установочных скриптов (это займет 5-10 минут)..."
|
||||
$remoteCommands | ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null ${Username}@${ServerIP} "bash -s"
|
||||
|
||||
if ($LASTEXITCODE -ne 0) {
|
||||
Write-Warning "Возможны ошибки при установке. Проверь логи на сервере."
|
||||
}
|
||||
|
||||
# === НАСТРОЙКА NGINX И SSL ===
|
||||
Write-Info "Настройка Nginx и SSL..."
|
||||
|
||||
$nginxCommands = @"
|
||||
cd $RemotePath/deploy
|
||||
|
||||
# Nginx
|
||||
sed -i "s/твой_домен.com/$Domain/g" nginx-setup.sh
|
||||
./nginx-setup.sh
|
||||
|
||||
# SSL
|
||||
sed -i "s/твой_домен.com/$Domain/g" ssl-setup.sh
|
||||
sed -i "s/твой_email@example.com/admin@$Domain/g" ssl-setup.sh
|
||||
./ssl-setup.sh
|
||||
|
||||
echo ""
|
||||
echo "=== Готово! ==="
|
||||
echo "Сайт доступен по адресу: https://$Domain"
|
||||
"@
|
||||
|
||||
$nginxCommands | ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null ${Username}@${ServerIP} "bash -s"
|
||||
|
||||
# === ФИНАЛ ===
|
||||
Write-Status "Деплой завершён!"
|
||||
Write-Info ""
|
||||
Write-Info "🌐 Сайт: https://$Domain"
|
||||
Write-Info "📁 Проект: $RemotePath"
|
||||
Write-Info ""
|
||||
Write-Info "Полезные команды:"
|
||||
Write-Info " ssh ${Username}@${ServerIP}"
|
||||
Write-Info " sudo systemctl status pressa"
|
||||
Write-Info " sudo journalctl -u pressa -f"
|
||||
Write-Info ""
|
||||
Write-Warning "⚠️ Не забудь настроить .env файл на сервере!"
|
||||
Write-Info " ssh ${Username}@${ServerIP} 'nano $RemotePath/.env'"
|
||||
|
||||
# Очистка
|
||||
if (Test-Path $TempDir) {
|
||||
Remove-Item $TempDir -Recurse -Force
|
||||
}
|
||||
|
||||
Set-Location $LocalProjectPath
|
||||
@@ -0,0 +1,65 @@
|
||||
#!/bin/bash
|
||||
|
||||
# === Полная установка ИИ Пресс-секретарь ===
|
||||
|
||||
set -e
|
||||
|
||||
echo "=== Полная установка ИИ Пресс-секретарь ==="
|
||||
echo ""
|
||||
|
||||
# 1. Установка системных зависимостей
|
||||
echo "[1/7] Установка системных зависимостей..."
|
||||
sudo apt update
|
||||
sudo apt install -y python3.12 python3.12-venv python3-pip nginx certbot python3-certbot-nginx
|
||||
|
||||
# 2. Клонирование проекта
|
||||
echo "[2/7] Клонирование проекта..."
|
||||
sudo mkdir -p /opt/pressa
|
||||
git clone https://github.com/твой_репозиторий/pressa.git /opt/pressa
|
||||
cd /opt/pressa
|
||||
|
||||
# 3. Деплой
|
||||
echo "[3/7] Деплой приложения..."
|
||||
chmod +x deploy.sh
|
||||
./deploy.sh
|
||||
|
||||
# 4. Nginx
|
||||
echo "[4/7] Настройка Nginx..."
|
||||
chmod +x nginx-setup.sh
|
||||
./nginx-setup.sh
|
||||
|
||||
# 5. SSL
|
||||
echo "[5/7] Настройка SSL..."
|
||||
read -p "Есть домен? (y/N): " HAS_DOMAIN
|
||||
if [ "$HAS_DOMAIN" == "y" ] || [ "$HAS_DOMAIN" == "Y" ]; then
|
||||
read -p "Введите домен (например, example.com): " DOMAIN
|
||||
chmod +x ssl-setup.sh
|
||||
./ssl-setup.sh
|
||||
fi
|
||||
|
||||
# 6. Бэкап
|
||||
echo "[6/7] Настройка бэкапов..."
|
||||
chmod +x backup.sh
|
||||
echo "0 3 * * * /opt/pressa/deploy/backup.sh" | crontab -
|
||||
|
||||
# 7. Проверка
|
||||
echo "[7/7] Проверка..."
|
||||
sudo systemctl status pressa --no-pager -l
|
||||
|
||||
echo ""
|
||||
echo "=== Установка завершена! ==="
|
||||
echo ""
|
||||
echo "Доступ:"
|
||||
echo " - Без Nginx: http://localhost:8001"
|
||||
echo " - С Nginx: http://$(hostname -I | awk '{print $1}'):80"
|
||||
echo ""
|
||||
echo "Следующие шаги:"
|
||||
echo " 1. Отредактируй .env файл: nano /opt/pressa/.env"
|
||||
echo " 2. Заполни переменные окружения"
|
||||
echo " 3. Перезапусти сервис: sudo systemctl restart pressa"
|
||||
echo ""
|
||||
echo "Управление:"
|
||||
echo " - Статус: sudo systemctl status pressa"
|
||||
echo " - Логи: sudo journalctl -u pressa -f"
|
||||
echo " - Бэкап: sudo /opt/pressa/deploy/backup.sh"
|
||||
echo " - Восстановление: sudo /opt/pressa/deploy/restore.sh"
|
||||
@@ -0,0 +1,57 @@
|
||||
#!/bin/bash
|
||||
|
||||
# === Восстановление из бэкапа ===
|
||||
|
||||
set -e
|
||||
|
||||
BACKUP_DIR="/opt/backups"
|
||||
APP_DIR="/opt/pressa"
|
||||
|
||||
echo "=== Восстановление из бэкапа ==="
|
||||
echo ""
|
||||
echo "Доступные бэкапы:"
|
||||
ls -1 $BACKUP_DIR/pressa_*.tar.gz 2>/dev/null || echo "Бэкапы не найдены"
|
||||
|
||||
echo ""
|
||||
read -p "Введите имя файла бэкапа (например, pressa_20260827_143022.tar.gz): " BACKUP_FILE
|
||||
|
||||
if [ ! -f "$BACKUP_DIR/$BACKUP_FILE" ]; then
|
||||
echo "❌ Файл не найден: $BACKUP_DIR/$BACKUP_FILE"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "Восстановление: $BACKUP_DIR/$BACKUP_FILE"
|
||||
read -p "Продолжить? (y/N): " CONFIRM
|
||||
|
||||
if [ "$CONFIRM" != "y" ] && [ "$CONFIRM" != "Y" ]; then
|
||||
echo "Отмена"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# Остановка сервиса
|
||||
echo "Остановка сервиса..."
|
||||
sudo systemctl stop pressa
|
||||
|
||||
# Создание папки
|
||||
mkdir -p $APP_DIR/cabinet_service
|
||||
|
||||
# Восстановление базы данных
|
||||
echo "Восстановление базы данных..."
|
||||
tar -xzf $BACKUP_DIR/$BACKUP_FILE -C $APP_DIR cabinet_service/users.db
|
||||
|
||||
# Восстановление медиа
|
||||
echo "Восстановление медиа..."
|
||||
tar -xzf $BACKUP_DIR/$BACKUP_FILE -C $APP_DIR cabinet_service/media
|
||||
|
||||
# Установка прав
|
||||
echo "Установка прав..."
|
||||
sudo chown -R www-data:www-data $APP_DIR/cabinet_service
|
||||
|
||||
# Перезапуск
|
||||
echo "Перезапуск сервиса..."
|
||||
sudo systemctl start pressa
|
||||
|
||||
echo ""
|
||||
echo "✓ Восстановление завершено!"
|
||||
echo "Проверь статус: sudo systemctl status pressa"
|
||||
Reference in new issue
Block a user