Если ты читаешь это, значит кто-то решил, что ты должен возиться с PostgreSQL на Ubuntu 18.04. Возможно, ты сам. Мои соболезнования. Не потому что Postgres — плохая штука. Он отличный. Просто он старше тебя, злее тебя и, судя по конфигам, немного псих. Вот тебе реальность без обёртки.

Установка. Без плясок.

Хочешь, чтобы оно работало? Вот команда:

sudo apt update
sudo apt install postgresql postgresql-contrib

Не спрашивай, зачем postgresql-contrib. Просто ставь. Потом, когда всё взорвётся, ты будешь рад, что оно уже установлено.

После этого PostgreSQL как бы запускается сам. Типа работает. Проверим:

sudo -u postgres psql -c "SELECT version();" 

Если видишь версию, значит сервер жив. Поздравляю, ты пока ничего не сломал.

Кто такой postgres и почему он как призрак

При установке появляется юзер postgres. Он бог. Без пароля. Без интерфейса. Без души.

Чтобы войти в него:

sudo su - postgres
psql

А если не хочется переодеваться в другого пользователя — сделай так:

sudo -u postgres psql

Появился промт postgres=#? Ты внутри. Добро пожаловать в админ-панель, сделанную в аду. Чтобы выйти:

\q 

Аутентификация. Механизмы из 90-х

PostgreSQL до сих пор живёт в парадигме "давай сделаем всё максимально неочевидно". Там есть свои "методы":

  • peer: работает только локально, спрашивает у ОС "а ты кто вообще?"
  • ident: почти как peer, но через TCP/IP и с выкрутасами
  • trust: просто поверь человеку. Ну да, это безопасно, ага.
  • password, md5, scram-sha-256: нормальные люди используют хотя бы md5, если не маниакально параноят.

Всё это живёт в /etc/postgresql/10/main/pg_hba.conf. Где 10 — это версия, не вздумай писать "latest". Ubuntu не прощает таких.

Создать роль и не облажаться

Допустим, тебе нужен пользователь john, а не этот жуткий postgres.

sudo su - postgres -c "createuser john"
sudo su - postgres -c "createdb johndb" 

Теперь ты заходишь под postgres, как обычно, и отдаёшь john права:

GRANT ALL PRIVILEGES ON DATABASE johndb TO john;

Это не сделает john умнее. Это просто даст ему возможность всё сломать.

Включить удалённый доступ (если ты осознанный суицидник)

По умолчанию Postgres слушает только 127.0.0.1. Хочешь пустить кого-то снаружи — лезь в конфиг:

sudo vim /etc/postgresql/10/main/postgresql.conf

Найди строку:

#listen_addresses = 'localhost'

И преврати её в:

listen_addresses = '*'

Сохрани, плюнь три раза и перезапусти:

sudo service postgresql restart

Проверь, что он теперь реально слушает:

ss -nlt | grep 5432

Если видишь 0.0.0.0:5432 — значит Postgres стал общительным. Ну или просто открыт в интернет, как бабушкин роутер.

Но это ещё не всё. Иди в pg_hba.conf и скажи Postgres, что можно доверять не только localhost:

sudo vim /etc/postgresql/10/main/pg_hba.conf

Добавь что-то вроде:

host    all             all             0.0.0.0/0               md5

Сохрани. Перезапусти. Молись.

Что точно пойдёт не так

Забудешь про pg_hba.conf, будешь сидеть с listen_addresses='*', и всё равно не пустит.

Попробуешь подключиться по паролю, а он требует peer. Потому что он тебя знает, а пароль — нет.

Создашь роль, а пароль не задашь. Она существует, но войти в неё нельзя. Типа как депутат.

Ubuntu обновится, версия Postgres поменяется, а ты не знал. Теперь у тебя /etc/postgresql/12/main/ вместо 10.

Итого

Ты поставил Postgres. Ты его запустил. Он даже работает. Не радуйся. Это только начало. PostgreSQL — не тот друг, который прощает ошибки. Это тот, кто молча смотрит, как ты сам себя хоронишь в конфигах и думает: "Я ведь предупреждал". Зато, если сдружитесь, он тебя вытащит даже из дерьмового продакшена.