GraphQL API на собственном VPS
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 MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK и США. Оплата картой РФ и по СБП.
Арендовать VPS для GraphQLЧастые вопросы
GraphQL или REST?
GraphQL хорош, когда клиентам нужны разные срезы данных и нужно избегать over-fetching. Для простых CRUD REST проще.
Как кэшировать GraphQL?
Кэшируйте на уровне резолверов через Redis и используйте persisted queries, чтобы кэшировать по хэшу запроса.
Какой VPS нужен под GraphQL?
Базовый план от $8/мес для старта; при тяжёлых резолверах и большом трафике добавляйте ядра и RAM.