Как перейти от MVP к производственному серверу за один день

1656556700 kak perejti ot mvp k proizvodstvennomu serveru za odin den

Исроэль Яковсон

Эта статья повествует о двух других о создании стеков полных графиков. Просмотрите, как создать передовой сервер сейчас, чтобы получить концептуальный ввод в этот подход. Запустите свой MVP сервер за час, поможет вам создать набор качества разработки. В этой статье объясняется, как превратить этот стек в надежную, постоянную программу.

xMv8-fJ-bBLSQJDiVRVDBAkJPEB1UFdoMrLz

Что не так со стеком разработки?

Шаги во второй статье отображали видео GRANDstack:

Этого достаточно для MVP или для начального прототипирования, но вскоре придется двигаться дальше. Наибольшим начальным ограничением является база данных. Песочница проживет максимум десять дней.

Даже после того, как вы развернете постоянную базу данных, Now станет сложным постоянным домом. Теоретически это было бы возможно, если вы часто не меняли свой сервер. Вы можете настроить свой постоянный API с отдельным хостом и псевдонимом для конечной точки Now. Проблема в том, что конечная точка Now меняется всякий раз, когда вы загружаете ревизию. Это значит, что вам придется постоянно обновлять свой псевдоним.

Безопасность тоже является проблемой. Обычно создается белый список IP-адресов, которым можно получить доступ к вашей базе данных, и ограничивать список вашим сервером API. Итак, если IP-адрес сервера часто меняется, вам придется обновлять список каждой редакции. Я не вижу жизнеспособного способа сделать это из Now на момент написания этой статьи. (Пожалуйста, свяжитесь со мной, если да!)

Итак, возникает вопрос, какой наилучший подход к решению этих ограничений?

На переднем крае

Правда, в том, что эта статья была приостановлена ​​на несколько недель. Проблема заключалась в том, что neo4j-graphql-js был не совсем готов для поддержки производства. Но за последние несколько недель все изменилось. Команда решила несколько фундаментальных проблем:

  • Промежуточное ПО стало поддерживаться две недели назад. Команда добавила в сгенерированные редукторы поддержку выброса ошибок промежуточного программного обеспечения. Это позволяет серверу выполнять общие функции аутентификации и авторизации как промежуточное программное обеспечение.
  • Модификация мутаций стала возможной неделю назад. До тех пор вы застряли в созданных мутациях. Теперь вы можете добавить необходимую бизнес-логику или побочные эффекты.
  • Становятся доступными автоматически сгенерированные ключи. Вчера команда сообщила о новой директиве @autogenerate. Размещение директивы после ключа приведет к автоматически сгенерированному UUID. Ранее интерфейс должен был передавать значения для ключей, наиболее необычных для рабочего сервера.

Этот текст, написанный 19 августа 2018 года, приходит в разгар многих других ожидаемых поправок. Особо интересно, что команда планирует выпустить некоторые директивы для упрощения аутентификации. Кроме того, я надеюсь, что скоро мы увидим вложенные мутации. Многое из того, что я здесь пишу, вскоре устареет. Но я решил, что сейчас следует описать этот пакет, ведь он уже полезен. Пожалуйста, опубликуйте обновления или исправления ниже комментариев.

Параметры

Когда вы покидаете мир песочниц, у вас есть выбор. Я думаю, что общее правило таково, что сегодня у большинства все хорошо. Главное – двигаться вперед.

Но три основных шага, которые я обсудю ниже, вероятно, являются универсальными потребностями. Они могут быть все, что вам нужно для вашего заднего конца.

Два вступительных замечания:

  • Вам не нужно доводить все до совершенства с первого дня. Было время, когда такие решения, как размер вашей машины или хоста, имели долгосрочное значение. Сегодня любая умная команда работает в облаке. Большинство решений обратимы. Auth может быть исключением, но даже это может измениться. Получите что-нибудь живое и начните вращаться!
  • Если вы сделали шаги, описанные в разделе «Запустите свой сервер MVP за час», у вас есть удивительно маленький сервер. Вам понадобятся три компонента: ваше маленькое серверное приложение, ваша база данных и служба аутентификации. Вам даже не нужно хранить их на одном хосте.

