223 lines
6.6 KiB
Bash
Executable File
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
|