Home » Как настроить Ruby on Rails с Postgres
Как настроить Ruby on Rails с Postgres

Как настроить Ruby on Rails с Postgres

Если вы читаете эту статью, значит, вам предстоит развернуть Ruby on Rails с PostgreSQL, и хочется сделать это быстро и без лишних танцев с бубном. Связка Rails + Postgres — это классика веб-разработки, которая проверена временем и миллионами проектов. Здесь разберём всё пошагово: от нуля до production-ready приложения, с реальными примерами и командами, которые можно копировать и выполнять. Никаких лишних слов — только то, что работает на практике.

Почему именно Rails + PostgreSQL?

PostgreSQL — это не просто база данных, это швейцарский нож для разработчика. В отличие от MySQL, Postgres предлагает полноценную поддержку JSON, массивов, hstore, и куча других фишек, которые делают жизнь Rails-разработчика проще. По статистике Stack Overflow 2023, PostgreSQL занимает 2-е место среди самых любимых баз данных (43.2% против 18.2% у MySQL).

Rails из коробки отлично дружит с Postgres, и многие гемы рассчитаны именно на эту связку. Если планируете серьёзный проект, то SQLite точно не подойдёт, а MySQL… ну, он работает, но зачем себя ограничивать?

Подготовка системы

Для начала нужен чистый сервер. Если у вас его нет, можно быстро заказать VPS или выделенный сервер. Дальше работаем с Ubuntu 22.04 LTS — она стабильная и всё на ней отлично работает.

Первым делом обновляем систему и ставим базовые пакеты:


sudo apt update && sudo apt upgrade -y
sudo apt install curl wget gnupg2 software-properties-common apt-transport-https ca-certificates
sudo apt install build-essential git nodejs yarn

Установка Ruby

Забудьте про системный Ruby — это путь к проблемам. Используем rbenv для управления версиями:


curl -fsSL https://github.com/rbenv/rbenv-installer/raw/HEAD/bin/rbenv-installer | bash
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(rbenv init -)"' >> ~/.bashrc
source ~/.bashrc

rbenv install 3.2.0
rbenv global 3.2.0
rbenv rehash

Проверяем установку:


ruby --version
# Ruby 3.2.0 (2022-12-25 revision a528908681) [x86_64-linux]

Установка PostgreSQL

Ставим PostgreSQL 15 (самую свежую стабильную версию):


sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
sudo apt update
sudo apt install postgresql-15 postgresql-client-15 postgresql-contrib-15 libpq-dev

Настраиваем PostgreSQL:


sudo systemctl start postgresql
sudo systemctl enable postgresql
sudo -u postgres psql

В psql создаём пользователя для Rails:


CREATE USER railsuser WITH PASSWORD 'your_secure_password';
ALTER USER railsuser CREATEDB;
\q

Установка Rails

Устанавливаем Rails (без документации — она всё равно онлайн читается):


gem install rails --no-document
rbenv rehash
rails --version

Создание нового проекта

Создаём новый проект с PostgreSQL:


rails new myapp --database=postgresql
cd myapp

Редактируем `config/database.yml`:


default: &default
adapter: postgresql
encoding: unicode
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
username: railsuser
password: your_secure_password
host: localhost

development:
<<: *default database: myapp_development test: <<: *default database: myapp_test production: <<: *default database: myapp_production

Создаём базы данных:


rails db:create
rails db:migrate

Практические кейсы и подводные камни

Теперь разберём типичные проблемы и их решения:

Проблема: Could not find gem 'pg'

Решение: Не установлен libpq-dev


sudo apt install libpq-dev
bundle install

Проблема: FATAL: peer authentication failed

Решение: Правим pg_hba.conf


sudo nano /etc/postgresql/15/main/pg_hba.conf
# Меняем строку:
# local all all peer
# на:
# local all all md5
sudo systemctl restart postgresql

Проблема: ActiveRecord::ConnectionNotEstablished

Решение: Проверяем настройки подключения


rails db:create:all
rails db:migrate

Оптимизация производительности

Для production-окружения добавляем в `config/database.yml`:


production:
<<: *default database: myapp_production pool: 25 timeout: 5000 prepared_statements: true advisory_locks: true

Настраиваем connection pooling в `config/puma.rb`:


workers ENV.fetch("WEB_CONCURRENCY") { 4 }
threads_count = ENV.fetch("RAILS_MAX_THREADS") { 5 }
threads threads_count, threads_count

