Skip to content

Deploy ứng dụng Go ​

Giả sử bạn có một ứng dụng Go (web server hoặc API) muốn chạy dưới domain api.example.com, ứng dụng lắng nghe ở cổng 8080. Ứng dụng được build thành một file thực thi, chạy nền bằng Systemd Service, còn website trên FlashPanel chuyển request từ domain tới cổng 8080.

Yêu cầu ​

  • Máy chủ đã kết nối với FlashPanel
  • DNS của domain đã trỏ về IP máy chủ
  • Ứng dụng đọc cổng lắng nghe từ cấu hình (ví dụ biến môi trường APP_PORT)

Bước 1: Cài đặt Go ​

Vào trang quản lý máy chủ, bấm menu Ứng dụng, chọn tab Chưa cài đặt, tìm Go rồi bấm Cài đặt. Xem chi tiết tại Ứng dụng.

Go được cài vào /usr/local/go. Để kiểm tra, mở Terminal và chạy:

bash
/usr/local/go/bin/go version

TIP

Các lệnh trong hướng dẫn dùng đường dẫn đầy đủ /usr/local/go/bin/go vì người dùng sở hữu website có thể chưa có Go trong biến PATH.

Bước 2: Chuẩn bị database (tùy chọn) ​

Nếu ứng dụng cần database, cài MySQL, MariaDB, PostgreSQL hoặc MongoDB trên trang Ứng dụng, sau đó tạo database và người dùng theo hướng dẫn Cơ sở dữ liệu. Ghi lại tên database, tên người dùng và mật khẩu để khai báo ở bước 6.

Bước 3: Tạo trang web ​

  1. Vào trang quản lý máy chủ, bấm menu Website ở thanh bên, sau đó bấm nút Tạo website
  2. Nhập Tên miền (ví dụ: api.example.com)
  3. Nhập Proxy Port: cổng ứng dụng Go lắng nghe, ví dụ 8080
  4. Bấm Tạo trang web

TIP

Nếu bật Cách ly trang web, website sẽ chạy bằng một người dùng Linux riêng. Khi đó hãy thay flashpanel trong các đường dẫn bên dưới bằng tên người dùng cách ly của website.

Bước 4: Đưa mã nguồn lên máy chủ ​

Chọn một trong hai cách:

  • Từ Git (khuyến nghị): vào trang quản lý website, bấm menu Cài đặt Mã nguồn và cài repository. Xem hướng dẫn tại Cài đặt mã nguồn.
  • Tự tải lên: mở Quản Lý File trên trang tổng quan của website và tải mã nguồn vào thư mục website. Xem Quản lý file.

Mã nguồn nằm trong thư mục /home/flashpanel/api.example.com.

Bước 5: Build ứng dụng ​

Mở Terminal trên trang tổng quan của website (terminal đăng nhập bằng người dùng sở hữu website và mở sẵn thư mục website), sau đó chạy:

bash
cd /home/flashpanel/api.example.com

# Build ứng dụng thành file thực thi tên "app"
CGO_ENABLED=0 /usr/local/go/bin/go build -o app .

TIP

  • Lệnh trên build package main ở thư mục gốc dự án. Nếu hàm main nằm ở thư mục khác, thay . bằng đường dẫn tương ứng, ví dụ ./cmd/server
  • CGO_ENABLED=0 tạo file thực thi tĩnh, không phụ thuộc thư viện C của hệ thống. Bỏ biến này nếu dự án dùng thư viện cần cgo (ví dụ go-sqlite3)

Chạy thử để chắc chắn ứng dụng hoạt động, sau đó nhấn Ctrl+C để dừng:

bash
APP_PORT=8080 ./app

Bước 6: Tạo Service cho ứng dụng ​

Dùng tính năng quản lý Systemd Service để ứng dụng chạy nền và tự khởi động lại:

  1. Vào trang quản lý máy chủ, bấm menu Service, sau đó bấm Tạo Service
  2. Nhập Tên, ví dụ myapp
  3. Thay nội dung trong trình soạn thảo bằng nội dung sau:
