DevOps & Infrastructure

Tự Host Website Production trên Home Server với Azure DevOps

By Ginbok7 min read

Bối Cảnh Dự Án

Vận hành một website không phải lúc nào cũng đòi hỏi các dịch vụ đám mây (cloud) đắt đỏ. Trong bài viết này, tôi muốn chia sẻ một trường hợp thực tế về cách tôi đã xây dựng, triển khai và host một website production bằng chính server tại nhà, kết hợp với Azure DevOps CI/CD, IIS và Dynamic DNS. Chi phí định kỳ duy nhất trong thiết lập này chỉ là tiền duy trì tên miền.

Đây không phải là một hướng dẫn lý thuyết. Mọi thứ được mô tả ở đây đều đã được triển khai và đang vận hành thực tế, tạo ra một môi trường mạnh mẽ để thử nghiệm và host các ứng dụng chuyên nghiệp mà không phải trả "thuế cloud" hàng tháng.

Động Lực và Mục Tiêu

Tôi đã làm việc trên một website được xây dựng bằng Optimizely CMS 12 và Commerce 14, chạy trên nền tảng .NET và host qua IIS. Thay vì triển khai lên Azure App Service hay Kubernetes ngay từ đầu, tôi muốn đạt được một số mục tiêu chiến lược:

Điều này dẫn đến một kiến trúc tự host với quy trình triển khai chuyên nghiệp không kém gì các tiêu chuẩn doanh nghiệp.

Kiến Trúc Tổng Thể

Hệ thống được thiết kế để đảm bảo tính ổn định và tự động hóa. Các thành phần chính bao gồm:

Hosting Website trên IIS

Website được host trên IIS với một Application Pool riêng biệt. Để đảm bảo tính sẵn sàng và tốc độ phản hồi, cấu hình cần được tùy chỉnh kỹ lưỡng thay vì chỉ cài đặt mặc định.

Ví dụ về các tham số thiết lập:

Cấu hình này đảm bảo site luôn trong trạng thái sẵn sàng, điều này cực kỳ quan trọng đối với các nền tảng CMS thường có quy trình khởi động nặng.

Công Khai Website với Dynamic DNS

Vì mạng tại nhà không có IP tĩnh, tôi đã sử dụng Dynamic DNS. Nó đóng vai trò là cầu nối giữa địa chỉ IP thay đổi liên tục của bạn và một hostname cố định.

Luồng hoạt động được tự động hóa như sau:

  1. Router (hoặc một phần mềm nhỏ trên server) cập nhật IP công cộng lên No-IP mỗi khi có thay đổi.
  2. Hostname của No-IP (ví dụ: myhomeserver.ddns.net) luôn trỏ về IP mới nhất.
  3. Tên miền chính (ví dụ: example.com) sử dụng bản ghi CNAME trỏ về hostname của No-IP.

Cấu hình DNS mẫu:

example.com      CNAME  myhomeserver.ddns.net
www.example.com  CNAME  myhomeserver.ddns.net

Từ bên ngoài, website hoạt động bình thường như bất kỳ trang web nào được host tại trung tâm dữ liệu.

CI/CD với Azure DevOps

Build Pipeline (Cloud Agent)

Pipeline build đảm nhận việc biên dịch mã nguồn. Sử dụng agent do Microsoft host là cách dễ nhất vì nó không tiêu tốn tài nguyên máy cục bộ trong giai đoạn build.

- task: DotNetCoreCLI@2
  displayName: 'Publish website'
  inputs:
    command: 'publish'
    projects: '**/CmsSite.csproj'
    arguments: '--configuration Release --output $(Build.ArtifactStagingDirectory)'
    zipAfterPublish: true

Kết quả là một file ZIP chứa các tệp thực thi, tài nguyên tĩnh và các tệp cấu hình đã được biên dịch.

Deploy Pipeline (Self-Hosted Agent)

Việc triển khai là nơi sự "kỳ diệu" xảy ra. Bằng cách sử dụng self-hosted agent cài đặt trực tiếp trên server tại nhà, Azure DevOps có thể "chạm" vào mạng nội bộ để thực thi lệnh mà không cần mở các cổng nguy hiểm như RDP hay SMB ra internet.

Các nhiệm vụ chính của script triển khai:

Đoạn mã PowerShell mẫu trong release pipeline:

Import-Module WebAdministration
Stop-Website -Name "CmsSite"
Stop-WebAppPool -Name "CmsSite"

# Giải nén gói sản phẩm
Expand-Archive -Path "C:\agent\_work\r1\a\site.zip" -DestinationPath "C:\inetpub\wwwroot\CmsSite" -Force

Start-WebAppPool -Name "CmsSite"
Start-Website -Name "CmsSite"

Giám Sát với Application Insights

Giám sát là yếu tố sống còn đối với hệ thống tự host. Tôi đã tích hợp Azure Application Insights để theo dõi sức khỏe, lỗi và hiệu năng. Cấu hình được đẩy qua biến môi trường trong lúc release để bảo mật thông tin.

{
  "ApplicationInsights": {
    "ConnectionString": "InstrumentationKey=MÃ_CỦA_BẠN"
  }
}

Để dữ liệu không bị nhiễu, tôi lọc bỏ các request từ giao diện quản trị của CMS:

// Lọc bỏ các request đến /episerver/cms và /episerver/shell
public void Process(ITelemetry telemetry)
{
    var request = telemetry as RequestTelemetry;
    if (request != null && (request.Url.AbsolutePath.Contains("/episerver/")))
    {
        return; 
    }
}

Vấn Đề Bảo Mật

Bảo mật là mối quan tâm lớn nhất khi mở home server ra internet. Tôi triển khai nhiều lớp bảo vệ:

Kết Luận

Thiết lập này chứng minh rằng việc host một website chuyên nghiệp không phải lúc nào cũng cần đến hạ tầng cloud đắt đỏ. Với một pipeline CI/CD đúng đắn, cấu hình IIS chuẩn và giám sát chặt chẽ, một server tại nhà hoàn toàn có thể vận hành ổn định một website CMS .NET hiện đại. Đây là cách tuyệt vời để các nhà phát triển làm chủ toàn bộ hệ thống—từ phần cứng cho đến trình duyệt.

#home-server#iis#azure-devops#ci-cd#automation#backend#asp.net-core
← Back to Articles