CLI, CI/CD & Автоматизация

CLI, CI/CD и API

MQXX CLI позволяет зарегистрировать аккаунт, создать репозиторий и настроить SSH — всё одной командой. Встроенный CI/CD запускает ваш .mqxx-ci.sh при каждом git push без внешних сервисов.

mqxx CLI

Регистрация, создание репозитория и управление прямо из терминала. Одна команда — полный онбординг.

.mqxx-ci.sh

Встроенный CI/CD: файл в корне репо запускается автоматически при каждом git push. Никаких внешних сервисов.

REST API

Полноценный HTTP API для управления репозиториями, синхронизацией и настройками.

Безопасность

Magic-link аутентификация, HMAC-токены, PoW-проверка. Никаких паролей.

Shell-скрипты

Инициализация репо через bash без веб-интерфейса. Поддержка SSH-ключей из файла.

GitHub Actions

Зеркало репо с GitHub/GitLab на MQXX одним workflow. Полная история коммитов.

Встроенный CI/CD Pipeline

MQXX имеет встроенный CI/CD механизм: при каждом git push сервер автоматически ищет файл .mqxx-ci.sh в корне репозитория и запускает его в изолированном окружении. Никаких внешних сервисов не нужно — всё работает «из коробки».

⚡ Как это работает:
  1. Вы делаете git push в репозиторий на MQXX
  2. SSH-сервер принимает коммиты (git-receive-pack)
  3. MQXX читает .mqxx-ci.sh из HEAD репозитория
  4. Скрипт запускается с переменными окружения MQXX_REPO_OWNER, MQXX_REPO_NAME, MQXX_BRANCH, MQXX_COMMIT
  5. Результат пишется в лог пайплайна

Переменные окружения в пайплайне

bash
# Доступны внутри .mqxx-ci.sh автоматически:
MQXX_REPO_OWNER   # Владелец репозитория (username)
MQXX_REPO_NAME    # Имя репозитория
MQXX_BRANCH       # Ветка (например: main, develop)
MQXX_COMMIT       # SHA последнего коммита

Минимальный пример

.mqxx-ci.sh
#!/bin/sh
set -e

echo "=== CI/CD: ${MQXX_REPO_NAME} @ ${MQXX_BRANCH} ==="
echo "Commit: ${MQXX_COMMIT}"

# Ваши команды деплоя здесь
# Например: перезапустить сервис на сервере
ssh -o StrictHostKeyChecking=no root@your-server.com \
  "cd /opt/myapp && git pull && docker compose up -d --build"

echo "Done!"

Деплой на отдельный сервер (SSH)

Типичный сценарий: MQXX хранит код, а при пуше автоматически деплоит на продакшн-сервер через SSH. Ключи хоста доступны внутри пайплайна через volume mount.

.mqxx-ci.sh
#!/bin/sh
set -e

PROD_HOST="your-prod-server.com"
PROD_DIR="/opt/${MQXX_REPO_NAME}"

echo "==============================="
echo "  Pipeline: ${MQXX_REPO_NAME}"
echo "  Branch:   ${MQXX_BRANCH}"
echo "  Commit:   ${MQXX_COMMIT}"
echo "==============================="

echo ">>> Deploying to ${PROD_HOST}..."
docker run --rm \
  --network host \
  -v /root/.ssh:/root/.ssh:ro \
  alpine sh -c "
    apk add -q openssh-client git
    ssh -o StrictHostKeyChecking=no root@${PROD_HOST} '
      cd ${PROD_DIR}
      git pull
      docker compose up -d --build
      echo Deploy OK
    '
  "

echo ">>> Done: $(date)"
💡 Совет: Файл .mqxx-ci.sh читается напрямую из Git-истории (HEAD), поэтому он версионируется вместе с кодом. Чтобы деактивировать пайплайн — просто удалите файл из репо.

Docker в пайплайне

MQXX имеет доступ к Docker socket хоста. Это позволяет пайплайну пересобирать образы и управлять контейнерами без дополнительной настройки.

.mqxx-ci.sh
#!/bin/sh
set -e

