Disable deployment until production server is configured

- Temporarily disable automatic deployment to prevent CI failures
- Add comprehensive production server setup documentation
- Update deployment guide with clear setup requirements
- Format manually edited code files for CI compliance
- Provide step-by-step server configuration instructions
- Enable safe CI/CD pipeline operation without deployment errors

The deployment will be re-enabled once the production server is properly set up following the new documentation.
This commit is contained in:
Stiftung Development
2025-09-06 21:17:34 +02:00
parent cc08bda714
commit 1589cff171
6 changed files with 317 additions and 64 deletions

View File

@@ -176,7 +176,7 @@ jobs:
deploy: deploy:
needs: build needs: build
runs-on: ubuntu-latest runs-on: ubuntu-latest
if: github.ref == 'refs/heads/main' if: github.ref == 'refs/heads/main' && false # Disabled until production server is set up
environment: production environment: production

View File

@@ -1,14 +1,48 @@
# Deployment Guide # Deployment Guide
## Production Deployment Status ✅ ## ⚠️ **Production Server Setup Required**
The automated deployment pipeline is now configured and ready! **IMPORTANT**: The automated deployment is currently disabled until your production server is properly configured.
### Current Status:
- ✅ CI/CD Pipeline: Fully configured
- ✅ Code Quality: Automated checks working
- ✅ Docker Images: Building successfully
- ❌ Production Server: **Needs setup** (deployment disabled)
### Required Setup Steps:
1. **Set up your production server** following the detailed guide:
📖 **[Complete Production Server Setup Guide](docs/production-server-setup.md)**
2. **Enable automatic deployment** once server is ready by editing `.github/workflows/ci-cd.yml`
### Deployment Secrets Configured: ### Deployment Secrets Configured:
-`PROD_HOST` - Production server address -`PROD_HOST` - Production server address
-`PROD_USERNAME` - SSH username (deployment) -`PROD_USERNAME` - SSH username (deployment)
-`PROD_SSH_KEY` - SSH private key for authentication -`PROD_SSH_KEY` - SSH private key for authentication
### Why Deployment is Disabled:
The CI/CD pipeline was failing because:
- `/opt/stiftung` directory doesn't exist on server
- Docker is not installed on production server
- Git repository not cloned to server
- Environment variables not configured
### Re-enabling Deployment:
After completing the server setup, edit `.github/workflows/ci-cd.yml` and change:
```yaml
if: github.ref == 'refs/heads/main' && false # Disabled until production server is set up
```
To:
```yaml
if: github.ref == 'refs/heads/main'
```
### Deployment Process: ### Deployment Process:
1. **Automatic Triggers:** 1. **Automatic Triggers:**

View File

@@ -5,24 +5,11 @@ from django.utils.html import format_html
from django.utils.safestring import mark_safe from django.utils.safestring import mark_safe
from . import models from . import models
from .models import ( from .models import (AppConfiguration, AuditLog, BackupJob, BankTransaction,
AppConfiguration, CSVImport, Destinataer, DestinataerUnterstuetzung,
AuditLog, DokumentLink, Foerderung, Land, Paechter, Person,
BackupJob, Rentmeister, StiftungsKonto, UnterstuetzungWiederkehrend,
BankTransaction, Verwaltungskosten)
CSVImport,
Destinataer,
DestinataerUnterstuetzung,
DokumentLink,
Foerderung,
Land,
Paechter,
Person,
Rentmeister,
StiftungsKonto,
UnterstuetzungWiederkehrend,
Verwaltungskosten,
)
@admin.register(CSVImport) @admin.register(CSVImport)

View File

@@ -4,22 +4,11 @@ from django import forms
from django.core.exceptions import ValidationError from django.core.exceptions import ValidationError
from django.utils import timezone from django.utils import timezone
from .models import ( from .models import (BankTransaction, Destinataer, DestinataerNotiz,
BankTransaction, DestinataerUnterstuetzung, DokumentLink, Foerderung, Land,
Destinataer, LandAbrechnung, Paechter, Person, Rentmeister,
DestinataerNotiz, StiftungsKonto, UnterstuetzungWiederkehrend,
DestinataerUnterstuetzung, Verwaltungskosten)
DokumentLink,
Foerderung,
Land,
LandAbrechnung,
Paechter,
Person,
Rentmeister,
StiftungsKonto,
UnterstuetzungWiederkehrend,
Verwaltungskosten,
)
class RentmeisterForm(forms.ModelForm): class RentmeisterForm(forms.ModelForm):

