686 lines
14 KiB
Markdown
686 lines
14 KiB
Markdown
# AniWorld Installation and Setup Guide
|
|
|
|
This comprehensive guide will help you install, configure, and deploy the AniWorld anime downloading and management application.
|
|
|
|
## Table of Contents
|
|
|
|
1. [Quick Start with Docker](#quick-start-with-docker)
|
|
2. [Manual Installation](#manual-installation)
|
|
3. [Configuration](#configuration)
|
|
4. [Running the Application](#running-the-application)
|
|
5. [Monitoring and Health Checks](#monitoring-and-health-checks)
|
|
6. [Backup and Maintenance](#backup-and-maintenance)
|
|
7. [Troubleshooting](#troubleshooting)
|
|
8. [Advanced Deployment](#advanced-deployment)
|
|
|
|
## Quick Start with Docker
|
|
|
|
The easiest way to get AniWorld running is using Docker Compose.
|
|
|
|
### Prerequisites
|
|
|
|
- Docker Engine 20.10+
|
|
- Docker Compose 2.0+
|
|
- At least 2GB RAM
|
|
- 10GB disk space (minimum)
|
|
|
|
### Installation Steps
|
|
|
|
1. **Clone the Repository**
|
|
```bash
|
|
git clone <repository-url>
|
|
cd Aniworld
|
|
```
|
|
|
|
2. **Create Environment File**
|
|
```bash
|
|
cp .env.example .env
|
|
```
|
|
|
|
3. **Configure Environment Variables**
|
|
Edit `.env` file:
|
|
```env
|
|
# Required Settings
|
|
ANIME_DIRECTORY=/path/to/your/anime/collection
|
|
MASTER_PASSWORD=your_secure_password
|
|
|
|
# Optional Settings
|
|
WEB_PORT=5000
|
|
HTTP_PORT=80
|
|
HTTPS_PORT=443
|
|
GRAFANA_PASSWORD=grafana_admin_password
|
|
|
|
# VPN Settings (if using)
|
|
WG_CONFIG_PATH=/path/to/wireguard/config
|
|
```
|
|
|
|
4. **Start the Application**
|
|
```bash
|
|
# Basic deployment
|
|
docker-compose up -d
|
|
|
|
# With monitoring
|
|
docker-compose --profile monitoring up -d
|
|
|
|
# With VPN
|
|
docker-compose --profile vpn up -d
|
|
|
|
# Full deployment with all services
|
|
docker-compose --profile monitoring --profile vpn up -d
|
|
```
|
|
|
|
5. **Access the Application**
|
|
- Web Interface: http://localhost:5000
|
|
- Grafana Monitoring: http://localhost:3000 (if monitoring profile enabled)
|
|
|
|
### Environment File (.env) Template
|
|
|
|
Create a `.env` file in the root directory:
|
|
|
|
```env
|
|
# Core Application Settings
|
|
ANIME_DIRECTORY=/data/anime
|
|
MASTER_PASSWORD=change_this_secure_password
|
|
DATABASE_PATH=/app/data/aniworld.db
|
|
LOG_LEVEL=INFO
|
|
|
|
# Web Server Configuration
|
|
WEB_PORT=5000
|
|
WEB_HOST=0.0.0.0
|
|
FLASK_ENV=production
|
|
|
|
# Reverse Proxy Configuration
|
|
HTTP_PORT=80
|
|
HTTPS_PORT=443
|
|
|
|
# Monitoring (optional)
|
|
GRAFANA_PASSWORD=admin_password
|
|
|
|
# VPN Configuration (optional)
|
|
WG_CONFIG_PATH=/path/to/wg0.conf
|
|
|
|
# Performance Settings
|
|
MAX_DOWNLOAD_WORKERS=4
|
|
MAX_SPEED_MBPS=100
|
|
CACHE_SIZE_MB=512
|
|
|
|
# Security Settings
|
|
SESSION_TIMEOUT=86400
|
|
MAX_LOGIN_ATTEMPTS=5
|
|
```
|
|
|
|
## Manual Installation
|
|
|
|
### System Requirements
|
|
|
|
- Python 3.10 or higher
|
|
- SQLite 3.35+
|
|
- 4GB RAM (recommended)
|
|
- 20GB disk space (recommended)
|
|
|
|
### Installation Steps
|
|
|
|
1. **Install System Dependencies**
|
|
|
|
**Ubuntu/Debian:**
|
|
```bash
|
|
sudo apt update
|
|
sudo apt install python3 python3-pip python3-venv sqlite3 curl wget
|
|
```
|
|
|
|
**CentOS/RHEL:**
|
|
```bash
|
|
sudo yum install python3 python3-pip sqlite curl wget
|
|
```
|
|
|
|
**Windows:**
|
|
- Install Python 3.10+ from python.org
|
|
- Install SQLite from sqlite.org
|
|
- Install Git for Windows
|
|
|
|
2. **Clone and Setup**
|
|
```bash
|
|
git clone <repository-url>
|
|
cd Aniworld
|
|
|
|
# Create virtual environment
|
|
python3 -m venv aniworld-env
|
|
|
|
# Activate virtual environment
|
|
source aniworld-env/bin/activate # Linux/Mac
|
|
aniworld-env\Scripts\activate # Windows
|
|
|
|
# Install Python dependencies
|
|
pip install -r requirements.txt
|
|
```
|
|
|
|
3. **Create Configuration**
|
|
```bash
|
|
cp src/server/config.py.example src/server/config.py
|
|
```
|
|
|
|
4. **Configure Application**
|
|
Edit `src/server/config.py`:
|
|
```python
|
|
import os
|
|
|
|
class Config:
|
|
# Core settings
|
|
anime_directory = os.getenv('ANIME_DIRECTORY', '/path/to/anime')
|
|
master_password = os.getenv('MASTER_PASSWORD', 'change_me')
|
|
database_path = os.getenv('DATABASE_PATH', './data/aniworld.db')
|
|
|
|
# Web server settings
|
|
host = os.getenv('WEB_HOST', '127.0.0.1')
|
|
port = int(os.getenv('WEB_PORT', 5000))
|
|
debug = os.getenv('FLASK_DEBUG', 'False').lower() == 'true'
|
|
|
|
# Performance settings
|
|
max_workers = int(os.getenv('MAX_DOWNLOAD_WORKERS', 4))
|
|
max_speed_mbps = int(os.getenv('MAX_SPEED_MBPS', 100))
|
|
```
|
|
|
|
5. **Initialize Database**
|
|
```bash
|
|
cd src/server
|
|
python -c "from database_manager import init_database_system; init_database_system()"
|
|
```
|
|
|
|
6. **Run the Application**
|
|
```bash
|
|
cd src/server
|
|
python app.py
|
|
```
|
|
|
|
## Configuration
|
|
|
|
### Core Configuration Options
|
|
|
|
#### Environment Variables
|
|
|
|
| Variable | Default | Description |
|
|
|----------|---------|-------------|
|
|
| `ANIME_DIRECTORY` | `/app/data` | Path to anime collection |
|
|
| `MASTER_PASSWORD` | `admin123` | Web interface password |
|
|
| `DATABASE_PATH` | `/app/data/aniworld.db` | SQLite database file path |
|
|
| `LOG_LEVEL` | `INFO` | Logging level (DEBUG, INFO, WARNING, ERROR) |
|
|
| `WEB_HOST` | `0.0.0.0` | Web server bind address |
|
|
| `WEB_PORT` | `5000` | Web server port |
|
|
| `MAX_DOWNLOAD_WORKERS` | `4` | Maximum concurrent downloads |
|
|
| `MAX_SPEED_MBPS` | `100` | Download speed limit (Mbps) |
|
|
|
|
#### Advanced Configuration
|
|
|
|
Edit `src/server/config.py` for advanced settings:
|
|
|
|
```python
|
|
class Config:
|
|
# Download settings
|
|
download_timeout = 300 # 5 minutes
|
|
retry_attempts = 3
|
|
retry_delay = 5 # seconds
|
|
|
|
# Cache settings
|
|
cache_size_mb = 512
|
|
cache_ttl = 3600 # 1 hour
|
|
|
|
# Security settings
|
|
session_timeout = 86400 # 24 hours
|
|
max_login_attempts = 5
|
|
lockout_duration = 300 # 5 minutes
|
|
|
|
# Monitoring settings
|
|
health_check_interval = 30 # seconds
|
|
metrics_retention_days = 7
|
|
```
|
|
|
|
### Directory Structure Setup
|
|
|
|
```
|
|
/your/anime/directory/
|
|
├── Series Name 1/
|
|
│ ├── Season 1/
|
|
│ ├── Season 2/
|
|
│ └── data # Metadata file
|
|
├── Series Name 2/
|
|
│ ├── episodes/
|
|
│ └── data # Metadata file
|
|
└── ...
|
|
```
|
|
|
|
## Running the Application
|
|
|
|
### Development Mode
|
|
|
|
```bash
|
|
cd src/server
|
|
export FLASK_ENV=development
|
|
export FLASK_DEBUG=1
|
|
python app.py
|
|
```
|
|
|
|
### Production Mode
|
|
|
|
#### Using Gunicorn (Recommended)
|
|
|
|
```bash
|
|
# Install gunicorn
|
|
pip install gunicorn
|
|
|
|
# Run with gunicorn
|
|
cd src/server
|
|
gunicorn -w 4 -b 0.0.0.0:5000 --timeout 300 app:app
|
|
```
|
|
|
|
#### Using systemd Service
|
|
|
|
Create `/etc/systemd/system/aniworld.service`:
|
|
|
|
```ini
|
|
[Unit]
|
|
Description=AniWorld Web Application
|
|
After=network.target
|
|
|
|
[Service]
|
|
Type=simple
|
|
User=aniworld
|
|
WorkingDirectory=/opt/aniworld/src/server
|
|
Environment=PATH=/opt/aniworld/aniworld-env/bin
|
|
Environment=ANIME_DIRECTORY=/data/anime
|
|
Environment=MASTER_PASSWORD=your_password
|
|
ExecStart=/opt/aniworld/aniworld-env/bin/gunicorn -w 4 -b 0.0.0.0:5000 app:app
|
|
Restart=always
|
|
RestartSec=10
|
|
|
|
[Install]
|
|
WantedBy=multi-user.target
|
|
```
|
|
|
|
Enable and start:
|
|
```bash
|
|
sudo systemctl daemon-reload
|
|
sudo systemctl enable aniworld
|
|
sudo systemctl start aniworld
|
|
```
|
|
|
|
### Using Docker
|
|
|
|
#### Single Container
|
|
```bash
|
|
docker run -d \
|
|
--name aniworld \
|
|
-p 5000:5000 \
|
|
-v /path/to/anime:/app/data/anime \
|
|
-v /path/to/data:/app/data \
|
|
-e MASTER_PASSWORD=your_password \
|
|
aniworld:latest
|
|
```
|
|
|
|
#### Docker Compose (Recommended)
|
|
```bash
|
|
docker-compose up -d
|
|
```
|
|
|
|
## Monitoring and Health Checks
|
|
|
|
### Health Check Endpoints
|
|
|
|
| Endpoint | Purpose |
|
|
|----------|---------|
|
|
| `/health` | Basic health check for load balancers |
|
|
| `/api/health/system` | System resource metrics |
|
|
| `/api/health/database` | Database connectivity |
|
|
| `/api/health/dependencies` | External dependencies |
|
|
| `/api/health/detailed` | Comprehensive health report |
|
|
| `/api/health/ready` | Kubernetes readiness probe |
|
|
| `/api/health/live` | Kubernetes liveness probe |
|
|
| `/api/health/metrics` | Prometheus metrics |
|
|
|
|
### Monitoring with Grafana
|
|
|
|
1. **Enable Monitoring Profile**
|
|
```bash
|
|
docker-compose --profile monitoring up -d
|
|
```
|
|
|
|
2. **Access Grafana**
|
|
- URL: http://localhost:3000
|
|
- Username: admin
|
|
- Password: (set in GRAFANA_PASSWORD env var)
|
|
|
|
3. **Import Dashboards**
|
|
- System metrics dashboard
|
|
- Application performance dashboard
|
|
- Download statistics dashboard
|
|
|
|
### Log Management
|
|
|
|
**Viewing Logs:**
|
|
```bash
|
|
# Docker logs
|
|
docker-compose logs -f aniworld-web
|
|
|
|
# System logs (if using systemd)
|
|
journalctl -u aniworld -f
|
|
|
|
# Application logs
|
|
tail -f src/server/logs/app.log
|
|
```
|
|
|
|
**Log Rotation Configuration:**
|
|
Create `/etc/logrotate.d/aniworld`:
|
|
```
|
|
/opt/aniworld/src/server/logs/*.log {
|
|
daily
|
|
rotate 30
|
|
compress
|
|
delaycompress
|
|
missingok
|
|
notifempty
|
|
create 644 aniworld aniworld
|
|
postrotate
|
|
systemctl reload aniworld
|
|
endscript
|
|
}
|
|
```
|
|
|
|
## Backup and Maintenance
|
|
|
|
### Database Backup
|
|
|
|
**Manual Backup:**
|
|
```bash
|
|
# Via API
|
|
curl -X POST "http://localhost:5000/api/database/backups/create" \
|
|
-H "Content-Type: application/json" \
|
|
-d '{"backup_type": "full", "description": "Manual backup"}'
|
|
|
|
# Direct SQLite backup
|
|
sqlite3 /app/data/aniworld.db ".backup /path/to/backup.db"
|
|
```
|
|
|
|
**Automated Backup Script:**
|
|
```bash
|
|
#!/bin/bash
|
|
# backup.sh
|
|
BACKUP_DIR="/backups"
|
|
DATE=$(date +%Y%m%d_%H%M%S)
|
|
DB_PATH="/app/data/aniworld.db"
|
|
|
|
# Create backup
|
|
sqlite3 "$DB_PATH" ".backup $BACKUP_DIR/aniworld_$DATE.db"
|
|
|
|
# Compress
|
|
gzip "$BACKUP_DIR/aniworld_$DATE.db"
|
|
|
|
# Clean old backups (keep 30 days)
|
|
find "$BACKUP_DIR" -name "aniworld_*.db.gz" -mtime +30 -delete
|
|
```
|
|
|
|
**Cron Job for Daily Backups:**
|
|
```bash
|
|
# Add to crontab
|
|
0 2 * * * /opt/aniworld/scripts/backup.sh
|
|
```
|
|
|
|
### Database Maintenance
|
|
|
|
**Vacuum Database (reclaim space):**
|
|
```bash
|
|
curl -X POST "http://localhost:5000/api/database/maintenance/vacuum"
|
|
```
|
|
|
|
**Update Statistics:**
|
|
```bash
|
|
curl -X POST "http://localhost:5000/api/database/maintenance/analyze"
|
|
```
|
|
|
|
**Integrity Check:**
|
|
```bash
|
|
curl -X POST "http://localhost:5000/api/database/maintenance/integrity-check"
|
|
```
|
|
|
|
## Troubleshooting
|
|
|
|
### Common Issues
|
|
|
|
#### 1. Permission Denied Errors
|
|
```bash
|
|
# Fix file permissions
|
|
chown -R aniworld:aniworld /opt/aniworld
|
|
chmod -R 755 /opt/aniworld
|
|
|
|
# Fix data directory permissions
|
|
chown -R aniworld:aniworld /data/anime
|
|
```
|
|
|
|
#### 2. Database Lock Errors
|
|
```bash
|
|
# Check for hung processes
|
|
ps aux | grep aniworld
|
|
|
|
# Kill hung processes
|
|
pkill -f aniworld
|
|
|
|
# Restart service
|
|
systemctl restart aniworld
|
|
```
|
|
|
|
#### 3. High Memory Usage
|
|
```bash
|
|
# Check memory usage
|
|
curl "http://localhost:5000/api/health/performance"
|
|
|
|
# Restart application to free memory
|
|
docker-compose restart aniworld-web
|
|
```
|
|
|
|
#### 4. Network Connectivity Issues
|
|
```bash
|
|
# Test network connectivity
|
|
curl "http://localhost:5000/api/health/dependencies"
|
|
|
|
# Check DNS resolution
|
|
nslookup aniworld.to
|
|
|
|
# Test with VPN if configured
|
|
docker-compose exec aniworld-web curl ifconfig.io
|
|
```
|
|
|
|
### Performance Tuning
|
|
|
|
#### 1. Increase Worker Processes
|
|
```env
|
|
MAX_DOWNLOAD_WORKERS=8
|
|
```
|
|
|
|
#### 2. Adjust Speed Limits
|
|
```env
|
|
MAX_SPEED_MBPS=200
|
|
```
|
|
|
|
#### 3. Increase Cache Size
|
|
```env
|
|
CACHE_SIZE_MB=1024
|
|
```
|
|
|
|
#### 4. Database Optimization
|
|
```bash
|
|
# Regular maintenance
|
|
sqlite3 /app/data/aniworld.db "VACUUM; ANALYZE;"
|
|
|
|
# Enable WAL mode for better concurrency
|
|
sqlite3 /app/data/aniworld.db "PRAGMA journal_mode=WAL;"
|
|
```
|
|
|
|
### Debug Mode
|
|
|
|
Enable debug logging:
|
|
```env
|
|
LOG_LEVEL=DEBUG
|
|
FLASK_DEBUG=1
|
|
```
|
|
|
|
View debug information:
|
|
```bash
|
|
# Check application logs
|
|
docker-compose logs -f aniworld-web
|
|
|
|
# Check system health
|
|
curl "http://localhost:5000/api/health/detailed"
|
|
```
|
|
|
|
## Advanced Deployment
|
|
|
|
### Load Balancing with Multiple Instances
|
|
|
|
#### Docker Swarm
|
|
```yaml
|
|
version: '3.8'
|
|
services:
|
|
aniworld-web:
|
|
image: aniworld:latest
|
|
deploy:
|
|
replicas: 3
|
|
update_config:
|
|
parallelism: 1
|
|
delay: 30s
|
|
networks:
|
|
- aniworld
|
|
```
|
|
|
|
#### Kubernetes Deployment
|
|
```yaml
|
|
apiVersion: apps/v1
|
|
kind: Deployment
|
|
metadata:
|
|
name: aniworld-web
|
|
spec:
|
|
replicas: 3
|
|
selector:
|
|
matchLabels:
|
|
app: aniworld-web
|
|
template:
|
|
metadata:
|
|
labels:
|
|
app: aniworld-web
|
|
spec:
|
|
containers:
|
|
- name: aniworld-web
|
|
image: aniworld:latest
|
|
ports:
|
|
- containerPort: 5000
|
|
env:
|
|
- name: ANIME_DIRECTORY
|
|
value: "/data/anime"
|
|
- name: MASTER_PASSWORD
|
|
valueFrom:
|
|
secretKeyRef:
|
|
name: aniworld-secrets
|
|
key: master-password
|
|
volumeMounts:
|
|
- name: anime-data
|
|
mountPath: /data/anime
|
|
- name: app-data
|
|
mountPath: /app/data
|
|
livenessProbe:
|
|
httpGet:
|
|
path: /api/health/live
|
|
port: 5000
|
|
initialDelaySeconds: 30
|
|
periodSeconds: 30
|
|
readinessProbe:
|
|
httpGet:
|
|
path: /api/health/ready
|
|
port: 5000
|
|
initialDelaySeconds: 5
|
|
periodSeconds: 10
|
|
```
|
|
|
|
### SSL/TLS Configuration
|
|
|
|
#### Automatic SSL with Let's Encrypt
|
|
```bash
|
|
# Install certbot
|
|
sudo apt install certbot python3-certbot-nginx
|
|
|
|
# Obtain certificate
|
|
sudo certbot --nginx -d your-domain.com
|
|
|
|
# Auto-renewal
|
|
echo "0 12 * * * /usr/bin/certbot renew --quiet" | sudo tee -a /etc/crontab
|
|
```
|
|
|
|
#### Manual SSL Certificate
|
|
Place certificates in `docker/nginx/ssl/`:
|
|
- `server.crt` - SSL certificate
|
|
- `server.key` - Private key
|
|
|
|
### High Availability Setup
|
|
|
|
#### Database Replication
|
|
```bash
|
|
# Master-slave SQLite replication using litestream
|
|
docker run -d \
|
|
--name litestream \
|
|
-v /app/data:/data \
|
|
-e LITESTREAM_ACCESS_KEY_ID=your_key \
|
|
-e LITESTREAM_SECRET_ACCESS_KEY=your_secret \
|
|
litestream/litestream \
|
|
replicate /data/aniworld.db s3://your-bucket/db
|
|
```
|
|
|
|
#### Shared Storage
|
|
```yaml
|
|
# docker-compose.yml with NFS
|
|
services:
|
|
aniworld-web:
|
|
volumes:
|
|
- type: volume
|
|
source: anime-data
|
|
target: /app/data/anime
|
|
volume:
|
|
driver: local
|
|
driver_opts:
|
|
type: nfs
|
|
o: addr=your-nfs-server,rw
|
|
device: ":/path/to/anime"
|
|
```
|
|
|
|
### Security Hardening
|
|
|
|
#### 1. Network Security
|
|
```yaml
|
|
# Restrict network access
|
|
networks:
|
|
aniworld:
|
|
driver: bridge
|
|
ipam:
|
|
config:
|
|
- subnet: 172.20.0.0/16
|
|
```
|
|
|
|
#### 2. Container Security
|
|
```dockerfile
|
|
# Run as non-root user
|
|
USER 1000:1000
|
|
|
|
# Read-only root filesystem
|
|
docker run --read-only --tmpfs /tmp aniworld:latest
|
|
```
|
|
|
|
#### 3. Secrets Management
|
|
```bash
|
|
# Use Docker secrets
|
|
echo "your_password" | docker secret create master_password -
|
|
|
|
# Use in compose
|
|
services:
|
|
aniworld-web:
|
|
secrets:
|
|
- master_password
|
|
environment:
|
|
- MASTER_PASSWORD_FILE=/run/secrets/master_password
|
|
```
|
|
|
|
This installation guide covers all aspects of deploying AniWorld from development to production environments. Choose the deployment method that best fits your infrastructure and requirements. |