MAATRIX / Блог / GraphQL API на собственном VPS

GraphQL API на собственном VPS

Блог MAATRIX · 2026-07-07

GraphQL даёт клиенту гибкость запрашивать ровно те поля, что нужны. Развернём production-GraphQL на VPS с nginx, TLS и защитой от вредных запросов.

Когда GraphQL нужен свой сервер

['GraphQL-резолверы часто ходят в несколько источников данных на один запрос, а сложные вложенные запросы нагружают CPU и память. Управляемые GraphQL-сервисы дороги и ограничивают код резолверов. Свой VPS с root снимает эти ограничения.', 'Резолверы и парсинг схемы упираются в производительность ядра, поэтому AMD EPYC + NVMe у MAATRIX держит latency низким даже на тяжёлых запросах, а ежедневные бэкапы страхуют данные.', 'GraphQL-эндпоинт — это единая точка входа для всех клиентов: веб, мобильные приложения, партнёрские интеграции. Держать её на управляемой платформе с жёсткими лимитами по времени резолвера рискованно: один тяжёлый запрос уводит функцию в таймаут. На своём VPS вы сами настраиваете таймауты, память процесса Node и пул соединений к базе. Для команд из России добавляется удобство — сервер в UK или США с оплатой картой РФ, СБП, криптой или токеном MAAT.']

Нужен сервер под эту задачу?

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK и США. Оплата картой РФ и по СБП.

Арендовать VPS для GraphQL

Ставим окружение и Apollo

['Node.js + Apollo Server — самый популярный стек:', '
curl -fsSL https://deb.nodesource.com/setup_20.x | bash -\napt install -y nodejs nginx\nmkdir -p /opt/gqlapp && cd /opt/gqlapp\nnpm init -y\nnpm install @apollo/server graphql
', 'Минимальный сервер /opt/gqlapp/index.js:', "
const { ApolloServer } = require('@apollo/server');\nconst { startStandaloneServer } = require('@apollo/server/standalone');\nconst typeDefs = `type Query { hello: String }`;\nconst resolvers = { Query: { hello: () => 'world' } };\nconst server = new ApolloServer({ typeDefs, resolvers });\nstartStandaloneServer(server, { listen: { port: 4000, host: '127.0.0.1' } })\n  .then(({ url }) => console.log('GraphQL on ' + url));
"]

Демонизация через systemd

['Демонизируем сервис через systemd — так процесс Node поднимется после ребута и рестартится при падении. Переменная NODE_ENV=production отключает подробные стек-трейсы в ответах и включает оптимизации фреймворка.', "
cat > /etc/systemd/system/gqlapp.service <<'EOF'\n[Unit]\nDescription=GraphQL API\nAfter=network.target\n\n[Service]\nWorkingDirectory=/opt/gqlapp\nExecStart=/usr/bin/node index.js\nRestart=always\nUser=www-data\nEnvironment=NODE_ENV=production\n\n[Install]\nWantedBy=multi-user.target\nEOF\nsystemctl daemon-reload\nsystemctl enable --now gqlapp
"]

nginx + TLS перед GraphQL

['GraphQL — обычный HTTP POST на /graphql, поэтому проксирование простое. Выпустим сертификат прямо через плагин certbot для nginx, он сам пропишет ssl-директивы:', '
certbot certonly --nginx -d api.example.com\n
', '
server {\n    listen 443 ssl http2;\n    server_name api.example.com;\n\n    ssl_certificate     /etc/letsencrypt/live/api.example.com/fullchain.pem;\n    ssl_certificate_key /etc/letsencrypt/live/api.example.com/privkey.pem;\n\n    location /graphql {\n        proxy_pass http://127.0.0.1:4000;\n        proxy_set_header Host $host;\n        proxy_set_header X-Real-IP $remote_addr;\n    }\n}
', '
nginx -t && systemctl reload nginx
']

Безопасность и частые ошибки

['GraphQL уязвим к глубоким и дорогим запросам: злоумышленник может запросить вложенные связи на десять уровней и положить сервер одним запросом. Поэтому в проде обязательны лимит глубины, лимит сложности и rate-limiting на уровне nginx. Ограничьте глубину и сложность:', '
npm install graphql-depth-limit graphql-query-complexity
', 'Проверяем API из консоли:', '
curl -X POST https://api.example.com/graphql \\\n  -H \'Content-Type: application/json\' \\\n  -d \'{"query":"{ hello }"}\'
', '
  • Introspection открыт в проде — отключите его, чтобы не раскрывать схему.
  • N+1 запросы — используйте DataLoader для батчинга обращений к БД.
  • 502 от nginx — сервис не слушает 4000; смотрите journalctl -u gqlapp -n 50.
', 'Отдельный VPS под GraphQL-шлюз удобно масштабировать: при росте трафика вы просто повышаете тариф MAATRIX (больше ядер и RAM) без переезда и смены IP, а ежедневные бэкапы фиксируют конфигурацию сервера перед каждым релизом схемы.']

Нужен сервер под эту задачу?

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK и США. Оплата картой РФ и по СБП.

Арендовать VPS для GraphQL

Частые вопросы

GraphQL или REST?

GraphQL хорош, когда клиентам нужны разные срезы данных и нужно избегать over-fetching. Для простых CRUD REST проще.

Как кэшировать GraphQL?

Кэшируйте на уровне резолверов через Redis и используйте persisted queries, чтобы кэшировать по хэшу запроса.

Какой VPS нужен под GraphQL?

Базовый план от $8/мес для старта; при тяжёлых резолверах и большом трафике добавляйте ядра и RAM.