246 lines
7.9 KiB
Markdown
246 lines
7.9 KiB
Markdown
# Pixelfed - Photo Sharing for the Fediverse
|
|
|
|
Pixelfed is a free and open-source photo sharing platform that implements the ActivityPub protocol for federation. This deployment provides a complete Pixelfed instance optimized for the Keyboard Vagabond community.
|
|
|
|
## 🎯 **Access Information**
|
|
|
|
- **URL**: `https://pixelfed.keyboardvagabond.com`
|
|
- **Federation**: ActivityPub enabled, federated with other fediverse instances
|
|
- **Registration**: Open registration with email verification
|
|
- **User Limit**: 200 Monthly Active Users
|
|
|
|
## 🏗️ **Architecture**
|
|
|
|
### **Multi-Container Design**
|
|
- **Web Container**: Nginx + PHP-FPM for HTTP requests
|
|
- **Worker Container**: Laravel Horizon + Scheduler for background jobs
|
|
- **Database**: PostgreSQL (shared cluster with HA)
|
|
- **Cache**: Redis (shared cluster)
|
|
- **Storage**: Backblaze B2 S3 + Cloudflare CDN
|
|
- **Mail**: SMTP
|
|
|
|
### **Resource Allocation**
|
|
- **Web**: 2 CPU cores, 4GB RAM (medium+ recommendation)
|
|
- **Worker**: 1 CPU core, 2GB RAM
|
|
- **Storage**: 10GB app storage + 5GB cache
|
|
|
|
## 📁 **File Structure**
|
|
|
|
```
|
|
manifests/applications/pixelfed/
|
|
├── namespace.yaml # pixelfed-application namespace
|
|
├── secret.yaml # Environment variables and credentials
|
|
├── storage.yaml # Persistent volumes for app and cache
|
|
├── deployment-web.yaml # Web server deployment
|
|
├── deployment-worker.yaml # Background worker deployment
|
|
├── service.yaml # Internal service for web pods
|
|
├── ingress.yaml # External access with SSL
|
|
├── monitoring.yaml # OpenObserve metrics collection
|
|
├── kustomization.yaml # Kustomize configuration
|
|
└── README.md # This documentation
|
|
```
|
|
|
|
## 🔧 **Configuration**
|
|
|
|
### **Database Configuration**
|
|
- **Primary**: `postgresql-shared-rw.postgresql-system.svc.cluster.local`
|
|
- **Replica**: `postgresql-shared-ro.postgresql-system.svc.cluster.local`
|
|
- **Database**: `pixelfed`
|
|
- **User**: `pixelfed`
|
|
|
|
### **Redis Configuration**
|
|
- **Primary**: `redis-ha-haproxy.redis-system.svc.cluster.local`
|
|
- **Port**: `6379`
|
|
- **Usage**: Sessions, cache, queues
|
|
|
|
### **S3 Media Storage**
|
|
- **Provider**: Backblaze B2
|
|
- **Bucket**: `media-keyboard-vagabond`
|
|
- **CDN**: `https://media.keyboardvagabond.com`
|
|
- **Region**: `us-west-004`
|
|
|
|
### **SMTP Configuration**
|
|
- **Provider**: SMTP
|
|
- **Host**: `<YOUR_SMTP_SERVER>`
|
|
- **User**: `pixelfed@mail.keyboardvagabond.com`
|
|
- **Encryption**: TLS (port 587)
|
|
|
|
## 🚀 **Deployment**
|
|
|
|
### **Prerequisites**
|
|
1. **Database Setup**: Database and user already created
|
|
2. **Secrets**: Update `secret.yaml` with:
|
|
- Redis password
|
|
- Backblaze B2 credentials
|
|
- Laravel APP_KEY (generate with `php artisan key:generate`)
|
|
|
|
### **Deploy Pixelfed**
|
|
```bash
|
|
# Deploy all manifests
|
|
kubectl apply -k manifests/applications/pixelfed/
|
|
|
|
# Monitor deployment
|
|
kubectl get pods -n pixelfed-application -w
|
|
|
|
# Check ingress and certificates
|
|
kubectl get ingress,certificates -n pixelfed-application
|
|
```
|
|
|
|
### **Post-Deployment Setup**
|
|
```bash
|
|
# Generate application key (if not done in secret)
|
|
kubectl exec -it deployment/pixelfed-web -n pixelfed-application -- php artisan key:generate
|
|
|
|
# Run database migrations
|
|
kubectl exec -it deployment/pixelfed-web -n pixelfed-application -- php artisan migrate
|
|
|
|
# Import location data
|
|
kubectl exec -it deployment/pixelfed-web -n pixelfed-application -- php artisan import:cities
|
|
|
|
# Create admin user (optional)
|
|
kubectl exec -it deployment/pixelfed-web -n pixelfed-application -- php artisan user:create
|
|
```
|
|
|
|
## 🔍 **Monitoring & Troubleshooting**
|
|
|
|
### **Check Application Status**
|
|
```bash
|
|
# Pod status
|
|
kubectl get pods -n pixelfed-application
|
|
kubectl describe pods -n pixelfed-application
|
|
|
|
# Application logs
|
|
kubectl logs -f deployment/pixelfed-web -n pixelfed-application
|
|
kubectl logs -f deployment/pixelfed-worker -n pixelfed-application
|
|
|
|
# Check services and ingress
|
|
kubectl get svc,ingress -n pixelfed-application
|
|
```
|
|
|
|
### **Database Connectivity**
|
|
```bash
|
|
# Test database connection
|
|
kubectl exec -it deployment/pixelfed-web -n pixelfed-application -- php artisan tinker
|
|
# In tinker: DB::connection()->getPdo();
|
|
```
|
|
|
|
### **Queue Status**
|
|
```bash
|
|
# Check Horizon status
|
|
kubectl exec -it deployment/pixelfed-worker -n pixelfed-application -- php artisan horizon:status
|
|
|
|
# Check queue jobs
|
|
kubectl exec -it deployment/pixelfed-worker -n pixelfed-application -- php artisan queue:work --once
|
|
```
|
|
|
|
### **Storage & Media**
|
|
```bash
|
|
# Check storage link
|
|
kubectl exec -it deployment/pixelfed-web -n pixelfed-application -- ls -la /var/www/storage
|
|
|
|
# Test S3 connectivity
|
|
kubectl exec -it deployment/pixelfed-web -n pixelfed-application -- php artisan storage:link
|
|
```
|
|
|
|
## 🔐 **Security Features**
|
|
|
|
### **Application Security**
|
|
- HTTPS enforcement with Let's Encrypt certificates
|
|
- Session security with secure cookies
|
|
- CSRF protection enabled
|
|
- XSS protection headers
|
|
- Content Security Policy headers
|
|
|
|
### **Infrastructure Security**
|
|
- Non-root containers (www-data user)
|
|
- Pod Security Standards (restricted)
|
|
- Resource limits and requests
|
|
- Network policies ready (implement as needed)
|
|
|
|
### **Rate Limiting**
|
|
- Nginx ingress rate limiting (100 req/min)
|
|
- Pixelfed internal rate limiting
|
|
- API endpoint protection
|
|
|
|
## 🌐 **Federation & ActivityPub**
|
|
|
|
### **Federation Settings**
|
|
- **ActivityPub**: Enabled
|
|
- **Remote Follow**: Enabled
|
|
- **Shared Inbox**: Enabled
|
|
- **Public Timeline**: Disabled (local community focus)
|
|
|
|
### **Instance Configuration**
|
|
- **Description**: "Photo sharing for the Keyboard Vagabond community"
|
|
- **Contact**: `pixelfed@mail.keyboardvagabond.com`
|
|
- **Public Hashtags**: Enabled
|
|
- **Max Users**: 200 MAU
|
|
|
|
## 📊 **Performance & Scaling**
|
|
|
|
### **Current Capacity**
|
|
- **Users**: Up to 200 Monthly Active Users
|
|
- **Storage**: 10GB application + unlimited S3 media
|
|
- **Upload Limit**: 20MB per photo
|
|
- **Album Limit**: 8 photos per album
|
|
|
|
### **Scaling Options**
|
|
- **Horizontal**: Increase web/worker replicas
|
|
- **Vertical**: Increase CPU/memory limits
|
|
- **Storage**: Automatic S3 scaling via Backblaze B2
|
|
- **Database**: PostgreSQL HA cluster with read replicas
|
|
|
|
## 🔄 **Backup & Recovery**
|
|
|
|
### **Automated Backups**
|
|
- **Database**: PostgreSQL cluster backups via CloudNativePG
|
|
- **Application Data**: Longhorn S3 backup to Backblaze B2
|
|
- **Media**: Stored directly in S3 (Backblaze B2)
|
|
|
|
### **Recovery Procedures**
|
|
- **Database**: CloudNativePG point-in-time recovery
|
|
- **Application**: Longhorn volume restoration
|
|
- **Media**: Already in S3, no recovery needed
|
|
|
|
## 🔗 **Integration Points**
|
|
|
|
### **Existing Infrastructure**
|
|
- **PostgreSQL**: Shared HA cluster
|
|
- **Redis**: Shared cache cluster
|
|
- **DNS**: External-DNS with Cloudflare
|
|
- **SSL**: cert-manager with Let's Encrypt
|
|
- **Monitoring**: OpenObserve metrics collection
|
|
- **Storage**: Longhorn + Backblaze B2 S3
|
|
|
|
### **Future Integrations**
|
|
- **Authentik SSO**: Invitation-based signup (planned)
|
|
- **Cloudflare Turnstile**: Anti-spam for registration (planned)
|
|
- **Matrix**: Cross-platform notifications (optional)
|
|
|
|
## 📝 **Maintenance Tasks**
|
|
|
|
### **Regular Maintenance**
|
|
```bash
|
|
# Update application cache
|
|
kubectl exec -it deployment/pixelfed-web -n pixelfed-application -- php artisan config:cache
|
|
kubectl exec -it deployment/pixelfed-web -n pixelfed-application -- php artisan route:cache
|
|
|
|
# Clear application cache
|
|
kubectl exec -it deployment/pixelfed-web -n pixelfed-application -- php artisan cache:clear
|
|
|
|
# Update Horizon assets
|
|
kubectl exec -it deployment/pixelfed-worker -n pixelfed-application -- php artisan horizon:publish
|
|
```
|
|
|
|
### **Updates & Upgrades**
|
|
1. **Update container images** in deployment manifests
|
|
2. **Run database migrations** after deployment
|
|
3. **Clear caches** after major updates
|
|
4. **Test functionality** before marking complete
|
|
|
|
## 📚 **References**
|
|
|
|
- [Pixelfed Documentation](https://docs.pixelfed.org/)
|
|
- [Pixelfed GitHub](https://github.com/pixelfed/pixelfed)
|
|
- [ActivityPub Specification](https://www.w3.org/TR/activitypub/)
|
|
- [Laravel Horizon Documentation](https://laravel.com/docs/horizon) |