Установка PostgreSQL с использованием Docker и Traefik

В этой статье мы рассмотрим, как запустить и настроить экземпляр базы данных PostgreSQL с помощью Docker. Также мы интегрируем Traefik для проксирования соединений.

Конфигурация успешно используется в нашем приложении Messenger

Предварительные требования

Перед началом убедитесь, что у вас установлены следующие компоненты:

Создать файл docker-compose.yml

Создайте файл docker-compose.yml и вставьте в него следующий код:

YAML
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 скрипт для инициализации всех необходимых параметров:

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"


Этот скрипт инициализирует глобальные переменные окружения сервера:

Bash
cd /data/utils
bash global-env.sh POSTGRES_USER admin
bash global-env.sh POSTGRES_DB postgres


На нашем сервере используется специализированный скрипт global-env.sh из репозитория utils, который добавляет переменные окружения на сервер глобально.

Если переменная SERVER_DOMAIN не была инициализирована ранее, ее так же можно добавить в глобальные переменные сервера:

Bash
bash global-env.sh SERVER_DOMAIN checkerwars.com


Затем добавляется переменная в .env файл, для чего используется специализированный скрипт env-gen.sh из того же репозитория utils:

Bash
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 и выполните:

Bash
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

Кроме того, автор проекта ищет работу. Мое резюме.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *