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

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

GraphQL API на VPS: Apollo, systemd и nginx
Блог MAATRIX · 2026-07-07

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

Обсудить статью, задать вопрос или начать новую тему

Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.

Перейти в сообщество →

Когда 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 -
apt install -y nodejs nginx
mkdir -p /opt/gqlapp && cd /opt/gqlapp
npm init -y
npm install @apollo/server graphql

Минимальный сервер /opt/gqlapp/index.js:

const { ApolloServer } = require('@apollo/server');
const { startStandaloneServer } = require('@apollo/server/standalone');
const typeDefs = `type Query { hello: String }`;
const resolvers = { Query: { hello: () => 'world' } };
const server = new ApolloServer({ typeDefs, resolvers });
startStandaloneServer(server, { listen: { port: 4000, host: '127.0.0.1' } })
  .then(({ url }) => console.log('GraphQL on ' + url));

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

Демонизируем сервис через systemd — так процесс Node поднимется после ребута и рестартится при падении. Переменная NODE_ENV=production отключает подробные стек-трейсы в ответах и включает оптимизации фреймворка.

cat > /etc/systemd/system/gqlapp.service <<'EOF'
[Unit]
Description=GraphQL API
After=network.target

[Service]
WorkingDirectory=/opt/gqlapp
ExecStart=/usr/bin/node index.js
Restart=always
User=www-data
Environment=NODE_ENV=production

[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable --now gqlapp

nginx + TLS перед GraphQL

GraphQL — обычный HTTP POST на /graphql, поэтому проксирование простое. Выпустим сертификат прямо через плагин certbot для nginx, он сам пропишет ssl-директивы:

certbot certonly --nginx -d api.example.com
server {
    listen 443 ssl http2;
    server_name api.example.com;

    ssl_certificate     /etc/letsencrypt/live/api.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/api.example.com/privkey.pem;

    location /graphql {
        proxy_pass http://127.0.0.1:4000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}
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 \
  -H 'Content-Type: application/json' \
  -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

Обсудить статью, задать вопрос или начать новую тему

Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.

Перейти в сообщество →

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

GraphQL или REST?

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

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

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

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

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