Минималистичный Go-сервис, который принимает docker-compose.yml по webhook и разворачивает проекты на сервере.
GitHub Actions → POST /deploy → deployer → docker compose up -d
Принимает base64-encoded docker-compose.yml, .env и любые дополнительные файлы.
Сам делает docker compose down, pull, up -d.
| Метод | Endpoint | Описание |
|---|---|---|
| GET | /health?token=TOKEN |
Health-check |
| POST | /deploy?token=TOKEN |
Развернуть проект |
| GET | /containers?token=TOKEN |
Список контейнеров |
| GET | /logs?token=TOKEN&name=xxx&tail=100 |
Логи контейнера |
| POST | /stop?token=TOKEN&name=xxx |
Остановить контейнер |
| POST | /remove?token=TOKEN&name=xxx |
Удалить контейнер |
curl -X POST "http://localhost:9090/deploy?token=YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"project": "my-app",
"compose_b64": "<base64 docker-compose.yml>",
"env_b64": "<base64 .env>",
"extra_files_b64": {
"dist/index.html": "<base64 file content>"
}
}'docker run -d \
--name deployer \
--restart unless-stopped \
-p 9090:9090 \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /opt/projects:/opt/projects \
-e DEPLOY_TOKEN=$(openssl rand -hex 32) \
ghcr.io/isklv/deploy-system:latestГотово. Deployer слушает на :9090.
📦 Образ автоматически собирается и пушится в GHCR при каждом пуше в
main. Теги:latest+ commit SHA.
Создать docker-compose.deployer.yml:
services:
deployer:
image: ghcr.io/isklv/deploy-system:latest
container_name: deployer
restart: unless-stopped
ports:
- "9090:9090"
environment:
- DEPLOY_TOKEN=${DEPLOY_TOKEN:?Set DEPLOY_TOKEN}
- GHCR_TOKEN=${GHCR_TOKEN} # опционально, для GHCR образов
# - LOG_WEBHOOK=https://api.telegram.org/bot<token>/sendMessage?chat_id=<chat_id>
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- /opt/projects:/opt/projectsСоздать .env.deployer:
# Случайный токен для авторизации
deeploy_TOKEN=$(openssl rand -hex 32)
# GitHub PAT (read:packages) — если нужны образы из GHCR
GHCR_TOKEN=ghp_xxxxxxxxЗапустить:
docker compose -f docker-compose.deployer.yml up -dcd deploy-system/deployer
docker build -t deployer:latest .
docker run -d --name deployer \
-p 9090:9090 \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /opt/projects:/opt/projects \
-e DEPLOY_TOKEN=your-token \
deployer:latest| Переменная | Обязательно | Описание |
|---|---|---|
DEPLOY_TOKEN |
✅ | Токен авторизации для API-запросов |
GHCR_TOKEN |
❌ | GitHub PAT (read:packages) для логина в ghcr.io |
LOG_WEBHOOK |
❌ | Telegram webhook URL для уведомлений о деплоях |
PORT |
❌ | Порт (по умолчанию 9090) |
PROJECTS_DIR |
❌ | Директория проектов (по умолчанию /opt/projects) |
# Health check
curl http://localhost:9090/health?token=YOUR_TOKEN
# Список контейнеров
curl http://localhost:9090/containers?token=YOUR_TOKENВ проекте добавить .github/workflows/deploy.yml:
name: Deploy
on:
push:
branches: [main]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Deploy
env:
DEPLOY_URL: ${{ vars.DEPLOY_URL }}
DEPLOY_TOKEN: ${{ secrets.DEPLOY_TOKEN }}
run: |
curl -sf "${DEPLOY_URL}/deploy?token=${DEPLOY_TOKEN}" \
-H "Content-Type: application/json" \
-d "$(jq -n \
--arg compose "$(base64 -w0 docker-compose.yml)" \
'{project: "my-app", compose_b64: $compose}')"Настроить в GitHub repo settings:
- Variable
DEPLOY_URL→http://your-server:9090 - Secret
DEPLOY_TOKEN→ ваш токен