Если вы хотите собрать собственный 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/datacat > 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 под нагрузку или переносом проекта из локальной разработки в более надёжный деплой — обращайтесь в РыбинскЛАБ. Мы поможем спроектировать и внедрить решение под ваши задачи.