Cách đơn giản cài và chạy ứng dụng Go trên VPS với systemd không dùng Docker

Bước 1: Cài đặt Golang trên VPS mới. Các bước cài đặt đơn giải tại đây: https://go.dev/doc/install

Bạn cần cập nhật file ~/.bashrc để Go có thể đươc gọi từ tất cả các cửa sổ terminal.

Gõ: nano ~/.bashrc

Thêm dòng sau vào cuối file:

export PATH=$PATH:/usr/local/go/bin

Mở thử một cửa sổ terminal khác và gõ: go version. Nếu dữ liệu trả về phiên bản Go thì có nghĩa, Go đã có thể được gọi từ tất cả các cửa sổ dòng lệnh.

Bước 2: Ta sẽ dùng service do systemd quản lý để chạy Go. Đây là Go đã build nên là phiên bản binary. (Trên project, bạn build với lệnh go build). Trên Ubuntu ta sẽ thấy 2 nơi lưu file service này.

  • /lib/systemd/system/: Đây là nơi chứa các file service do gói cài đặt thiết lập.
  • /etc/systemd/system/: Đây là nơi chứa các file service cấu hình, sẽ có ưu tiên cao hơn so với  file service thiết lập trong /lib/systemd/system/. Ta sẽ lưu file service dùng để chạy Go tại tại thư mục này.

Trên Ubuntu /etc/systemd/system, tạo một file songngu.service có nội dung sau:

[Unit]
Description=SongNgu Goo application
[Service]
Type=simple
Restart=always
RestartSec=5s
WorkingDirectory=/www/wwwroot/songngu.net/core
ExecStart=/www/wwwroot/songngu.net/core/bin/kiwipanel start
[Install]
WantedBy=multi-user.target

Ta chú ý: WorkingDirectory là nơi chứa code của Go

ExecStart: Nơi ta sẽ gọi file binary và lệnh start để chạy Go (Ta sẽ cần build ra binary này, đặt trong thư mục bin/kiwipanel. Lệnh start do ta chủ động viết để gọi, thông thường ta có thể chạy go run main.go thì ta không cần start ở “đuôi”. Do để tiện gọi nhiều lệnh khác nhau nên trong chương trình của mình, “go run main.go start” sẽ chạy chương trình.).

Gõ lệnh sau để cho phép file binary có tên kiwipanel có thể chạy:

sudo chmod +x /www/wwwroot/songngu.net/core/bin/kiwipanel

Tiếp đến điều khiển service bằng systemd thông qua 4 dòng lệnh sau, tùy tình huống:

sudo systemctl enable songngu
sudo systemctl start songngu
sudo systemctl status songngu
sudo systemctl restart songngu

So với PHP hay Nodejs thì cách này của Go khá là lòng vòng nhưng quen thì thấy cũng khá nhẹ nhàng vì mình có thể: push code lên github –> pull code về VPS –> chạy lệnh build thông qua lệnh đã thiết lập trên Makefile –> Restart lại service là cập nhật phần mềm.

Nếu bạn dùng nginx làm proxy để chạy trên cổng 80 thì cấu hình thêm nginx nữa. Thường mình sẽ chạy golang ở cổng khác 80 nên cần thêm một bước cấu hình này. nginx cũng dùng systemd để chạy nên bạn cũng cần dùng các lệnh khá giống trên với systemctl để khởi chạy hoặc khởi động lại.

Thiết lập config cho nginx như sau:

Tạo location mới cho golang code (Load static files như ảnh, template file. database sqlite nếu có).

Trong file config của nginx, tìm tới server{}

server{
 # Thiết lập root để phục vụ file statics
 root /www/wwwroot/demo.kiwipanel.org/scaffolding;
 location / {
     # Replace with the address your Golang app is running on
        proxy_pass http://127.0.0.1:8443;  #Thay thế port với port bạn muốn sử dụng
        proxy_set_header Host $host;        
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
    
}

Leave a Comment