Skip to content

Сборка и требования

Требования:

  • Go 1.26+
  • PostgreSQL, Redis
  • Make

Локальная сборка

bash
# Установка зависимостей
go mod download

# Линт/тест/сборка
go vet ./...
go test ./... -race
go build ./...

Линтеры

Используется golangci-lint v2.10.1 с дополнительными линтерами:

bash
# Установка
make install-lint

# Полный прогон
make lint

# Быстрый (только app + domain)
make lint-fast

# Архитектурная проверка (domain не импортирует infra/app)
make lint-arch

Включены линтеры: gosec (безопасность), bodyclose (закрытие тел HTTP-ответов), noctx (передача context в HTTP-запросы). Конфигурация — .golangci.yml.

Сканирование уязвимостей

bash
make vulncheck

Запускает govulncheck ./... — проверяет зависимости на известные CVE.

CI (.gitlab-ci.yml)

Этапы пайплайна:

ЭтапJobКогда
checklint (golangci-lint), docs (redocly), test (go test + coverage), integration (Postgres+Redis)Каждый push
securitygovulncheckКаждый push
buildbuild (go build)Push без тега
buildbuild-release (bundle + upload в Package Registry)Push с тегом

На push с тегом job build-release собирает deployment-бандл и загружает его в GitLab Package Registry (Generic Packages).

Deployment Bundle

Бандл — самодостаточный архив для деплоя на сервер (Go на сервере не нужен):

bash
# Для текущей ОС
make bundle

# Для Linux (серверы)
make bundle-linux

# С явной версией
VERSION=1.2.3 make bundle

# Произвольная платформа
make bundle GOOS=linux GOARCH=arm64

Содержимое бандла:

marv-VERSION-OS-ARCH/
├── bin/
│   ├── marv                # основной сервер
│   ├── hgoose              # утилита миграций БД (goose v3)
│   └── config-migrator     # конвертер legacy-конфигов
├── scripts/
│   ├── deploy.sh           # управление (run, migrate, version, ...)
│   └── marv.service.template # шаблон systemd unit
├── migrations/
│   └── *.sql               # SQL-миграции
└── config/
    ├── config.example.yml  # пример конфигурации
    ├── bots.example.json   # пример конфигурации ботов
    ├── products.example.json # пример конфигурации продуктов
    └── .env.example        # пример переменных окружения

Параметры сборки:

  • CGO_ENABLED=0 — статическая линковка
  • -tags=go_json — ускоренный JSON через go_json
  • -ldflags="-s -w -X ...AppVersion=VERSION" — инъекция версии, strip debug info

Деплой на сервер

Рекомендуемый подход — через отдельный game-репозиторий с конфигами и версией. См. Game Repository workflow.

Автоматическое скачивание (рекомендуется)

Скрипт scripts/fetch-release.sh автоматически скачивает и распаковывает нужную версию бандла из GitLab Generic Packages.

Настройка Deploy Token (однократно):

  1. Перейдите в GitLab → SettingsRepositoryDeploy tokens
  2. Создайте токен:
    • Name: marv-deploy (или любое имя)
    • Scopes: read_package_registry
    • Expiration: по усмотрению (или без ограничения)
  3. Сохраните username и token — token показывается только один раз

Настройка на сервере:

bash
# Добавьте в ~/.bashrc, ~/.profile или /etc/environment
export MARV_DEPLOY_TOKEN="<username>:<token>"

# Создайте файл версии
echo "v2.0.3" > .marv-version

Скачивание и установка:

bash
# Скачать версию из .marv-version
./scripts/fetch-release.sh

# Скачать конкретную версию
MARV_VERSION=v2.0.3 ./scripts/fetch-release.sh

# Проверить версии (без скачивания)
./scripts/fetch-release.sh --check

Типы аутентификации (используется первый найденный):

ПеременнаяТипФорматНазначение
MARV_DEPLOY_TOKENDeploy Tokenusername:tokenСерверы (рекомендуется)
GITLAB_TOKENPersonal Access Tokenglpat-xxxРазработчики
CI_JOB_TOKENCI Job TokenавтоматическиGitLab CI

Дополнительные переменные:

ПеременнаяУмолчаниеОписание
GITLAB_URLhttps://gitlab.comБазовый URL GitLab
GITLAB_PROJECT_ID22503710Числовой ID проекта
MARV_PLATFORMlinux-amd64Платформа бандла
INSTALL_DIR./marvДиректория для установки
VERSION_FILE.marv-versionПуть к файлу с версией

Пример обновления на сервере:

bash
# Обновить версию
echo "v2.1.0" > .marv-version

# Скачать и распаковать
./scripts/fetch-release.sh

# Применить миграции и перезапустить
./marv/scripts/deploy.sh migrate
./marv/scripts/deploy.sh run

Ручной деплой

bash
# 1. Распаковать бандл
tar -xzf marv-1.2.3-linux-amd64.tar.gz
cd marv-1.2.3-linux-amd64

# 2. Подготовить конфиг
cp config/config.example.yml config/config.release.yml
# Заполнить значения, либо использовать переменные окружения (config/.env.example)

# 3. Применить миграции
./scripts/deploy.sh migrate

# 4. Запустить сервер
./scripts/deploy.sh run

deploy.sh

Скрипт-помощник для управления бандлом на сервере. Входит в состав бандла.

КомандаОписание
migrateПрименить все миграции
migrate-statusСтатус миграций
migrate-downОткатить одну миграцию
config-migrate <file>Мигрировать legacy-конфиг в новый формат
runЗапустить сервер (GIN_MODE=release)
versionВерсия бинарников
bash
./scripts/deploy.sh migrate     # миграции
./scripts/deploy.sh run         # запуск
./scripts/deploy.sh version     # версия

Docker

Dockerfile (multi-stage build):

bash
# Сборка образа
docker build -t marv:latest --build-arg VERSION=1.2.3 .

# Запуск
docker run -p 8080:8080 -v ./config:/app/config marv:latest

Docker Compose (локальная разработка):

bash
docker-compose up -d

Поднимает marv + PostgreSQL 17 + Redis 7 с health-checks и пробросом портов.

Запуск

bash
# Из исходников
go run ./cmd/marv

# Из бинарника
./marv

Перед деплоем:

  1. Применить миграции (hgoose up или ./scripts/deploy.sh migrate)
  2. Заполнить конфиг или переменные окружения
  3. Dev: PostgreSQL и Redis локальные. Release: PostgreSQL — отдельный сервер, Redis — обычно локальный