Cannot connect to postgresql-11 from another machine after boot

2020-02-13 Thread Jason Swails
Hi,

I've been struggling with a strange (to me) issue for awhile.  I have
PostgreSQL 11.6 installed on my Ubuntu machine with the data directory
living on a different drive than the one mounted on /. I was observing the
same behavior when my machine was running Gentoo a month ago.

The problem is that after my machine boots, I'm unable to connect to the
server from anywhere except localhost.  Running a simple "systemctl restart
postgresql" fixes the problem and allows me to connect from anywhere on my
LAN.  Here is an example of this behavior:

swails@client ~ $ psql -U postgres -h 192.168.1.3
psql: could not connect to server: Connection refused
Is the server running on host "192.168.1.3" and accepting
TCP/IP connections on port 5432?

swails@client ~ $ ssh 192.168.1.3

swails@server ~ $ sudo systemctl restart postgresql

swails@server ~ $ logout
Connection to 192.168.1.3 closed.

swails@client ~ $ psql -U postgres -h 192.168.1.3
Password for user postgres:

So the first connection attempt fails.  But when I restart the service and
try again (doing nothing else in between), the connection attempt
succeeds.  My workaround has been to simply restart the service every time
my machine reboots, but I'd really like to have a more reliable startup.

Any ideas how to start hunting down the root cause?  I think this started
happening after I moved the data directory to another drive.

Thanks,
Jason

-- 
Jason M. Swails


Re: Cannot connect to postgresql-11 from another machine after boot

2020-02-17 Thread Jason Swails
On Sun, Feb 16, 2020 at 8:51 AM Peter J. Holzer  wrote:

> On 2020-02-13 21:03:48 -0800, Adrian Klaver wrote:
> > On 2/13/20 9:02 PM, Adrian Klaver wrote:
> > > On 2/13/20 7:54 PM, Jason Swails wrote:
> > > > The problem is that after my machine boots, I'm unable to connect to
> > > > the server from anywhere except localhost.  Running a simple
> > > > "systemctl restart postgresql" fixes the problem and allows me to
> > > > connect from anywhere on my LAN.  Here is an example of this
> > > > behavior:
> [...]
> > > >
> > > > So the first connection attempt fails.  But when I restart the
> > > > service and try again (doing nothing else in between), the
> > > > connection attempt succeeds.  My workaround has been to simply
> > > > restart the service every time my machine reboots, but I'd really
> > > > like to have a more reliable startup.
> > > >
> > > > Any ideas how to start hunting down the root cause?  I think this
> > > > started happening after I moved the data directory to another drive.
> > >
> > > I would start by looking in the system log to see what it records when
> > > the service tries to start on reboot.
> >
> > Hit send to soon. At a guess the Postgres service is starting before the
> > drive is mounted.
>
> I don't think this has anything to do with the drive. If the drive
> wasn't mounted he couldn't connect from localhost either.
>
> What is probably happening is that postgresql is configured to listen on
> localhost and the IP address of the ethernet interface and is starting
> before the etherned interface is ready. So it is listening only on
> localhost (there should be an error message regarding the other address
> in the log). When he restarts postgresql some time later, the interface
> is ready.
>
> It should be possible to solve this by adding the right dependencies to
> systemd.
>

I actually think the problem was both of these.  The postgresql.conf file
was on the non-root drive that probably wasn't mounted before postgresql
started up -- I think the "default" listen_addresses when no conf file is
available is just "localhost".  To fix this, I added "After=home.mount" to
the postgresql systemd service.  Once I did that, I started seeing the
error message regarding the other address in the log, so I suspected
exactly what you mentioned here.

I then added "network.target", "networking.service", and
"network-online.target" to the After line of the postgresql.service systemd
file, but it still didn't fix the problem.  I ultimately had to change
listen_addresses from "localhost,192.168.1.3" to "*".  It's certainly not
my favorite approach as the former is stricter and therefore more secure.
But I don't have port forwarding set up for the postgres port, so my router
should serve as a suitable firewall for my small-scale home database setup.

Thanks,
Jason

-- 
Jason M. Swails