Этот конспект представляет собой личные заметки по решению указанной в названии задачи. Цель задачи: расшарить локальную БД для единовременного доступа нескольким клиентам. При решении был использован дешевый VPS от известного хостера.
Вводные
Предполагается, что на локальном хосте уже установлен Docker и запущен контейнер с нужной версией PostgresQL, где инициализирована база данных, которая и является целью для трансфера. Синхронизация локальной и удаленной БД в дальнейшем не предусмотрена.
На всякий случай привожу ключевые параметры моей системы на момент выполнения работы:
Параметры
-
ОС: macOS Monterey 12.6.1
-
Docker локальный: 24.0.7, build afdd53b
-
Docker на VPS: 20.10.5+dfsg1, build 55c4c88
-
PostgresQL образ: postgres:16
-
pgAdmin образ: dpage/pgadmin4:7.7
VPS:
-
Virtualization: microsoft
-
Operating System: Debian GNU/Linux 11 (bullseye)
-
Kernel: Linux 5.10.0-11-amd64
-
Architecture: x86-64
Смотрим запущеные контейнеры:
docker ps
Запускаем терминал внутри нужного контейнера:
docker exec -it myPostgreSQL_1 bash
Создаём дамп нужной БД (подставьте своё название вместо beads):
pg_dump -U postgres beads > /tmp/beads.sql
Теперь внутри контейнера на локальном хосте сохранена Ваша БД в папке /tmp/
Не забываем вернуться из bash’a докера:
exit
Копируем полученный дамп из контейнера на локальный хост в папку /tmp/:
docker cp myPostgreSQL_1:/tmp/beads.sql /tmp/
Теперь можно увидеть Ваш дамп в прописанной папке на локальном хосте.
Получение VPS
Наверняка, RUVDS – не самый оптимальный вариант, но на данном этапе для обучения этот сервис меня устраивает. Я выбрал у них дешман-машину самый простой вариант, которой по бесконечной акции всегда стоит около 100 руб.
чтоб не выглядело как продвижение сервиса – скрою это здесь:
Нажимаем «VPS Старт»:
Далее можно выбрать физическое расположение сервера (вероятно, что это так). На всякий случай проговорю, что я выбрал «Москва M9«:
Есть выбор ОС. Далее я использую Debian:
В личном кабинете получаем IP для доступа к пустой машине:
Продублирую, что выводит команда hostnamectl на полученном сервере:
Параметры VPS:
-
Virtualization: microsoft
-
Operating System: Debian GNU/Linux 11 (bullseye)
-
Kernel: Linux 5.10.0-11-amd64
-
Architecture: x86-64
Работа с VPS
На сервере предустановлен SSH. Поэтому дальнейшее общение с сервером будет проходить именно по этому протоколу. Подключаемся:
ssh <имя пользователя>@<ip Вашего VPS>
«Из коробки» надо подключаться с именем root и паролем, который дают Вам в личном кабинете, но по некоторым соображениям безопасности надо добавлять нового пользователя и совсем отключать возможность входить с именем root. Однако с этим можно разобраться когда Ваш VPS начнем майнить позднее.
После подключения можно посмотреть, что ещё предустановлено:
dpkg-query -l
Создаем папку на сервере для временного переноса ранее подготовленного дампа:
mkdir tmp
Получается что-то вроде /home/roman/tmp.
Переходим в терминал локального хоста.
Переносим дамп с локального хоста на сервер:
scp /tmp/beads.sql roman@194.87.93.164:/home/roman/tmp
Переходим в терминал VPS.
Устанавливаем докер на сервер (я делал по вот этому туториалу):
sudo apt update -y sudo apt upgrade -y sudo apt install -y docker.io sudo systemctl start docker
Подтягиваем и запускаем пустой контейнер с PostgresQL:
sudo docker pull postgres:16 docker run -d \ -p 5432:5432 \ --name myPostgreSQL \ -e POSTGRES_USER=<ВАШЕ ИМЯ ПОЛЬЗОВАТЕЛЯ> \ -e POSTGRES_PASSWORD=<ВАШ ПАРОЛЬ ОТ ЭТОГО ПОЛЬЗОВАТЕЛЯ> \ postgres:16
Переносим дамп БД внутрь контейнера на сервере:
sudo docker cp ~/tmp/beads.sql myPostgreSQL:/tmp/
здесь myPostgreSQL — это моё название контейнера. Конкретное название запущенного контейнера всегда можно проверить командой выше docker ps.
Запустить psql внутри контейнера:
sudo docker exec -it myPostgreSQL psql -U postgres
Внутри psql импортировать БД:
\i /tmp/beads.sql
Раз у нас целых 10 Гб ПЗУ на сервере, то можно также поставить pgadmin прямо на сервер:
sudo docker pull dpage/pgadmin4:7.7 docker run -d\ -p 5050:80 \ --name myPGAdmin \ -e "PGADMIN_DEFAULT_EMAIL=<ВАШ email>" \ -e "PGADMIN_DEFAULT_PASSWORD=<ВАШ ПАРОЛЬ>" \ dpage/pgadmin4:7.7
Теперь из любого pgadmin, имеющего доступ к интернету, можно добавить сервер:
Если всё ок, то в pgadmin уже можно смотреть БД.
Код на python’e так же подключается без заминок:
import psycopg2 from psycopg2 import Error from psycopg2.extensions import ISOLATION_LEVEL_AUTOCOMMIT import configparser config = configparser.ConfigParser() config.read("config.ini") class DB: def __init__(self): try: # Подключение к существующей базе данных self.conn = psycopg2.connect(dbname = config['beads_db']['dbname'], user = config['beads_db']['user'], password = config['beads_db']['password'], host = config['beads_db']['host'], port = config['beads_db']['port']) print("соединение установлено") self.conn.set_isolation_level(ISOLATION_LEVEL_AUTOCOMMIT) # Курсор для выполнения операций с базой данных self.cur = self.conn.cursor() print("курсор создан") except (Exception, Error) as error: print("Ошибка при работе с PostgreSQL", error)
ссылка на оригинал статьи https://habr.com/ru/articles/840458/
Добавить комментарий