Vận hành LCOJ
Hướng dẫn vận hành hàng ngày cho LCOJ với Docker.
Khởi động và dừng
Khởi động tất cả services
sh
cd lcoj-docker/dmoj
docker compose up -dDừng tất cả services
sh
docker compose downLưu ý: Lệnh này KHÔNG xóa data. Database và media files vẫn được giữ.
Dừng và xóa tất cả (bao gồm volumes)
sh
docker compose down -vCảnh báo: Lệnh này XÓA database! Chỉ dùng khi muốn reset hoàn toàn.
Quản lý từng service
Restart một service
sh
docker compose restart site
docker compose restart celery
docker compose restart nginxStop một service
sh
docker compose stop siteStart một service đã stop
sh
docker compose start siteRebuild và restart
sh
docker compose up -d --build siteXem logs
Logs tất cả services
sh
docker compose logs -fLogs một service
sh
docker compose logs -f site
docker compose logs -f celery
docker compose logs -f nginxLogs với số dòng giới hạn
sh
docker compose logs --tail=100 siteLogs trong khoảng thời gian
sh
docker compose logs --since 1h site
docker compose logs --since "2024-01-01 00:00:00" siteLưu logs ra file
sh
docker compose logs site > site_logs.txtTheo dõi hệ thống
Resource usage
sh
docker statsHiển thị CPU, RAM, Network, Disk I/O của từng container.
Disk usage
sh
# Tổng quan
docker system df
# Chi tiết
docker system df -vContainer status
sh
docker compose psXem processes trong container
sh
docker compose top siteTruy cập container
Exec vào container
sh
docker compose exec site bash
docker compose exec db bashChạy lệnh trong container
sh
docker compose exec site python manage.py check
docker compose exec db mysql -u root -pXem file trong container
sh
docker compose exec site cat /site/local_settings.pyDatabase operations
Backup database
sh
# Backup toàn bộ
docker exec lcoj_mysql mysqldump -u root -p<password> lcoj > backup.sql
# Backup với timestamp
docker exec lcoj_mysql mysqldump -u root -p<password> lcoj > backup_$(date +%Y%m%d_%H%M%S).sql
# Backup và compress
docker exec lcoj_mysql mysqldump -u root -p<password> lcoj | gzip > backup.sql.gzRestore database
sh
# Restore từ file
docker exec -i lcoj_mysql mysql -u root -p<password> lcoj < backup.sql
# Restore từ compressed file
gunzip < backup.sql.gz | docker exec -i lcoj_mysql mysql -u root -p<password> lcojTruy cập MySQL shell
sh
docker compose exec db mysql -u root -pChạy SQL query
sh
docker compose exec db mysql -u root -p<password> lcoj -e "SELECT COUNT(*) FROM judge_submission;"Migrations
Chạy migrations
sh
./scripts/migrateXem migrations chưa chạy
sh
./scripts/manage.py showmigrationsRollback migration
sh
./scripts/manage.py migrate <app_name> <migration_name>Tạo migration mới
sh
./scripts/manage.py makemigrationsStatic files
Collect static files
sh
./scripts/copy_staticXóa static files cũ
sh
docker compose exec site rm -rf /assets/*
./scripts/copy_staticCache management
Clear cache
sh
docker compose exec site python manage.py clear_cacheRestart Redis
sh
docker compose restart redisFlush Redis
sh
docker compose exec redis redis-cli FLUSHALLCelery tasks
Xem active tasks
sh
docker compose exec celery celery -A dmoj_celery inspect activeXem scheduled tasks
sh
docker compose exec celery celery -A dmoj_celery inspect scheduledPurge all tasks
sh
docker compose exec celery celery -A dmoj_celery purgeRestart Celery
sh
docker compose restart celeryProblem data
Upload problem data
sh
# Copy vào thư mục problems
cp -r /path/to/problem dmoj/problems/
# Set permissions
chmod -R 755 dmoj/problems/Backup problems
sh
tar -czf problems_backup_$(date +%Y%m%d).tar.gz dmoj/problems/Restore problems
sh
tar -xzf problems_backup_20240101.tar.gzMedia files
Backup media
sh
tar -czf media_backup_$(date +%Y%m%d).tar.gz dmoj/media/Clean old media
sh
# Xóa file cũ hơn 30 ngày
find dmoj/media/ -type f -mtime +30 -deleteMonitoring scripts
Script kiểm tra health
File: check_health.sh
bash
#!/bin/bash
echo "=== LCOJ Health Check ==="
echo
echo "Container Status:"
docker compose ps
echo
echo "Resource Usage:"
docker stats --no-stream
echo
echo "Disk Usage:"
df -h | grep -E "/$|/var"
echo
echo "Database Status:"
docker compose exec -T db mysqladmin -u root -p<password> status
echo
echo "Redis Status:"
docker compose exec -T redis redis-cli ping
echo
echo "Site Status:"
curl -s -o /dev/null -w "%{http_code}" http://localhostScript backup tự động
File: backup.sh
bash
#!/bin/bash
BACKUP_DIR="/backups"
DATE=$(date +%Y%m%d_%H%M%S)
echo "Starting backup at $DATE"
# Backup database
echo "Backing up database..."
docker exec lcoj_mysql mysqldump -u root -p<password> lcoj | gzip > $BACKUP_DIR/db_$DATE.sql.gz
# Backup media
echo "Backing up media..."
tar -czf $BACKUP_DIR/media_$DATE.tar.gz dmoj/media/
# Backup problems
echo "Backing up problems..."
tar -czf $BACKUP_DIR/problems_$DATE.tar.gz dmoj/problems/
# Delete old backups (older than 7 days)
echo "Cleaning old backups..."
find $BACKUP_DIR -type f -mtime +7 -delete
echo "Backup completed!"Cron job cho backup
cron
# Backup mỗi ngày lúc 2 giờ sáng
0 2 * * * /path/to/backup.sh >> /var/log/lcoj_backup.log 2>&1
# Health check mỗi 5 phút
*/5 * * * * /path/to/check_health.sh >> /var/log/lcoj_health.log 2>&1Performance optimization
Xem slow queries
sh
docker compose exec db mysql -u root -p -e "
SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 2;
SHOW VARIABLES LIKE 'slow_query%';
"Analyze database
sh
docker compose exec db mysqlcheck -u root -p --analyze --all-databasesOptimize database
sh
docker compose exec db mysqlcheck -u root -p --optimize --all-databasesSecurity
Đổi mật khẩu database
sh
# Vào MySQL shell
docker compose exec db mysql -u root -p
# Đổi password
ALTER USER 'lcoj'@'%' IDENTIFIED BY 'new_password';
FLUSH PRIVILEGES;Sau đó cập nhật environment/mysql.env và restart:
sh
docker compose restart site celery bridgedXem failed login attempts
sh
docker compose logs site | grep "Failed login"Block IP
Thêm vào nginx/conf.d/nginx.conf:
nginx
deny 1.2.3.4;Restart nginx:
sh
docker compose restart nginxTroubleshooting
Container bị crash liên tục
sh
# Xem logs
docker compose logs --tail=100 <service>
# Xem exit code
docker inspect <container> | grep ExitCode
# Restart với logs
docker compose up <service>Out of memory
sh
# Xem memory usage
docker stats
# Tăng memory limit
# Thêm vào docker-compose.yml:
deploy:
resources:
limits:
memory: 4GDisk full
sh
# Xem disk usage
df -h
# Xóa unused Docker resources
docker system prune -a
# Xóa old logs
find /var/lib/docker/containers/ -name "*.log" -mtime +7 -deleteDatabase locked
sh
# Xem processes
docker compose exec db mysql -u root -p -e "SHOW PROCESSLIST;"
# Kill process
docker compose exec db mysql -u root -p -e "KILL <process_id>;"Celery tasks stuck
sh
# Xem active tasks
docker compose exec celery celery -A dmoj_celery inspect active
# Revoke task
docker compose exec celery celery -A dmoj_celery control revoke <task_id>
# Restart Celery
docker compose restart celeryMaintenance mode
Bật maintenance mode
Tạo file dmoj/repo/maintenance.html:
html
<!DOCTYPE html>
<html>
<head>
<title>Maintenance</title>
</head>
<body>
<h1>Đang bảo trì</h1>
<p>Hệ thống đang được bảo trì. Vui lòng quay lại sau.</p>
</body>
</html>Cập nhật nginx config:
nginx
if (-f /site/maintenance.html) {
return 503;
}
error_page 503 @maintenance;
location @maintenance {
root /site;
rewrite ^(.*)$ /maintenance.html break;
}Tắt maintenance mode
sh
rm dmoj/repo/maintenance.html
docker compose restart nginx