Установка PostgreSQL, настройка и перенос БД

⏱ 25 мин · 🧩 заданий: 6

Установка

sudo apt install postgresql postgresql-contrib -y
sudo systemctl status postgresql

Пользователь и база

sudo -u postgres psql
CREATE USER blog WITH PASSWORD 'надёжный-пароль';
ALTER ROLE blog SET client_encoding TO 'utf8';
ALTER ROLE blog SET default_transaction_isolation TO 'read committed';
ALTER ROLE blog SET timezone TO 'UTC';
CREATE DATABASE blog OWNER blog;
\q

Три ALTER ROLE — рекомендованные настройки для Django: кодировка UTF-8, уровень изоляции транзакций по умолчанию и часовой пояс UTC (Django хранит время в UTC при USE_TZ = True). Это ускоряет работу: Django не придётся выставлять параметры при каждом подключении.

Пароль сгенерируйте надёжный, например:

openssl rand -base64 24

Подключение Django

Драйвер в requirements.txt:

psycopg[binary]

Настройки — как в уроке про PostgreSQL в блоге, значения из .env:

DATABASES = {
    "default": {
        "ENGINE": "django.db.backends.postgresql",
        "NAME": os.environ["DB_NAME"],
        "USER": os.environ["DB_USER"],
        "PASSWORD": os.environ["DB_PASSWORD"],
        "HOST": os.environ.get("DB_HOST", "localhost"),
        "PORT": os.environ.get("DB_PORT", "5432"),
        "CONN_MAX_AGE": 60,
    }
}

CONN_MAX_AGE позволяет переиспользовать подключения к базе между запросами.

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

PostgreSQL по умолчанию слушает только localhost — подключиться к нему из интернета нельзя. Для Django на том же сервере это идеально: не открывайте порт 5432 в файрволе. Если нужно посмотреть данные с компьютера, используйте SSH-туннель:

ssh -L 5433:localhost:5432 deploy@203.0.113.10
# теперь база доступна локально на порту 5433

Перенос данных

Если сайт уже работал на SQLite (или PostgreSQL на компьютере), перенесите данные.

На старом месте:

python manage.py dumpdata --natural-foreign --natural-primary \
  --exclude contenttypes --exclude auth.permission --exclude admin.logentry \
  --exclude sessions --indent 2 > data.json

Скопируйте файл на сервер:

scp data.json deploy@203.0.113.10:~/blog/

На сервере:

cd ~/blog && source venv/bin/activate && set -a && source .env && set +a
python manage.py migrate
python manage.py loaddata data.json

Медиафайлы (аватары, картинки) копируются отдельно:

rsync -avz media/ deploy@203.0.113.10:~/blog/media/

Резервные копии

Самое ценное на сервере — база. Регулярно делайте копии:

mkdir -p ~/backups
pg_dump -U blog -h localhost blog > ~/backups/blog.sql

Чтобы pg_dump не спрашивал пароль, создайте файл ~/.pgpass (права 600):

localhost:5432:blog:blog:надёжный-пароль

Автоматически каждую ночь — через cron (crontab -e):

0 3 * * * pg_dump -U blog -h localhost blog | gzip > /home/deploy/backups/blog-$(date +\%F).sql.gz
0 4 * * * find /home/deploy/backups -name "*.sql.gz" -mtime +14 -delete

Вторая строка удаляет копии старше двух недель. В crontab символ % нужно экранировать: \%.

Восстановление:

gunzip -c blog-2026-10-25.sql.gz | psql -U blog -h localhost blog

Копии — не на том же сервере

Если сервер умрёт, вместе с ним пропадут и копии. Регулярно выгружайте их в облачное хранилище (S3-совместимое) или на другой компьютер.

Итог

  • PostgreSQL: apt install, пользователь и база с рекомендованными параметрами.
  • Подключение только через localhost, порт 5432 наружу не открываем.
  • Перенос: dumpdata → scp → migrate → loaddata, медиа — rsync.
  • Ежедневный pg_dump по cron и хранение копий вне сервера.

Практика решено 0 из 6

Вы не вошли — ответы проверяются, но прогресс не сохранится. Войти или зарегистрироваться.
Задание 1 Ввод ответа

Какой командой установить PostgreSQL и дополнительные модули на Ubuntu?

Задание 2 Расставить по порядку

Расставьте SQL-команды настройки базы для Django в правильном порядке (в psql под пользователем postgres).

  1. ALTER ROLE blog SET timezone TO 'UTC';
  2. CREATE USER blog WITH PASSWORD 'надёжный-пароль';
  3. \q
  4. CREATE DATABASE blog OWNER blog;
  5. ALTER ROLE blog SET client_encoding TO 'utf8';
Задание 3 Один вариант ответа

Почему PostgreSQL по умолчанию не принимает подключения из интернета — и что с этим делать для Django на том же сервере?

Задание 4 Ввод ответа

Какой командой сделать резервную копию базы blog в файл blog.sql (утилита PostgreSQL)?

Задание 5 Написать код

Напишите строку для crontab, которая каждый день в 3:00 делает копию базы blog командой pg_dump blog | gzip > /home/deploy/backups/blog-$(date +\%F).sql.gz.

Задание 6 Практика (выполнить у себя)

Установите PostgreSQL на сервере, создайте пользователя и базу, примените миграции проекта и перенесите данные. Выполните python manage.py showmigrations | grep -c '\[X\]' и вставьте число.

Войдите, чтобы отмечать пройденные уроки.