Содержание

  1. Настроить Auth
  2. Раскрутите базу данных
  3. Создайте свой сервер

Настроить Auth

Потребности в аутентификации каждого проекта разные, но возникли некие базы. Вам нужны две вещи:

  1. Внешняя служба аутентификации. Два распространенных варианта: Cognito и Auth0.
  2. Большинство серверов также требует авторизации или контроля доступа. Вы должны решить, разрешено ли определенному пользователю что-либо делать.

Настройка промежуточного программного обеспечения

Предпочтительный способ обработки Auth – это промежуточное программное обеспечение или директивы. На момент написания аутентификация не включена в стартовый пакет GRANDstack.

Сервер, используемый в api/src/index.jx в стартовом пакете на данный момент ApolloServer. Но вы можете заменить это на graphalExpress от apollo-server-express.

Вам нужно будет изменить 2 файла:

  • api/src/index.js
  • api/package.json

Вы также должны добавить auth.js файл.

Вот версия index.js работающий с промежуточным программным обеспечением:

import express from 'express';import { graphqlExpress, graphiqlExpress } from 'apollo-server-express';import cors from 'cors';import { makeExecutableSchema } from 'graphql-tools'import expressPlayground from 'graphql-playground-middleware-express';import bodyParser from 'body-parser';require('dotenv').config();import { v1 as neo4j } from "neo4j-driver";import { augmentSchema } from "neo4j-graphql-js";import { typeDefs, resolvers } from "./graphql-schema";import { authenticateUser, authorize } from './auth';// augmentSchema will add autogenerated mutations based on types in schemaconst schema = makeExecutableSchema({  typeDefs,  resolvers});const augmentedSchema = augmentSchema(schema);const driver = neo4j.driver(  process.env.NEO4J_URI,  neo4j.auth.basic(    process.env.NEO4J_USER,    process.env.NEO4J_PASSWORD  ));const app = express();app.use(bodyParser.json()); // support json encoded bodiesapp.use(cors());app.use('/graphql i apollo-server-expressql', graphiqlExpress({  endpointURL: '/graphql'}));app.get('/', expressPlayground({ endpoint: '/graphql' }));// app.use('/', authenticateUser, authorize);app.use('/graphql', bodyParser.json(), graphqlExpress(req => {  return {    context:  {      auth: req.auth,      driver    },    endpointURL: '/graphql',    schema: augmentedSchema  }}));app.listen(process.env.GRAPHQL_LISTEN_PORT, '0.0.0.0');console.log(`GraphQL Playground at ${process.env.GRAPHQL_LISTEN_PORT}`);

Заметьте, что:

  1. Мы используем apollo-server-express, поддерживающий промежуточное программное обеспечение
  2. Две функции называются промежуточным программным обеспечением: authenticateUser и authorize. Оба определения появляются в auth.js.
  3. Я также добавил cors, который нам пригодился для решения некоторых проблем CORS.

Файл project.json должен содержать соответствующие зависимости. На момент написания вот версии, которые я использую:

{  "name": "grand-stack-express",  "version": "0.0.1",  "description": "API app for GRANDstack with express",  "main": "src/index.js",  "license": "MIT",  "dependencies": {    "apollo-server-express": "^1.3.6",    "babel-cli": "^6.26.0",    "babel-core": "^6.26.3",    "babel-polyfill": "^6.26.0",    "babel-preset-env": "^1.7.0",    "babel-preset-stage-0": "^6.24.1",    "babel-watch": "^2.0.7",    "body-parser": "^1.18.3",    "cors": "^2.8.4",    "dotenv": "^6.0.0",    "express": "^4.16.3",    "express-graphql": "^0.6.12",    "graphql-playground-middleware-express": "^1.7.1",    "graphql-tag": "^2.9.2",    "graphql-tools": "^3.0.4",    "neo4j-driver": "^1.6.3",    "neo4j-graphql-js": "^0.1.32",    "node-fetch": "^2.1.2",    "nodemon": "^1.17.5"  },  "resolutions": {    "neo4j-graphql-js/graphql": "v14.0.0-rc.2"  },  "scripts": {    "test": "echo \"Error: no test specified\" && exit 1",    "dev": "babel-watch --exec babel-node --presets env,stage-0 src/index.js",    "start": "nodemon --exec babel-node --presets env,stage-0 src/index.js"  },  "devDependencies": {    "nodemon": "^1.17.5"  }}

