This commit is contained in:
Leonid Pershin
2025-10-17 05:54:32 +03:00
parent e549d1f68e
commit 566db308b3
3 changed files with 345 additions and 1 deletions

View File

@@ -0,0 +1,32 @@
name: Auto Deploy
on:
workflow_run:
workflows: ["Deploy"]
types: [completed]
branches: [master]
jobs:
auto-deploy:
if: ${{ github.event.workflow_run.conclusion == 'success' }}
runs-on: ubuntu-latest
steps:
- name: Download deployment package
uses: actions/download-artifact@v3
with:
name: chatbot-deployment
path: ./deployment
- name: Deploy to server
uses: appleboy/ssh-action@v1.0.3
with:
host: ${{ secrets.SERVER_HOST }}
username: ${{ secrets.SERVER_USER }}
key: ${{ secrets.SERVER_SSH_KEY }}
script: |
cd /tmp
wget ${{ github.event.workflow_run.artifacts_url }}
tar -xzf chatbot-deployment-*.tar.gz
sudo ./deploy.sh
echo "Deployment completed successfully!"

312
.gitea/workflows/deploy.yml Normal file
View File

@@ -0,0 +1,312 @@
name: Deploy
on:
push:
branches:
- master
workflow_dispatch:
jobs:
deploy:
name: Deploy to Production
runs-on: ubuntu-latest
environment: production
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Setup .NET
uses: actions/setup-dotnet@v4
with:
dotnet-version: '9.0.x'
- name: Restore dependencies
run: dotnet restore --verbosity normal
- name: Build application
run: dotnet build --no-restore --configuration Release --verbosity normal
- name: Publish application
run: dotnet publish ChatBot/ChatBot.csproj --configuration Release --output ./publish --verbosity normal
- name: Create deployment package
run: |
mkdir -p ./deployment
cp -r ./publish/* ./deployment/
cp -r ./ChatBot/Prompts ./deployment/
cp ./ChatBot/appsettings.json ./deployment/
cp ./ChatBot/appsettings.Production.json ./deployment/ 2>/dev/null || echo "Production config not found, using default"
# Create deployment script
cat > ./deployment/deploy.sh << 'EOF'
#!/bin/bash
set -e
echo "Starting ChatBot deployment..."
# Stop existing service if running
sudo systemctl stop chatbot || echo "Service not running"
# Backup current version
if [ -d "/opt/chatbot" ]; then
sudo mv /opt/chatbot /opt/chatbot.backup.$(date +%Y%m%d_%H%M%S)
fi
# Create application directory
sudo mkdir -p /opt/chatbot
# Copy new files
sudo cp -r ./* /opt/chatbot/
# Set permissions
sudo chown -R chatbot:chatbot /opt/chatbot
sudo chmod +x /opt/chatbot/ChatBot
# Start service
sudo systemctl start chatbot
sudo systemctl enable chatbot
echo "Deployment completed successfully!"
EOF
chmod +x ./deployment/deploy.sh
# Create systemd service file
cat > ./deployment/chatbot.service << 'EOF'
[Unit]
Description=ChatBot Telegram Service
After=network.target postgresql.service
Wants=postgresql.service
[Service]
Type=notify
User=chatbot
Group=chatbot
WorkingDirectory=/opt/chatbot
ExecStart=/opt/chatbot/ChatBot
Restart=always
RestartSec=10
Environment=ASPNETCORE_ENVIRONMENT=Production
Environment=ASPNETCORE_URLS=http://localhost:5000
# Environment variables (set these in /etc/systemd/system/chatbot.service.d/override.conf)
# Environment=TELEGRAM_BOT_TOKEN=your_bot_token
# Environment=OLLAMA_URL=http://localhost:11434
# Environment=OLLAMA_DEFAULT_MODEL=llama3.2
# Environment=DB_HOST=localhost
# Environment=DB_PORT=5432
# Environment=DB_NAME=chatbot
# Environment=DB_USER=postgres
# Environment=DB_PASSWORD=your_password
[Install]
WantedBy=multi-user.target
EOF
# Create Docker Compose file for easy deployment
cat > ./deployment/docker-compose.yml << 'EOF'
version: '3.8'
services:
chatbot:
build: .
container_name: chatbot
restart: unless-stopped
environment:
- ASPNETCORE_ENVIRONMENT=Production
- TELEGRAM_BOT_TOKEN=${TELEGRAM_BOT_TOKEN}
- OLLAMA_URL=${OLLAMA_URL:-http://ollama:11434}
- OLLAMA_DEFAULT_MODEL=${OLLAMA_DEFAULT_MODEL:-llama3.2}
- DB_HOST=postgres
- DB_PORT=5432
- DB_NAME=${DB_NAME:-chatbot}
- DB_USER=${DB_USER:-postgres}
- DB_PASSWORD=${DB_PASSWORD}
depends_on:
- postgres
- ollama
networks:
- chatbot-network
postgres:
image: postgres:15-alpine
container_name: chatbot-postgres
restart: unless-stopped
environment:
- POSTGRES_DB=${DB_NAME:-chatbot}
- POSTGRES_USER=${DB_USER:-postgres}
- POSTGRES_PASSWORD=${DB_PASSWORD}
volumes:
- postgres_data:/var/lib/postgresql/data
- ./init.sql:/docker-entrypoint-initdb.d/init.sql
networks:
- chatbot-network
ollama:
image: ollama/ollama:latest
container_name: chatbot-ollama
restart: unless-stopped
volumes:
- ollama_data:/root/.ollama
networks:
- chatbot-network
ports:
- "11434:11434"
volumes:
postgres_data:
ollama_data:
networks:
chatbot-network:
driver: bridge
EOF
# Create Dockerfile
cat > ./deployment/Dockerfile << 'EOF'
FROM mcr.microsoft.com/dotnet/aspnet:9.0 AS base
WORKDIR /app
EXPOSE 8080
EXPOSE 8081
FROM mcr.microsoft.com/dotnet/sdk:9.0 AS build
WORKDIR /src
COPY ["ChatBot/ChatBot.csproj", "ChatBot/"]
RUN dotnet restore "ChatBot/ChatBot.csproj"
COPY . .
WORKDIR "/src/ChatBot"
RUN dotnet build "ChatBot.csproj" -c Release -o /app/build
FROM build AS publish
RUN dotnet publish "ChatBot.csproj" -c Release -o /app/publish /p:UseAppHost=false
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
COPY --from=publish /src/ChatBot/Prompts ./Prompts
ENTRYPOINT ["dotnet", "ChatBot.dll"]
EOF
# Create .env.example file
cat > ./deployment/.env.example << 'EOF'
# Telegram Bot Configuration
TELEGRAM_BOT_TOKEN=your_telegram_bot_token_here
# Ollama Configuration
OLLAMA_URL=http://localhost:11434
OLLAMA_DEFAULT_MODEL=llama3.2
# Database Configuration
DB_HOST=localhost
DB_PORT=5432
DB_NAME=chatbot
DB_USER=postgres
DB_PASSWORD=your_secure_password_here
EOF
# Create README for deployment
cat > ./deployment/README.md << 'EOF'
# ChatBot Deployment
## System Requirements
- Ubuntu 20.04+ or similar Linux distribution
- .NET 9.0 Runtime
- PostgreSQL 12+
- Ollama (for AI functionality)
## Deployment Options
### Option 1: Direct Deployment (Recommended for VPS)
1. Copy all files to your server
2. Install dependencies:
```bash
sudo apt update
sudo apt install -y postgresql postgresql-contrib
sudo apt install -y dotnet-runtime-9.0
curl -fsSL https://ollama.ai/install.sh | sh
```
3. Create chatbot user:
```bash
sudo useradd -r -s /bin/false chatbot
```
4. Set up environment variables in systemd override:
```bash
sudo mkdir -p /etc/systemd/system/chatbot.service.d
sudo nano /etc/systemd/system/chatbot.service.d/override.conf
```
5. Run deployment script:
```bash
sudo ./deploy.sh
```
### Option 2: Docker Deployment
1. Install Docker and Docker Compose
2. Copy .env.example to .env and configure
3. Run:
```bash
docker-compose up -d
```
## Configuration
Set the following environment variables:
- TELEGRAM_BOT_TOKEN: Your Telegram bot token
- OLLAMA_URL: Ollama server URL (default: http://localhost:11434)
- OLLAMA_DEFAULT_MODEL: Model to use (default: llama3.2)
- DB_*: Database connection settings
## Health Checks
The application includes health checks at:
- /health/ollama
- /health/telegram
- /health (overall)
EOF
- name: Create deployment archive
run: |
cd deployment
tar -czf ../chatbot-deployment-$(date +%Y%m%d_%H%M%S).tar.gz .
cd ..
ls -la *.tar.gz
- name: Upload deployment artifacts
uses: actions/upload-artifact@v3
with:
name: chatbot-deployment
path: |
./deployment/
./chatbot-deployment-*.tar.gz
retention-days: 30
- name: Create release
if: github.ref == 'refs/heads/master'
uses: softprops/action-gh-release@v1
with:
tag_name: v${{ github.run_number }}
name: ChatBot Release v${{ github.run_number }}
body: |
## ChatBot Release v${{ github.run_number }}
### Changes
- Automated deployment package
- Includes Docker and systemd deployment options
- Ready for production deployment
### Deployment
1. Download the deployment package
2. Follow instructions in README.md
3. Configure environment variables
4. Deploy using your preferred method
### Files Included
- Application binaries
- Docker configuration
- Systemd service file
- Deployment scripts
- Documentation
files: |
./chatbot-deployment-*.tar.gz
draft: false
prerelease: false

View File

@@ -41,7 +41,7 @@ jobs:
- name: Upload test results - name: Upload test results
if: always() if: always()
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@v3
with: with:
name: test-results name: test-results
path: ./TestResults/ path: ./TestResults/