# Пересобрать и перезапустить контейнер прямо на хосте MQXX
docker run --rm \
  -v /var/run/docker.sock:/var/run/docker.sock \
  docker:cli sh -c "
    docker compose -f /opt/myapp/docker-compose.yml up -d --build 2>&1 | tail -20
  "

echo "Health check..."
sleep 5
curl -sf https://myapp.example.com/health && echo " OK" || echo " WARN"

GitHub Actions — зеркало на MQXX

Синхронизируйте репозиторий с GitHub на MQXX одним workflow-файлом:

.github/workflows/mirror.yml
name: Mirror to MQXX

on:
  push:
    branches: [main]

jobs:
  mirror:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0

      - name: Setup SSH
        run: |
          mkdir -p ~/.ssh
          echo "${{ secrets.MQXX_SSH_KEY }}" > ~/.ssh/id_ed25519
          chmod 600 ~/.ssh/id_ed25519
          ssh-keyscan -p 2222 mqxx.ru >> ~/.ssh/known_hosts

      - name: Push to MQXX
        run: |
          git remote add mqxx ssh://git@mqxx.ru:2222/${{ github.actor }}/${{ github.event.repository.name }}.git
          git push mqxx main --force

Установка mqxx CLI

CLI-инструмент для управления MQXX из командной строки. Работает на Linux, macOS и Windows.

bash
# Linux / macOS (автоустановка)
curl -sSL https://mqxx.ru/install.sh | sh

# Или скачайте бинарник напрямую:
# https://mqxx.ru/releases/latest/mqxx-linux-amd64
# https://mqxx.ru/releases/latest/mqxx-darwin-arm64
# https://mqxx.ru/releases/latest/mqxx-windows-amd64.exe

# Проверка установки
mqxx --version   # mqxx 2.0.0

Регистрация и создание репозитория

Если аккаунта нет — он создаётся автоматически. Если есть — создаётся только репозиторий. Всё через одну команду, без предварительной настройки ключей.

bash
# Создать репозиторий (регистрация при необходимости)
mqxx init myrepo --email you@example.com

# SSH-ключ подхватится автоматически из ~/.ssh/id_ed25519.pub
# или укажите явно:
mqxx init myrepo --email you@example.com --ssh-key ~/.ssh/id_rsa.pub

# Импорт существующего репозитория (GitHub/GitLab/etc)
mqxx import my-project --url https://github.com/user/repo.git

# Только регистрация (без создания репо)
mqxx register --email you@example.com
🔄 Как работает процесс:
  1. CLI отправляет запрос на сервер с email и именем репо
  2. На email приходит ссылка подтверждения (15 мин)
  3. После клика — аккаунт создан, репо инициализирован, SSH ключ добавлен
  4. CLI автоматически делает git init и git remote add origin
terminal
$ mqxx init myapi --email dev@example.com

┌──────────────────────────────────────────┐
│ MQXX Init                                │
│ Repository:  myapi                       │
│ Email:       dev@example.com             │
│ Server:      mqxx.ru                     │
└──────────────────────────────────────────┘

🔑 Using SSH key: ~/.ssh/id_ed25519.pub
✉️  Email sent to dev@example.com
   (Новый аккаунт — будет создан после подтверждения)

⏳ Waiting for confirmation....

✅ Confirmed!
🔗 Git remote 'origin' added

🚀 Remote URL:
   ssh://git@mqxx.ru:2222/dev/myapi.git

   git push -u origin master

Список репозиториев

bash
# После initы сессия сохраняется в ~/.config/mqxx/mqxx_ru.json
mqxx list

# Вывод:
# 📦 Repositories for @dev:
#   myapi                        2.3KB  ssh://git@mqxx.ru:2222/dev/myapi.git
#   backend                     14.7MB  ssh://git@mqxx.ru:2222/dev/backend.git

Информация о сервере

bash
mqxx info

# ┌──────────────────────────────┐
# │ Server Info                  │
# │ Host:     mqxx.ru            │
# │ SSH Port: 2222               │
# │ Git URL:  ssh://git@mqxx.ru:2222/{owner}/{repo}.git
# └──────────────────────────────┘

Переменные окружения

