259 lines
7.5 KiB
Markdown
259 lines
7.5 KiB
Markdown
# Mastodon Application
|
|
|
|
This directory contains the Mastodon fediverse application deployment for the Keyboard Vagabond cluster.
|
|
|
|
## Overview
|
|
|
|
Mastodon is a free, open-source decentralized social media platform deployed using the official Helm chart via FluxCD GitOps.
|
|
|
|
**Deployment Status**: ✅ **Phase 1 - Core Deployment** (without Elasticsearch)
|
|
|
|
- **URL**: `https://mastodon.keyboardvagabond.com`
|
|
- **Federation Domain**: `keyboardvagabond.com` (CRITICAL: Never change this!)
|
|
- **Architecture**: Multi-container design with Web, Sidekiq, and Streaming deployments
|
|
- **Authentication**: Authentik OIDC integration + local accounts
|
|
- **Storage**: Backblaze B2 S3-compatible storage with Cloudflare CDN
|
|
- **Database**: Shared PostgreSQL cluster with CloudNativePG
|
|
- **Cache**: Shared Redis cluster
|
|
|
|
## Directory Structure
|
|
|
|
```
|
|
mastodon/
|
|
├── namespace.yaml # mastodon-application namespace
|
|
├── repository.yaml # Official Mastodon Helm chart repository
|
|
├── secret.yaml # SOPS-encrypted secrets (credentials, tokens)
|
|
├── helm-release.yaml # Main HelmRelease configuration
|
|
├── ingress.yaml # NGINX ingress with SSL and external-dns
|
|
├── monitoring.yaml # ServiceMonitor for OpenObserve integration
|
|
├── kustomization.yaml # Resource list
|
|
└── README.md # This documentation
|
|
```
|
|
|
|
## 🔑 Pre-Deployment Setup
|
|
|
|
### 1. Generate Mastodon Secrets
|
|
|
|
**Important**: Replace placeholder values in `secret.yaml` before deployment:
|
|
|
|
```bash
|
|
# Generate SECRET_KEY_BASE (using modern Rails command)
|
|
docker run --rm -it tootsuite/mastodon bundle exec rails secret
|
|
|
|
# Generate OTP_SECRET (using modern Rails command)
|
|
docker run --rm -it tootsuite/mastodon bundle exec rails secret
|
|
|
|
# Generate VAPID Keys (after setting SECRET_KEY_BASE and OTP_SECRET)
|
|
docker run --rm -it \
|
|
-e SECRET_KEY_BASE="your_secret_key_base" \
|
|
-e OTP_SECRET="your_otp_secret" \
|
|
tootsuite/mastodon bundle exec rake mastodon:webpush:generate_vapid_key
|
|
```
|
|
|
|
### 2. Database Setup
|
|
|
|
Create Mastodon database and user in the existing PostgreSQL cluster:
|
|
|
|
```bash
|
|
kubectl exec -it postgresql-shared-1 -n postgresql-system -- psql -U postgres
|
|
```
|
|
|
|
```sql
|
|
-- Create database and user
|
|
CREATE DATABASE mastodon_production;
|
|
CREATE USER mastodon_user WITH PASSWORD 'SECURE_PASSWORD_HERE';
|
|
GRANT ALL PRIVILEGES ON DATABASE mastodon_production TO mastodon_user;
|
|
ALTER DATABASE mastodon_production OWNER TO mastodon_user;
|
|
\q
|
|
```
|
|
|
|
### 3. Update Secret Values
|
|
|
|
Edit `secret.yaml` and replace:
|
|
- `REPLACE_WITH_GENERATED_SECRET_KEY_BASE`
|
|
- `REPLACE_WITH_GENERATED_OTP_SECRET`
|
|
- `REPLACE_WITH_GENERATED_VAPID_PRIVATE_KEY`
|
|
- `REPLACE_WITH_GENERATED_VAPID_PUBLIC_KEY`
|
|
- `REPLACE_WITH_POSTGRESQL_PASSWORD`
|
|
- `REPLACE_WITH_REDIS_PASSWORD`
|
|
|
|
### 4. Encrypt Secrets
|
|
|
|
```bash
|
|
sops --encrypt --in-place manifests/applications/mastodon/secret.yaml
|
|
```
|
|
|
|
## 🚀 Deployment
|
|
|
|
### Add to Applications Kustomization
|
|
|
|
Add mastodon to `manifests/applications/kustomization.yaml`:
|
|
|
|
```yaml
|
|
resources:
|
|
# ... existing apps
|
|
- mastodon/
|
|
```
|
|
|
|
### Commit and Deploy
|
|
|
|
```bash
|
|
git add manifests/applications/mastodon/
|
|
git commit -m "feat: Add Mastodon fediverse application"
|
|
git push origin k8s-fleet
|
|
```
|
|
|
|
Flux will automatically deploy within 5-10 minutes.
|
|
|
|
## 📋 Post-Deployment Configuration
|
|
|
|
### 1. Initial Admin Setup
|
|
|
|
Wait for pods to be ready, then create admin account:
|
|
|
|
```bash
|
|
# Check deployment status
|
|
kubectl get pods -n mastodon-application
|
|
|
|
# Create admin account (single-user mode enabled initially)
|
|
kubectl exec -n mastodon-application deployment/mastodon-web -- \
|
|
tootctl accounts create admin \
|
|
--email admin@keyboardvagabond.com \
|
|
--confirmed \
|
|
--role Admin
|
|
```
|
|
|
|
### 2. Disable Single-User Mode
|
|
|
|
After creating admin account, edit `helm-release.yaml`:
|
|
|
|
```yaml
|
|
mastodon:
|
|
single_user_mode: false # Change from true to false
|
|
```
|
|
|
|
Commit and push to apply changes.
|
|
|
|
### 3. Federation Testing
|
|
|
|
Test federation with other Mastodon instances:
|
|
1. Search for accounts from other instances
|
|
2. Follow accounts from other instances
|
|
3. Verify media attachments display correctly via CDN
|
|
|
|
## 🔧 Configuration Details
|
|
|
|
### Resource Allocation
|
|
|
|
**Starting Resources** (Phase 1):
|
|
- **Web**: 2 replicas, 1-2 CPU, 2-4Gi memory
|
|
- **Sidekiq**: 2 replicas, 0.5-1 CPU, 1-2Gi memory
|
|
- **Streaming**: 2 replicas, 0.25-0.5 CPU, 0.5-1Gi memory
|
|
- **Total**: ~5.5 CPU requests, ~9Gi memory requests
|
|
|
|
### External Dependencies
|
|
|
|
- ✅ **PostgreSQL**: `postgresql-shared-rw.postgresql-system.svc.cluster.local:5432`
|
|
- ✅ **Redis**: `redis-ha-haproxy.redis-system.svc.cluster.local:6379`
|
|
- ✅ **S3 Storage**: Backblaze B2 `mastodon-bucket`
|
|
- ✅ **CDN**: Cloudflare `mm.keyboardvagabond.com`
|
|
- ✅ **SMTP**: `<YOUR_SMTP_SERVER>` `<YOUR_EMAIL_ADDRESS>`
|
|
- ✅ **OIDC**: Authentik `auth.keyboardvagabond.com`
|
|
- ❌ **Elasticsearch**: Not configured (Phase 2)
|
|
|
|
### Security Features
|
|
|
|
- **HTTPS**: Enforced with Let's Encrypt certificates
|
|
- **Headers**: Security headers via NGINX ingress
|
|
- **OIDC**: Single Sign-On with Authentik
|
|
- **S3**: Media storage with CDN distribution
|
|
- **Secrets**: SOPS-encrypted in Git
|
|
|
|
## 📊 Monitoring
|
|
|
|
### OpenObserve Integration
|
|
|
|
Metrics automatically collected via ServiceMonitor:
|
|
- **URL**: `https://obs.keyboardvagabond.com`
|
|
- **Metrics**: Mastodon application metrics, HTTP requests, response times
|
|
- **Logs**: Application logs via OpenTelemetry collector
|
|
|
|
### Health Checks
|
|
|
|
```bash
|
|
# Check pod status
|
|
kubectl get pods -n mastodon-application
|
|
|
|
# Check ingress and certificates
|
|
kubectl get ingress,certificates -n mastodon-application
|
|
|
|
# Check logs
|
|
kubectl logs -n mastodon-application deployment/mastodon-web
|
|
kubectl logs -n mastodon-application deployment/mastodon-sidekiq
|
|
```
|
|
|
|
## 🔄 Phase 2: Elasticsearch Integration
|
|
|
|
### When to Add Elasticsearch
|
|
|
|
Add Elasticsearch when you need:
|
|
- Full-text search within Mastodon
|
|
- Better search performance for content discovery
|
|
- Enhanced user experience with search features
|
|
|
|
### Implementation Steps
|
|
|
|
1. **Add Elasticsearch infrastructure** to `manifests/infrastructure/elasticsearch/`
|
|
2. **Uncomment Elasticsearch configuration** in `helm-release.yaml`
|
|
3. **Update dependencies** to include Elasticsearch
|
|
4. **Enable search features** in Mastodon admin panel
|
|
|
|
## 🆘 Troubleshooting
|
|
|
|
### Common Issues
|
|
|
|
**Database Connection Errors**:
|
|
```bash
|
|
# Check PostgreSQL connectivity
|
|
kubectl exec -n mastodon-application deployment/mastodon-web -- \
|
|
pg_isready -h postgresql-shared-rw.postgresql-system.svc.cluster.local -p 5432
|
|
```
|
|
|
|
**Redis Connection Errors**:
|
|
```bash
|
|
# Check Redis connectivity
|
|
kubectl exec -n mastodon-application deployment/mastodon-web -- \
|
|
redis-cli -h redis-ha-haproxy.redis-system.svc.cluster.local -p 6379 ping
|
|
```
|
|
|
|
**S3 Upload Issues**:
|
|
- Verify Backblaze B2 credentials
|
|
- Check bucket permissions and CORS configuration
|
|
- Test CDN connectivity to `mm.keyboardvagabond.com`
|
|
|
|
**OIDC Authentication Issues**:
|
|
- Verify Authentik provider configuration
|
|
- Check client ID and secret
|
|
- Confirm issuer URL accessibility
|
|
|
|
### Support Commands
|
|
|
|
```bash
|
|
# Run Mastodon CLI commands
|
|
kubectl exec -n mastodon-application deployment/mastodon-web -- tootctl help
|
|
|
|
# Database migrations
|
|
kubectl exec -n mastodon-application deployment/mastodon-web -- \
|
|
rails db:migrate
|
|
|
|
# Clear cache
|
|
kubectl exec -n mastodon-application deployment/mastodon-web -- \
|
|
tootctl cache clear
|
|
```
|
|
|
|
## 📚 References
|
|
|
|
- **Official Documentation**: https://docs.joinmastodon.org/
|
|
- **Helm Chart**: https://github.com/mastodon/chart
|
|
- **Admin Guide**: https://docs.joinmastodon.org/admin/
|
|
- **Federation Guide**: https://docs.joinmastodon.org/spec/activitypub/ |