22-go — Go (официальный дистрибутив)

Ставит официальный тулчейн Go в /usr/local/go и добавляет его в системный PATH; рантайм для пресета go команды mitdev app. ☐ опциональный модуль.

Зачем нужен

Go — компилируемый язык; приложение на Go превращается в один самодостаточный бинарный файл. Модуль ставит официальный релиз Go (тулчейн — компилятор go, стандартная библиотека и инструменты) прямо с go.dev, потому что версия Go в репозиториях дистрибутивов часто устаревшая. Тулчейн разворачивается в /usr/local/go и делается доступным всем пользователям через запись в PATH.

Когда включать и когда не нужен

Включайте для развёртывания Go-приложения (пресет go в mitdev app): mitdev соберёт бинарник через go build и запустит его под PM2.

Не нужен, если Go-сервисов нет, либо если вы собираете бинарник в CI и деплоите уже готовый артефакт (тогда тулчейн на сервере не требуется).

Зависимости и требования

Что именно делает

Шаги module_install (файл modules/22-go.sh):

  1. Определяет архитектуру (amd64/arm64) и нужную версию (GO_VERSION).
  2. Проверка на пропуск. Если /usr/local/go/bin/go уже существует и это нужная версия — загрузка пропускается, обновляется только запись PATH.
  3. Загрузка официального тарбола https://go.dev/dl/go${GO_VERSION}.linux-${arch}.tar.gz во временный файл.
  4. Установка: удаляет прежний /usr/local/go и распаковывает тарбол в /usr/local (создаётся каталог /usr/local/go).
  5. Запись PATH. Создаёт /etc/profile.d/go.sh (каталог profile.d — скрипты, которые автоматически выполняются при входе в систему для каждого пользователя) со строкой:
    export PATH="$PATH:/usr/local/go/bin:${HOME}/go/bin"
    
    Это добавляет в PATH и сам Go, и каталог ~/go/bin, куда go install кладёт бинарники. Важно: запись подхватывается только при новом входе в шелл — в текущей сессии команда go появится после повторного логина (exit и заново ssh) или после source /etc/profile.d/go.sh.
  6. Верификация и отметка модуля.

Файлы, службы и порты

Путь / объект Назначение Права
/usr/local/go/ тулчейн Go (компилятор, стандартная библиотека, инструменты) root
/usr/local/go/bin/go бинарник go 755
/etc/profile.d/go.sh добавляет Go в PATH при входе в систему 644
~deploy/go/ кэш модулей и bin (создаётся при первой сборке от пользователя) владелец — deploy
~deploy/apps/<app>/<app> скомпилированный бинарник приложения владелец — deploy
~deploy/apps/<app>/.mitdev-run.sh сгенерированный скрипт запуска (экспорт PORT + ./<app>) владелец — deploy
/var/lib/mitdev/state/go.done отметка, что модуль установлен root

Служб модуль не создаёт. Порт (по умолчанию 8080) открывает само приложение, проксируемое через nginx.

Настройка

Переменная Значения По умолчанию На что влияет Когда менять
GO_VERSION версия Go (напр. 1.22.5, 1.23.4) 1.23.4 какой релиз Go загружается с go.dev если приложению нужна конкретная версия Go

Значение по умолчанию — в config/defaults.conf.

Как переопределить настройки

# 1. Экспорт переменной перед установщиком (-E сохраняет переменные при sudo):
export GO_VERSION=1.22.5
sudo -E ./install.sh

# 2. Правка config/defaults.conf:
#    GO_VERSION="${GO_VERSION:-1.22.5}"

# 3. Отдельная установка/обновление модуля:
sudo GO_VERSION=1.22.5 mitdev add go

Вопросов в интерактивном установщике модуль не задаёт.

Проверка, что всё работает

Автоматическая верификация проверяет, что /usr/local/go/bin/go существует и go version отрабатывает.

Вручную (после нового входа в шелл, чтобы подхватился PATH):

