<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Postgres: пользователь не прошел проверку подлинности peer - как исправить]]></title><description><![CDATA[<p dir="auto">В PostgreSQL часто возникает ошибка «пользователь не прошел проверку подлинности peer». Это происходит при локальных подключениях, когда сервер требует соответствия системного пользователя и имени в БД. Разберем, почему это случается и как быстро решить проблему без лишних хлопот.</p>
<p dir="auto">Такая ошибка блокирует доступ к базе, особенно если вы подключаетесь как <strong>postgres</strong>, но системного пользователя с таким именем нет. Мы пройдем по причинам, найдем файл конфигурации и применим проверенные фиксы. Это сэкономит часы поиска и вернет работу в норму.</p>
<h2>Что значит peer authentication в PostgreSQL</h2>
<p dir="auto"><strong>Peer authentication</strong> — это метод проверки в PostgreSQL, который работает только для локальных подключений через Unix-сокеты. Он проверяет, совпадает ли имя системного пользователя (из ОС) с именем пользователя БД. Если вы запускаете <code>psql -U postgres</code>, а в системе нет пользователя <code>postgres</code>, сервер отвергает подключение с ошибкой «peer authentication failed».</p>
<p dir="auto">Это защитный механизм по умолчанию в Linux-дистрибутивах вроде Ubuntu. Он удобен для разработки, где имена совпадают, но мешает в продакшене или при установке MIMIC, Docker-контейнерах и CI/CD. Представьте: вы клонируете репозиторий, пытаетесь загрузить данные в БД — и стоп. Типичный пример из GitHub-issues: разработчик не может запустить <code>psql</code> для MIMIC, потому что pg_hba.conf настроен на peer для всех локальных подключений.</p>
<p dir="auto">Сервер ищет строку <code>local all all peer</code> в конфиге и отказывает, если пользователь не matches. Это не баг, а фича для безопасности — без пароля, но строго по именам. Теперь перейдем к поиску и редактированию файла.</p>
<ul>
<li><strong>Где искать pg_hba.conf</strong>: Запустите <code>sudo find / -type f -name "pg_hba.conf" 2&gt;/dev/null</code>, чтобы найти путь (обычно <code>/etc/postgresql/*/main/pg_hba.conf</code>).</li>
<li><strong>Редактирование</strong>: Измените <code>local all all peer</code> на <code>local all all md5</code> или <code>trust</code> для тестов.</li>
<li><strong>Перезапуск</strong>: <code>sudo service postgresql restart</code> или <code>sudo systemctl restart postgresql</code>.</li>
</ul>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Метод</th>
<th>Преимущества</th>
<th>Риски</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>peer</strong></td>
<td>Без пароля, безопасно для локалки</td>
<td>Не работает без совпадения имен</td>
</tr>
<tr>
<td><strong>md5</strong></td>
<td>Парольная аутентификация</td>
<td>Нужно знать пароль postgres</td>
</tr>
<tr>
<td><strong>trust</strong></td>
<td>Полный доступ без проверки</td>
<td>Только для dev, небезопасно</td>
</tr>
</tbody>
</table>
<h2>Пошаговое исправление ошибки peer</h2>
<p dir="auto">Сначала убедитесь, что проблема именно в peer: запустите <code>psql</code> без параметров — если войдет под вашим системным именем, то да, дело в несоответствии. В Ubuntu postgres часто не создается как системный юзер при установке через apt, особенно в контейнерах или VM. Поэтому <code>psql -U postgres</code> фейлит.</p>
<p dir="auto">Решение №1: отредактировать <strong>pg_hba.conf</strong>. Найдите файл, откройте <code>sudo nano /path/to/pg_hba.conf</code>. Строка <code># TYPE DATABASE USER ADDRESS METHOD</code> с <code>local all all peer</code> меняется на <code>local all all md5</code>. Сохраните, перезапустите сервис. Теперь <code>psql -U postgres -W</code> запросит пароль — если его нет, создайте через <code>sudo -u postgres psql</code> и <code>ALTER USER postgres PASSWORD 'yourpass';</code>.</p>
<p dir="auto">Если вы в Docker или CI вроде AppVeyor, peer мешает скриптам вроде <code>createdb</code>. Там фикс — не юзать PGUSER=postgres, а полагаться на текущего юзера или менять conf на лету. В Confluence или Atlassian стеке pg_dump падает по той же причине: хост не имеет pg_hba.conf или он строг.</p>
<ol>
<li><strong>Создайте системного пользователя</strong>: <code>sudo adduser postgres</code> — редко нужно, но решает root-причину.</li>
<li><strong>Подключитесь под своим юзером</strong>: <code>psql -d yourdb -U yourlinuxuser</code> вместо postgres.</li>
<li><strong>Автоматизация в скриптах</strong>: Добавьте <code>sed -i 's/peer/md5/' pg_hba.conf</code> перед рестартом.</li>
</ol>
<p dir="auto"><em>Нюанс</em>: После правок проверьте <code>pg_lsclusters</code> — убедитесь, что кластер на правильном порту и версии.</p>
<h2>Альтернативы и продвинутые настройки</h2>
<p dir="auto">Если md5 не подходит, настройте <strong>ident</strong> или <strong>pam</strong> — они похожи на peer, но гибче. В pg_hba.conf можно указать <code>local postgres postgres peer</code> для конкретного юзера. Для продакшена комбинируйте: peer для локалки, scram-sha-256 для TCP.</p>
<p dir="auto">В CI/CD (AppVeyor, GitHub Actions) часто юзают init-скрипты: меняют conf перед стартом postgres сервиса. Пример: в yml добавьте шаг <code>echo 'local all all md5' &gt;&gt; pg_hba.conf</code>. Это решает <code>createdb: FATAL: Peer authentication failed for user "postgres"</code>. В MIMIC-code issues рекомендуют именно это + рестарт.</p>
<p dir="auto">Если база в контейнере, монтируйте volume с измененным conf или юзайте <code>POSTGRES_HOST_AUTH_METHOD=md5</code> в docker-compose. Для Atlassian/Confluence: проверьте, есть ли pg_hba.conf вообще — иногда bundled Postgres его игнорирует.</p>
<ul>
<li><strong>scram-sha-256</strong>: Современный метод (PostgreSQL 10+), хэширует пароли солиднее md5.</li>
<li><strong>TCP-подключения</strong>: Всегда md5 или выше, peer не работает по сети (<code>host all all 127.0.0.1/32 md5</code>).</li>
<li><strong>Логи</strong>: <code>/var/log/postgresql/</code> покажет точную причину отказа.</li>
</ul>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Сценарий</th>
<th>Рекомендация</th>
<th>Команда</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Dev локалка</strong></td>
<td>md5</td>
<td><code>local all all md5</code></td>
</tr>
<tr>
<td><strong>Docker/CI</strong></td>
<td>trust/md5</td>
<td>Init-скрипт с sed</td>
</tr>
<tr>
<td><strong>Прод</strong></td>
<td>scram + SSL</td>
<td><code>hostssl all all 0.0.0.0/0 scram-sha-256</code></td>
</tr>
</tbody>
</table>
<h2>Когда peer все-таки стоит оставить</h2>
<p dir="auto">Peer хорош для командной работы: каждый dev подключается под своим Linux-именем без паролей. <em>Но только если все юзеры в БД созданы заранее.</em> В крупных проектах это упрощает деплой — нет нужды хранить пароли в env.</p>
<p dir="auto">Если ошибка persists после фиксов, проверьте SELinux/AppArmor — они блокируют сокеты. Или версия PostgreSQL: в 14+ peer строже с группами. Подумать стоит над миграцией на роли с GRANTами вместо суперюзера postgres.</p>
<p dir="auto">Другие аспекты: ротация паролей, аудит логов, миграция на облачные RDS с IAM-аутентификацией. Там peer неактуален, но базовые принципы те же.</p>
]]></description><link>https://forum.exlends.ru/topic/670/postgres-polzovatel-ne-proshel-proverku-podlinnosti-peer-kak-ispravit</link><generator>RSS for Node</generator><lastBuildDate>Sat, 17 Oct 2026 03:06:05 GMT</lastBuildDate><atom:link href="https://forum.exlends.ru/topic/670.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 22 Feb 2026 14:00:05 GMT</pubDate><ttl>60</ttl></channel></rss>