Files
ai-stylegallery/prp/deployment-requirements.md
2025-11-11 21:23:00 +01:00

1164 lines
27 KiB
Markdown

# Deployment Requirements Specification
## Overview
Complete deployment guide for AI StyleGallery, including system requirements, dependency management, environment configuration, and operational procedures for production deployment.
## System Requirements
### Server Requirements
#### Minimum Specifications
- **Operating System**: Linux (Ubuntu 20.04+, CentOS 8+, Debian 11+)
- **Web Server**: Apache 2.4+ or Nginx 1.20+
- **Database**: SQLite 3.8+ (default) or MySQL 8.0+/PostgreSQL 13+
- **PHP Version**: 8.3+ with extensions
- **Memory**: 2GB RAM minimum, 4GB recommended
- **Storage**: 10GB minimum, 50GB recommended
- **Network**: Stable internet connection for AI services
#### Recommended Production Setup
- **Operating System**: Ubuntu 22.04 LTS
- **Web Server**: Nginx 1.24+ with PHP-FPM
- **Database**: PostgreSQL 15+ for production workloads
- **Redis**: 7.0+ for caching and sessions
- **SSL/TLS**: Let's Encrypt or commercial certificate
### PHP Requirements
#### Required Extensions
```bash
# Core extensions
php8.3-cli
php8.3-common
php8.3-fpm
php8.3-mysql # or php8.3-pgsql for PostgreSQL
php8.3-sqlite3
php8.3-redis
php8.3-curl
php8.3-gd
php8.3-mbstring
php8.3-xml
php8.3-zip
php8.3-bcmath
php8.3-intl
# Development extensions (recommended)
php8.3-xdebug # For development only
```
#### PHP Configuration (`php.ini`)
```ini
# Performance settings
memory_limit = 256M
max_execution_time = 300
max_input_time = 300
upload_max_filesize = 10M
post_max_size = 12M
# Error handling
display_errors = Off
display_startup_errors = Off
error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT
log_errors = On
error_log = /var/log/php/error.log
# Security
expose_php = Off
allow_url_fopen = Off
allow_url_include = Off
# Session security
session.cookie_httponly = 1
session.cookie_secure = 1
session.use_strict_mode = 1
# OPcache (recommended for production)
opcache.enable = 1
opcache.memory_consumption = 128
opcache.max_accelerated_files = 10000
opcache.validate_timestamps = 1
```
## Dependency Management
### PHP Dependencies (Composer)
#### Production Dependencies
```json
{
"require": {
"php": "^8.3",
"laravel/framework": "^12.0",
"laravel/tinker": "^2.10",
"filament/filament": "^3.3",
"laravel/sanctum": "^4.0",
"predis/predis": "^2.0",
"nesbot/carbon": "^3.0",
"ramsey/uuid": "^4.0",
"guzzlehttp/guzzle": "^7.0"
}
}
```
#### Development Dependencies
```json
{
"require-dev": {
"phpunit/phpunit": "^12.0",
"laravel/pint": "^1.0",
"laravel/sail": "^1.0",
"spatie/laravel-ignition": "^2.0",
"fakerphp/faker": "^1.23",
"laravel/dusk": "^8.0"
}
}
```
### Node.js Dependencies (npm/yarn)
#### Production Dependencies
```json
{
"dependencies": {
"axios": "^1.11.0",
"vue": "^3.5.0",
"@inertiajs/vue3": "^1.3.0",
"tailwindcss": "^3.4.0",
"autoprefixer": "^10.4.0",
"postcss": "^8.5.0",
"@fortawesome/fontawesome-svg-core": "^7.0.0",
"@fortawesome/free-solid-svg-icons": "^7.0.0",
"@fortawesome/vue-fontawesome": "^3.1.0",
"vanilla-lazyload": "^19.1.0"
}
}
```
#### Development Dependencies
```json
{
"devDependencies": {
"@vitejs/plugin-vue": "^5.2.0",
"laravel-vite-plugin": "^1.0.0",
"vite": "^5.4.0",
"@tailwindcss/forms": "^0.5.0",
"laravel-echo": "^2.1.0",
"pusher-js": "^8.4.0"
}
}
```
## Environment Configuration
### Environment Variables (`.env`)
#### Required Variables
```bash
# Application
APP_NAME="AI StyleGallery"
APP_ENV=production
APP_KEY=base64:your-generated-app-key
APP_DEBUG=false
APP_URL=https://your-domain.com
# Database (SQLite default)
DB_CONNECTION=sqlite
DB_DATABASE=/path/to/storage/database.sqlite
# Alternative Database (MySQL/PostgreSQL)
# DB_CONNECTION=mysql
# DB_HOST=127.0.0.1
# DB_PORT=3306
# DB_DATABASE=ai_stylegallery
# DB_USERNAME=your-db-user
# DB_PASSWORD=your-db-password
# Redis (recommended for production)
REDIS_CLIENT=phpredis
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379
# Mail Configuration
MAIL_MAILER=smtp
MAIL_HOST=smtp.your-provider.com
MAIL_PORT=587
MAIL_USERNAME=your-email@domain.com
MAIL_PASSWORD=your-app-password
MAIL_ENCRYPTION=tls
MAIL_FROM_ADDRESS=noreply@your-domain.com
MAIL_FROM_NAME="${APP_NAME}"
# Broadcasting (for real-time features)
BROADCAST_CONNECTION=pusher
PUSHER_APP_ID=your-pusher-id
PUSHER_APP_KEY=your-pusher-key
PUSHER_APP_SECRET=your-pusher-secret
PUSHER_HOST=api.pusherapp.com
PUSHER_PORT=443
PUSHER_SCHEME=https
PUSHER_APP_CLUSTER=your-cluster
# Queue (for background processing)
QUEUE_CONNECTION=database
# Filesystem
FILESYSTEM_DISK=local
# Sanctum (API authentication)
SANCTUM_STATEFUL_DOMAINS=your-domain.com
```
#### AI Provider Configuration
```bash
# ComfyUI Configuration
COMFYUI_API_URL=https://your-comfyui-server.com
COMFYUI_API_KEY=your-comfyui-api-key
COMFYUI_TIMEOUT=180
COMFYUI_MAX_RETRIES=3
# RunwareAI Configuration
RUNWAREAI_API_URL=https://api.runwareai.com
RUNWAREAI_API_TOKEN=your-runwareai-token
RUNWAREAI_TIMEOUT=60
RUNWAREAI_RATE_LIMIT_DELAY=1000
# Additional providers can be added here
```
## Installation and Setup
### Automated Deployment Script
#### Deploy Script (`deploy.sh`)
```bash
#!/bin/bash
set -e # Exit on any error
echo "🚀 Starting AI StyleGallery deployment..."
# Variables
APP_DIR="/var/www/ai-stylegallery"
BACKUP_DIR="/var/backups/ai-stylegallery"
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
# Create backup
echo "📦 Creating backup..."
mkdir -p "$BACKUP_DIR"
tar -czf "$BACKUP_DIR/backup_$TIMESTAMP.tar.gz" -C "$(dirname "$APP_DIR")" "$(basename "$APP_DIR")"
# Navigate to app directory
cd "$APP_DIR"
# Backup current .env
cp .env ".env.backup.$TIMESTAMP"
# Pull latest changes
echo "📥 Pulling latest changes..."
git pull origin main
# Install PHP dependencies
echo "📦 Installing PHP dependencies..."
composer install --no-dev --optimize-autoloader
# Install Node.js dependencies
echo "📦 Installing Node.js dependencies..."
npm ci
# Build assets
echo "🔨 Building frontend assets..."
npm run build
# Run database migrations
echo "🗄️ Running database migrations..."
php artisan migrate --force
# Clear caches
echo "🧹 Clearing caches..."
php artisan config:clear
php artisan route:clear
php artisan view:clear
php artisan event:clear
# Optimize application
echo "⚡ Optimizing application..."
php artisan optimize
# Set proper permissions
echo "🔐 Setting permissions..."
chown -R www-data:www-data storage bootstrap/cache
chmod -R 755 storage bootstrap/cache
chmod -R 644 storage/logs/*.log
# Restart web server
echo "🔄 Restarting web server..."
sudo systemctl reload nginx
sudo systemctl restart php8.3-fpm
# Run health check
echo "🏥 Running health check..."
sleep 10
curl -f https://your-domain.com/api/health || exit 1
echo "✅ Deployment completed successfully!"
echo "📋 Backup saved as: $BACKUP_DIR/backup_$TIMESTAMP.tar.gz"
```
### Manual Installation Steps
#### 1. System Preparation
```bash
# Update system packages
sudo apt update && sudo apt upgrade -y
# Install required software
sudo apt install -y nginx php8.3 php8.3-fpm php8.3-cli php8.3-common php8.3-mysql php8.3-sqlite3 php8.3-redis php8.3-curl php8.3-gd php8.3-mbstring php8.3-xml php8.3-zip php8.3-bcmath php8.3-intl
# Install Composer
curl -sS https://getcomposer.org/installer | php
sudo mv composer.phar /usr/local/bin/composer
# Install Node.js and npm
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
sudo apt install -y nodejs
# Install Redis
sudo apt install -y redis-server
# Start and enable Redis
sudo systemctl start redis-server
sudo systemctl enable redis-server
```
#### 2. Application Setup
```bash
# Create application directory
sudo mkdir -p /var/www/ai-stylegallery
sudo chown www-data:www-data /var/www/ai-stylegallery
# Clone repository (or upload files)
git clone https://github.com/your-repo/ai-stylegallery.git /var/www/ai-stylegallery
cd /var/www/ai-stylegallery
# Install PHP dependencies
composer install --no-dev
# Install Node.js dependencies
npm install
# Copy environment file
cp .env.example .env
# Generate application key
php artisan key:generate
# Configure database
touch database/database.sqlite
php artisan migrate
# Build frontend assets
npm run build
# Set permissions
sudo chown -R www-data:www-data storage bootstrap/cache
chmod -R 755 storage bootstrap/cache
```
#### 3. Web Server Configuration
##### Nginx Configuration (`/etc/nginx/sites-available/ai-stylegallery`)
```nginx
server {
listen 80;
server_name your-domain.com;
root /var/www/ai-stylegallery/public;
# Security headers
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
# Handle static assets
location / {
try_files $uri $uri/ /index.php?$query_string;
}
# PHP processing
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php8.3-fpm.sock;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
include fastcgi_params;
fastcgi_read_timeout 300;
}
# Static assets caching
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ {
expires 1y;
add_header Cache-Control "public, immutable";
try_files $uri @proxy;
}
# Deny access to sensitive files
location ~ /\.ht {
deny all;
}
# API routes (optional, for better handling)
location /api/ {
try_files $uri $uri/ /index.php?$query_string;
}
# Health check endpoint
location /health {
access_log off;
return 200 "healthy\n";
add_header Content-Type text/plain;
}
}
server {
listen 443 ssl http2;
server_name your-domain.com;
# SSL configuration...
# Same directives as above...
}
```
##### Apache Configuration (Alternative)
```apache
<VirtualHost *:80>
ServerName your-domain.com
DocumentRoot /var/www/ai-stylegallery/public
<Directory /var/www/ai-stylegallery/public>
Options -Indexes +FollowSymLinks
AllowOverride All
Require all granted
</Directory>
# Security headers
Header always set X-Frame-Options "SAMEORIGIN"
Header always set X-Content-Type-Options "nosniff"
Header always set X-XSS-Protection "1; mode=block"
Header always set Referrer-Policy "strict-origin-when-cross-origin"
# Handle PHP files
<FilesMatch \.php$>
SetHandler "proxy:unix:/var/run/php/php8.3-fpm.sock|fcgi://localhost"
</FilesMatch>
# Health check
<Location "/health">
Require all granted
Header set Content-Type "text/plain"
Header set Cache-Control "no-cache, no-store, must-revalidate"
</Location>
ErrorLog ${APACHE_LOG_DIR}/ai-stylegallery_error.log
CustomLog ${APACHE_LOG_DIR}/ai-stylegallery_access.log combined
</VirtualHost>
```
## Operational Procedures
### Database Management
#### Backup Strategy
```bash
# Daily database backup
#!/bin/bash
BACKUP_DIR="/var/backups/ai-stylegallery"
mkdir -p "$BACKUP_DIR"
# SQLite backup (default)
cp /var/www/ai-stylegallery/database/database.sqlite "$BACKUP_DIR/db_$(date +%Y%m%d_%H%M%S).sqlite"
# MySQL backup (if using MySQL)
# mysqldump -h localhost -u username -p password ai_stylegallery > "$BACKUP_DIR/db_$(date +%Y%m%d_%H%M%S).sql"
# Compress and cleanup old backups
find "$BACKUP_DIR" -name "db_*" -type f -mtime +7 -delete
```
#### Migration Management
```bash
# Run migrations
php artisan migrate
# Rollback if needed
php artisan migrate:rollback
# Check migration status
php artisan migrate:status
# Seed database (for initial data)
php artisan db:seed
```
### File Storage Management
#### Storage Structure
```
/var/www/ai-stylegallery/
├── storage/
│ ├── app/
│ │ ├── public/
│ │ │ ├── uploads/ # User uploaded images
│ │ │ └── style_previews/ # AI style preview images
│ │ └── .gitignore
│ ├── framework/
│ │ ├── cache/
│ │ ├── sessions/
│ │ └── views/
│ ├── logs/ # Application logs
│ └── .gitignore
```
#### Storage Permissions
```bash
# Set proper ownership
sudo chown -R www-data:www-data /var/www/ai-stylegallery/storage
# Set proper permissions
sudo chmod -R 755 /var/www/ai-stylegallery/storage
sudo chmod -R 644 /var/www/ai-stylegallery/storage/logs/*.log
# Create symbolic link (if needed)
php artisan storage:link
```
### Log Management
#### Log Configuration
```php
// config/logging.php
'channels' => [
'stack' => [
'driver' => 'stack',
'channels' => ['single', 'daily'],
],
'single' => [
'driver' => 'single',
'path' => storage_path('logs/laravel.log'),
'level' => env('LOG_LEVEL', 'debug'),
],
'daily' => [
'driver' => 'daily',
'path' => storage_path('logs/laravel.log'),
'level' => env('LOG_LEVEL', 'debug'),
'days' => 14,
],
],
```
#### Log Rotation
```bash
# Logrotate configuration (/etc/logrotate.d/ai-stylegallery)
/var/www/ai-stylegallery/storage/logs/*.log {
daily
rotate 30
compress
delaycompress
missingok
notifempty
create 644 www-data www-data
postrotate
systemctl reload nginx
endscript
}
```
### Monitoring and Health Checks
#### Health Check Endpoint
```php
// routes/web.php
Route::get('/health', function () {
try {
// Database check
DB::connection()->getPdo();
// Storage check
Storage::disk('public')->exists('test');
// Cache check
Cache::store('redis')->put('health', 'ok', 10);
return response()->json([
'status' => 'healthy',
'timestamp' => now()->toISOString(),
'version' => config('app.version'),
]);
} catch (Exception $e) {
return response()->json([
'status' => 'unhealthy',
'error' => $e->getMessage(),
'timestamp' => now()->toISOString(),
], 503);
}
});
```
#### Monitoring Setup
```bash
# Install monitoring tools
sudo apt install -y htop iotop nethogs
# Set up log monitoring
sudo apt install -y logwatch
# Configure process monitoring
sudo apt install -y monit
# Monit configuration for AI StyleGallery
# /etc/monit/conf.d/ai-stylegallery
check process php-fpm with pidfile /var/run/php/php8.3-fpm.pid
start program = "/etc/init.d/php8.3-fpm start"
stop program = "/etc/init.d/php8.3-fpm stop"
if cpu > 60% for 2 cycles then alert
if memory usage > 80% for 5 cycles then alert
check process nginx with pidfile /var/run/nginx.pid
start program = "/etc/init.d/nginx start"
stop program = "/etc/init.d/nginx stop"
if cpu > 60% for 2 cycles then alert
if memory usage > 80% for 5 cycles then alert
```
## Security Hardening
### Firewall Configuration
```bash
# UFW (Uncomplicated Firewall)
sudo ufw allow 'OpenSSH'
sudo ufw allow 'Nginx Full'
sudo ufw --force enable
# Advanced firewall rules
sudo ufw allow from your-admin-ip to any port 22
sudo ufw allow from your-office-ip-range to any port 80
sudo ufw allow from your-office-ip-range to any port 443
```
### SSL/TLS Setup
```bash
# Install Certbot for Let's Encrypt
sudo apt install -y certbot python3-certbot-nginx
# Generate SSL certificate
sudo certbot --nginx -d your-domain.com -d www.your-domain.com
# Auto-renewal (add to crontab)
sudo crontab -e
# Add: 0 12 * * * /usr/bin/certbot renew --quiet
```
### Security Updates
```bash
# Automated security updates
sudo apt install -y unattended-upgrades
sudo dpkg-reconfigure -plow unattended-upgrades
# Manual security updates
sudo apt update && sudo apt upgrade -y
sudo apt autoremove -y
sudo apt autoclean
```
## Performance Optimization
### PHP-FPM Optimization
```ini
# /etc/php/8.3/fpm/pool.d/www.conf
pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 35
pm.max_requests = 500
# Process manager settings
pm.process_idle_timeout = 10s
pm.max_requests = 1000
# Memory optimization
php_admin_value[memory_limit] = 256M
php_admin_flag[opcache.enable] = 1
```
### MySQL Optimization (if using MySQL)
```ini
# /etc/mysql/mysql.conf.d/mysqld.cnf
[mysqld]
innodb_buffer_pool_size = 1G
innodb_log_file_size = 256M
innodb_flush_log_at_trx_commit = 2
query_cache_size = 0
query_cache_type = 0
innodb_flush_method = O_DIRECT
# Connection settings
max_connections = 100
wait_timeout = 28800
interactive_timeout = 28800
```
### Nginx Optimization
```nginx
# Performance optimizations
worker_processes auto;
worker_rlimit_nofile 1024;
events {
worker_connections 1024;
use epoll;
multi_accept on;
}
http {
# Caching
proxy_cache_path /tmp/nginx_cache levels=1:2 keys_zone=my_cache:10m max_size=1g inactive=60m use_temp_path=off;
# Gzip compression
gzip on;
gzip_vary on;
gzip_min_length 1024;
gzip_proxied expired no-cache no-store private must-revalidate auth;
gzip_types text/plain text/css text/xml text/javascript application/javascript application/xml+rss application/json;
# Rate limiting
limit_req_zone $binary_remote_addr zone=api:10m rate=10r/s;
limit_req_zone $binary_remote_addr zone=upload:10m rate=2r/s;
}
```
## Troubleshooting
### Common Issues
#### Application Not Loading
```bash
# Check PHP-FPM status
sudo systemctl status php8.3-fpm
# Check Nginx status
sudo systemctl status nginx
# Check application logs
tail -f /var/www/ai-stylegallery/storage/logs/laravel.log
# Test PHP processing
php -f /var/www/ai-stylegallery/public/index.php
```
#### Database Connection Issues
```bash
# Test database connection
php artisan tinker --execute="DB::connection()->getPdo(); echo 'Database connected';"
# Check database file permissions (SQLite)
ls -la /var/www/ai-stylegallery/database/database.sqlite
# Check database configuration
php artisan config:cache
php artisan config:clear
```
#### File Upload Issues
```bash
# Check storage permissions
ls -la /var/www/ai-stylegallery/storage/app/public/
# Check PHP upload settings
php -i | grep upload
# Test file upload
php -r "move_uploaded_file('/tmp/test.txt', '/var/www/ai-stylegallery/storage/app/public/uploads/test.txt');"
```
#### AI Service Connection Issues
```bash
# Test ComfyUI connection
curl -X GET "https://your-comfyui-server.com/queue"
# Test RunwareAI connection
curl -X POST "https://api.runwareai.com" \
-H "Authorization: Bearer your-token" \
-H "Content-Type: application/json" \
-d '{"taskType": "authentication", "apiKey": "your-token"}'
# Check API provider configuration
php artisan tinker --execute="App\Models\ApiProvider::all()"
```
### Debug Mode
#### Enable Debug Mode (Development Only)
```bash
# Edit .env file
APP_DEBUG=true
LOG_LEVEL=debug
# Clear config cache
php artisan config:clear
# Check detailed error logs
tail -f /var/www/ai-stylegallery/storage/logs/laravel.log
```
#### Performance Profiling
```bash
# Enable query logging
php artisan tinker --execute="DB::enableQueryLog();"
# Profile application performance
php artisan tinker --execute="dump(app()->getLoadedProviders());"
# Memory usage
php -r "echo 'Memory usage: ' . memory_get_peak_usage(true) / 1024 / 1024 . 'MB';"
```
## Backup and Recovery
### Complete System Backup
```bash
#!/bin/bash
# Full system backup script
BACKUP_DIR="/var/backups/ai-stylegallery"
APP_DIR="/var/www/ai-stylegallery"
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
# Create backup directory
mkdir -p "$BACKUP_DIR"
# Backup application files
tar -czf "$BACKUP_DIR/app_$TIMESTAMP.tar.gz" -C "$(dirname "$APP_DIR")" "$(basename "$APP_DIR")"
# Backup database
cp "$APP_DIR/database/database.sqlite" "$BACKUP_DIR/db_$TIMESTAMP.sqlite"
# Backup Nginx configuration
cp /etc/nginx/sites-available/ai-stylegallery "$BACKUP_DIR/nginx_config_$TIMESTAMP"
# Backup SSL certificates
cp -r /etc/letsencrypt/live/your-domain.com "$BACKUP_DIR/ssl_$TIMESTAMP"
# Cleanup old backups (keep 7 days)
find "$BACKUP_DIR" -type f -mtime +7 -delete
echo "Backup completed: $BACKUP_DIR/backup_$TIMESTAMP"
```
### Recovery Procedure
```bash
#!/bin/bash
# Recovery script
BACKUP_DIR="/var/backups/ai-stylegallery"
APP_DIR="/var/www/ai-stylegallery"
# Stop services
sudo systemctl stop nginx php8.3-fpm
# Restore application files
LATEST_BACKUP=$(ls -t "$BACKUP_DIR/app_"*.tar.gz | head -1)
sudo tar -xzf "$LATEST_BACKUP" -C "$(dirname "$APP_DIR")"
# Restore database
LATEST_DB=$(ls -t "$BACKUP_DIR/db_"*.sqlite | head -1)
cp "$LATEST_DB" "$APP_DIR/database/database.sqlite"
# Restore Nginx configuration
LATEST_NGINX=$(ls -t "$BACKUP_DIR/nginx_config_"* | head -1)
sudo cp "$LATEST_NGINX" /etc/nginx/sites-available/ai-stylegallery
# Set permissions
sudo chown -R www-data:www-data "$APP_DIR"
sudo chmod -R 755 "$APP_DIR/storage" "$APP_DIR/bootstrap/cache"
# Start services
sudo systemctl start php8.3-fpm nginx
# Test recovery
curl -f https://your-domain.com/health || exit 1
echo "Recovery completed successfully!"
```
## Scaling Considerations
### Horizontal Scaling
#### Load Balancer Setup
```nginx
# Load balancer configuration
upstream ai-stylegallery_backend {
server 192.168.1.10:80;
server 192.168.1.11:80;
server 192.168.1.12:80;
# Health checks
keepalive 32;
}
server {
listen 80;
server_name your-domain.com;
location / {
proxy_pass http://ai-stylegallery_backend;
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;
# Health check
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
}
}
```
#### Shared Storage
```bash
# NFS shared storage for uploads
sudo apt install -y nfs-kernel-server
sudo mkdir -p /var/nfs/ai-stylegallery
sudo chown www-data:www-data /var/nfs/ai-stylegallery
# Mount on web servers
sudo mount -t nfs storage-server:/var/nfs/ai-stylegallery /var/www/ai-stylegallery/storage/app/public
```
### Database Scaling
#### Read Replicas
```bash
# MySQL read replica setup
CHANGE MASTER TO
MASTER_HOST='master-db-server',
MASTER_USER='replica_user',
MASTER_PASSWORD='replica_password',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=107;
```
#### Redis Cluster
```bash
# Redis cluster setup for horizontal scaling
redis-cli --cluster create \
192.168.1.10:6379 \
192.168.1.11:6379 \
192.168.1.12:6379 \
--cluster-replicas 0
```
## Maintenance Procedures
### Regular Maintenance Tasks
#### Daily Tasks
- Monitor system resources (CPU, memory, disk)
- Check application logs for errors
- Verify AI service connectivity
- Test backup restoration
#### Weekly Tasks
- Review and rotate application logs
- Check for security updates
- Monitor storage usage and cleanup
- Test full application functionality
#### Monthly Tasks
- Full system backup and verification
- Security audit and penetration testing
- Performance analysis and optimization
- Dependency updates and testing
### Emergency Procedures
#### Service Outage Response
```bash
# Quick health check
curl -f https://your-domain.com/health
# Check service status
sudo systemctl status nginx php8.3-fpm
# View recent logs
sudo tail -f /var/log/nginx/error.log
sudo tail -f /var/www/ai-stylegallery/storage/logs/laravel.log
# Restart services if needed
sudo systemctl restart nginx php8.3-fpm
```
#### Data Recovery
```bash
# From backup
cd /var/backups/ai-stylegallery
LATEST_BACKUP=$(ls -t *.tar.gz | head -1)
sudo tar -xzf "$LATEST_BACKUP" -C /var/www/ai-stylegallery --strip-components=1
# Restore database
LATEST_DB=$(ls -t db_*.sqlite | head -1)
cp "$LATEST_DB" /var/www/ai-stylegallery/database/database.sqlite
```
## Support and Documentation
### Documentation Locations
- **API Documentation**: `/prp/api-specification.md`
- **Component Documentation**: `/prp/frontend-components.md`
- **Deployment Guide**: This document
- **User Manual**: Application help system
### Support Contacts
- **Technical Support**: dev-team@your-domain.com
- **System Administrator**: admin@your-domain.com
- **Security Issues**: security@your-domain.com
### Training Materials
- **Admin Training**: Filament admin panel usage
- **Developer Guide**: Contributing to the codebase
- **Operations Manual**: Day-to-day system management
## Compliance and Legal
### Data Protection
- **GDPR Compliance**: User data handling procedures
- **Data Retention**: Configurable data retention policies
- **Privacy Policy**: User data collection and usage transparency
### Security Compliance
- **SSL/TLS**: HTTPS encryption for all communications
- **Data Encryption**: Sensitive data encryption at rest
- **Access Logging**: Comprehensive audit trails
### Licensing
- **Application License**: Open source or commercial license
- **Third-party Libraries**: Compliance with library licenses
- **AI Service Terms**: Compliance with AI provider terms of service
## Future Deployment Enhancements
### Containerization (Docker)
#### Dockerfile
```dockerfile
FROM php:8.3-fpm
# Install system dependencies
RUN apt-get update && apt-get install -y \
git curl libpng-dev libonig-dev libxml2-dev libzip-dev zip unzip \
&& docker-php-ext-install pdo_mysql mbstring exif pcntl bcmath gd zip
# Install Composer
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
# Copy application code
WORKDIR /var/www/ai-stylegallery
COPY . .
# Install dependencies
RUN composer install --no-dev --optimize-autoloader
# Set permissions
RUN chown -R www-data:www-data storage bootstrap/cache
```
#### Docker Compose
```yaml
version: '3.8'
services:
web:
build: .
ports:
- "80:80"
volumes:
- ./storage/app/public:/var/www/ai-stylegallery/storage/app/public
depends_on:
- redis
- db
redis:
image: redis:7-alpine
db:
image: postgres:15-alpine
environment:
POSTGRES_DB: ai_stylegallery
POSTGRES_USER: laravel
POSTGRES_PASSWORD: password
```
### CI/CD Pipeline
#### GitHub Actions Workflow
```yaml
name: Deploy to Production
on:
push:
branches: [ main ]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
php-version: '8.3'
- name: Install Dependencies
run: composer install --no-dev
- name: Run Tests
run: php artisan test
- name: Deploy to Server
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.SERVER_HOST }}
username: ${{ secrets.SERVER_USER }}
key: ${{ secrets.SERVER_SSH_KEY }}
script: |
cd /var/www/ai-stylegallery
./deploy.sh
```
### Monitoring and Alerting
#### Prometheus Metrics
```php
// Prometheus metrics endpoint
Route::get('/metrics', function () {
$metrics = [
'app_requests_total' => \DB::table('access_logs')->count(),
'app_users_total' => \App\Models\User::count(),
'app_images_total' => \App\Models\Image::count(),
'app_processing_time' => \Cache::get('avg_processing_time', 0),
];
return response(implode("\n", array_map(
fn($key, $value) => "{$key} {$value}",
array_keys($metrics),
array_values($metrics)
)), 200, ['Content-Type' => 'text/plain']);
});
```
#### Grafana Dashboard
- Application performance metrics
- AI service response times
- User activity and engagement
- System resource utilization
- Error rates and alerting
This comprehensive deployment guide provides all necessary information for successfully deploying and maintaining the AI StyleGallery application in production environments.