/usr/local/go/bin/go version             # напр. go version go1.23.4 linux/amd64
# после повторного логина достаточно короткой формы:
go version
echo "$PATH" | tr ':' '\n' | grep go     # /usr/local/go/bin в PATH

Развёртывание приложения на этом рантайме

Установлены модули go, pm2, nginx, для HTTPS — certbot.

# 1. Развернуть (пресет go, порт по умолчанию 8080):
sudo mitdev app go svc https://github.com/you/svc.git svc.example.com

Что произойдёт:

Важно: приложение должно читать порт из переменной окружения PORT (mitdev её экспортирует) и слушать 127.0.0.1:$PORT.

# 2. Настроить окружение (данные БД — в /root/.mitdev-credentials):
sudo cat /root/.mitdev-credentials
sudo -u deploy nano ~deploy/apps/svc/.env

# 3. Перезапустить:
sudo -u deploy -i pm2 restart svc

# 4. Сертификат (если не выпустили при app):
sudo mitdev ssl svc.example.com [email protected]

# 5. Обновление после push (git pull + пересборка происходит при повторном app; deploy перезапускает):
sudo mitdev deploy svc

Примечание: mitdev deploy делает git pull и перезапускает процесс PM2, но пересборку Go выполняет команда mitdev app (её же можно запустить повторно для пересборки из свежего кода). Как надёжную альтернативу можно положить команду сборки+запуска в ~deploy/apps/svc/.mitdev/start.

Логи приложения:

sudo -u deploy -i pm2 logs svc
mitdev logs pm2
sudo tail -f /var/log/nginx/svc.error.log

Типовые задачи

# Пересобрать вручную и перезапустить:
sudo -u deploy bash -lc 'cd ~/apps/svc && /usr/local/go/bin/go build -o svc . && :'
sudo -u deploy -i pm2 restart svc

# Обновить версию Go и переустановить тулчейн:
sudo GO_VERSION=1.23.4 mitdev add go
go version                               # после повторного логина

# Подтянуть PATH в текущей сессии без повторного входа:
source /etc/profile.d/go.sh
go version

# Посмотреть/очистить кэш модулей:
sudo -u deploy -i go env GOMODCACHE
sudo -u deploy -i go clean -modcache

# Логи и перезапуск:
sudo -u deploy -i pm2 logs svc
sudo -u deploy -i pm2 restart svc

Частые ошибки

Симптом: go: command not found сразу после установки. Причина: запись PATH из /etc/profile.d/go.sh подхватывается только при новом входе в шелл. Решение: выйдите и зайдите по ssh заново, либо source /etc/profile.d/go.sh, либо используйте полный путь /usr/local/go/bin/go.

Симптом: сборка падает go build: cannot find main module. Причина: в репозитории нет go.mod или main-пакет лежит в подкаталоге. Решение: убедитесь, что есть go.mod; mitdev пробует go build -o <app> ./... — при нестандартной структуре задайте свою команду в ~deploy/apps/<app>/.mitdev/start.

Симптом: приложение стартует, но nginx отдаёт 502. Причина: приложение не слушает 127.0.0.1:$PORT (игнорирует переменную PORT). Решение: читайте порт из os.Getenv("PORT") и слушайте 127.0.0.1:PORT, пересоберите и перезапустите.

Симптом: «Go: неподдерживаемая архитектура». Причина: сервер не на amd64/arm64. Решение: модуль поддерживает только эти архитектуры; используйте другой способ установки Go.

Безопасность и продакшен

Откат и удаление

module_rollback (при сбое): удаляет /usr/local/go и /etc/profile.d/go.sh.

Ручное удаление:

sudo mitdev remove go            # удаляет тулчейн и запись PATH, кэш ~/go сохранён
sudo mitdev remove go --purge    # плюс удаляет кэш модулей ~deploy/go

module_remove: удаляет каталог /usr/local/go и запись PATH (/etc/profile.d/go.sh). Кэш модулей и bin пользователя (~deploy/go) по умолчанию сохраняется; удаляется только с --purge. Скомпилированные бинарники в каталогах приложений не трогаются.

См. также