@dake1231

Как выложить приложение на Go в production?

Здравствуйте! Учусь golang, сделал свое первое приложение, но оно на локальном компьютере. Компьютер на windows, соответсвенно когда делаю go build он мне формирует .exe файл, а как его на ubuntu 16.04 заставить работать? Насколько я знаю в ubuntu нельзя запускать .exe. Потом когда на локальном запускаю он остается висеть в терминале, на продакшне хотелось бы что бы он был фоновым процессом (как например nginx).

Собственно вопрос как все это правильно организовать? Можно ссылками на прочтение, спасибо
  • Вопрос задан
  • 1109 просмотров
Пригласить эксперта
Ответы на вопрос 4
@dake1231 Автор вопроса
Как запустить веб-сервер на go? - Нашел вот такие ответы, если есть что добавить пишите, пока тут ответы почитаю
Ответ написан
Sly_tom_cat
@Sly_tom_cat
.
Собрать под другую ос:

env GOOS=target-OS GOARCH=target-architecture go build package-import-path

Ну только это для Linux, есть ли аналог env на винде - не знаю, но переменные можно просто в сессии установить.

Запуск сервисов в ubuntu осуществляется через systemd - как? - гуглится на раз.
Ответ написан
Комментировать
@KirEv
1. на сервер нужно доставить исходники проекта на Go, если без CI/CD - то с помощью git, или, ладно, FTP

2. делаем тот же go build - получаем бинарник, который можно запустить

в своих проектах (ос виндовс, на серверах линукс) делаю примерно так:

есть build.sh - компилирует проект
go build -o my-app ./

есть service.sh - запускает полученный бинарник
ACTION=$1
SERVICE="./my-app"
SERVICE_PID=$(ps -aux | awk '$11=="'$SERVICE'" {print $2}')

if [ -z $ACTION ]
then
	echo "Command not found"
	exit;
fi

if ! [ -x $SERVICE ]
then
	echo "Service execute permission not granted"
	exit;
fi

if [ $ACTION = 'start' ]
then
	if ! [ -z $SERVICE_PID ]
	then
		echo "Service PID:{$SERVICE_PID}"
	else
		nohup $SERVICE > log/$(date +%F-%H-%M-%S).log 2>&1 </dev/null &
	fi
elif [ $ACTION = 'restart' ]
then
	if  ! [ -z $SERVICE_PID ]
	then
		kill -s KILL $SERVICE_PID
	fi
	nohup $SERVICE > log/$(date +%F-%H-%M-%S).log 2>&1 </dev/null &
elif [ $ACTION == 'stop' ]
then
	if  ! [ -z $SERVICE_PID ]
        then
                kill -s KILL $SERVICE_PID
	else
		echo "Service PID not found"
        fi

fi


build.sh, service.sh, my-app - должны иметь право выполняться: chmod +x *

service.sh запускает фоном, то что выводит в stdout пишу в ./log/ - потому папка ./log должна быть создана с соотв.правами на запись

порядок действий:
./build.sh
./service.sh restart # start - чистый запуск, stop - убивает процесс


как-то так

кстати можно и nginx использовать, но там конфиг.прописывать на соотв.порт или unix-socket .. много разных способов.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы