Introducción

Buenas, en este post vamos a instalar y configurar PostgreSQL para su acceso remoto.

Partiendo de un escenario en el cuál hemos creado una máquina Debian Buster con Vagrant, vamos a instalar y acceder remotamente desde nuestra máquina anfitriona a un servicio de Postgres.

Instalación Postgres

Instalamos postgresql:

$ sudo apt install postgresql

Añadimos una contraseña al nuevo usuario que se ha creado:

$ sudo passwd postgres

Creación de usuario y base de datos poblada

Accedemos al usuario postgres:

$ su postgres

Creamos un usuario:

$ createuser -S -R -D -l externo

Accedemos a postgres para dar una contraseña a dicho usuario:

$ psql
psql (11.9 (Debian 11.9-0+deb10u1))
Type "help" for help.

postgres=# ALTER USER externo WITH ENCRYPTED PASSWORD 'externo';

Editamos el fichero:

sudo nano /etc/postgresql/11/main/pg_hba.conf

Para poder acceder mediante la contraseña desde nuestro equipo y cambiamos la siguiente línea:

local   all             all                                     peer

Por esta otra:

local   all             all                                     md5

Reiniciamos el servicio:

sudo systemctl restart postgresql

Creamos una base de datos:

su postgres
Password: 
postgres@server:/home/vagrant$ createdb prueba

La poblamos de datos:

postgres@server:/home/vagrant$ psql -U externo -d prueba
psql (11.9 (Debian 11.9-0+deb10u1))
Type "help" for help.

prueba=# CREATE TABLE Provincias
(
	Codigo 		VARCHAR(10),
	Nombre 		VARCHAR(20),
	CONSTRAINT pk_provincias PRIMARY KEY(Codigo)
);

INSERT INTO Provincias (Codigo,Nombre) VALUES ('0','Sevilla');
INSERT INTO Provincias (Codigo,Nombre) VALUES ('1','Huelva');
INSERT INTO Provincias (Codigo,Nombre) VALUES ('2','Granada');
INSERT INTO Provincias (Codigo,Nombre) VALUES ('3','Cadiz');
INSERT INTO Provincias (Codigo,Nombre) VALUES ('4','Malaga');
INSERT INTO Provincias (Codigo,Nombre) VALUES ('5','Jaen');
INSERT INTO Provincias (Codigo,Nombre) VALUES ('6','Almeria');
INSERT INTO Provincias (Codigo,Nombre) VALUES ('7','Murcia');

CREATE TABLE Poblaciones
(
	Codigo 			VARCHAR(10),
	Nombre 			VARCHAR(20),
	CodigoProvincia	VARCHAR(10),
	CONSTRAINT pk_poblaciones PRIMARY KEY(Codigo),
	CONSTRAINT fk_poblaciones FOREIGN KEY(CodigoProvincia) REFERENCES Provincias
);

INSERT INTO Poblaciones (Codigo,Nombre,CodigoProvincia) VALUES ('0','Dos Hermanas','0');
INSERT INTO Poblaciones (Codigo,Nombre,CodigoProvincia) VALUES ('1','Utrera','0');
INSERT INTO Poblaciones (Codigo,Nombre,CodigoProvincia) VALUES ('2','Villablanca','1');
INSERT INTO Poblaciones (Codigo,Nombre,CodigoProvincia) VALUES ('3','Monachil','2');
INSERT INTO Poblaciones (Codigo,Nombre,CodigoProvincia) VALUES ('4','Chipiona','3');
INSERT INTO Poblaciones (Codigo,Nombre,CodigoProvincia) VALUES ('5','Torremolinos','4');
INSERT INTO Poblaciones (Codigo,Nombre,CodigoProvincia) VALUES ('6','Estepona','4');
INSERT INTO Poblaciones (Codigo,Nombre,CodigoProvincia) VALUES ('7','Linares','5');

CREATE TABLE Conductores
(
	Codigo 			VARCHAR(10),
	Nombre 			VARCHAR(20),
	Apellidos 		VARCHAR(20),
	DNI				VARCHAR(9),
	Direccion 		VARCHAR(30),
	Telefono 		VARCHAR(9),
	CodigoPoblacion	VARCHAR(10),
	CONSTRAINT pk_conductores PRIMARY KEY(Codigo),
	CONSTRAINT fk_conductores FOREIGN KEY(CodigoPoblacion) REFERENCES Poblaciones,
	CONSTRAINT codiok CHECK(Codigo ~ '[0-9]{6,}'),
	CONSTRAINT apellidosok CHECK(INITCAP(Apellidos) = Apellidos)
);

INSERT INTO Conductores (Codigo,Nombre,Apellidos,DNI,Direccion,Telefono,CodigoPoblacion) 
	VALUES ('000000','Antonio','Garcia Rodriguez','58647072Q','C/ Tajo, 145','685091321','0');
INSERT INTO Conductores (Codigo,Nombre,Apellidos,DNI,Direccion,Telefono,CodigoPoblacion) 
	VALUES ('000001','Jose','Gonzalez Fernandez','83002995C','C/ Judea, 19','657240633','1');
INSERT INTO Conductores (Codigo,Nombre,Apellidos,DNI,Direccion,Telefono,CodigoPoblacion) 
	VALUES ('000002','Manuel','Lopez Martinez','98759385F','C/ Espartero, 4','624738904','0');
INSERT INTO Conductores (Codigo,Nombre,Apellidos,DNI,Direccion,Telefono,CodigoPoblacion) 
	VALUES ('000003','Francisco','Perez Gomez','62541048T','C/ Marchena, 1D','654782999','1');
INSERT INTO Conductores (Codigo,Nombre,Apellidos,DNI,Direccion,Telefono,CodigoPoblacion) 
	VALUES ('000004','David','Martin Jimenez','38186676Y','C/ Ponce de Leon, 3D','783098678','1');
INSERT INTO Conductores (Codigo,Nombre,Apellidos,DNI,Direccion,Telefono,CodigoPoblacion) 
	VALUES ('000005','Juan','Ruiz Hernandez','94200021W','C/ Miguel Angel Asturias, 16','657483900','0');

Ficheros de configuración

Para que se pueda acceder desde la red local tendremos que modificar dos archivos de configuración, el primero:

sudo nano /etc/postgresql/11/main/postgresql.conf

Y descomentamos y ponemos de la siguiente forma lo siguiente:

listen_addresses = '*'

El otro archivo de configuración:

sudo nano /etc/postgresql/11/main/pg_hba.conf

Y modificamos para que quede de la siguiente forma la línea de IPv4 local connections

# IPv4 local connections:
host    all             all             192.168.1.0/24            md5

Reiniciamos el servicio:

sudo systemctl restart postgresql

Acceso remoto desde cliente y comprobación de funcionamiento

Para poder acceder desde nuestra máquina anfitriona tendremos que tener instalado un paquete de cliente:

sudo apt install postgresql-client

Y simplemente con realizar el siguiente comando tendremos el acceso:

$ psql -h 192.168.1.177 -U externo -d prueba
Contraseña para usuario externo: 
psql (11.9 (Debian 11.9-0+deb10u1))
conexión SSL (protocolo: TLSv1.3, cifrado: TLS_AES_256_GCM_SHA384, bits: 256, compresión: desactivado)
Digite «help» para obtener ayuda.

prueba=> \dt
          Listado de relaciones
 Esquema |   Nombre    | Tipo  |  Dueño   
---------+-------------+-------+----------
 public  | conductores | tabla | postgres
 public  | poblaciones | tabla | postgres
 public  | provincias  | tabla | postgres
(3 filas)

prueba=> SELECT codigo,nombre,dni FROM CONDUCTORES;
 codigo |  nombre   |    dni    
--------+-----------+-----------
 000000 | Antonio   | 58647072Q
 000001 | Jose      | 83002995C
 000002 | Manuel    | 98759385F
 000003 | Francisco | 62541048T
 000004 | David     | 38186676Y
 000005 | Juan      | 94200021W
(6 filas)