Deploy Golang Application on Digital Ocean Server Ubuntu 16.04
I like to use Golang to write application in server for handle service, such as Api, Realtime, and background processing…, If you would like to learn Golang i recommend visit official page https://golang.org/
In this tutorial i just created a sample pie of code to to handle HTTP request , create a file main.go
Main.go
if we run command in development mode
go run main.go
output: Server is running: 3001
type in browser http://localhost:3001/api we should see “Hello!”
in real project you have alot of files .go depend on how is your complex of your project. In this article i would like to show you how to build your Golang project into one file and deploy it on your linux VPS , I use and like Digital Ocean.
Step 1: Create a deploy file
i usually create a bash file , this is contain custom commands so we can run it one to save time
open your command line, create deploy.sh file and change permission execute able.
touch deploy.sh
chmod u+x deploy.sh
now edit deploy.sh with following content
To build project just in your commandline in same directory with deploy.sh and run this command
./deploy.sh
It will complied your project into one file for example myapp
that is name of your project file we will copy this file over Digital Ocean VPS.
Step 2: Setup Digital Ocean VPS
Many of hosting providers but for me i do like Digital Ocean(DO) so much because they are flexible in price and UI control, if you don’t have an account let create new one
After creating an account on Digital Ocean you should have access as root , open terminal and login to your VPS with
ssh root@123456
123456 is your Server IP address
Step 3: Setup Nginx
We do use nginx for proxy handler. For example out Golang application is running in server port is 3001, but in Nginx we can setup and handle http request on port 80 or 443 if you have SSL setup.
sudo apt-get update
sudo apt-get install nginxsudo ufw allow 'Nginx HTTP'
Step 4: Setup HTTPS use Let’s Encrypt
sudo apt-get update
sudo apt-get install software-properties-common
sudo add-apt-repository universe
sudo add-apt-repository ppa:certbot/certbot
sudo apt-get update
sudo apt-get install certbot python-certbot-nginx
sudo certbot --nginx
Create Cert file for your domain
sudo certbot --nginx certonly
Enter your domain example : tabvn.com api.tabvn.com
then enable auto renew
sudo certbot renew --dry-run
Step 5: Move your application file to server
change to your project folder, remember we did build project to a file myapp
let copy it to over server, we can copy it to any folder in your server, but i do recommend store that file in /var/www
use ssh to copy that file
scp ./myapp root@123456:/var/www/
123456 is your Digital Ocean VPS IP address you can copy ip address in Digital Ocean dashboard.
Step 6: Create a service to run Golang application
We need create a sytem service to run our applion
let create new file /etc/systemd/system/myapp.service with following content remember change ExecStart=/var/www/myapp and Environment=GOPATH=/var/www/ to correct and match your application root folder and appcation file name,
in this demo i store myapp file in /var/www
[Unit]
Description= instance to serve api
Requires=mysql.service
After=network.target
After=mysql.service[Service]
User=root
Group=www-dataEnvironment=GOPATH=/var/www/
ExecStart=/var/www/myapp[Install]
WantedBy=multi-user.target
in this service file i had require mysql if you don’t use MYSQL server you can remove it.
Now to start service (Start and running our Golang App) by run this command
sudo systemctl start myapp
To stop:
sudo systemctl stop myapp
Step 7: Create Nginx Configure file to handle proxy for our application
you need change your domain.com to your domain name
create a file /etc/nginx/sites-enabled/domain.com
server {
listen 80;
server_name domain.com www.domain.com;
return 301 https://$server_name$request_uri;
}server {
server_name domain.com www.domain.com;
listen 443 ssl;
ssl on;
ssl_certificate /etc/letsencrypt/live/domain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/domain.com/privkey.pem;
root /var/www/html;
location / {
proxy_pass http://127.0.0.1:3001;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}location /ws {proxy_buffering off;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;proxy_pass http://127.0.0.1:3001/ws;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
Remember change your domain, in this tutorial i had included websocket config as well you can see location /ws
Restart NGINX server
systemctl restart nginx
It’s done. Thank you for reading.