- Home »

Быстрый старт: установка PostgreSQL на Ubuntu 24
Продолжаем разбираться с основами серверной инфраструктуры. Сегодня на повестке дня — установка PostgreSQL на свежую Ubuntu 24. Если вы только что развернули новый сервер или планируете мигрировать базы данных, это руководство поможет вам быстро и без лишних телодвижений поднять PostgreSQL в боевой готовности.
PostgreSQL — это не просто база данных, это целая экосистема для работы с данными. В отличие от MySQL, здесь вы получаете полноценную объектно-реляционную СУБД с поддержкой JSON, массивов, пользовательских типов данных и множества расширений. Особенно актуально для тех, кто работает с современными фреймворками и микросервисами.
Зачем PostgreSQL и что нового в Ubuntu 24
Ubuntu 24.04 LTS поставляется с PostgreSQL 16 в репозиториях — это значительный апгрейд по сравнению с предыдущими версиями. Новые фичи включают улучшенную производительность запросов, лучшую поддержку параллельных операций и обновленный планировщик запросов.
Основные преимущества PostgreSQL перед конкурентами:
- ACID-совместимость — полная поддержка транзакций
- Расширяемость — можно создавать собственные функции и типы данных
- JSON и NoSQL возможности — гибридный подход к хранению данных
- Репликация и кластеризация — встроенная поддержка высокой доступности
- Полнотекстовый поиск — без необходимости внешних решений
Быстрая установка: три способа
Способ 1: Установка из стандартных репозиториев (рекомендуется для начинающих)
sudo apt update
sudo apt install postgresql postgresql-contrib
Этот способ установит PostgreSQL 16 со всеми базовыми расширениями. Простой, быстрый, но версия может быть не самой свежей.
Способ 2: Установка из официального репозитория PostgreSQL (для продакшена)
# Добавляем официальный репозиторий PostgreSQL
sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'
# Импортируем GPG ключ
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
# Обновляем списки пакетов
sudo apt update
# Устанавливаем PostgreSQL
sudo apt install postgresql-16 postgresql-contrib-16
Этот способ даст вам самую свежую версию с последними патчами безопасности.
Способ 3: Установка через Docker (для разработки)
docker run --name postgres-dev \
-e POSTGRES_PASSWORD=mysecretpassword \
-p 5432:5432 \
-d postgres:16
Подходит для быстрого тестирования и разработки, но не для продакшена.
Первоначальная настройка и безопасность
После установки PostgreSQL автоматически создает пользователя postgres
с правами суперпользователя. Первым делом нужно настроить пароль:
# Переключаемся на пользователя postgres
sudo -i -u postgres
# Запускаем psql
psql
# Устанавливаем пароль для пользователя postgres
\password postgres
# Выходим из psql
\q
# Возвращаемся к обычному пользователю
exit
Теперь создадим базу данных и пользователя для вашего приложения:
# Создаем базу данных
sudo -u postgres createdb myapp_db
# Создаем пользователя
sudo -u postgres createuser --interactive myapp_user
# Подключаемся к psql для настройки прав
sudo -u postgres psql
# Устанавливаем пароль для нового пользователя
ALTER USER myapp_user WITH PASSWORD 'secure_password';
# Даем права на базу данных
GRANT ALL PRIVILEGES ON DATABASE myapp_db TO myapp_user;
# Выходим
\q
Настройка конфигурации
Основные конфигурационные файлы находятся в /etc/postgresql/16/main/
:
postgresql.conf
— основная конфигурацияpg_hba.conf
— настройки аутентификацииpg_ident.conf
— маппинг пользователей
Оптимизация производительности
Откройте /etc/postgresql/16/main/postgresql.conf
и настройте следующие параметры:
# Для VPS с 4GB RAM
shared_buffers = 1GB
effective_cache_size = 3GB
maintenance_work_mem = 256MB
checkpoint_completion_target = 0.9
wal_buffers = 16MB
default_statistics_target = 100
random_page_cost = 1.1
effective_io_concurrency = 200
# Включаем логирование медленных запросов
log_min_duration_statement = 1000
log_statement = 'all'
log_destination = 'stderr'
logging_collector = on
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'
Если вы используете VPS с SSD, установите random_page_cost = 1.1
. Для выделенного сервера с NVMe можно снизить до 1.0.
Настройка удаленного доступа
По умолчанию PostgreSQL принимает соединения только локально. Для удаленного доступа:
# В postgresql.conf
listen_addresses = '*'
port = 5432
# В pg_hba.conf добавляем строку для удаленного доступа
host all all 0.0.0.0/0 md5
Важно: Это открывает доступ для всех IP. В продакшене обязательно укажите конкретные адреса или подсети.
Перезапускаем PostgreSQL:
sudo systemctl restart postgresql
sudo systemctl enable postgresql
Полезные команды для администрирования
Работа с psql
# Подключение к базе данных
psql -h localhost -U myapp_user -d myapp_db
# Основные команды в psql
\l # Список баз данных
\dt # Список таблиц
\du # Список пользователей
\q # Выход
\? # Справка по командам
\h SELECT # Справка по SQL команде
# Выполнение SQL файла
\i /path/to/script.sql
# Экспорт результата в файл
\o output.txt
SELECT * FROM users;
\o
Бэкап и восстановление
# Создание бэкапа
pg_dump -h localhost -U myapp_user -d myapp_db > backup.sql
# Восстановление из бэкапа
psql -h localhost -U myapp_user -d myapp_db < backup.sql
# Бэкап всех баз данных
pg_dumpall -h localhost -U postgres > all_databases.sql
# Бэкап в сжатом формате
pg_dump -h localhost -U myapp_user -d myapp_db -Fc > backup.dump
# Восстановление из сжатого бэкапа
pg_restore -h localhost -U myapp_user -d myapp_db backup.dump
Мониторинг и диагностика
Статистика производительности
# Просмотр активных соединений
SELECT * FROM pg_stat_activity;
# Статистика по базам данных
SELECT * FROM pg_stat_database;
# Размер баз данных
SELECT pg_database.datname, pg_database_size(pg_database.datname) as size
FROM pg_database;
# Медленные запросы (требует включения log_min_duration_statement)
SELECT query, mean_time, calls
FROM pg_stat_statements
ORDER BY mean_time DESC
LIMIT 10;
Системные команды
# Статус службы
sudo systemctl status postgresql
# Просмотр логов
sudo tail -f /var/log/postgresql/postgresql-16-main.log
# Перезапуск без потери соединений
sudo systemctl reload postgresql
# Проверка конфигурации
sudo -u postgres postgres --check
# Информация о кластере
sudo -u postgres pg_lsclusters
Расширения и дополнительные возможности
PostgreSQL славится своей расширяемостью. Вот несколько полезных расширений:
Установка популярных расширений
# UUID для генерации уникальных идентификаторов
sudo apt install postgresql-16-uuid-ossp
# PostGIS для работы с геоданными
sudo apt install postgresql-16-postgis-3
# pg_stat_statements для анализа производительности
sudo apt install postgresql-16-pg-stat-statements
# Подключение расширений в базе данных
psql -U postgres -d myapp_db -c "CREATE EXTENSION uuid-ossp;"
psql -U postgres -d myapp_db -c "CREATE EXTENSION postgis;"
psql -U postgres -d myapp_db -c "CREATE EXTENSION pg_stat_statements;"
Работа с JSON
PostgreSQL отлично работает с JSON данными:
# Создание таблицы с JSON полем
CREATE TABLE products (
id SERIAL PRIMARY KEY,
name VARCHAR(100),
attributes JSONB
);
# Вставка JSON данных
INSERT INTO products (name, attributes) VALUES
('Laptop', '{"brand": "Dell", "ram": "16GB", "cpu": "Intel i7"}'),
('Phone', '{"brand": "Apple", "model": "iPhone 15", "storage": "256GB"}');
# Запросы к JSON данным
SELECT * FROM products WHERE attributes->>'brand' = 'Dell';
SELECT * FROM products WHERE attributes @> '{"ram": "16GB"}';
# Индексы для JSON
CREATE INDEX idx_products_attributes ON products USING GIN (attributes);
Сравнение с другими СУБД
Критерий | PostgreSQL | MySQL | MongoDB |
---|---|---|---|
ACID-совместимость | ✅ Полная | ✅ Полная (InnoDB) | ⚠️ Ограниченная |
JSON поддержка | ✅ Нативная JSONB | ✅ JSON тип | ✅ Нативная |
Полнотекстовый поиск | ✅ Встроенный | ✅ Встроенный | ✅ Встроенный |
Производительность | ⚡ Высокая | ⚡ Очень высокая | ⚡ Высокая |
Сложность настройки | 🔧 Средняя | 🔧 Простая | 🔧 Простая |
Репликация | ✅ Встроенная | ✅ Встроенная | ✅ Встроенная |
Автоматизация и скрипты
PostgreSQL отлично интегрируется с системами автоматизации. Вот несколько примеров:
Автоматический бэкап через cron
# Создаем скрипт бэкапа
cat > /home/user/backup_postgres.sh << 'EOF'
#!/bin/bash
BACKUP_DIR="/home/user/backups"
DATE=$(date +%Y%m%d_%H%M%S)
mkdir -p $BACKUP_DIR
# Бэкап всех баз
pg_dumpall -h localhost -U postgres > $BACKUP_DIR/all_databases_$DATE.sql
# Сжимаем
gzip $BACKUP_DIR/all_databases_$DATE.sql
# Удаляем файлы старше 7 дней
find $BACKUP_DIR -name "*.sql.gz" -mtime +7 -delete
echo "Backup completed: $BACKUP_DIR/all_databases_$DATE.sql.gz"
EOF
chmod +x /home/user/backup_postgres.sh
# Добавляем в cron для выполнения каждый день в 2:00
echo "0 2 * * * /home/user/backup_postgres.sh" | crontab -
Мониторинг через systemd
# Создаем сервис для мониторинга
cat > /etc/systemd/system/postgres-monitor.service << 'EOF'
[Unit]
Description=PostgreSQL Monitor
After=postgresql.service
[Service]
Type=simple
ExecStart=/home/user/monitor_postgres.sh
Restart=always
RestartSec=60
[Install]
WantedBy=multi-user.target
EOF
# Скрипт мониторинга
cat > /home/user/monitor_postgres.sh << 'EOF'
#!/bin/bash
while true; do
if ! pg_isready -h localhost -p 5432; then
echo "PostgreSQL is down! $(date)" | mail -s "PostgreSQL Alert" admin@domain.com
systemctl restart postgresql
fi
sleep 30
done
EOF
chmod +x /home/user/monitor_postgres.sh
systemctl enable postgres-monitor
systemctl start postgres-monitor
Решение типичных проблем
Проблема: "peer authentication failed"
Это означает, что PostgreSQL пытается использовать системную аутентификацию. Решение:
# Редактируем pg_hba.conf
sudo nano /etc/postgresql/16/main/pg_hba.conf
# Заменяем строку
local all all peer
# На
local all all md5
# Перезапускаем PostgreSQL
sudo systemctl restart postgresql
Проблема: "could not connect to server"
Проверяем статус службы и настройки:
# Проверяем статус
sudo systemctl status postgresql
# Проверяем, слушает ли PostgreSQL нужный порт
sudo netstat -tlnp | grep :5432
# Проверяем настройки подключения
sudo -u postgres psql -c "SHOW listen_addresses;"
Проблема: медленные запросы
# Включаем логирование медленных запросов
sudo -u postgres psql -c "ALTER SYSTEM SET log_min_duration_statement = 1000;"
sudo -u postgres psql -c "SELECT pg_reload_conf();"
# Анализируем план выполнения
EXPLAIN ANALYZE SELECT * FROM users WHERE email = 'user@example.com';
# Создаем индекс для ускорения
CREATE INDEX idx_users_email ON users(email);
Интеграция с приложениями
PostgreSQL отлично работает с современными фреймворками:
Подключение из Python (Django/Flask)
# Для Django в settings.py
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'myapp_db',
'USER': 'myapp_user',
'PASSWORD': 'secure_password',
'HOST': 'localhost',
'PORT': '5432',
}
}
# Для Flask с SQLAlchemy
from sqlalchemy import create_engine
engine = create_engine('postgresql://myapp_user:secure_password@localhost/myapp_db')
Подключение из Node.js
# package.json
{
"dependencies": {
"pg": "^8.11.3"
}
}
# app.js
const { Pool } = require('pg');
const pool = new Pool({
user: 'myapp_user',
host: 'localhost',
database: 'myapp_db',
password: 'secure_password',
port: 5432,
});
Безопасность в продакшене
Несколько важных настроек безопасности:
# Ограничиваем соединения
max_connections = 100
# Настройка SSL
ssl = on
ssl_cert_file = '/etc/ssl/certs/server.crt'
ssl_key_file = '/etc/ssl/private/server.key'
# Ограничиваем привилегии пользователей
CREATE USER readonly_user WITH PASSWORD 'readonly_password';
GRANT CONNECT ON DATABASE myapp_db TO readonly_user;
GRANT USAGE ON SCHEMA public TO readonly_user;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO readonly_user;
Полезные ресурсы
- Официальная документация PostgreSQL
- PostgreSQL Wiki
- PostgreSQL Weekly Newsletter
- Awesome PostgreSQL на GitHub
Заключение
PostgreSQL на Ubuntu 24 — это мощная и надежная связка для любых задач, от простых веб-приложений до сложных аналитических систем. Главные преимущества:
- Простота установки — буквально две команды для базовой настройки
- Гибкость — поддержка SQL и NoSQL паттернов в одной системе
- Производительность — отличная оптимизация для современного железа
- Надежность — полная ACID-совместимость и проверенная репутация
- Масштабируемость — от небольших проектов до enterprise-решений
Если вы только начинаете работать с PostgreSQL, рекомендую начать с установки из стандартных репозиториев и постепенно изучать возможности. Для продакшена обязательно настройте мониторинг, регулярные бэкапы и систему безопасности.
PostgreSQL — это инвестиция в будущее вашего проекта. Потратив время на правильную настройку сейчас, вы получите стабильную и производительную систему, которая будет расти вместе с вашими потребностями.
В этой статье собрана информация и материалы из различных интернет-источников. Мы признаем и ценим работу всех оригинальных авторов, издателей и веб-сайтов. Несмотря на то, что были приложены все усилия для надлежащего указания исходного материала, любая непреднамеренная оплошность или упущение не являются нарушением авторских прав. Все упомянутые товарные знаки, логотипы и изображения являются собственностью соответствующих владельцев. Если вы считаете, что какой-либо контент, использованный в этой статье, нарушает ваши авторские права, немедленно свяжитесь с нами для рассмотрения и принятия оперативных мер.
Данная статья предназначена исключительно для ознакомительных и образовательных целей и не ущемляет права правообладателей. Если какой-либо материал, защищенный авторским правом, был использован без должного упоминания или с нарушением законов об авторском праве, это непреднамеренно, и мы исправим это незамедлительно после уведомления. Обратите внимание, что переиздание, распространение или воспроизведение части или всего содержимого в любой форме запрещено без письменного разрешения автора и владельца веб-сайта. Для получения разрешений или дополнительных запросов, пожалуйста, свяжитесь с нами.