ini
[Unit]
Description=Golang Application - api.example.com
After=network.target

[Service]
Type=simple
User=flashpanel
WorkingDirectory=/home/flashpanel/api.example.com
ExecStart=/home/flashpanel/api.example.com/app
Restart=always
RestartSec=10
StandardOutput=append:/var/log/services/myapp.log
StandardError=append:/var/log/services/myapp-error.log

# Biến môi trường của ứng dụng
Environment="APP_PORT=8080"
Environment="APP_ENV=production"
Environment="DB_HOST=127.0.0.1"
Environment="DB_PORT=3306"
Environment="DB_USER=myapp_user"
Environment="DB_PASSWORD=your_strong_password_here"
Environment="DB_NAME=myapp_db"

[Install]
WantedBy=multi-user.target
  1. Giữ chọn Khởi động cùng với hệ thống để service tự chạy khi máy chủ reboot
  2. Bấm Tạo Service. Service được tạo và khởi động ngay

WARNING

  • Thay api.example.com bằng domain của bạn, myapp trong tên file log bằng tên service đã đặt
  • APP_PORT phải khớp với Proxy Port của website. Nên cho ứng dụng lắng nghe trên 127.0.0.1 (ví dụ http.ListenAndServe("127.0.0.1:"+port, ...)) để cổng không lộ trực tiếp ra Internet
  • Bỏ các dòng DB_* nếu ứng dụng không dùng database. Cổng mặc định: MySQL/MariaDB 3306, PostgreSQL 5432, MongoDB 27017
  • Nếu database nằm trên cùng máy chủ, thêm service của database vào dòng After để ứng dụng khởi động sau database, ví dụ After=network.target mysql.service (hoặc mariadb.service, postgresql.service, mongod.service)
  • Nếu ứng dụng tự đọc file .env trong thư mục website, bạn có thể khai báo biến ở đó thay cho các dòng Environment

Bước 7: Cài đặt SSL ​

Vào trang quản lý website, bấm menu SSL và cài chứng chỉ cho domain. Xem hướng dẫn tại SSL.

Kiểm tra kết quả ​

  1. Trên trang Service, service myapp có trạng thái đang hoạt động
  2. Truy cập https://api.example.com và kiểm tra ứng dụng phản hồi đúng

Cập nhật ứng dụng ​

  1. Cập nhật mã nguồn (bấm Triển khai ngay trong menu Triển khai nếu cài từ Git, hoặc tải bản mới lên bằng Quản Lý File)
  2. Mở Terminal của website và build lại: CGO_ENABLED=0 /usr/local/go/bin/go build -o app .
  3. Trên trang Service, bấm nút Khởi động lại của service myapp

TIP

Nếu cài mã nguồn từ Git, bạn có thể thêm lệnh build vào Deployment Script để không phải chạy tay ở bước 2. Deployment Script chạy bằng người dùng sở hữu website nên không khởi động lại được Systemd Service; bạn vẫn cần bấm Khởi động lại trên trang Service.

Xử lý sự cố ​

Ứng dụng không khởi chạy được ​

  1. Trên trang Service, bấm Xem Log lỗi của service myapp
  2. Kiểm tra file thực thi có quyền chạy: chmod +x app
  3. Chạy thử thủ công trong thư mục website để xem lỗi: APP_PORT=8080 ./app
  4. Kiểm tra đường dẫn trong WorkingDirectory và ExecStart có đúng không

Lỗi kết nối database ​

  1. Trên trang Ứng dụng, kiểm tra database đang chạy
  2. Kiểm tra lại các biến DB_* khớp với database và người dùng đã tạo trên trang quản lý database của máy chủ (ví dụ menu MySQL)

Lỗi 502 Bad Gateway ​

  1. Kiểm tra service đang chạy trên trang Service
  2. Kiểm tra ứng dụng đang lắng nghe đúng cổng: ss -tln | grep 8080
  3. Đảm bảo cổng này khớp với Proxy Port của website. Xem thêm Lỗi 502 Bad Gateway