Làm chủ Local Repo: Hướng dẫn triển khai kho lưu trữ Apt và Yum cho môi trường Production

Linux tutorial - IT technology blog
Linux tutorial - IT technology blog

Cơn ác mộng lúc 2 giờ sáng: Tại sao Mirror bên ngoài thường thất bại ở quy mô lớn

Lúc đó là 2 giờ 14 phút sáng. Tôi đang nhìn chằm chằm vào lỗi “Connection Timed Out” trong khi cố gắng vá một lỗ hổng zero-day nghiêm trọng trên ba mươi máy chủ web. Đường truyền văn phòng của chúng tôi đang bị quá tải, và mỗi lệnh apt-get update giống như một trò may rủi. Việc phụ thuộc vào các mirror bên ngoài cho một hệ thống máy chủ production là một canh bạc mà cuối cùng bạn sẽ thua. Nó làm cạn kiệt băng thông, phá hỏng quy trình CI/CD và khiến bạn phải phụ thuộc vào sự ổn định của bên thứ ba.

Tôi nhận ra rằng chúng tôi cần một kho lưu trữ nội bộ (local repository). Cho dù bạn đang thắt chặt bảo mật cho một môi trường air-gapped hay chỉ muốn cắt giảm thời gian triển khai, việc tự vận hành mirror gói phần mềm là một kỹ năng không thể thiếu đối với các kỹ sư Linux. Trên node Ubuntu 22.04 của tôi với 4GB RAM, thiết lập này đã biến chu kỳ cập nhật từ 15 phút xuống còn chưa đầy 10 giây. Tốc độ thực sự rất quan trọng.

Lợi ích của việc sử dụng Local Repo

  • Tiết kiệm băng thông cực lớn: Tải một gói 50MB một lần, phân phối cho 1.000 máy chủ qua mạng LAN.
  • Tốc độ vượt trội: Mạng nội bộ 10Gbps sẽ đè bẹp đường truyền cáp quang thương mại 1Gbps khi tải hàng gigabyte các bản vá bảo mật.
  • Khóa phiên bản (Version Lock): Đảm bảo mọi máy chủ trong cluster của bạn chạy chính xác cùng một bản build của gói phần mềm.
  • Tăng cường bảo mật: Bạn kiểm soát cổng vào. Chỉ những phần mềm đã qua kiểm duyệt mới được phép vào môi trường production.

Xây dựng nền tảng: Các công cụ cần thiết cho Repository

Chúng ta cần một nơi để lưu trữ dữ liệu và một cách để phân phối nó. Tôi sử dụng Nginx vì nó nhẹ, ổn định và phục vụ các file tĩnh với tốc độ cực nhanh. Hướng dẫn này bao gồm cả quy trình cho hệ điều hành gốc Debian (Apt) và gốc RHEL (Yum/Dnf).

Chuẩn bị không gian lưu trữ

Đừng đánh giá thấp dung lượng lưu trữ. Một mirror Ubuntu đầy đủ có thể dễ dàng chiếm tới 250GB. Hãy sử dụng một phân vùng riêng biệt hoặc một ổ cứng NVMe gắn ngoài. Trong ví dụ này, chúng ta sẽ sử dụng /var/repo.

sudo mkdir -p /var/repo/{ubuntu,centos}
sudo chown -R $USER:$USER /var/repo

Cài đặt phần mềm đồng bộ

Trên Ubuntu/Debian, apt-mirror là tiêu chuẩn. Đối với RHEL hoặc AlmaLinux, chúng ta dựa vào createrepoyum-utils.

# Cho Server Repo Ubuntu/Debian
sudo apt update && sudo apt install apt-mirror nginx -y

# Cho Server Repo RHEL/AlmaLinux/CentOS
sudo dnf install yum-utils createrepo nginx -y

Cấu hình: Đồng bộ và phân phối các gói

Bây giờ chúng ta sẽ xác định những kho lưu trữ nào cần clone và cách các client sẽ nhìn thấy chúng. Sự chính xác ở bước này sẽ ngăn ngừa các lỗi phụ thuộc (dependency) về sau.

1. Cấu hình Apt Mirror (Ubuntu/Debian)

Chỉnh sửa file /etc/apt/mirror.list. File này cho apt-mirror biết nơi lưu dữ liệu và các kiến trúc hệ thống cần tải về.

############# cấu hình #############
set base_path    /var/repo/ubuntu
set nthreads     20
set _crypto_md5  1
############# kết thúc cấu hình #########