Вот исходный файл auth.js, который нужно добавить в свой проект и завершить:

import gql from 'graphql-tag'import { v1 as neo4j } from 'neo4j-driver';import { INSPECT_MAX_BYTES } from 'buffer';require('dotenv').config();const driver = neo4j.driver(  process.env.NEO4J_URI,  neo4j.auth.basic(    process.env.NEO4J_USER,    process.env.NEO4J_PASSWORD  ));const resolveUser = () => {  //a placeholder  return 0;}/* * middleware functions follow */export const authenticateUser = async (req, res, next) => {  req.auth={};  try {    const response = await resolveUser();    req.auth.user=response  } catch(err) {    req.error=err.message  }  next();}export const authorize = async (req, res, next) => {  if (req.error) {    console.log(req.error);    next();    return;  }  // placeholder, allows every authenticated request  next();}
  1. начните с фиксации вашей старой версии git и, вероятно, создание новой ветви. git add . потом git commit -m "works without auth" и затем git checkout -b auth. Тогда вы увидите ответ от
    Switched to a new branch ‘auth’
  2. заменить свой api/src/index.js и api/project.json файлы с приведенными выше версиями и добавьте файл auth.js файл к api/src.
  3. переместите ваши текущие node_modules: mv node_modules node_modules.old
  4. бежать npm install снова, потом npm start. Убедитесь, что это работает, запустив запрос.
ya3u8WaXGfR4VcOTOJXpA8SNJUrAOAoiUlEG

Добавьте службу аутентификации

Вы можете заполнить детали на основе SDK для любого программного обеспечения для аутентификации, которое вы используете.

Возможно, вам придется изучить использование функций async/await в экспресс-приложении, но научиться этому не так уж сложно.

  1. Раскомментируйте строку app.use(‘/’, authenticateUser, authorize); в index.js.
  2. Установите соответствующий пакет SDK Node js для проверки подлинности. Затем добавьте нужный код и перепишите функцию authenticateUser в auth.js назвать это. Не забудьте установить req.error на соответствующее сообщение об ошибке, когда аутентификация не удается.
  3. Требуйтесь, добавив действительный маркер к заголовку HTTP. Обратите внимание, что в Playground панель HTTP HEADERS делает это достаточно просто.

Добавить авторизацию

Файл auth.js Содержит драйвер базы данных. Драйвер поддерживает запросы на определение прав доступа к определенным данным. К примеру, ваша база данных может сохранять привилегии чтения/записи данных. Каждый раз, когда запрос не проходит ваш тест, вы можете указать, что не удалось, с помощью настройки req.error. The neo4jgraphql функция resolver возвратит сообщение об ошибке.

Обратите внимание, что можно добавить больше функций в промежуточное программное обеспечение. Например, можно добавить чек или полностью оплачен текущий пользователь.

Улучшение AugmentSchema

Звонок в augmentSchema в index.js файл генерирует мутации в схеме. Как отмечено выше, недавнее улучшение позволяет добавлять мутации. Вы также можете перезаписать сгенерированные.

Один простой способ – это с помощью директивы @cypher в вашей декларации мутации:

type Mutation { UpdateFoo(id: ID, name: String): Foo @cypher(statement:”MATCH (f:Foo {id: $id}) SET f.name = $name”}

Тогда для резольвера просто используйте neo4jgraphql:

Mutation: { UpdateFoo: neo4jgraphql}

Хостинг баз данных

У вас есть несколько вариантов. Во-первых, есть некоторые услуги хостинга. Я не был настолько поражен, потому что создать сервер базы данных самостоятельно не так уж сложно. Но цена – это капля в ковше по сравнению со временем вашей команды. Если вы платите несколько сот долларов в месяц, чтобы что-то запустить и не беспокоиться, вы можете сделать гораздо хуже.

Базовый хостинг

Я решил развернуть экземпляр AWS EC2. Я напишу, что я сделал.

  1. Определите свой регион. Возможно, не имеет большого значения, но если вы сосредоточены где-то, то воспользуйтесь этим.
  2. Настройте работу AWS CLI на вашем компьютере.
  3. Получите соответствующий AMI. Вы можете искать в магазине AWS или проверить, что есть в наличии.
  4. Выполните шаги (до последнего) здесь. Обязательно сохраните файл ключа, так как он понадобится для настройки APOC.
  5. Затем нужно зайти на страницу, войти и изменить пароль. Но в какой порт перейти и какой пароль может быть не таким, как там. Для моего AMI пароль был «neo4j» (например, имя пользователя). Мне пришлось перейти на https://[IP]:7473/browser/ (не http, как в примере, приведенном на странице, и не 7434).
  6. Измените код на локальном, чтобы убедиться, что вы можете подключиться к нему. Проверьте это на вашем локальном хосте:4000.

Настройка APOC

Использовать @cypher директивы или любая из функций APOC, вам придется установить файл APOC jar на самом сервере. Вам нужно будет зайти по ssh на сервер базы данных. По состоянию на 2 месяца назад он не был включен в AMI.

  1. Вам нужно будет использовать команду, показанную на Hosting Neo4j на EC2 на AWS: ssh -i $KEY_NAME.pem ubuntu@[PublicDnsName]
  2. Вам нужно будет добавить файл jar в каталог плагинов neo4j. Следуйте инструкциям из руководства, чтобы найти последнюю версию и понять, куда ее вставить.
  3. Вам также необходимо найти файл neo4j.conf и вставить в него разрешение на вызов функций. Следующие работы: dbms.security.procedures.unrestricted=apoc.*
  4. Тогда вам придется перезапустить: sudo systemctl restart neo4j.

Развертывание API

Вы можете развернуть в любой системе, поддерживающей программу NODE js. Я использовал AWS Elastic Beanstalk:

  1. Выполните команду zip -r api.zip . -x node_modules/**\*в api каталог. Это создает zip без каталога и без node_modules.
  2. Выделите AWS Elastic Beanstalk на консоли и убедитесь, что вы в выбранном регионе.
  3. Если вы можете попасть на страницу приветствия, мне это легче всего. Вы нажимаете на Начать, и следуйте инструкциям. Они сразу настроили меня на то, что мне требовалось. Вы просто загружаете файл, который вы заархивировались выше.
  4. nder Конфигурация для Elastic Beanstalk окружение, перейти к Изменить программное обеспечение. Введите Параметры контейнераи установить Команда узла к npm start.
  5. Приблизительно через 10 минут он готов. Вы можете нажать на URL-адрес конечной точки чтобы увидеть это.
  6. Используйте Route53, чтобы создать псевдоним вашего собственного домена API для конечной точки Elastic Beanstalk и все готово.

Выводы

Если вы зашли так далеко, поздравляем. Вы знаете больше о том, как создать полный стек графов, чем многие опытные дизайнеры.

Процесс, описанный в этих статьях, может занять час для того, кто делал это несколько раз. Надеемся, что для всех остальных эти статьи будут минимизировать дополнительное время для исследования. Время разработки должно сократиться еще больше, поскольку эти инструменты усовершенствуются.

Но простота и легкость – это только одно преимущество. Полный стек графиков также технологично надежен.

  • Созданный здесь сервер надежный.
  • База данных графиков в целом отлично масштабируется.
  • Стек использует очень мало ресурсов.
  • Вы можете перенести бэк-энд на разные хосты или службы, уменьшая блокировку и расход.

Давайте работать вместе, чтобы эта разработка развивалась. Оставляйте комментарии или свяжитесь с другими улучшениями. Удачи в собственных проектах!

Добавить комментарий

Ваш адрес email не будет опубликован.