We detected you are likely not from a Russian-speaking region. Would you like to switch to the international version of the site?

  Назад к списку статей

Разработка и деплой собственного сервера GraphQL на базе Dgraph в Termux с поддержкой масштабирования через Docker‑Compose

Если вы хотите собрать собственный GraphQL-сервер «под себя» и при этом держать проект контролируемым по компонентам (данные, запросы, схема), Dgraph — один из практичных вариантов. Он предоставляет графовую БД и нативную поддержку GraphQL через Dgraph GraphQL endpoint. А Termux удобен как «рабочая станция» на стороне разработчика: вы поднимаете сервисы, тестируете запросы, готовите конфигурации, а затем переносите/масштабируете развёртывание с помощью Docker‑Compose.

В этой статье рассмотрим рабочую схему: подготовка окружения в Termux, запуск Dgraph и GraphQL, а затем масштабирование через Docker‑Compose (несколько нод и/или масштабирование транспортного слоя). Материал ориентирован на легальный и полностью локальный сценарий разработки и деплоя.

Что будет в итоге

  • Termux как среда разработки: сборка/подготовка конфигураций, подготовка схемы GraphQL, быстрые проверки запросов.
  • Dgraph (планируемый формат: один сервис для разработки и отдельная docker‑сборка для «серьёзного» деплоя).
  • GraphQL endpoint Dgraph: создание схемы и выполнение запросов.
  • Docker‑Compose для масштабирования: несколько контейнеров Dgraph с возможностью роста числа нод и настройкой общих параметров.

Требования и оговорки

  • Android‑устройство с установленным Termux.
  • Установленный Docker на сервере/хосте, где вы будете запускать Docker‑Compose (например, отдельная машина в локальной сети или компьютер). В Termux Docker может быть доступен не везде одинаково; поэтому архитектурно мы переносим «продовые» и масштабируемые шаги в docker‑окружение.
  • Доступ в локальную сеть между хостом Docker и клиентом (при необходимости вы можете поднять локальную сеть через VPN только для соединения устройств, не для обхода блокировок).

Шаг 1. Подготовка Termux

Начнём с обновления пакетов и установки базовых утилит. В Termux удобно иметь инструменты для работы с запросами (curl) и шаблонами (например, jq), а также минимальные средства для сборки.

pkg update -y
pkg upgrade -y
pkg install -y curl jq git

Проверим версию curl и базовую связность:

curl --version

Шаг 2. Локальная схема GraphQL для Dgraph

Dgraph GraphQL работает через схему (schema) и генерацию соответствующих GraphQL типов/эндпоинтов. Подход обычно такой: вы описываете типы (и связи) в терминах Dgraph GraphQL schema, загружаете схему в Dgraph, а затем выполняете GraphQL запросы.

Пример минимальной схемы для сущностей Person и Post (для демонстрации). Файл можно назвать schema.graphql и хранить в вашей рабочей папке в Termux.

cat > schema.graphql <<'EOF'
type Person {
  id: ID!
  name: string! @search(by: [fulltext])
  posts: [Post] @hasInverse(field: author)
}

type Post {
  id: ID!
  title: string! @search(by: [fulltext])
  content: string
  author: Person @hasInverse(field: posts)
}
EOF

Если вы планируете сложные модели, держите схему в репозитории и версионируйте изменения — так проще масштабировать и обслуживать.

Шаг 3. Запуск Dgraph в режиме разработки (ориентир)

На практике удобнее поднимать Dgraph в контейнерах через Docker, но вы просили контекст Termux. Поэтому рассмотрим общий сценарий: в Termux вы готовите запросы и проверяете API, а сам Dgraph обычно запускаете в контейнерах на docker‑хосте. Тем не менее, для понимания логики полезно знать, что Dgraph GraphQL Endpoint обычно доступен по HTTP (в контейнерной схеме — через проброшенные порты).

Чтобы не привязываться к конкретной «модели» сборки/установки Dgraph внутри Termux (они могут отличаться по версии образа/бинарника), ниже мы ориентируемся на запуск Dgraph через Docker‑Compose — это и будет основным способом деплоя и масштабирования.

Шаг 4. Docker‑Compose для Dgraph (база под масштабирование)

Создайте на docker‑хосте каталог проекта, например dgraph-gql, и структуру конфигураций. Допустим, вы хотите минимум: один Zero (или несколько по плану), агент(ы) Alpha и отдельный GraphQL endpoint (он обычно доступен через Alpha).

Ниже приведён пример docker-compose.yml. Его цель — показать архитектуру: масштабируем alpha сервисы (несколько контейнеров). Точные параметры могут зависеть от вашей версии Dgraph и желаемой схемы данных. Перед запуском убедитесь, что версия образов соответствует вашим требованиям.