View File

@@ -11,7 +11,8 @@ from django.conf import settings
from django.contrib import messages from django.contrib import messages
from django.contrib.auth.decorators import login_required from django.contrib.auth.decorators import login_required
from django.core.paginator import Paginator from django.core.paginator import Paginator
from django.db.models import Avg, Count, DecimalField, F, IntegerField, Q, Sum, Value from django.db.models import (Avg, Count, DecimalField, F, IntegerField, Q,
Sum, Value)
from django.db.models.functions import Cast, Coalesce, NullIf, Replace from django.db.models.functions import Cast, Coalesce, NullIf, Replace
from django.http import JsonResponse from django.http import JsonResponse
from django.shortcuts import get_object_or_404, redirect, render from django.shortcuts import get_object_or_404, redirect, render
@@ -20,20 +21,10 @@ from django.views.decorators.csrf import csrf_exempt
from rest_framework.decorators import api_view from rest_framework.decorators import api_view
from rest_framework.response import Response from rest_framework.response import Response
from .models import ( from .models import (AppConfiguration, CSVImport, Destinataer,
AppConfiguration, DestinataerUnterstuetzung, DokumentLink, Foerderung, Land,
CSVImport, LandAbrechnung, LandVerpachtung, Paechter, Person,
Destinataer, UnterstuetzungWiederkehrend)
DestinataerUnterstuetzung,
DokumentLink,
Foerderung,
Land,
LandAbrechnung,
LandVerpachtung,
Paechter,
Person,
UnterstuetzungWiederkehrend,
)
def get_pdf_generator(): def get_pdf_generator():
@@ -220,18 +211,10 @@ def gramps_debug_api(_request):
from stiftung.models import DestinataerNotiz, DestinataerUnterstuetzung from stiftung.models import DestinataerNotiz, DestinataerUnterstuetzung
from .forms import ( from .forms import (DestinataerForm, DestinataerNotizForm,
DestinataerForm, DestinataerUnterstuetzungForm, DokumentLinkForm,
DestinataerNotizForm, FoerderungForm, LandForm, PaechterForm, PersonForm,
DestinataerUnterstuetzungForm, UnterstuetzungForm, UnterstuetzungMarkAsPaidForm)
DokumentLinkForm,
FoerderungForm,
LandForm,
PaechterForm,
PersonForm,
UnterstuetzungForm,
UnterstuetzungMarkAsPaidForm,
)
def home(request): def home(request):

View File

