Как мне в Vds Ubunty запустить под моим доменом мой сайт написанный на Goland?

Скачал на сервере Go и Apache по инструкции смотрел как это сделать, на go у меня только написанная маршрутизация, в файле так же есть шаблоны index.html style.css, такой вопрос возник как мне запустить мой файл на go чтоб он работал, а не обычный html (и под моим доменном)

 package main

import (
    "fmt"
    "log"
    "net/http"

    "github.com/gorilla/mux"
)

func main() {

    //Маршрутизация
    http.Handle("/public/", http.StripPrefix("/public/", http.FileServer(http.Dir("./public/"))))
    router := mux.NewRouter()
    router.HandleFunc("/", HomeHandler)
    
    
    http.Handle("/", router)
    fmt.Println("Server is listening...")
    http.ListenAndServe(":8000", nil)
}

func HomeHandler(w http.ResponseWriter, r *http.Request) {

    if r.Method == "POST" {

        err := r.ParseForm()

        if err != nil {
            log.Println(err)
        }

        name := r.FormValue("name_1")
        email := r.FormValue("mail_1")
        phone := r.FormValue("phone_1")
        message := r.FormValue("message_1")

        resp, err := http.Post("https://api.telegram.org/bot{token}/sendMessage?chat_id={chat_id}&text="+"Имя: "+name+" Почта: "+email+" Телефон: "+phone+" Сообщения: "+message+"!", "", nil)
        if err != nil {
            fmt.Println(err)
        }
        defer resp.Body.Close()

        fmt.Println(name, email, phone, message)

    } else {

        http.ServeFile(w, r, "index.html")
    }
}

Ответы (1 шт):

Автор решения: Pak Uula

Я в таком случае пользуюсь nginx в режиме обратного прокси.

  1. Поднять файервол ufw:

    sudo ufw allow 22/tcp
    sudo ufw allow 80/tcp
    sudo ufw allow 443/tcp
    sudo ufw enable
    

    Очень важно разрешить доступ по SSH до того как будет включен файервол. В противном случае сервер будет доступен только с локальной консоли

  2. Настроить nginx

    sudo vim /etc/nginx/sites-enabled/go-site.conf
    
    server {
       listen 80;
    
       server_name server.domain;
       add_header Access-Control-Allow-Origin *;
    
       location / {
          # CORS preflight request
          if ($request_method = 'OPTIONS') {
          add_header 'Access-Control-Allow-Origin' '*';
          add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
    
          # Custom headers and headers various browsers *should* be OK with but aren't
          add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range';
    
          # Tell client that this pre-flight info is valid for 20 days
          add_header 'Access-Control-Max-Age' 1728000;
          add_header 'Content-Type' 'text/plain; charset=utf-8';
          add_header 'Content-Length' 0;
          return 204;
          }
          if ($request_method = 'POST') {
          add_header 'Access-Control-Allow-Origin' '*' always;
          add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS' always;
          add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range' always;
          add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range' always;
          }
          if ($request_method = 'GET') {
          add_header 'Access-Control-Allow-Origin' '*' always;
          add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS' always;
          add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range' always;
          add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range' always;
          }
          proxy_pass http://localhost:8000;
          proxy_set_header Host $host;
          proxy_set_header X-Real-IP $remote_addr;
       }
    }
    
  3. Настроить DNS, чтобы ваш домен server.domain указывал на IP адрес вашего сервера.

  4. Поднять бесплатный сертификатор certbot

    sudo apt install certbot python3-certbot-nginx
    
  5. Установить бесплатный сертификат от Let's Encrypt

    sudo certbot --nginx -d server.domain
    

    На последнем шаге, когда сертбот предложит сделать переадресацию, нужно согласиться.

  6. После того, так вы завершите разработку и захотите запустить в продакшн, стоит оформить приложение как сервис, чтобы автоматически стартовал при загрузке

    sudo vim /etc/systemd/system/my-go-server.service:
    
    [Unit]
    Description=My go server
    After=network.target
    StartLimitIntervalSec=0
    [Service]
    Type=simple
    Restart=always
    RestartSec=2
    User=my_user
    ExecStart=/path/to/server
    
    [Install]
    WantedBy=multi-user.target
    

    Запустить сервис

    sudo systemctl enable my-go-server
    sudo systemctl start my-go-server
    
→ Ссылка