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:
/usr/local/go/bin/go versionTIP
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
- Vào trang quản lý máy chủ, bấm menu Website ở thanh bên, sau đó bấm nút Tạo website
- Nhập Tên miền (ví dụ:
api.example.com) - Nhập Proxy Port: cổng ứng dụng Go lắng nghe, ví dụ
8080 - 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:
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àmmainnằm ở thư mục khác, thay.bằng đường dẫn tương ứng, ví dụ./cmd/server CGO_ENABLED=0tạ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:
APP_PORT=8080 ./appBướ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:
- Vào trang quản lý máy chủ, bấm menu Service, sau đó bấm Tạo Service
- Nhập Tên, ví dụ
myapp - Thay nội dung trong trình soạn thảo bằng nội dung sau:
[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- Giữ chọn Khởi động cùng với hệ thống để service tự chạy khi máy chủ reboot
- Bấm Tạo Service. Service được tạo và khởi động ngay
WARNING
- Thay
api.example.combằng domain của bạn,myapptrong tên file log bằng tên service đã đặt APP_PORTphải khớp với Proxy Port của website. Nên cho ứng dụng lắng nghe trên127.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/MariaDB3306, PostgreSQL5432, MongoDB27017 - 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ặcmariadb.service,postgresql.service,mongod.service) - Nếu ứng dụng tự đọc file
.envtrong thư mục website, bạn có thể khai báo biến ở đó thay cho các dòngEnvironment
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ả
- Trên trang Service, service
myappcó trạng thái đang hoạt động - Truy cập
https://api.example.comvà kiểm tra ứng dụng phản hồi đúng
Cập nhật ứng dụng
- 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)
- Mở Terminal của website và build lại:
CGO_ENABLED=0 /usr/local/go/bin/go build -o app . - 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
- Trên trang Service, bấm Xem Log lỗi của service
myapp - Kiểm tra file thực thi có quyền chạy:
chmod +x app - Chạy thử thủ công trong thư mục website để xem lỗi:
APP_PORT=8080 ./app - Kiểm tra đường dẫn trong
WorkingDirectoryvàExecStartcó đúng không
Lỗi kết nối database
- Trên trang Ứng dụng, kiểm tra database đang chạy
- 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
- Kiểm tra service đang chạy trên trang Service
- Kiểm tra ứng dụng đang lắng nghe đúng cổng:
ss -tln | grep 8080 - Đảm bảo cổng này khớp với Proxy Port của website. Xem thêm Lỗi 502 Bad Gateway