@@ -0,0 +1,260 @@
# Production Server Setup Guide
This guide will help you set up your production server for automated deployment from GitHub Actions.
## Prerequisites
- A Linux server (Ubuntu 20.04+ recommended)
- SSH access to the server
- Domain name pointing to your server (optional)
## Step 1: Connect to Your Server
```bash
ssh your-username@your-server-ip
```
## Step 2: Update System
```bash
sudo apt update && sudo apt upgrade -y
```
## Step 3: Install Docker and Docker Compose
```bash
# Install Docker
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
# Add your user to docker group
sudo usermod -aG docker $USER
# Install Docker Compose
sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
# Logout and login again to apply group changes
exit
# Then reconnect via SSH
```
## Step 4: Install Git
```bash
sudo apt install git -y
```
## Step 5: Set Up Project Directory
```bash
# Create project directory
sudo mkdir -p /opt/stiftung
sudo chown $USER:$USER /opt/stiftung
cd /opt/stiftung
# Clone your repository
git clone https://github.com/remmerinio/stiftung-management-system.git .
# Copy environment template
cp env-template.txt app/.env
```
## Step 6: Configure Environment Variables
Edit the production environment file:
```bash
nano app/.env
```
Add these settings (replace with your actual values):
```env
# Django Settings
DJANGO_DEBUG=0
DJANGO_SECRET_KEY=your-very-long-secret-key-here
DJANGO_ALLOWED_HOSTS=your-domain.com,your-server-ip
# Database Settings
POSTGRES_DB=stiftung_prod
POSTGRES_USER=stiftung_user
POSTGRES_PASSWORD=your-secure-database-password
# Redis Settings
REDIS_URL=redis://redis:6379/0
# Email Settings (optional)
EMAIL_HOST=smtp.your-provider.com
EMAIL_PORT=587
EMAIL_HOST_USER=your-email@example.com
EMAIL_HOST_PASSWORD=your-email-password
EMAIL_USE_TLS=1
```
## Step 7: Set Up Production Docker Compose
Copy the production Docker Compose file to the project root:
```bash
cp deploy-production/docker-compose.prod.yml .
```
## Step 8: Generate Strong Secret Key
```bash
python3 -c "from django.core.management.utils import get_random_secret_key; print(get_random_secret_key())"
```
Use this output as your `DJANGO_SECRET_KEY` in the `.env` file.
## Step 9: Set Up SSL/HTTPS (Recommended)
If you have a domain name, set up SSL certificates:
```bash
# Install Certbot
sudo apt install snapd
sudo snap install core; sudo snap refresh core
sudo snap install --classic certbot
# Create certificate
sudo certbot certonly --standalone -d your-domain.com
# The certificates will be in /etc/letsencrypt/live/your-domain.com/
```
## Step 10: Configure Firewall
```bash
# Enable firewall
sudo ufw enable
# Allow SSH
sudo ufw allow ssh
# Allow HTTP and HTTPS
sudo ufw allow 80
sudo ufw allow 443
# Check status
sudo ufw status
```
## Step 11: Initial Deployment
Run the first deployment manually:
```bash
cd /opt/stiftung
# Build and start containers
docker-compose -f docker-compose.prod.yml up -d --build
# Run initial migrations
docker-compose -f docker-compose.prod.yml exec web python manage.py migrate
# Create superuser
docker-compose -f docker-compose.prod.yml exec web python manage.py createsuperuser
# Collect static files
docker-compose -f docker-compose.prod.yml exec web python manage.py collectstatic --noinput
```
## Step 12: Test the Deployment
Visit your server IP or domain name to verify the application is running.
## Step 13: Enable Automatic Deployment
Once your server is properly set up, you can enable automatic deployment by editing `.github/workflows/ci-cd.yml`:
Change this line:
```yaml
if: github.ref == 'refs/heads/main' && false # Disabled until production server is set up
```
To:
```yaml
if: github.ref == 'refs/heads/main'
```
## Troubleshooting
### If deployment fails:
1. **Check Docker status:**
```bash
sudo systemctl status docker
```
2. **Check container logs:**
```bash
docker-compose -f docker-compose.prod.yml logs
```
3. **Restart services:**
```bash
docker-compose -f docker-compose.prod.yml restart
```
### Common Issues:
- **Permission denied**: Make sure your user is in the docker group
- **Port conflicts**: Check if ports 80/443 are already in use
- **Database connection**: Verify your database settings in `.env`
- **Static files**: Ensure the web server can access static files
## Monitoring and Maintenance
### Check application status:
```bash
docker-compose -f docker-compose.prod.yml ps
```
### View logs:
```bash
docker-compose -f docker-compose.prod.yml logs -f web
```
### Update the application:
```bash
cd /opt/stiftung
git pull origin main
docker-compose -f docker-compose.prod.yml pull
docker-compose -f docker-compose.prod.yml up -d
```
### Backup database:
```bash
docker-compose -f docker-compose.prod.yml exec db pg_dump -U stiftung_user stiftung_prod > backup_$(date +%Y%m%d_%H%M%S).sql
```
## Security Recommendations
1. **Keep system updated:**
```bash
sudo apt update && sudo apt upgrade -y
```
2. **Use strong passwords** for database and admin accounts
3. **Enable fail2ban** to prevent brute force attacks:
```bash
sudo apt install fail2ban
```
4. **Regular backups** of your database and media files
5. **Monitor logs** for suspicious activity
## Next Steps
After completing this setup:
1. Test the deployment pipeline by making a commit to the main branch
2. Set up monitoring and alerting for your application
3. Configure regular automated backups
4. Set up a staging environment for testing
Your production server is now ready for automated deployment from GitHub Actions!