diff --git a/.gitignore b/.gitignore index 24a8536..017f6ee 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,7 @@ cache/ /config.toml + +# Сборка +/trackers +/dist/ diff --git a/AGENTS.md b/AGENTS.md index b3613ee..1597737 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -20,6 +20,12 @@ This is an educational project written in Go 1.26. go build -o trackers ./main.go ``` +Через [Task](https://taskfile.dev) (`task --list` — полный список): +```bash +task build # статический бинарь linux/amd64 (CGO_ENABLED=0) для сервера +task image # docker-образ из готового бинаря (Dockerfile.deploy) +``` + ### Run ```bash go run main.go -config config.toml @@ -48,6 +54,18 @@ Uses goreleaser for cross-platform builds (Linux amd64/arm64): goreleaser build --snapshot --clean ``` +## Deploy paths + +Two independent ways to ship the service: + +1. **Yandex Container Registry (buckland)** — CI (`.gitea/workflows/release.yml`) + собирает образ из `Dockerfile` (многоступенчатая сборка из исходников) и + пушит в реестр; buckland тянет образ оттуда. +2. **Локальная сборка (umbar)** — `Dockerfile.deploy` упаковывает готовый + бинарь (`task build`). Плейбук `umbar/playbook-trackers.yml` собирает бинарь + на control-хосте, доставляет его + `Dockerfile.deploy` на сервер и собирает + образ там (Go-тулчейн на сервере не нужен). Так же устроен `jellybit`. + ## Architecture **Single File Design**: All code is in `main.go` with clear functional separation: diff --git a/Dockerfile.deploy b/Dockerfile.deploy new file mode 100644 index 0000000..2446fd9 --- /dev/null +++ b/Dockerfile.deploy @@ -0,0 +1,17 @@ +# Упаковка готового статического бинаря в минимальный образ — деплой на umbar +# (см. ../umbar/playbook-trackers.yml). Бинарь собирается снаружи: +# CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o trackers . (task build) +# distroless/static несёт CA-сертификаты (HTTPS к источникам списков трекеров). +# Пользователь задаётся в compose (user: "1000:1000"). +# +# Тома (см. compose): /config (ro, рендерится плейбуком) + /cache (пишет сам). +# +# Канонический Dockerfile (многоступенчатая сборка из исходников) живёт рядом и +# используется CI (Yandex Registry) — этот файл нужен только серверной сборке. +FROM gcr.io/distroless/static-debian12 + +COPY trackers /usr/local/bin/trackers + +EXPOSE 8080 + +ENTRYPOINT ["/usr/local/bin/trackers", "-config", "/config/config.toml"] diff --git a/Taskfile.yml b/Taskfile.yml new file mode 100644 index 0000000..02c5f0b --- /dev/null +++ b/Taskfile.yml @@ -0,0 +1,48 @@ +# yaml-language-server: $schema=https://taskfile.dev/schema.json +# +# Запуск команд проекта через Task (https://taskfile.dev). +# Список задач: `task --list`. + +version: '3' + +vars: + BINARY: trackers + PKG: . + +tasks: + default: + desc: Список доступных задач + cmds: + - task --list + silent: true + + run: + desc: 'Локальный запуск (нужен ./config.toml)' + cmds: + - go run {{.PKG}} -config ./config.toml + + build: + desc: Статический бинарь linux/amd64 для сервера (деплой umbar) + cmds: + - CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -trimpath -ldflags='-s -w' -o {{.BINARY}} {{.PKG}} + + test: + desc: Прогон тестов + cmds: + - go test ./... + + tidy: + desc: go mod tidy + cmds: + - go mod tidy + + image: + desc: 'Docker-образ из готового бинаря (Dockerfile.deploy, как на сервере umbar)' + deps: [build] + cmds: + - docker build -f Dockerfile.deploy -t trackers:dev . + + clean: + desc: Удалить собранный бинарь + cmds: + - rm -f {{.BINARY}}