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 и деплоите уже готовый артефакт (тогда тулчейн на сервере не требуется).
Зависимости и требования
- Для запуска собранного приложения нужны модули
07-pm2(бинарник работает под PM2),06-nginx(reverse-proxy) и08-certbot(HTTPS). - Поддерживаемые архитектуры:
x86_64(amd64) иaarch64(arm64). На другой архитектуре модуль завершится с ошибкой. - Доступ к
go.devдля загрузки тарбола.
Что именно делает
Шаги module_install (файл modules/22-go.sh):
- Определяет архитектуру (
amd64/arm64) и нужную версию (GO_VERSION). - Проверка на пропуск. Если
/usr/local/go/bin/goуже существует и это нужная версия — загрузка пропускается, обновляется только записьPATH. - Загрузка официального тарбола
https://go.dev/dl/go${GO_VERSION}.linux-${arch}.tar.gzво временный файл. - Установка: удаляет прежний
/usr/local/goи распаковывает тарбол в/usr/local(создаётся каталог/usr/local/go). - Запись
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. - Верификация и отметка модуля.
Файлы, службы и порты
| Путь / объект | Назначение | Права |
|---|---|---|
/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
Что произойдёт:
- репозиторий клонируется в
~deploy/apps/svc; - выполняется сборка от пользователя деплоя:
go build -o svc .(если не собралось — пробуетсяgo build -o svc ./...). Компилятор берётся по пути/usr/local/go/bin, поэтому сборка работает даже без обновлённогоPATHв сессии; - создаётся скрипт-обёртка
.mitdev-run.sh, который экспортируетPORT=8080и запускает./svc; - бинарник запускается под PM2 (
pm2 start .mitdev-run.sh --name svc && pm2 save); - nginx получает reverse-proxy
svc.example.com → 127.0.0.1:8080; - предлагается выпустить SSL.
Важно: приложение должно читать порт из переменной окружения 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.
Безопасность и продакшен
- Собранный бинарник запускается от пользователя
deploy, а не от root — так и оставьте. - Приложение слушает
127.0.0.1и публикуется только через nginx; порт приложения в файрволе не открывайте. - Фиксируйте версию Go (
GO_VERSION) под нужный релиз, чтобы обновления тулчейна не влияли на сборку неожиданно. - Кэш модулей
~deploy/goможет занимать место — периодически проверяйте (go clean -modcacheпри необходимости).
Откат и удаление
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. Скомпилированные бинарники в каталогах приложений не трогаются.
См. также
- ../COMMANDS.md — команды
mitdev app go,deploy,ssl. - 07-pm2.md — менеджер процессов, под которым работает бинарник.
06-nginx.md,08-certbot.md— reverse-proxy и SSL.- ../RECIPES.md — сквозные сценарии развёртывания.