Skip to content

IljaYuhtenko/nodejsredisexample

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

10 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

NodeJSRedisPostgresExample

Простое приложение, демонстрирующее один из вариантов работы с БД redis (в качестве кэша) + Postgres в CentOS 7 на примере приложения для работы с заметками (создание, чтение, редактирование, удаление)

Changelog

Добавлена БД Postgres и проведена ее инициализация. В файл credentials следует добавить переменные: pgPort, pgUser, pgPass, pgDB, смысл которых ясен из названия. Используя каждый маршрут используется в первую очередь redis. В случае отсутствия данных проводится проверка в Postgresql

Описание

Redis - сетевое журналируемое хранилище данных типа «ключ — значение» с открытым исходным кодом. Нереляционная высокопроизводительная СУБД.

Postgres - свободная объектно-реляционная система управления базами данных (СУБД)

Установка

1. Установка Redis

  1. Устанавливаем epel repo, хранилище пакетов, созданное группой специалистов операционной системы Fedora:
# yum -y install epel-release
  1. Затем:
# sudo yum -y update
  1. Непосредственно установка redis, установка автозагрузки и запуск
# sudo yum install redis -y
# sudo systemctl enable redis
# sudo systemctl start redis
  1. Протестируем, установлена ли БД:
# redis-cli ping

В ответе должно быть:

PONG

2. Настройка redis

  1. Открываем файл /etc/redis.conf с помощью любого текстового редактора

  2. Чтобы redis принимала запросы с любого адреса комментируем строку

bind 127.0.0.1

Но в этом случае, для соблюдения правил безопасности, следует установить мастер-пароль:

  1. Мастер-пароль задается в строке:
requirepass

Например:

requirepass mySuperStrongRedisDatabasePass

3. Установка и настройка PostgreSQL

  1. Установим пакеты
yum install postgresql postgresql-server
  1. Инициализиуем
/usr/bin/postgresql-setup initdb
  1. Запустим и добавим в автозагрузку
systemctl enable postgresql
systemctl start postgresql
  1. Принимаем запросы с всех адресов

Открываем postgresql.conf:

vim /var/lib/pgsql/data/postgresql.conf

Раскомментируем и редактируем строку

На

listen_addresses = '*' 

Открываем pg_hba.conf:

vim /var/lib/pgsql/9.4/data/pg_hba.conf

И добавляем строку:

host all all <YOUR IP ADDRESS>/<YOUR SUBNET MASK> md5

Чтобы с указанного адреса, с указанной маской была возможность подключаться к БД

  1. Создание пользователя Postgresql

По умолчанию, доступен суперпользователь БД postgres. Создадим пользователя с меньшими правами, дадим ему БД и права на нее. Для этого сначала переключимся на суперпользователя БД и вызовем процедуру создания пользователя:

su postgres
createuser --interactive

После чего мы отвечаем на ряд несложных вопросов о возможностях нашего пользователя. Затем:

psql
ALTER ROLE <YOUR USER> WITH ENCRYPTED PASSWORD <YOUR USER PASSWORD>;
CREATE DATABASE <YOUR DATABASE> WITH OWNER <YOUR USER>;
GRANT ALL ON DATABASE <YOUR DATABASE> TO <YOUR USER>;
\q

После чего остается закончить вернуться к нашему изначальному пользователю и перезагрузить БД:

systemctl restart postgresql

4. Установка приложения

  1. Скачаем файлы приложения:
# git clone https://github.com/IljaYuhtenko/nodejsredisexample
  1. Установим зависимости:
# npm i 
  1. Настроим подключение к БД

Создать в директории ./config файл credentials.js в котором экспортировать переменные port, host и redisPass, например:

module.exports = {
   port: 6379,
   host: 'localhost',
   redisPass: 'mySuperStrongRedisDatabasePassword'
}

5. Запуск приложения

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

# node app.js

6. Использование приложения

  1. GET /

Выводит все имеющиеся заметки

  1. GET /:id

Выводит заданную заметку

  1. POST /

Параметры запроса:

{
	"title":"NoteTitle",
	"body":"NoteBody"
}

Создает заметку с указанными параметрами

  1. PUT /:id

Параметры запроса:

{
	"title":"NoteTitle",
	"body":"NoteBody"
}

Заменяет в заметке id данные на указанные в запросе

  1. DELETE /:id

Удаляет указанную заметку

Заметки и сюрпризы

  1. Можно не устанавливать пароль, если не комментировать строку bind, а задать там тот адрес, с которого будет осуществляться подключение к БД. По умолчанию - с той же машины.

  2. Если задавать пароль, то надо задавать очень сильный пароль. Так как redis лежит в оперативной памяти и быстро обрабатывает запросы, то в секунду злоумышленник можеть перепробовать до 150к паролей. А еще лучше сменить порт и поставить сильный пароль

  3. Оказывается forEach ломает асинхронность. Поэтому все циклы - x of y

  4. Для того, чтобы запросы к redis возвращали promise используется модуль bluebird, который к каждому виду запросов к БД добавляет Async. Например, hget => hgetAsync, hset => hsetAsync и т.д.

  5. В данном приложении в качестве типа хранения данных redis использовалась структура хэш. Она требует уникального ключа, поля и значения поля. Встроееного механизма получения уникального ключа мне найти не удалось, поэтому была объявлена глобальная переменная redisID, которая при каждом добавлении записи просто инкрементируется

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

  7. С postgresql возникает чувсто большей возни в плане настроек ее взаимодействия через Интернет. Менее приятен голый синтаксис sql, вкупе с необходимостью обертки практически всех объектов в двойные кавычки, вроде названия таблицы или схемы или отдельного поля (хотя последнее решается параметризованными запросами, которые я и использую)

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Packages

No packages published