Cài đặt LCOJ với Docker
Hướng dẫn này giúp bạn cài đặt LCOJ bằng Docker - cách được khuyến nghị và đơn giản nhất.
Repository: lcoj-docker
Yêu cầu hệ thống
Phần cứng tối thiểu
- CPU: 2 cores
- RAM: 4GB
- Disk: 20GB trống
- OS: Linux (Ubuntu 20.04+ khuyến nghị)
Phần cứng khuyến nghị
- CPU: 4+ cores
- RAM: 8GB+
- Disk: 50GB+ SSD
- Network: 100Mbps+
Phần mềm
- Docker 20.10+
- Docker Compose 2.0+
- Git
Bước 1: Cài đặt Docker
Ubuntu/Debian
# Cài đặt Docker
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
# Thêm user vào group docker
sudo usermod -aG docker $USER
# Logout và login lại để áp dụngKiểm tra
docker --version
docker compose versionBước 2: Clone repository
git clone --recursive https://github.com/luyencode/lcoj-docker.git
cd lcoj-docker/dmojLưu ý: Flag --recursive rất quan trọng để clone cả submodules.
Bước 3: Khởi tạo
Chạy script khởi tạo:
./scripts/initializeScript này sẽ:
- Tạo các thư mục cần thiết
- Copy file cấu hình mẫu
- Set permissions
Bước 4: Cấu hình
4.1. Tạo file environment
cp environment/mysql-admin.env.example environment/mysql-admin.env
cp environment/mysql.env.example environment/mysql.env
cp environment/site.env.example environment/site.env4.2. Cấu hình MySQL
File: environment/mysql.env
MYSQL_DATABASE=lcoj
MYSQL_USER=lcoj
MYSQL_PASSWORD=<mat_khau_manh>File: environment/mysql-admin.env
MYSQL_ROOT_PASSWORD=<mat_khau_root_manh>Lưu ý: Đổi <mat_khau_manh> thành mật khẩu thực tế!
4.3. Cấu hình Site
File: environment/site.env
# Database
MYSQL_HOST=db
MYSQL_DATABASE=lcoj
MYSQL_USER=lcoj
MYSQL_PASSWORD=<trung_voi_mysql.env>
# Site
SITE_NAME=LCOJ
SITE_LONG_NAME=LuyenCode Online Judge
SITE_ADMIN_EMAIL=[email protected]
# Secret key (generate mới)
SECRET_KEY=<secret_key_dai_va_ngau_nhien>
# Host
HOST=luyencode.net
# Debug (PHẢI ĐỔI THÀNH False KHI PRODUCTION)
DEBUG=TrueTạo SECRET_KEY:
python3 -c "import secrets; print(secrets.token_urlsafe(50))"4.4. Cấu hình Nginx
File: nginx/conf.d/nginx.conf
Đổi server_name:
server {
listen 80;
server_name luyencode.net; # Đổi thành domain của bạn
# ... phần còn lại giữ nguyên
}Bước 5: Build Docker images
docker compose buildQuá trình này mất 10-20 phút tùy vào tốc độ mạng và máy.
Bước 6: Khởi động services
6.1. Khởi động database và cache
docker compose up -d db redisĐợi 10 giây để database khởi động hoàn toàn.
6.2. Khởi động site và celery
docker compose up -d site celery6.3. Tạo database schema
./scripts/migrate6.4. Tạo static files
./scripts/copy_static6.5. Load dữ liệu mẫu
./scripts/manage.py loaddata navbar
./scripts/manage.py loaddata language_small
./scripts/manage.py loaddata demoCảnh báo: demo tạo tài khoản admin với username/password là admin. Đổi ngay sau khi đăng nhập!
6.6. Tạo superuser
./scripts/manage.py createsuperuserLàm theo hướng dẫn để tạo tài khoản admin của bạn.
Bước 7: Khởi động tất cả services
docker compose up -dKiểm tra tất cả containers đang chạy:
docker compose psBạn sẽ thấy:
NAME STATUS
lcoj_bridged Up
lcoj_celery Up
lcoj_mysql Up
lcoj_nginx Up
lcoj_redis Up
lcoj_site Up
lcoj_wsevent UpBước 8: Kiểm tra
Truy cập http://localhost (hoặc domain của bạn) để kiểm tra.
Bạn sẽ thấy trang chủ LCOJ!
Cấu trúc thư mục
dmoj/
├── base/ # Base Docker image
├── bridged/ # Bridge service
├── celery/ # Celery worker
├── config/ # Config files
├── database/ # MySQL data (tự động tạo)
├── environment/ # Environment variables
├── media/ # User uploads
├── nginx/ # Nginx config
├── problems/ # Problem data
├── repo/ # Site source code (submodule)
├── scripts/ # Helper scripts
├── site/ # Site Docker image
├── wsevent/ # WebSocket event server
└── docker-compose.yml # Docker Compose configCác services
| Service | Container | Port | Mô tả |
|---|---|---|---|
| nginx | lcoj_nginx | 80 | Web server |
| site | lcoj_site | - | Django application |
| celery | lcoj_celery | - | Background tasks |
| bridged | lcoj_bridged | 9998, 9999 | Judge bridge |
| wsevent | lcoj_wsevent | 15100-15102 | WebSocket events |
| db | lcoj_mysql | 3306 | MariaDB database |
| redis | lcoj_redis | 6379 | Cache & message broker |
Quản lý services
Xem logs
# Tất cả services
docker compose logs -f
# Một service cụ thể
docker compose logs -f site
docker compose logs -f celery
docker compose logs -f nginxRestart service
docker compose restart site
docker compose restart celeryStop tất cả
docker compose downStart lại
docker compose up -dCập nhật
Cập nhật code
cd lcoj-docker/dmoj
git pull
git submodule update --init --recursiveRebuild và restart
docker compose up -d --build site celery bridged wseventChạy migrations
./scripts/migrateCập nhật static files
./scripts/copy_staticBackup
Backup database
docker exec lcoj_mysql mysqldump -u root -p<root_password> lcoj > backup_$(date +%Y%m%d).sqlBackup media files
tar -czf media_backup_$(date +%Y%m%d).tar.gz dmoj/media/Backup problems
tar -czf problems_backup_$(date +%Y%m%d).tar.gz dmoj/problems/Restore
Restore database
docker exec -i lcoj_mysql mysql -u root -p<root_password> lcoj < backup_20240101.sqlRestore media
tar -xzf media_backup_20240101.tar.gzMonitoring
Kiểm tra resource usage
docker statsKiểm tra disk usage
docker system dfXem logs realtime
# Site logs
docker compose logs -f --tail=100 site
# Celery logs
docker compose logs -f --tail=100 celery
# Nginx access logs
docker compose exec nginx tail -f /var/log/nginx/access.logTroubleshooting
Container không start
# Xem logs
docker compose logs <service_name>
# Xem chi tiết
docker inspect <container_name>Database connection error
# Kiểm tra MySQL đang chạy
docker compose ps db
# Kiểm tra logs
docker compose logs db
# Restart database
docker compose restart dbStatic files không load
# Chạy lại copy_static
./scripts/copy_static
# Restart nginx
docker compose restart nginxOut of memory
# Kiểm tra memory usage
docker stats
# Tăng memory limit trong docker-compose.yml
# Thêm vào service cần thiết:
deploy:
resources:
limits:
memory: 2GDisk full
# Xóa unused images
docker image prune -a
# Xóa unused volumes
docker volume prune
# Xóa unused containers
docker container pruneProduction checklist
Trước khi deploy production:
Cấu hình HTTPS
Với Let's Encrypt
# Cài đặt certbot
apt install certbot python3-certbot-nginx
# Lấy certificate
certbot --nginx -d luyencode.net
# Auto-renew
certbot renew --dry-runCập nhật nginx config
Certbot sẽ tự động cập nhật nginx config. Sau đó:
docker compose restart nginxPerformance tuning
Tăng số Celery workers
File: celery/Dockerfile
CMD celery -A dmoj_celery worker -l info --concurrency=4Tăng số uWSGI workers
File: site/Dockerfile
CMD uwsgi --ini uwsgi.ini --processes=4Cấu hình Redis persistence
File: docker-compose.yml
redis:
command: redis-server --appendonly yes
volumes:
- redis-data:/dataXem thêm
Hỗ trợ
Nếu gặp vấn đề:
- Kiểm tra logs:
docker compose logs -f - Tạo issue tại GitHub Issues
- Liên hệ hỗ trợ tại https://luyencode.net/about/#lien-he
