Files
homelab-optimized/docs/services/mastodon/fix-mastodon.sh
Gitea Mirror Bot 2ea7d71f94
Some checks failed
Documentation / Build Docusaurus (push) Failing after 5m3s
Documentation / Deploy to GitHub Pages (push) Has been skipped
Sanitized mirror from private repository - 2026-04-05 10:53:12 UTC
2026-04-05 10:53:12 +00:00

223 lines
6.6 KiB
Bash
Executable File

#!/bin/bash
# =============================================================================
# Mastodon Fix/Repair Script
# Diagnoses and fixes common issues
# =============================================================================
# Run as root
echo "=========================================="
echo "Mastodon Fix/Repair Tool"
echo "=========================================="
# Check root
if [[ $EUID -ne 0 ]]; then
echo "This script must be run as root"
exit 1
fi
FIXED=0
ERRORS=0
# 1. Check and fix service status
echo ""
echo "[1/7] Checking services..."
services=("postgresql" "valkey" "nginx" "mastodon-web" "mastodon-sidekiq" "mastodon-streaming")
for svc in "${services[@]}"; do
if systemctl is-active --quiet $svc 2>/dev/null; then
echo "$svc is running"
elif systemctl list-unit-files | grep -q "^${svc}.service"; then
echo "$svc is not running, attempting to start..."
systemctl start $svc 2>/dev/null
sleep 2
if systemctl is-active --quiet $svc; then
echo "$svc started successfully"
FIXED=$((FIXED + 1))
else
echo " ✗ Failed to start $svc"
echo " Check logs: journalctl -u $svc -n 50"
ERRORS=$((ERRORS + 1))
fi
fi
done
# 2. Check file permissions
echo ""
echo "[2/7] Checking file permissions..."
# Check .env.production
if [ -f /home/mastodon/live/.env.production ]; then
OWNER=$(stat -c '%U' /home/mastodon/live/.env.production)
PERMS=$(stat -c '%a' /home/mastodon/live/.env.production)
if [ "$OWNER" != "mastodon" ]; then
echo " ✗ Fixing .env.production ownership..."
chown mastodon:mastodon /home/mastodon/live/.env.production
FIXED=$((FIXED + 1))
fi
if [ "$PERMS" != "600" ]; then
echo " ✗ Fixing .env.production permissions..."
chmod 600 /home/mastodon/live/.env.production
FIXED=$((FIXED + 1))
fi
echo " ✓ .env.production permissions OK"
fi
# Check live directory ownership
if [ -d /home/mastodon/live ]; then
LIVE_OWNER=$(stat -c '%U' /home/mastodon/live)
if [ "$LIVE_OWNER" != "mastodon" ]; then
echo " ✗ Fixing /home/mastodon/live ownership..."
chown -R mastodon:mastodon /home/mastodon/live
FIXED=$((FIXED + 1))
else
echo " ✓ /home/mastodon/live ownership OK"
fi
fi
# 3. Check database connection
echo ""
echo "[3/7] Checking database..."
if sudo -u postgres psql -c "SELECT 1" mastodon_production > /dev/null 2>&1; then
echo " ✓ Database connection successful"
else
echo " ✗ Cannot connect to database"
# Try to fix common issues
if ! systemctl is-active --quiet postgresql; then
echo " Attempting to start PostgreSQL..."
systemctl start postgresql
sleep 2
fi
# Check if database exists
if ! sudo -u postgres psql -lqt | cut -d \| -f 1 | grep -qw mastodon_production; then
echo " Database does not exist!"
ERRORS=$((ERRORS + 1))
fi
fi
# 4. Check Redis/Valkey connection
echo ""
echo "[4/7] Checking cache server..."
if valkey-cli ping > /dev/null 2>&1; then
echo " ✓ Valkey connection successful"
elif redis-cli ping > /dev/null 2>&1; then
echo " ✓ Redis connection successful"
else
echo " ✗ Cannot connect to cache server"
if systemctl is-active --quiet valkey; then
echo " Valkey is running but not responding"
elif systemctl is-active --quiet redis; then
echo " Redis is running but not responding"
else
echo " Attempting to start Valkey..."
systemctl start valkey 2>/dev/null || systemctl start redis 2>/dev/null
sleep 2
FIXED=$((FIXED + 1))
fi
fi
# 5. Check nginx configuration
echo ""
echo "[5/7] Checking nginx configuration..."
if nginx -t 2>/dev/null; then
echo " ✓ Nginx configuration is valid"
else
echo " ✗ Nginx configuration has errors"
nginx -t
ERRORS=$((ERRORS + 1))
fi
# 6. Check SELinux contexts (Rocky/RHEL)
echo ""
echo "[6/7] Checking SELinux..."
if command -v getenforce &> /dev/null; then
SELINUX_MODE=$(getenforce)
echo " SELinux mode: $SELINUX_MODE"
if [ "$SELINUX_MODE" = "Enforcing" ]; then
# Fix common SELinux issues
if [ -d /home/mastodon/live/public ]; then
echo " Ensuring correct SELinux contexts..."
chcon -R -t httpd_sys_content_t /home/mastodon/live/public 2>/dev/null || true
fi
fi
else
echo " SELinux not present"
fi
# 7. Check API endpoints
echo ""
echo "[7/7] Checking API endpoints..."
sleep 1
# Test instance API
if curl -sf http://127.0.0.1:3000/api/v1/instance > /dev/null 2>&1; then
echo " ✓ Instance API responding"
else
echo " ✗ Instance API not responding"
# Check if it's a startup timing issue
echo " Waiting for services to fully start..."
sleep 5
if curl -sf http://127.0.0.1:3000/api/v1/instance > /dev/null 2>&1; then
echo " ✓ Instance API now responding"
else
echo " ✗ Instance API still not responding"
echo " Check logs: journalctl -u mastodon-web -n 50"
ERRORS=$((ERRORS + 1))
fi
fi
# Test streaming API
if curl -sf http://127.0.0.1:4000/api/v1/streaming/health > /dev/null 2>&1; then
echo " ✓ Streaming API healthy"
else
echo " ✗ Streaming API not responding"
echo " Attempting to restart streaming service..."
systemctl restart mastodon-streaming
sleep 3
if curl -sf http://127.0.0.1:4000/api/v1/streaming/health > /dev/null 2>&1; then
echo " ✓ Streaming API now healthy"
FIXED=$((FIXED + 1))
else
echo " ✗ Streaming API still not responding"
ERRORS=$((ERRORS + 1))
fi
fi
# Summary
echo ""
echo "=========================================="
if [ $ERRORS -eq 0 ]; then
if [ $FIXED -eq 0 ]; then
echo "✅ All checks passed! No issues found."
else
echo "✅ Fixed $FIXED issue(s). All checks now pass."
echo ""
echo "You may want to restart services:"
echo " systemctl restart mastodon-web mastodon-sidekiq mastodon-streaming"
fi
else
echo "⚠️ Found $ERRORS error(s) that need manual attention."
echo ""
echo "Common fixes:"
echo " - Check logs: journalctl -u mastodon-web -f"
echo " - Restart all: systemctl restart mastodon-{web,sidekiq,streaming}"
echo " - Check .env: cat /home/mastodon/live/.env.production"
echo " - Run migrations: sudo -u mastodon bash -lc 'cd ~/live && RAILS_ENV=production bin/rails db:migrate'"
fi
echo "=========================================="
exit $ERRORS