- Home »

Как настроить 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.
Полезные ссылки для дальнейшего изучения:
В этой статье собрана информация и материалы из различных интернет-источников. Мы признаем и ценим работу всех оригинальных авторов, издателей и веб-сайтов. Несмотря на то, что были приложены все усилия для надлежащего указания исходного материала, любая непреднамеренная оплошность или упущение не являются нарушением авторских прав. Все упомянутые товарные знаки, логотипы и изображения являются собственностью соответствующих владельцев. Если вы считаете, что какой-либо контент, использованный в этой статье, нарушает ваши авторские права, немедленно свяжитесь с нами для рассмотрения и принятия оперативных мер.
Данная статья предназначена исключительно для ознакомительных и образовательных целей и не ущемляет права правообладателей. Если какой-либо материал, защищенный авторским правом, был использован без должного упоминания или с нарушением законов об авторском праве, это непреднамеренно, и мы исправим это незамедлительно после уведомления. Обратите внимание, что переиздание, распространение или воспроизведение части или всего содержимого в любой форме запрещено без письменного разрешения автора и владельца веб-сайта. Для получения разрешений или дополнительных запросов, пожалуйста, свяжитесь с нами.