deb http://archive.ubuntu.com/ubuntu jammy main restricted universe multiverse
deb http://archive.ubuntu.com/ubuntu jammy-updates main restricted universe multiverse
deb http://archive.ubuntu.com/ubuntu jammy-security main restricted universe multiverse

clean http://archive.ubuntu.com/ubuntu

Kích hoạt quá trình đồng bộ ban đầu. Cảnh báo: với kết nối 100Mbps, lần tải 200GB đầu tiên sẽ mất vài giờ.

sudo apt-mirror

2. Cấu hình Yum Mirror (RHEL/AlmaLinux)

Đối với các hệ thống gốc RHEL, reposync sẽ tải các file RPM trong khi createrepo tạo ra các metadata cần thiết để client có thể duyệt qua cấu trúc các gói.

# Đồng bộ kho lưu trữ
reposync -p /var/repo/centos --repo=baseos --download-metadata

# Tạo metadata cho kho lưu trữ
createrepo /var/repo/centos/baseos

3. Phân phối qua Nginx

Hãy làm cho các file này có thể truy cập được. Tạo cấu hình Nginx tại /etc/nginx/sites-available/repo. Chúng ta sẽ giới hạn quyền truy cập trong mạng nội bộ để đảm bảo an toàn.

server {
    listen 80;
    server_name repo.local.network;
    root /var/repo;

    location / {
        autoindex on;
        allow 192.168.1.0/24; # Chỉ cho phép mạng nội bộ của bạn
        deny all;
    }
}

Kích hoạt trang web và khởi động lại Nginx để áp dụng các thay đổi:

sudo ln -s /etc/nginx/sites-available/repo /etc/nginx/sites-enabled/
sudo systemctl restart nginx

Xác minh: Duy trì sự ổn định của Mirror

Thiết lập xong mới chỉ là một nửa chặng đường. Bạn phải xác minh kết nối và giữ cho dữ liệu luôn mới. Tôi đã từng thấy những mirror bị bỏ quên hàng tháng trời, khiến các máy chủ production chạy những phần mềm cũ kỹ, đầy lỗ hổng vì script đồng bộ bị lỗi trong âm thầm.

Kiểm tra trên máy Client

Trên một client Ubuntu, hãy trỏ /etc/apt/sources.list về máy chủ nội bộ mới của bạn:

deb http://repo.local.network/ubuntu/mirror/archive.ubuntu.com/ubuntu/ jammy main restricted

Chạy sudo apt update. Nếu nó kết thúc trong chớp mắt, bạn đã thành công.

Trên một client AlmaLinux, tạo file /etc/yum.repos.d/local.repo:

[local-baseos]
name=Local BaseOS
baseurl=http://repo.local.network/centos/baseos/
gpgcheck=0
enabled=1

Tự động hóa cập nhật

Đừng chạy những lệnh này một cách thủ công. Hãy thiết lập một cron job vào lúc 2 giờ sáng—hy vọng lần này bạn có thể ngủ ngon. Tạo file /etc/cron.d/repo-sync:

0 2 * * * root /usr/bin/apt-mirror > /var/log/apt-mirror.log 2>&1
# Hoặc cho Yum
0 2 * * * root reposync -p /var/repo/centos --repo=baseos --download-metadata && createrepo --update /var/repo/centos/baseos

Cảnh báo “Đầy ổ cứng”

Một mẹo cuối cùng: hãy theo dõi dung lượng lưu trữ của bạn. Các kho lưu trữ sẽ ngày càng lớn hơn. Tôi sử dụng một đoạn shell script đơn giản để cảnh báo khi phân vùng đạt mức 85%. Nếu ổ đĩa bị đầy, quá trình đồng bộ sẽ thất bại và metadata của bạn sẽ bị hỏng, biến tình huống khẩn cấp tiếp theo của bạn thành một cơn đau đầu lớn hơn nhiều.

Xây dựng một kho lưu trữ nội bộ là một nhiệm vụ kiểu “thiết lập một lần rồi thôi” nhưng mang lại lợi ích trong nhiều năm. Nó thay thế sự phụ thuộc mong manh vào thế giới bên ngoài bằng một dịch vụ nội bộ mạnh mẽ, có thể kiểm soát được. Hãy bắt đầu từ quy mô nhỏ, chỉ mirror những bộ phần mềm bạn thực sự sử dụng, và chứng kiến tốc độ triển khai của bạn tăng vọt.

Share: