В тази статия ще Ви покажем как да настроите PostgreSQL сървър за бази данни чрез платформата за Уеб приложения (WebApps).

Важно: Ако нямате раздел "Уеб приложения" във Вашия Контролен панел, тогава инструкциите в тази статия не са валидни за Вашия акаунт и сървър. Можете да ни пишете за повече информация и съдействие.

"SSH достъп" и "Мрежови инструменти" трябва да са активирани за Вашия акаунт през раздел "SSH Достъп" на Контролния панел.

Бърза настройка

Ако искате бързо да настроите и стартирате PostgreSQL сървър на Вашия акаунт, изтеглете този скрипт за настройка на PostgreSQL на Вашия акаунт и го изпълнете. Скриптът ще създаде и настрои WebApps проект и PostgreSQL сървър на Вашия акаунт, така че да можете да го използвате веднага.

Трябва да добавите права за изпълнение на скрипта след изтеглянето му на Вашия акаунт и след това да го изпълните. Можете да направите това със следните команди:

mv 4166.sh setup_postgresql.sh
chmod 755 setup_postgresql.sh
./setup_postgresql.sh postgres1

В този случай можете да пропуснете стъпките за "Настройка на PostgreSQL Server" и "Създаване на WebApps проект" от тази статия, а можете да продължите директно към създаването на бази данни и роли.

Настройка на PostgreSQL Server

На сървъра има поддръжка за PostgreSQL. Трябва само да настроите PostgreSQL сървъра да използва Вашите бази данни от WebApps платформата.

За целта трябва първо да създаде директориите за съхранение на данните Ви на сървъра. Можете да използвате "private/" директорията, която е налична във всеки хостинг акаунт:

sureapp_project="postgres1"
pg_app_dir="/home/$USER/private/$sureapp_project"

mkdir -m 0700 "$pg_app_dir"
mkdir -m 0700 "$pg_app_dir/run"
mkdir -m 0700 "$pg_app_dir/sureapp"

touch "$pg_app_dir/.psql_history"
chmod 0600 "$pg_app_dir/.psql_history"

Следващата стъпка е да инициализирате сървъра за бази данни и да добавите основен потребител (superuser). По подразбиране потребителското име на основния потребител ще е същото като потребителското име на Вашия хостинг акаунт (напр. "example"):

superuser_pass="$(pwgen 24 1)"
touch "$pg_app_dir/.superuser-pwfile"
chmod 0600 "$pg_app_dir/.superuser-pwfile"
echo "$superuser_pass" > "$pg_app_dir/.superuser-pwfile"

for pg_install_dir in $(find /usr/lib/postgresql -maxdepth 1 -type d -o -type l 2>/dev/null | sort -Vr)
do
    [ -x "$pg_install_dir/bin/initdb" ] && break
done
"$pg_install_dir/bin/initdb" -D "$pg_app_dir/pgdata" --auth=md5 --pwfile="$pg_app_dir/.superuser-pwfile" && rm -f "$pg_app_dir/.superuser-pwfile"

touch "$pg_app_dir/.pgpass"
chmod 0600 "$pg_app_dir/.pgpass"
printf "*:*:*:%s:%s\n" "$USER" "$superuser_pass" > "$pg_app_dir/.pgpass"

Сега трябва да настроите PostgreSQL сървъра да слуша за заявки чрез UNIX сокет на правилното място във Вашия акаунт:

sed -i "s~^#*unix_socket_directories = .*\(\s*#.*\)~unix_socket_directories = '$pg_app_dir/run' \1~g" "$pg_app_dir/pgdata/postgresql.conf"
sed -i "s~^#*unix_socket_permissions = .*\(\s*#.*\)~unix_socket_permissions = 0700 \1~g" "$pg_app_dir/pgdata/postgresql.conf"
sed -i "s~^#*listen_addresses = .*\(\s*#.*\)~listen_addresses = '' \1~g" "$pg_app_dir/pgdata/postgresql.conf"

За да направите стартирането на PostgreSQL услугата по-лесно, можете да използвате следните команди за създаването на стартов скрипт:

printf '#!/bin/sh\nexec %s/bin/postgres -D %s/pgdata\n' "$pg_install_dir" "$pg_app_dir" > "$pg_app_dir/start.sh"
chmod 0700 "$pg_app_dir/start.sh"

За да използвате различни инструменти за управление на PostgreSQL, трябва да направите следните промени във Вашия .bashrc файл:

grep -q '^PGHOST=' "/home/$USER/.bashrc" || cat <<BASHRC >> "/home/$USER/.bashrc"

# $sureapp_project client configuration
PGHOST="$pg_app_dir/run"
export PGHOST
PGPASSFILE="$pg_app_dir/.pgpass"
export PGPASSFILE
PSQL_HISTORY="$pg_app_dir/.psql_history"
export PSQL_HISTORY
BASHRC
. "/home/$USER/.bashrc"

Създаване на WebApps проект

За да стартирате сървър за бази данни, първо трябва да настроите PostgreSQL услугата. Можете да направите това по два начина:

  • Можете да създадете проект чрез раздел "Уеб приложения" на хостинг Контролния панел за Вашия акаунт.
  • Можете да използвате sureapp CLI инструмента за управление на уеб приложения за създаване на проекта.

Използване на раздел "Уеб приложения" на хостинг Контролния панел

Ако изберете да създадете приложението чрез хостинг Контролния панел, използвайте следните настройки:

  • Платформа: Custom
  • Име: postgres1 - Името на Вашето приложение.
  • Домейн: example.com - Можете да изберете всеки домейн от списъка. Това няма да окаже никакво влияние на работата на PostgreSQL сървъра.
  • Поддомейн: www - Можете да изберете всеки поддомейн от списъка. Това няма да окаже никакво влияние на PostgreSQL сървъра, защото той няма да работи на TCP порт.
  • Уеб път за достъп: /Efu6dunox0vieyelahch2eaf - Уеб пътят за достъп трябва да бъде измислен път, който не се използва на Вашия сайт. В дадения пример използваме "/Efu6dunox0vieyelahch2eaf", но можете да използвате произволен път. Не оставяйте полето празно или със стойността по подразбиране ('/'), защото сайтът Ви може да спре да работи изцяло.
  • Директория на приложението: /private/postgres1/sureapp - Ако сте променили основната директория за PostgreSQL в скрипта по-горе, въведете зададения от Вас път.
  • Команда за стартиране: /home/example/private/postgres1/start.sh - Тук трябва да заместите "example" с потребителското име на Вашия хостинг акаунт.

Създаване на PostgreSQL приложение

След като създадете и активирате приложението, ще можете да използвате новия сървър за PostgreSQL бази данни.

Използване на sureapp CLI инструмента

WebApps проектите могат да се управляват чрез "sureapp" CLI инструмента. За да създадете и стартирате нов PostgreSQL проект, използвайте следните команди:

sureapp project create \
    --engine "custom" \
    --engine-version "-" \
    --release-dir "$pg_app_dir/sureapp" \
    --start-cmd "$pg_app_dir/start.sh" \
    "$sureapp_project"
sureapp service manage --enable "$sureapp_project"
sureapp service manage --start "$sureapp_project"

PostgreSQL сървърът ще е стартиран и наличен за употреба след изпълнение на горните команди.

Създаване на бази данни и роли

След като сървърът е започнал да работи, трябва да добавите нов потребител и база данни за Вашето приложение със следните SSH команди:

. "/home/$USER/.bashrc"  # For $PGHOST
createuser -e -DEPRS "pgusername" createdb -e -O "pgusername" "pgdatabase"

Трябва да заместисте потребителското име и името на базата данни в примера с детайлите, които искате да използвате във Вашето приложение.

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

На нашите сървъри автоматично се създават резервни копия веднъж на всеки 12 часа, така че не бива да се тревожите за загуба на данни. Тези резервни копия ще Ви позволят да възстановите Вашите данни от системно резервно копие, ако нещо се обърка със Вашия сайт.

Системите за бази данни като PostgreSQL и MySQL съхраняват данните си на сървъра по специален начин, така че трябва да се използва по-специален подход за създаване на резервни копия, така че те да са консистентни и използваеми.

За MySQL бази данни, които са налични по подразбиране за всички хостинг акаунти, създаването на резервни копия е автоматизирано от хостинг Контролния панел. Всички MySQL данни се архивират на определен интервал от нашата система и те могат да се възстановят лесно чрез раздел "Възстановяване" на хостинг Контролния панел.

За PostgreSQL бази данни, работещи чрез WebApps платформата за уеб приложения, трябва да създадете отделна процедура за създаване на резервни копия. Следния блок с код ще създаде два скрипта във Вашия WebApps проект (backup.sh и restore.sh), с които ще можете да създавате и да възстановявате данни от резервни копия, a aко сте използвали метода за бърза настройка, тези файлове вече ще са създадени за Вашия проект:

mkdir -m 0700 "$pg_app_dir/backup"

cat <<BACKUP_SH > "$pg_app_dir/backup.sh"
#!/bin/sh
set -e
die() { printf "%s\n" "\$*" 1>&2 && exit 1; }
PGPASSFILE="$pg_app_dir/.pgpass"
export PGPASSFILE
"$pg_install_dir/bin/pg_dumpall" --clean --host "$pg_app_dir/run" | gzip --stdout -- > "$pg_app_dir/backup/pgdump.sql.gz" || die "PostgreSQL backup failed: $sureapp_project"
BACKUP_SH
chmod 700 "$pg_app_dir/backup.sh"

cat <<RESTORE_SH > "$pg_app_dir/restore.sh"
#!/bin/sh
set -e
die() { printf "%s\n" "\$*" 1>&2 && exit 1; }
PGPASSFILE="$pg_app_dir/.pgpass"
export PGPASSFILE
archive="$pg_app_dir/backup/pgdump.sql.gz"
[ -f "\$archive" ] || die "Backup file does not exist: \$archive"
zgrep -m1 "Dumped" "\$archive" || die "Backup file does not contain PostgreSQL data: \$archive"
gzip --decompress --stdout "\$archive" | "$pg_install_dir/bin/psql" --quiet --host "$pg_app_dir/run" postgres
RESTORE_SH
chmod 700 "$pg_app_dir/restore.sh"

След като са създадени тези скриптове, можете да настроите планирана задача, която изпълнява скрипта "backup.sh" веднъж на 12 часа чрез раздел "Cron Jobs" на хостинг Контролния панел.

Тази крон задача ще създава резервно копие с име "pgdump.sql.gz", което ще се презаписва при всяко изпълнение на скрипта. По този начин всяко системно резервно копие ще съдържа най-новото копие на файла.

В най-добрия случай няма да Ви се наложи да използвате restore.sh скрипта. Ако все пак Ви се наложи, той ще премахне всички данни от Вашата PostgreSQL база данни и ще възстанови в нея данните от архива с име "pgdump.sql.gz".

Ако желаете да възстановите данни от определено резервно копие, можете да възстановите файла "pgdump.sql.gz" от автоматично създаден системен архив и след това да изпълните restore.sh скрипта чрез командата:

./restore.sh

PHP настройка

Ако ще използвате PHP приложение с PostgreSQL база данни, трябва да промените конфигурационния файл за PHP (php.ini). Може да пропуснете тези стъпки, ако няма да използвате PHP.

PHP може да използва две библиотеки за свързване с PostgreSQL бази данни. Те са разширение за PostgreSQL бази данни и по-абстрактния PDO драйвър за PostgreSQL.

Трябва да активирате правилното PHP разширение за Вашето софтуерно приложение чрез раздел "PHP настройки" на хостинг Контролния панел, следвайки тези стъпки:

  1. Натиснете бутона "Промени" за домейна/поддомейна, където желаете да използвате PostgreSQL база данни.
  2. Отбележете с отметка разширението "PostgreSQL" или "PDO_PGSQL" от раздел Разширения.
  3. Натиснете бутона Запази.

Разширенията могат да се активират и ръчно чрез добавяне на съотвения ред в PHP конфигурационен файл (php.ini):

Разширение PostgreSQL:

extension = pgsql.so

PDO драйвър за PostgreSQL:

extension = pdo_pgsql.so


Инструкции за промяна на други PHP настройки за Вашия акаунт можете да откриете в статията ни "Промяна на PHP настройките за Вашия акаунт".

Активиране на външни връзки

По подразбиране PostgreSQL сървърът е настроен да приема само локални връзки. Има начин да активирате външни връзки, ако желаете да се свържете с Вашия PostgreSQL сървър от външен сървър или чрез инструмент за управление на PostgreSQL бази данни като pgAdmin. За да активирате външните връзки, трябва да обновите два конфигурационни файла:

  • pgdata/postgresql.conf
  • pgdata/pg_hba.conf

Във файла "pgdata/postgresql.conf" трябва да промените следните редове:

listen_addresses = '' # what IP address(es) to listen on;
port = 5432                             # (change requires restart)

като настроите "listen_address" да бъде "*", а "port" да бъде порта на Вашия WebApps проект. Можете да откриете порта в раздел "Уеб приложения" на Вашия хостинг Контролен панел.

В края на файла "pgdata/pg_hba.conf" трябва да добавите следния ред:

hostallall0.0.0.0/0md5

Тези промени ще настроят Вашия PostgreSQL сървър да приема връзки от всички външни локации, ако предоставят правилно потребителско име и парола. Ако желаете да ограничите достъпа само за определен IP адрес (напр. 123.123.123.123), използвайте този ред:

host all all 123.123.123.123/32 md5

След завършване на промените, трябва да рестартирате WebApps проекта чрез раздел "Уеб приложения" на хостинг Контролния панел, за да се приложат.

Бележка: Променяйки порта в конфигурационния файл на PostgreSQL сървъра, определени функционалности/команди ще спрат да работят (напр. psql, createuser и createdb). За да можете да ги използвате, ще трябва да задавате новия порт в командите:
psql -p <WebApp port>