В этой статье мы рассмотрим, как запустить и настроить экземпляр базы данных PostgreSQL с помощью Docker. Также мы интегрируем Traefik для проксирования соединений.
Конфигурация успешно используется в нашем приложении Messenger
Предварительные требования
Перед началом убедитесь, что у вас установлены следующие компоненты:
- Docker (Готовый скрипт для установки Docker на Ubuntu 24.04 LTS)
- Traefik (Установка Traefik с использованием Docker)
Создать файл docker-compose.yml
Создайте файл docker-compose.yml
и вставьте в него следующий код:
services:
postgres:
container_name: postgres
image: postgres:16.4-alpine3.20
restart: unless-stopped
networks:
- proxynet
env_file:
- /data/secrets/${SERVER_DOMAIN}/${SERVER_DOMAIN}.env
environment:
PG_DATA: /var/lib/postgresql/data
POSTGRES_USER: ${POSTGRES_USER}
POSTGRES_DB: ${POSTGRES_DB}
volumes:
- /data/appdata/pgdata:/var/lib/postgresql/data
labels:
- "traefik.enable=true"
- "traefik.tcp.routers.postgresql.rule=HostSNI(*)"
- "traefik.tcp.services.postgresql.loadbalancer.server.port=5432"
- "traefik.tcp.routers.postgresql.entrypoints=postgres"
networks:
proxynet:
external: true
Разбор конфигурации
- services.postgres: Конфигурация для контейнера PostgreSQL.
- container_name: Устанавливает имя контейнера в Docker.
- image: Используется образ
postgres:16.4-alpine3.20
, который является более легким вариантом на базе Alpine Linux. - restart: Политика перезапуска
unless-stopped
гарантирует, что контейнер автоматически перезапустится в случае сбоев. - networks: Подключение к внешней сети
proxynet
, которая может использоваться Traefik. - env_file: Переменные окружения загружаются из файла, что позволяет хранить конфиденциальные данные вне кода.
- environment: Переменные окружения, такие как
POSTGRES_USER
иPOSTGRES_DB
, определяют пользователя и базу данных по умолчанию. - volumes: Монтирует локальную директорию
/data/appdata/pgdata
в контейнер для постоянного хранения данных. - labels: Настройка Traefik для проксирования TCP соединений к PostgreSQL.
- networks.proxynet: Используется для подключения к существующей сети Traefik.
Подготовка окружения
У нас на сервере используется специально разработанная система скриптов для автоматизации установки. Эти скрипты по большей части опубликованы в нашем репозитории и описаны в отдельной статье. В нашем случае, вместе с этим docker-compose.yml
идет Bash скрипт для инициализации всех необходимых параметров:
#!/bin/bash
if [ "$(id -u)" != "0" ]; then
echo -e "\033[31mThis script requires superuser rights.\033[0m"
exit 0
fi
trap 'echo -e "\033[31minstall.sh: Something went wrong\033[0m"; exit 1' ERR
set -e
export DEBIAN_FRONTEND=noninteractive
echo "Install postgres..."
cd /data/utils
bash global-env.sh POSTGRES_USER admin
bash global-env.sh POSTGRES_DB postgres
sudo bash env-gen.sh POSTGRES_PASSWORD
cd /data/postgres
sudo docker compose up -d
trap - ERR
echo "Install postgres complete"
Этот скрипт инициализирует глобальные переменные окружения сервера:
cd /data/utils
bash global-env.sh POSTGRES_USER admin
bash global-env.sh POSTGRES_DB postgres
На нашем сервере используется специализированный скрипт global-env.sh из репозитория utils, который добавляет переменные окружения на сервер глобально.
Если переменная SERVER_DOMAIN
не была инициализирована ранее, ее так же можно добавить в глобальные переменные сервера:
bash global-env.sh SERVER_DOMAIN checkerwars.com
Затем добавляется переменная в .env файл, для чего используется специализированный скрипт env-gen.sh из того же репозитория utils:
sudo bash env-gen.sh POSTGRES_PASSWORD
Но вы так же можете вручную создать файл ${SERVER_DOMAIN}.env
в директории /data/secrets/${SERVER_DOMAIN}/
и заполнить его необходимыми значениями:
POSTGRES_PASSWORD=your_postgres_password
Замените your_postgres_password
на свое значение.
В конце производится запуск Docker контейнера. Перейдите в директорию с файлом docker-compose.yml
и выполните:
cd /data/postgres
sudo docker compose up -d
Эта команда загрузит образ PostgreSQL, создаст и запустит контейнер в фоновом режиме.
Проверка конфигурации
После запуска контейнера вы можете проверить работу сервиса, подключившись к базе данных. Например, используйте команду ниже, чтобы войти в контейнер и подключиться к PostgreSQL:
docker exec -it postgres psql -U your_postgres_user -d your_postgres_db
Замените your_postgres_user
и your_postgres_db
на ваши значения.
Репозиторий этой конфигурации можно найти здесь.
Если вам интересен наш проект, есть вопросы, замечания, или предложения — оставляйте комментарии или пишите на почту: checkerwars@mail.ru
Кроме того, автор проекта ищет работу. Мое резюме.