Quay lại danh sách
Tin tức công nghệ

Tối ưu hóa chi phí và bảo mật: Hướng dẫn tự dựng Private NuGet và PyPI Server trên VPS ARM cho doanh nghiệp công nghệ

4 tháng 6, 2026

Đặt vấn đề: Thách thức quản lý thư viện mã nguồn trong doanh nghiệp

Trong kỷ nguyên chuyển đổi số, các doanh nghiệp công nghệ thường sở hữu hàng chục, thậm chí hàng trăm dự án phần mềm sử dụng chung các module lõi (core libraries). Đối với hệ sinh thái .NET và Python, việc chia sẻ các package NuGet và PyPI nội bộ là nhu cầu thiết yếu để tái sử dụng mã nguồn và chuẩn hóa quy trình phát triển.

Tuy nhiên, việc sử dụng các dịch vụ Cloud Private Registry như Azure Artifacts, GitHub Packages hay AWS CodeArtifact thường đi kèm với chi phí tích lũy theo dung lượng và số lượng người dùng rất đắt đỏ. Hơn nữa, vấn đề bảo mật thông tin và kiểm soát dữ liệu nội bộ luôn là mối quan ngại lớn đối với các doanh nghiệp tài chính, ngân hàng hoặc các startup đang nắm giữ công nghệ cốt lõi. Giải pháp tối ưu chính là tự vận hành một hệ thống Private Package Registry nội bộ.

Bài viết này sẽ hướng dẫn bạn cách triển khai một hệ thống Private NuGet (BaGet) và PyPI (Pypiserver) trên cùng một máy chủ VPS ARM (ví dụ: Oracle Cloud Ampere, AWS Graviton hoặc Vietnix ARM VPS). Lựa chọn kiến trúc ARM giúp doanh nghiệp tiết kiệm đến 40% chi phí phần cứng trong khi vẫn đảm bảo hiệu năng vượt trội.


Tại sao lại chọn VPS ARM, BaGet và Pypiserver?

Trước khi đi vào chi tiết kỹ thuật, hãy cùng điểm qua lý do tại sao sự kết hợp này lại là "bộ ba hoàn hảo" cho hạ tầng hạ tầng DevOps của bạn:

  • VPS ARM: Mang lại hiệu năng trên mỗi Watt điện và chi phí cực tốt. Các dòng chip ARM hiện đại hoàn toàn tương thích tốt với Docker và các ứng dụng container hóa.
  • BaGet: Là một service mã nguồn mở xây dựng trên ASP.NET Core, đóng vai trò là một NuGet server gọn nhẹ, tốc độ cao và tiêu tốn cực ít RAM (chỉ khoảng 50-100MB), thay thế hoàn hảo cho Nexus hay Artifactory cồng kềnh.
  • Pypiserver: Giải pháp tối giản và bảo mật cao để lưu trữ các gói Python (.whl, .tar.gz). Nó hoạt động mượt mà, không cần cơ sở dữ liệu phức tạp và cấu hình vô cùng nhanh chóng.

Kiến trúc hệ thống và chuẩn bị tiền đề

Để hệ thống hoạt động ổn định và bảo mật, chúng ta sẽ triển khai theo mô hình Containerization sử dụng Docker và Docker Compose, đứng sau một Reverse Proxy là Nginx Proxy Manager (hoặc Traefik) để tự động cấp phát chứng chỉ SSL Let's Encrypt miễn phí.

Yêu cầu chuẩn bị:

  1. Một máy chủ VPS chạy hệ điều hành Ubuntu Server (Kiến trúc ARM64).
  2. Một tên miền (Domain) đã trỏ các bản ghi A về IP của VPS (Ví dụ: nuget.yourcompany.com và pypi.yourcompany.com).
  3. Đã cài đặt Docker và Docker Compose phiên bản mới nhất tương thích ARM64.

Hướng dẫn chi tiết các bước triển khai

Bước 1: Cấu trúc thư mục dự án

Đầu tiên, hãy truy cập vào VPS thông qua SSH và tạo cấu trúc thư mục để lưu trữ dữ liệu cấu hình và các package:

mkdir -p ~/package-registry/baget/data
mkdir -p ~/package-registry/pypi/packages
cd ~/package-registry

Bước 2: Tạo file cấu hình bảo mật cho Pypiserver

Pypiserver yêu cầu xác thực để upload package. Chúng ta sẽ sử dụng công cụ htpasswd để tạo file chứa thông tin đăng nhập mật mã:

sudo apt-get install apache2-utils -y

Tạo file mật khẩu bảo mật (thay thế admin_user bằng username bạn muốn):

htpasswd -sc pypi/.htpasswd admin_user

Bước 3: Cấu hình Docker Compose tổng thể

Tạo file docker-compose.yml tại thư mục gốc ~/package-registry để định nghĩa cả hai dịch vụ:

version: '3.8'

services:
  baget:
    image: loicsharma/baget:latest
    container_name: private-nuget
    restart: always
    ports:
      - "8080:80"
    volumes:
      - ./baget/data:/var/baget
    environment:
      - APIKey=YOUR_SUPER_SECRET_NUGET_KEY
      - Storage__Type=FileSystem
      - Storage__Path=/var/baget/packages
      - Search__Type=Database

  pypiserver:
    image: pypiserver/pypiserver:latest
    container_name: private-pypi
    restart: always
    ports:
      - "8081:8080"
    volumes:
      - ./pypi/packages:/data/packages
      - ./pypi/.htpasswd:/data/.htpasswd
    command: -p 8080 -a update,download,list -P /data/.htpasswd /data/packages

Lưu ý quan trọng: Hãy thay đổi YOUR_SUPER_SECRET_NUGET_KEY bằng một chuỗi ngẫu nhiên có độ dài tối thiểu 32 ký tự để bảo vệ cổng đẩy package NuGet của bạn.

Bước 4: Khởi chạy hệ thống

Kích hoạt các container hoạt động ở chế độ chạy ngầm (detached mode):

docker compose up -d

Kiểm tra trạng thái hoạt động bằng lệnh docker compose ps để đảm bảo cả hai dịch vụ đều báo trạng thái Up.


Cấu hình Reverse Proxy và SSL

Để đảm bảo an toàn thông tin khi truyền tải package qua môi trường Internet, việc cấu hình HTTPS là bắt buộc. Bạn nên cấu hình Nginx để forward các port nội bộ ra ngoài:

  • Tên miền nuget.yourcompany.com trỏ về cổng nội bộ 8080.
  • Tên miền pypi.yourcompany.com trỏ về cổng nội bộ 8081.

Hãy đảm bảo rằng bạn đã bật tính năng mã hóa SSL Let's Encrypt và kích hoạt tùy chọn Force SSL cũng như nâng giới hạn dung lượng upload của Nginx (client_max_body_size 500M;) để tránh lỗi khi upload các bộ thư viện lớn.


Hướng dẫn sử dụng Client nội bộ

1. Đối với nhà phát triển .NET (NuGet)

Để cấu hình CLI nhận diện server mới, thực hiện lệnh:

dotnet nuget add source [https://nuget.yourcompany.com/v3/index.json](https://nuget.yourcompany.com/v3/index.json) --name CompanyPrivate

Khi muốn push một package lên hệ thống:

dotnet nuget push YourPackage.1.0.0.nupkg --source CompanyPrivate --api-key YOUR_SUPER_SECRET_NUGET_KEY

2. Đối với nhà phát triển Python (PyPI)

Để cấu hình cài đặt thư viện thông qua file pip.conf hoặc pyproject.toml, thêm đoạn sau vào cấu hình:

[global]
extra-index-url = [https://pypi.yourcompany.com/simple/](https://pypi.yourcompany.com/simple/)

Để upload package bằng Twine:

twine upload --repository-url [https://pypi.yourcompany.com/](https://pypi.yourcompany.com/) -u admin_user -p YourPassword dist/*


Kết luận và các lưu ý về bảo trì hệ thống

Việc tự xây dựng hạ tầng Private NuGet và PyPI Server trên VPS ARM không chỉ mang lại lợi ích kinh tế vượt trội cho các doanh nghiệp CNTT, mà còn nâng cao tính tự chủ và năng lực bảo mật hệ thống. Để hệ thống vận hành trơn tru lâu dài, đội ngũ DevOps của công ty cần lưu ý thiết lập quy trình backup định kỳ cho các thư mục ~/package-registry và cấu hình giám sát dung lượng ổ cứng (Disk Storage Monitoring) chặt chẽ.

Chúc các bạn cấu hình thành công và tối ưu hóa quy trình CI/CD của doanh nghiệp mình!