Deploy ASPNET Core lên Google Cloud Virtual Machine Instances
Giới thiệu
Mình đã có bài viết hướng dẫn deploy ASPNET Core lên Azure. Với mình thì deploy ASPNET Core lên Google Cloud dùng Virtual Machine (VM) thì nhiều bước và phức tạp hơn nhiều. Tại khách hàng muốn chứ mình cũng không thích kiểu này.
Mình dùng Mac để phát triển ứng dụng, nên cần kết nối remotely đến Window Server cũng như SQL Server bằng những app trên Mac
Nói chung mình lỡ viết rồi nên cũng ráng viết rất chi tiết, chụp hình từng bước, mình nghĩ nếu bạn chưa deploy ứng dụng lần nào cũng có thể làm được một cách dễ dàng.
Hy vọng bài viết này giúp ích được cho mọi người
Bước 1: Tạo Virtual Machine Instance
Chọn OS Image
Ở đây mình chọn Microsoft Windows Server 2016 Datacenter. Nếu bạn chọn OS là Windows thì sẽ trả thêm phí bản quyền nhé
Ở phần Firewall, nhớ chọn Allow Http and Https nhé, không là không truy cập được
Xem giá tiền và xác nhận tạo VM
Bước 2: Config Local Server và IIS
Config Local Server
Vì mình dùng Mac, nên mình dùng app Microsoft Remote Desktop để kết nối với Windows Server vừa mới tạo. App này free và khá tốt. Mình tạo 1 folder share giữa máy Mac local và server luôn để lát nữa share file cho tiện.
Tiếp theo bạn truy cập remote vào server mới tạo. Mở Server Manager và tắt cái Internet Explorer (IE) Enhanced Security Configuration đi để vào IE tải file được.
Sau đó cài đặt the .NET Core Hosting Bundle, lựa version ASP.NET Core của bạn để cài vào máy ở đây
Config IIS
Từ Server Manager, chọn Manage -> Add Roles and Features
Popup hiện ra, bạn bấm Next vài lần. Ở Tab Server Roles, chọn thêm Web Server (IIS). Ở tab Features, chọn thêm .NET Framework 4.6 Features.
Bước 3: Cài đặt, config SQL Server
Thường những bài hướng dẫn trên mạng bỏ qua bước này, nhưng mình thấy đây là bước cần thiết nhất vì app nào cũng có database mà. Vì mình phát triển ứng dụng trên Macbook, nên cần kết nối tới database trên Windows Server (Virtual Machine mới tạo ở trên).
Cài đặt SQL server
Mình dùng bản free là SQL Express 2017. Quá trình cài đặt cũng đơn giản.
Bạn cài thêm SQL Server Management Studio thêm cho dễ config.
Config SQL Sever
Bạn dùng SQL Server Management Studio để login vào SQL Server và tạo database. Thường thì server name sẽ là: localhost hoặc localhost\SQLEXPRESS. Ví dụ của mình default là INSTANCE-1\khoanguyenvan1505. Sau khi bạn connect thành công, nháy phải vào connection đó chọn Properties.
Qua tab Security, chọn mode Windows Authentication
Tab Connection, chọn Allow connections to this server
Vào folder Security để tạo account, đây là account để bạn dùng truy cập vào SQL Server remote.
Sau đó vào grant access cho user này
Truy cập SQL Server bằng IP address
Giờ chúng ta cần config để cho phép máy local có thể truy cập được SQL Server qua địa chỉ IP.
Bạn mở SQL Server Configuration Manager, và Enable 3 cột như trong hình.
Double click vào TCP/IP, tab IP Adress. TCP Dynamic Ports để trống, TCP Port: 1433
Tiếp theo ta sẽ khai báo port 1433 trong FireWall. Bạn mở app Windows Firewall with Advanced Security. Chọn Tab Inbound Rules, chọn New Rules.
Tạo rule mới là TCP:1433 nhé.
Sau đó bạn vào SQL Server Management Studio và login với name server là IP address của Virtual Machine nhé. Nếu thành công thì sang bước tiếp theo, còn nếu báo lỗi thì bạn search access sql server via ip address. Mình thấy khá nhiều lỗi linh tinh về vấn đề này.
Mở port Firewall trên Google Cloud
Bước này sẽ cho phép từ 1 địa chỉ IP từ máy khác có thể truy cập được SQL Server. Bạn vào phần Firewall Rules trên Google Cloud và thêm 1 rule giống hình nhé.
Chú ý: Bạn cần vào lại VM instance của mình xem Network tags của nó là gì thì trong cái rule phải dùng Network tags đó mới đúng nhé. Bạn dùng Apply to all sẽ không được đâu, mình mất cả mấy tiếng vì cái targets này luôn ý. Cứ tưởng Apply to all sẽ có tags của VM, nhưng không phải bạn à.
Bạn vào máy local kết nối thử được chưa nhé:
Nếu mọi thứ ok hết thì tạo 1 database để cho bước sau nhé.
Bước 4: Chuẩn bị app ASP.NET Core
Mình tạo 1 app đơn giản có đăng ký đăng nhập để kết nối với database.
dotnet new mvc --auth Individual -o deploy
Bạn vào đổi connection string lại:
"Server=tcp:{your_vm_ip_address},1433;Initial Catalog={db_name};Persist Security Info=False;User ID={your_id};Password={your_password};MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;"
Sau đó bạn thực hiện migration để update db
dotnet ef migrations add initDb dotnet ef database update
Nếu không được có thể bỏ Encrypt=True trong connection string thử. Bạn chạy thử ok rồi thì:
dotnet publish -c Release
Sau đó copy Folder publish sang Google VM đã tạo ở bước 1. Bạn có thể upload lên đâu đó rồi vào VM tải về, hoặc dùng share folder như mình ở bước 2 ở trên.
Sau đó copy tất cả trong folder publish vào
C:\inetpub\wwwroot\nivikademy
Trong đó thì nivikademy là để folder mình muốn chứa app này, bạn đặt tên khác cũng được nhé
Bước 5: Thêm site trong IIS
Bạn mở app IIS lên nhé
Dưới tab Sites, bạn chọn Add Websites. Bạn chọn đường dẫn đến thư mục ở trên, mình dùng port 5000.
Bạn vào Application Pools, double click vào site mới tạo. Ở phần .NET CLR version, chọn No Managed Code.
Sau đó bạn vào http://localhost:5000/ và thấy website thì ok. Tuy nhiên nếu bạn truy cập bằng {VM_IP_Address}:5000 thì vẫn chưa được. Tiếp theo mình sẽ hướng dẫn bạn dùng custom domain với Google Cloud
Bước 6: Dùng domain với Google Cloud
Bạn vào Network Services => Cloud DNS, sau đó tạo 1 Zone mới.
Trong chi tiết Zone Detail, bạn có thể config như mình. Sau đó lưu phần thông tin name server (khung màu đỏ) và vào phần quản lý domain của bạn trỏ domain về name server này.
Sau đó bạn cần quay lại VM để redirect từ domain của bạn sang localhost:5000. Bạn cần edit binding lại. Chọn website, nháy phải chuột, chọn Edit Binding
Sau đó thêm mới 1 binding
Như hình thì mình đang map nivikademy.com tới localhost của VM. Mà site nivikademy hiện tại đang dùng port 5000 của localhost.
Vì thế khi truy cập nivikademy.com sẽ vào được localhost:5000. Bạn có thể binding thêm www.domain nếu cần.
Phù, như vậy là đã xong rồi đó.
Kết
Hy vọng với bài viết này, bạn có thể deploy ASPNET Core lên Google Cloud dùng Virtual Machine thành công. Bạn dùng bài viết này để tham khảo deploy ASPNET Core lên VPS Windows cũng được (bỏ mấy cái config của Google Cloud đi thôi)
Thực ra Google Cloud Platform hỗ trợ nhiều thứ hơn cho ASP.NET Core như Cloud Tools for Visual Studio extension, App Engine, Container Engine, Deploy a Framework Dependent Deployment bundle, vv
Nhưng theo mình thấy dùng VM là phức tạp nhất rồi. Nên nếu bạn deploy lên VM thì mấy tool khác khá dễ. Nếu bạn gặp khó khăn gì bạn cứ comment nhé. Chúc bạn thành công.