Сравнение с альтернативами

Особенность PostgreSQL MySQL SQLite
JSON поддержка Нативная (jsonb) Базовая (JSON) Через расширения
Полнотекстовый поиск Встроенный Базовый FTS5
Производительность Высокая (сложные запросы) Высокая (простые запросы) Средняя
Масштабируемость Отличная Хорошая Только для разработки

Интересные фишки PostgreSQL в Rails

PostgreSQL предлагает уникальные возможности для Rails-разработчиков:

  • hstore — хранение key-value в колонке
  • Arrays — массивы прямо в базе данных
  • UUID — уникальные идентификаторы вместо auto-increment
  • Partial indexes — индексы с условиями
  • Materialized views — кешированные представления

Пример использования массивов:


# В миграции
add_column :articles, :tags, :string, array: true, default: []

# В модели
class Article < ApplicationRecord scope :with_tag, ->(tag) { where("? = ANY(tags)", tag) }
end

# Использование
Article.with_tag('ruby')

Автоматизация и скрипты

Создаём скрипт для автоматической настройки:


#!/bin/bash
# setup_rails_postgres.sh

echo "Устанавливаем Ruby..."
curl -fsSL https://github.com/rbenv/rbenv-installer/raw/HEAD/bin/rbenv-installer | bash

echo "Устанавливаем PostgreSQL..."
sudo apt update
sudo apt install postgresql postgresql-contrib libpq-dev -y

echo "Создаём пользователя БД..."
sudo -u postgres createuser -s $USER

echo "Устанавливаем Rails..."
~/.rbenv/bin/rbenv exec gem install rails

echo "Готово! Создавайте проект: rails new myapp --database=postgresql"

Мониторинг и отладка

Полезные команды для мониторинга:


# Проверка подключений к БД
sudo -u postgres psql -c "SELECT * FROM pg_stat_activity;"

# Размер баз данных
sudo -u postgres psql -c "SELECT pg_database.datname, pg_size_pretty(pg_database_size(pg_database.datname)) FROM pg_database;"

# Медленные запросы
sudo -u postgres psql -c "SELECT query, calls, total_time, mean_time FROM pg_stat_statements ORDER BY mean_time DESC LIMIT 10;"

Production-готовые настройки

Для продакшена добавляем в `postgresql.conf`:


shared_preload_libraries = 'pg_stat_statements'
max_connections = 100
shared_buffers = 256MB
effective_cache_size = 1GB
maintenance_work_mem = 64MB
checkpoint_completion_target = 0.9
wal_buffers = 16MB
default_statistics_target = 100

И перезапускаем PostgreSQL:


sudo systemctl restart postgresql

Безопасность

Базовые настройки безопасности:


# Создаём отдельного пользователя для каждого приложения
sudo -u postgres createuser --interactive myapp_user

# Ограничиваем доступ только к нужной БД
sudo -u postgres psql -c "REVOKE ALL ON DATABASE myapp_production FROM PUBLIC;"
sudo -u postgres psql -c "GRANT ALL ON DATABASE myapp_production TO myapp_user;"

Полезные гемы для работы с PostgreSQL

Добавляем в Gemfile:


# Для работы с PostgreSQL-специфичными типами данных
gem 'pg_array_parser'
gem 'activerecord-postgres-hstore'

# Для полнотекстового поиска
gem 'pg_search'

# Для оптимизации запросов
gem 'bullet'
gem 'rack-mini-profiler'

Заключение и рекомендации

Связка Rails + PostgreSQL — это надёжный фундамент для любого веб-проекта. PostgreSQL предлагает продвинутые возможности, которые сложно найти в других базах данных, а Rails делает работу с ними максимально простой.

Когда использовать эту связку:

  • Сложные запросы и аналитика
  • Работа с JSON-данными
  • Полнотекстовый поиск
  • Высоконагруженные приложения
  • Проекты, где важна надёжность данных

Где лучше не использовать:

  • Простые лендинги или блоги
  • Проекты с очень ограниченными ресурсами
  • Когда команда знает только MySQL

В итоге, если вы серьёзно занимаетесь веб-разработкой, то рано или поздно придётся освоить PostgreSQL. Лучше сделать это сейчас, чем потом мучиться с миграцией с MySQL или SQLite.

Полезные ссылки для дальнейшего изучения:


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

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

Leave a reply

Your email address will not be published. Required fields are marked