mkdir -p dgraph-gql/config dgraph-gql/data
cat > docker-compose.yml <<'EOF'
version: "3.9"

services:
  zero:
    image: dgraph/dgraph:latest
    command: dgraph zero
    ports:
      - "6080:6080"
      - "5080:5080"
    volumes:
      - ./data/zero:/dgraph
    networks:
      - dgraph-net

  alpha1:
    image: dgraph/dgraph:latest
    command: dgraph alpha --my=alpha1:7080 --zero=zero:5080 --graphql_internal --lru_mb=1024
    depends_on:
      - zero
    ports:
      - "8080:8080"   # HTTP (GraphQL endpoint часто через это)
      - "9080:9080"   # gRPC/прочие эндпоинты (зависит от версии/конфига)
    volumes:
      - ./data/alpha1:/dgraph
    networks:
      - dgraph-net

  alpha2:
    image: dgraph/dgraph:latest
    command: dgraph alpha --my=alpha2:7080 --zero=zero:5080 --graphql_internal --lru_mb=1024
    depends_on:
      - zero
    ports: []
    volumes:
      - ./data/alpha2:/dgraph
    networks:
      - dgraph-net

networks:
  dgraph-net:
    driver: bridge
EOF

Ключевые идеи:

  • zero координирует кластер.
  • alpha — ноды, на которых работают запросы и GraphQL endpoint.
  • Флаг --graphql_internal включает поддержку GraphQL.
  • Масштабирование достигается добавлением сервисов alpha3, alpha4 и т.д. или настройкой количества реплик (в зависимости от того, как устроен ваш кластер).

Запуск:

docker compose up -d

Проверка логов:

docker compose logs -f --tail=200 alpha1

Проверьте, что HTTP эндпоинт доступен с вашего клиента. Если хост — это ваша машина с Docker, то с Termux попробуйте запрос:

curl -s http://<DOCKER_HOST_IP>:8080/health?verbose=true

Если endpoint другой — смотрите логи контейнера и документацию вашей версии Dgraph. Цель — убедиться, что сервис жив и маршрутизация правильная.

Шаг 5. Загрузка GraphQL схемы в Dgraph

Dgraph обычно требует загрузки схемы через endpoint (часто это REST/HTTP с содержимым schema). В зависимости от конфигурации и версии образа используемые URL могут отличаться, поэтому ниже — универсальная практическая форма: отправить схему в Dgraph schema API и проверить результат.

С Termux удобно отправлять schema через curl. Предположим, что Dgraph доступен по адресу http://<DOCKER_HOST_IP>:8080. Тогда пример загрузки схемы может выглядеть так (при необходимости адаптируйте путь под вашу версию):

SCHEMA_CONTENT=$(cat schema.graphql)

curl -X POST "http://<DOCKER_HOST_IP>:8080/admin/schema" 
  -H "Content-Type: application/graphql" 
  --data-binary "$SCHEMA_CONTENT"

Если операция успешна — вы получите ответ без ошибки. В случае ошибок смотрите message в ответе и корректируйте схему.

Шаг 6. Добавление данных через GraphQL

После загрузки схемы можно выполнять GraphQL мутации и запросы. Dgraph обычно поддерживает GraphQL операции через endpoint (например, /graphql или через специальный маршрут). Проверим доступный маршрут из вашей конфигурации. Часто используется следующий шаблон:

curl -s -X POST "http://<DOCKER_HOST_IP>:8080/graphql" 
  -H "Content-Type: application/json" 
  -d '{"query":"{ _service { sdl } }"}'

Если вы видите SDL/подтверждение сервиса — endpoint найден. Далее добавим данные.

curl -s -X POST "http://<DOCKER_HOST_IP>:8080/graphql" 
  -H "Content-Type: application/json" 
  -d '{
    "query": "mutation { 
      addPerson(input: [{name: "Denis"}]) { 
        person { id name } 
      } 
    }"
  }'

Добавим пост:

curl -s -X POST "http://<DOCKER_HOST_IP>:8080/graphql" 
  -H "Content-Type: application/json" 
  -d '{
    "query": "mutation {
      addPost(input: [{title: "Hello GraphQL", content: "Dgraph + Termux workflow"}]) {
        post { id title }
      }
    }"
  }'

Для связи author и posts вам нужно указать ссылку/ID автора в мутации. Например, через поле связи (синтаксис зависит от того, как Dgraph сгенерировал schema для связей). Обычно это делается либо назначением author с указанием id, либо отдельной мутацией на связь.

Принцип: сначала создайте Person, затем используйте полученный id для создания/привязки Post.

