Как мне в 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 шт):
Я в таком случае пользуюсь nginx в режиме обратного прокси.
Поднять файервол
ufw:sudo ufw allow 22/tcp sudo ufw allow 80/tcp sudo ufw allow 443/tcp sudo ufw enableОчень важно разрешить доступ по SSH до того как будет включен файервол. В противном случае сервер будет доступен только с локальной консоли
Настроить nginx
sudo vim /etc/nginx/sites-enabled/go-site.confserver { 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; } }Настроить DNS, чтобы ваш домен
server.domainуказывал на IP адрес вашего сервера.Поднять бесплатный сертификатор
certbotsudo apt install certbot python3-certbot-nginxУстановить бесплатный сертификат от Let's Encrypt
sudo certbot --nginx -d server.domainНа последнем шаге, когда сертбот предложит сделать переадресацию, нужно согласиться.
После того, так вы завершите разработку и захотите запустить в продакшн, стоит оформить приложение как сервис, чтобы автоматически стартовал при загрузке
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