bash
# Сохраните, чтобы не вводить каждый раз
export MQXX_SERVER=mqxx.ru
export MQXX_EMAIL=you@example.com
export MQXX_SSH_KEY=~/.ssh/id_ed25519.pub
export MQXX_CLI_TOKEN=<token из ~/.config/mqxx/mqxx_ru.json>

Создание репозитория через SSH (без CLI)

Если CLI не установлен — репозиторий можно создать SSH-командой (требуется добавленный ключ):

terminal
ssh -p 2222 git@mqxx.ru init <repo-name>
✅ SSH-ключ должен быть добавлен в Настройках или через CLI перед использованием этой команды.

Облачная синхронизация (Cloud Sync)

MQXX поддерживает автоматическое резервное копирование ваших репозиториев в облако. Бекап создается в виде сжатого архива .tar.gz, полностью сохраняя историю коммитов.

📂 Где искать бекапы?

Все архивы сохраняются в корневую папку /MQXX на вашем Яндекс Диске. Структура:

/MQXX/username/project.git.tar.gz

Особенности:

  • Авто-создание папок: Система сама создаст нужные каталоги на Диске.
  • Отказоустойчивость: Если настроено несколько облаков (например, S3 и Яндекс), сбой одного не помешает загрузке в другое.
  • Управление в профиле: Вы можете видеть статус синхронизации и переходить к настройкам прямо со страницы своего профиля.

REST API

Все операции доступны через HTTP API. Аутентификация — через cookie-сессию после входа на mqxx.ru.

http
# ── Аутентификация ─────────────────────────────────────────────
# Запросить magic link
POST /api/auth/request
{"email": "you@example.com"}

# Проверить сессию
GET  /api/auth/session

# Выход
POST /api/auth/logout

# ── CLI сессии ──────────────────────────────────────────────────
# Инициировать CLI сессию (создать аккаунт + репо)
POST /api/cli/init
{"email": "you@...", "repo_name": "myrepo", "ssh_pub_key": "ssh-ed25519 AAAA..."}

# Опрашивать статус
GET  /api/cli/poll/:token

# Информация о сервере
GET  /api/cli/info

# Список репозиториев
GET  /api/cli/repos          (X-CLI-Token: <token>)

# ── Репозитории ─────────────────────────────────────────────────
GET  /api/repositories                   # Список (auth required)
POST /api/repositories                   # Создать {"name": "myrepo"}
POST /api/repositories/import            # Импорт {"name": "...", "url": "..."}
DELETE /api/repositories/:owner/:name    # Удалить
PATCH  /api/repositories/:owner/:name/visibility  # Видимость

# ── Просмотр кода ───────────────────────────────────────────────
GET /api/repositories/:owner/:name/files?path=/&ref=main
GET /api/repositories/:owner/:name/content?path=README.md&ref=main
GET /api/repositories/:owner/:name/commits
GET /api/repositories/:owner/:name/branches
GET /api/repositories/:owner/:name/archive?format=zip

# ── Синхронизация ───────────────────────────────────────────────
# Запустить ручную синхронизацию репозитория
POST /api/repositories/:owner/:name/sync

# Статус подключения (активно/провайдеры)
GET  /api/sync/status

# Отключить провайдера
POST /api/sync/disconnect

# ── Комьюнити ───────────────────────────────────────────────────
# Список тредов обсуждений
GET  /api/community/threads

# Создать новый тред (auth required)
POST /api/community/threads
{"title": "...", "content": "..."}

# ── Статус ──────────────────────────────────────────────────────
GET /api/status                 # Общая статистика (repo count, users)
GET /api/health                 # Проверка работоспособности

Bash-скрипт деплоя нового сервиса

deploy.sh
#!/bin/bash
set -e

SERVICE="my-api"
MQXX_HOST="git@mqxx.ru"
MQXX_PORT="2222"

echo "🚀 Создание репозитория на MQXX..."
ssh -p $MQXX_PORT $MQXX_HOST init $SERVICE

echo "📦 Инициализация локального репо..."
git init .
git remote add origin ssh://$MQXX_HOST:$MQXX_PORT/$SERVICE.git

echo "📤 Первый коммит..."
git add .
git commit -m "feat: initial commit"
git push -u origin master

echo "✅ Готово! Репозиторий $SERVICE создан."