Установка PostgreSQL, настройка и перенос БД
Установка
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
Какой командой установить PostgreSQL и дополнительные модули на Ubuntu?
Расставьте SQL-команды настройки базы для Django в правильном порядке (в psql под пользователем postgres).
-
ALTER ROLE blog SET timezone TO 'UTC'; -
CREATE USER blog WITH PASSWORD 'надёжный-пароль'; -
\q -
CREATE DATABASE blog OWNER blog; -
ALTER ROLE blog SET client_encoding TO 'utf8';
Почему PostgreSQL по умолчанию не принимает подключения из интернета — и что с этим делать для Django на том же сервере?
Какой командой сделать резервную копию базы blog в файл blog.sql (утилита PostgreSQL)?
pg_dump -U blog -h localhost blog > blog.sqlНапишите строку для crontab, которая каждый день в 3:00 делает копию базы blog
командой pg_dump blog | gzip > /home/deploy/backups/blog-$(date +\%F).sql.gz.
0 3 * * * pg_dump blog | gzip > /home/deploy/backups/blog-$(date +\%F).sql.gz
Установите PostgreSQL на сервере, создайте пользователя и базу, примените миграции проекта и перенесите данные. Выполните python manage.py showmigrations | grep -c '\[X\]' и вставьте число.
25Войдите, чтобы отмечать пройденные уроки.