Шаг 7. Запрос данных (GraphQL query)

Теперь сделаем выборку. Запрос: получить автора и его посты.

curl -s -X POST "http://<DOCKER_HOST_IP>:8080/graphql" 
  -H "Content-Type: application/json" 
  -d '{
    "query": "query {
      queryPerson(first: 10) {
        id
        name
        posts {
          id
          title
        }
      }
    }"
  }'

Подстройте queryPerson/queryPost согласно генерации resolvers в вашей схеме.

Шаг 8. Масштабирование: что именно масштабируем

Важно понимать: «масштабирование» в Dgraph может подразумевать разные уровни.

  • Scale-out по Alpha: вы добавляете больше нод alpha для обработки запросов. Это обычно даёт рост по RPS и повышает отказоустойчивость.
  • Горизонтальное расширение данных: распределение/хранение графа между нодами — это задача Dgraph и режима кластера.
  • Транспортный слой: иногда добавляют reverse-proxy (например, Nginx) для балансировки HTTP к нескольким Alpha (если в вашей конфигурации HTTP распределяется не автоматически).

В docker‑compose масштабирование на практике делается добавлением сервисов alpha3, alpha4 и т.д. либо через шаблон, если вы используете compose v2 с поддержкой параметризации.

Пример расширения: добавление alpha3 по аналогии с alpha2 (показывается концептуально):

# В docker-compose.yml добавьте сервис по аналогии:
# alpha3:
#   image: dgraph/dgraph:latest
#   command: dgraph alpha --my=alpha3:7080 --zero=zero:5080 --graphql_internal --lru_mb=1024
#   depends_on:
#     - zero
#   ports: []
#   volumes:
#     - ./data/alpha3:/dgraph
#   networks:
#     - dgraph-net

После добавления ноды:

docker compose up -d

Проверьте логи и убедитесь, что ноды присоединились к кластеру.

Шаг 9. Работа из Termux: быстрые проверки и интеграция

Пока кластер растёт, разработчику важно быстро проверять запросы. Termux отлично подходит как «клиент разработки».

Рекомендуемый подход:

  • Храните GraphQL запросы в файлах (например, queries/get-person.graphql, mutations/add-post.graphql).
  • Используйте curl для отправки и сохраняйте ответы в JSON.
  • При необходимости делайте простые обёртки (shell-скрипты) для единообразных запросов.

Пример простого отправщика:

cat > gql.sh <<'EOF'
#!/data/data/com.termux/files/usr/bin/bash
set -e
ENDPOINT="http://<DOCKER_HOST_IP>:8080/graphql"
QUERY_FILE="$1"

QUERY_CONTENT=$(cat "$QUERY_FILE")

curl -s -X POST "$ENDPOINT" 
  -H "Content-Type: application/json" 
  -d "{"query": $(jq -Rs . <<< "$QUERY_CONTENT")}"
EOF

chmod +x gql.sh

Использование:

./gql.sh queries/get-person.graphql

Типовые проблемы и как их диагностировать

  • Не открывается endpoint GraphQL: проверьте проброс порта (в docker‑compose), проверьте URL и логи контейнера alpha.
  • Ошибка в схеме: ошибка синтаксиса/связей. Проверьте schema файлы и сообщения в ответе на загрузку схемы.
  • Запросы возвращают пусто: проверьте, что данные действительно созданы и что поля/имена совпадают с типами вашей схемы.
  • Нода не присоединилась к кластеру: проверьте адреса --zero и параметр --my, доступность сети docker.

Заключение

Выстроить собственный GraphQL сервер на базе Dgraph в связке с Termux — это удобный путь для разработки: Termux помогает быстро формировать запросы и проверять бизнес-логику, а Docker‑Compose даёт управляемое и масштабируемое деплоение кластера Dgraph. Начиная с одного узла для проверки, вы можете расширять количество Alpha нод, увеличивая пропускную способность и устойчивость.

Если вам нужна помощь с архитектурой кластера, настройкой Docker‑Compose, подбором параметров Dgraph под нагрузку или переносом проекта из локальной разработки в более надёжный деплой — обращайтесь в РыбинскЛАБ. Мы поможем спроектировать и внедрить решение под ваши задачи.

* Текст статьи подготовлен и структурирован с использованием технологий искусственного интеллекта. Проверен и доработан перед публикацией.

Нужна помощь с настройкой Termux, Linux и серверов?

Я оказываю ИТ-услуги: настройка серверов, автоматизация, безопасность, помощь с Linux и инфраструктурой. Материалы сайта — только в ознакомительных и образовательных целях.

Связаться со мной
Поддержать проект