Aniworld/docs/deployment.md
2025-10-22 11:30:04 +02:00

773 lines
15 KiB
Markdown

# Aniworld Deployment Guide
Complete deployment guide for the Aniworld Download Manager application.
## Table of Contents
1. [System Requirements](#system-requirements)
2. [Pre-Deployment Checklist](#pre-deployment-checklist)
3. [Local Development Setup](#local-development-setup)
4. [Production Deployment](#production-deployment)
5. [Docker Deployment](#docker-deployment)
6. [Configuration](#configuration)
7. [Database Setup](#database-setup)
8. [Security Considerations](#security-considerations)
9. [Monitoring & Maintenance](#monitoring--maintenance)
10. [Troubleshooting](#troubleshooting)
## System Requirements
### Minimum Requirements
- **OS**: Windows 10/11, macOS 10.14+, Ubuntu 20.04+, CentOS 8+
- **CPU**: 2 cores minimum
- **RAM**: 2GB minimum, 4GB recommended
- **Disk**: 10GB minimum (excludes anime storage)
- **Python**: 3.10 or higher
- **Browser**: Chrome 90+, Firefox 88+, Safari 14+, Edge 90+
### Recommended Production Setup
- **OS**: Ubuntu 20.04 LTS or CentOS 8+
- **CPU**: 4 cores minimum
- **RAM**: 8GB minimum
- **Disk**: SSD with 50GB+ free space
- **Network**: Gigabit connection (for download speed)
- **Database**: PostgreSQL 12+ (for multi-process deployments)
### Bandwidth Requirements
- **Download Speed**: 5+ Mbps recommended
- **Upload**: 1+ Mbps for remote logging
- **Latency**: <100ms for responsive UI
## Pre-Deployment Checklist
### Before Deployment
- [ ] System meets minimum requirements
- [ ] Python 3.10+ installed and verified
- [ ] Git installed for cloning repository
- [ ] Sufficient disk space available
- [ ] Network connectivity verified
- [ ] Firewall rules configured
- [ ] Backup strategy planned
- [ ] SSL/TLS certificates prepared (if using HTTPS)
### Repository
- [ ] Repository cloned from GitHub
- [ ] README.md reviewed
- [ ] LICENSE checked
- [ ] CONTRIBUTING.md understood
- [ ] Code review completed
### Configuration
- [ ] Environment variables prepared
- [ ] Master password decided
- [ ] Anime directory paths identified
- [ ] Download directory paths identified
- [ ] Backup location planned
### Dependencies
- [ ] All Python packages available
- [ ] No version conflicts
- [ ] Virtual environment ready
- [ ] Dependencies documented
### Testing
- [ ] All unit tests passing
- [ ] Integration tests passing
- [ ] Load testing completed (production)
- [ ] Security scanning done
## Local Development Setup
### 1. Clone Repository
```bash
git clone https://github.com/your-repo/aniworld.git
cd aniworld
```
### 2. Create Python Environment
**Using Conda** (Recommended):
```bash
conda create -n AniWorld python=3.10
conda activate AniWorld
```
**Using venv**:
```bash
python3.10 -m venv venv
source venv/bin/activate # On Windows: venv\Scripts\activate
```
### 3. Install Dependencies
```bash
pip install -r requirements.txt
```
### 4. Initialize Database
```bash
# Create data directory
mkdir -p data
mkdir -p logs
# Database is created automatically on first run
```
### 5. Configure Application
Create `.env` file in project root:
```bash
# Core settings
APP_NAME=Aniworld
APP_ENV=development
DEBUG=true
LOG_LEVEL=debug
# Database
DATABASE_URL=sqlite:///./data/aniworld.db
# Server
HOST=127.0.0.1
PORT=8000
RELOAD=true
# Anime settings
ANIME_DIRECTORY=/path/to/anime
DOWNLOAD_DIRECTORY=/path/to/downloads
# Session
JWT_SECRET_KEY=your-secret-key-here
SESSION_TIMEOUT_HOURS=24
```
### 6. Run Application
```bash
python -m uvicorn src.server.fastapi_app:app --host 127.0.0.1 --port 8000 --reload
```
### 7. Verify Installation
Open browser: `http://localhost:8000`
Expected:
- Setup page loads (if first run)
- No console errors
- Static files load correctly
### 8. Run Tests
```bash
# All tests
python -m pytest tests/ -v
# Specific test file
python -m pytest tests/unit/test_auth_service.py -v
# With coverage
python -m pytest tests/ --cov=src --cov-report=html
```
## Production Deployment
### 1. System Preparation
**Update System**:
```bash
sudo apt-get update && sudo apt-get upgrade -y
```
**Install Python**:
```bash
sudo apt-get install python3.10 python3.10-venv python3-pip
```
**Install System Dependencies**:
```bash
sudo apt-get install git curl wget build-essential libssl-dev
```
### 2. Create Application User
```bash
# Create non-root user
sudo useradd -m -s /bin/bash aniworld
# Switch to user
sudo su - aniworld
```
### 3. Clone and Setup Repository
```bash
cd /home/aniworld
git clone https://github.com/your-repo/aniworld.git
cd aniworld
```
### 4. Create Virtual Environment
```bash
python3.10 -m venv venv
source venv/bin/activate
```
### 5. Install Dependencies
```bash
pip install --upgrade pip
pip install -r requirements.txt
pip install gunicorn uvicorn
```
### 6. Configure Production Environment
Create `.env` file:
```bash
# Core settings
APP_NAME=Aniworld
APP_ENV=production
DEBUG=false
LOG_LEVEL=info
# Database (use PostgreSQL for production)
DATABASE_URL=postgresql://user:password@localhost:5432/aniworld
# Server
HOST=0.0.0.0
PORT=8000
WORKERS=4
# Anime settings
ANIME_DIRECTORY=/var/aniworld/anime
DOWNLOAD_DIRECTORY=/var/aniworld/downloads
CACHE_DIRECTORY=/var/aniworld/cache
# Session
JWT_SECRET_KEY=$(python -c 'import secrets; print(secrets.token_urlsafe(32))')
SESSION_TIMEOUT_HOURS=24
# Security
ALLOWED_HOSTS=yourdomain.com,www.yourdomain.com
CORS_ORIGINS=https://yourdomain.com
# SSL (if using HTTPS)
SSL_KEYFILE=/path/to/key.pem
SSL_CERTFILE=/path/to/cert.pem
```
### 7. Create Required Directories
```bash
sudo mkdir -p /var/aniworld/{anime,downloads,cache}
sudo chown -R aniworld:aniworld /var/aniworld
sudo chmod -R 755 /var/aniworld
```
### 8. Setup Systemd Service
Create `/etc/systemd/system/aniworld.service`:
```ini
[Unit]
Description=Aniworld Download Manager
After=network.target
[Service]
Type=notify
User=aniworld
WorkingDirectory=/home/aniworld/aniworld
Environment="PATH=/home/aniworld/aniworld/venv/bin"
ExecStart=/home/aniworld/aniworld/venv/bin/gunicorn \
-w 4 \
-k uvicorn.workers.UvicornWorker \
--bind 0.0.0.0:8000 \
--timeout 120 \
--access-logfile - \
--error-logfile - \
src.server.fastapi_app:app
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target
```
### 9. Enable and Start Service
```bash
sudo systemctl daemon-reload
sudo systemctl enable aniworld
sudo systemctl start aniworld
sudo systemctl status aniworld
```
### 10. Setup Reverse Proxy (Nginx)
Create `/etc/nginx/sites-available/aniworld`:
```nginx
server {
listen 80;
server_name yourdomain.com;
# Redirect to HTTPS
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
server_name yourdomain.com;
ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem;
# Security headers
add_header Strict-Transport-Security "max-age=31536000" always;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
# Proxy settings
location / {
proxy_pass http://127.0.0.1:8000;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
# WebSocket settings
location /ws/ {
proxy_pass http://127.0.0.1:8000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_read_timeout 86400;
}
}
```
Enable site:
```bash
sudo ln -s /etc/nginx/sites-available/aniworld /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl restart nginx
```
### 11. Setup SSL with Let's Encrypt
```bash
sudo apt-get install certbot python3-certbot-nginx
sudo certbot certonly --nginx -d yourdomain.com
```
### 12. Configure Firewall
```bash
sudo ufw allow 22/tcp # SSH
sudo ufw allow 80/tcp # HTTP
sudo ufw allow 443/tcp # HTTPS
sudo ufw enable
```
## Docker Deployment
### 1. Build Docker Image
Create `Dockerfile`:
```dockerfile
FROM python:3.10-slim
WORKDIR /app
# Install system dependencies
RUN apt-get update && apt-get install -y \
gcc \
&& rm -rf /var/lib/apt/lists/*
# Copy requirements
COPY requirements.txt .
# Install Python dependencies
RUN pip install --no-cache-dir -r requirements.txt
# Copy application
COPY . .
# Expose port
EXPOSE 8000
# Health check
HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \
CMD python -c "import urllib.request; urllib.request.urlopen('http://localhost:8000/health')"
# Run application
CMD ["uvicorn", "src.server.fastapi_app:app", "--host", "0.0.0.0", "--port", "8000"]
```
Build image:
```bash
docker build -t aniworld:1.0.0 .
```
### 2. Docker Compose
Create `docker-compose.yml`:
```yaml
version: "3.8"
services:
aniworld:
image: aniworld:1.0.0
container_name: aniworld
ports:
- "8000:8000"
volumes:
- ./data:/app/data
- /path/to/anime:/var/anime
- /path/to/downloads:/var/downloads
environment:
- DATABASE_URL=sqlite:///./data/aniworld.db
- ANIME_DIRECTORY=/var/anime
- DOWNLOAD_DIRECTORY=/var/downloads
- LOG_LEVEL=info
restart: unless-stopped
networks:
- aniworld-net
nginx:
image: nginx:alpine
container_name: aniworld-nginx
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf:ro
- ./ssl:/etc/nginx/ssl:ro
depends_on:
- aniworld
restart: unless-stopped
networks:
- aniworld-net
networks:
aniworld-net:
driver: bridge
```
### 3. Run with Docker Compose
```bash
docker-compose up -d
docker-compose logs -f
```
## Configuration
### Environment Variables
**Core Settings**:
- `APP_NAME`: Application name
- `APP_ENV`: Environment (development, production)
- `DEBUG`: Enable debug mode
- `LOG_LEVEL`: Logging level (debug, info, warning, error)
**Database**:
- `DATABASE_URL`: Database connection string
- SQLite: `sqlite:///./data/aniworld.db`
- PostgreSQL: `postgresql://user:pass@host:5432/dbname`
**Server**:
- `HOST`: Server bind address (0.0.0.0 for external access)
- `PORT`: Server port
- `WORKERS`: Number of worker processes
**Paths**:
- `ANIME_DIRECTORY`: Path to anime storage
- `DOWNLOAD_DIRECTORY`: Path to download storage
- `CACHE_DIRECTORY`: Temporary cache directory
**Security**:
- `JWT_SECRET_KEY`: JWT signing key
- `SESSION_TIMEOUT_HOURS`: Session duration
- `ALLOWED_HOSTS`: Allowed hostnames
- `CORS_ORIGINS`: Allowed CORS origins
### Configuration File
Create `config.json` in data directory:
```json
{
"version": "1.0.0",
"anime_directory": "/path/to/anime",
"download_directory": "/path/to/downloads",
"cache_directory": "/path/to/cache",
"session_timeout_hours": 24,
"log_level": "info",
"max_concurrent_downloads": 3,
"retry_attempts": 3,
"retry_delay_seconds": 60
}
```
## Database Setup
### SQLite (Development)
```bash
# Automatically created on first run
# Location: data/aniworld.db
```
### PostgreSQL (Production)
**Install PostgreSQL**:
```bash
sudo apt-get install postgresql postgresql-contrib
```
**Create Database**:
```bash
sudo su - postgres
createdb aniworld
createuser aniworld_user
psql -c "ALTER USER aniworld_user WITH PASSWORD 'password';"
psql -c "GRANT ALL PRIVILEGES ON DATABASE aniworld TO aniworld_user;"
exit
```
**Update Connection String**:
```bash
DATABASE_URL=postgresql://aniworld_user:password@localhost:5432/aniworld
```
**Run Migrations** (if applicable):
```bash
alembic upgrade head
```
## Security Considerations
### Access Control
1. **Master Password**: Use strong, complex password
2. **User Permissions**: Run app with minimal required permissions
3. **Firewall**: Restrict access to necessary ports only
4. **SSL/TLS**: Always use HTTPS in production
### Data Protection
1. **Encryption**: Encrypt JWT secrets and sensitive data
2. **Backups**: Regular automated backups
3. **Audit Logging**: Enable comprehensive logging
4. **Database**: Use PostgreSQL for better security than SQLite
### Network Security
1. **HTTPS**: Use SSL/TLS certificates
2. **CORS**: Configure appropriate CORS origins
3. **Rate Limiting**: Enable rate limiting on all endpoints
4. **WAF**: Consider Web Application Firewall
### Secrets Management
1. **Environment Variables**: Use .env for secrets
2. **Secret Store**: Use tools like HashiCorp Vault
3. **Rotation**: Regularly rotate JWT secrets
4. **Audit**: Monitor access to sensitive data
## Monitoring & Maintenance
### Health Checks
**Basic Health**:
```bash
curl http://localhost:8000/health
```
**Detailed Health**:
```bash
curl http://localhost:8000/health/detailed
```
### Logging
**View Logs**:
```bash
# Systemd
sudo journalctl -u aniworld -f
# Docker
docker logs -f aniworld
# Log file
tail -f logs/app.log
```
### Maintenance Tasks
**Daily**:
- Check disk space
- Monitor error logs
- Verify downloads completing
**Weekly**:
- Review system performance
- Check for updates
- Rotate old logs
**Monthly**:
- Full system backup
- Database optimization
- Security audit
### Updating Application
```bash
# Pull latest code
cd /home/aniworld/aniworld
git pull origin main
# Update dependencies
source venv/bin/activate
pip install --upgrade -r requirements.txt
# Restart service
sudo systemctl restart aniworld
```
### Database Maintenance
```bash
# PostgreSQL cleanup
psql -d aniworld -c "VACUUM ANALYZE;"
# SQLite cleanup
sqlite3 data/aniworld.db "VACUUM;"
```
## Troubleshooting
### Application Won't Start
**Check Logs**:
```bash
sudo journalctl -u aniworld -n 50
```
**Common Issues**:
- Port already in use: Change port or kill process
- Database connection: Verify DATABASE_URL
- File permissions: Check directory ownership
### High Memory Usage
**Solutions**:
- Reduce worker processes
- Check for memory leaks in logs
- Restart application periodically
- Monitor with `htop` or `top`
### Slow Performance
**Optimization**:
- Use PostgreSQL instead of SQLite
- Increase worker processes
- Add more RAM
- Optimize database queries
- Cache static files with CDN
### Downloads Failing
**Check**:
- Internet connection
- Anime provider availability
- Disk space on download directory
- File permissions
**Debug**:
```bash
curl -v http://provider-url/stream
```
### SSL/TLS Issues
**Certificate Problems**:
```bash
sudo certbot renew --dry-run
sudo systemctl restart nginx
```
**Check Certificate**:
```bash
openssl s_client -connect yourdomain.com:443
```
---
## Support
For additional help:
1. Check [User Guide](./user_guide.md)
2. Review [API Reference](./api_reference.md)
3. Check application logs
4. File issue on GitHub
---
**Last Updated**: October 22, 2025
**Version**: 1.0.0