Cómo instalar PostgreSQL y phpPgAdmin en Fedora 34

PostgreSQL o Postgres es un potente sistema de gestión de bases de datos relacionales de código abierto que utiliza y amplía el lenguaje SQL. Tiene muchas características avanzadas que permiten almacenar y escalar con seguridad cargas de trabajo de datos complicadas. phpPgAdmin es una aplicación basada en PHP para gestionar y editar bases de datos PostgreSQL.

Este tutorial mostrará cómo instalar PostgreSQL y phpPgAdmin en un servidor basado en Fedora 34.

Requisitos previos

  1. Un servidor basado en Fedora 34.

  2. Mantén tus sistemas actualizados.

    $ sudo dnf update
    
  3. Un usuario no root con privilegios sudo.

Paso 1 - Instalar PostgreSQL

Fedora 34 viene con diferentes versiones de PostgreSQL disponibles en su repositorio. Puedes elegir entre estas versiones habilitando el módulo correspondiente, que es un conjunto de paquetes y dependencias.

En primer lugar, comprueba las corrientes disponibles para el módulo postgresql mediante el comando dnf.

$ dnf module list postgresql
Name                        Stream                  Profiles                           Summary
postgresql                  9.6                     client, server [d]                 PostgreSQL module
postgresql                  10                      client, server [d]                 PostgreSQL module
postgresql                  11                      client, server [d]                 PostgreSQL module
postgresql                  12                      client, server                     PostgreSQL module
postgresql                  13                      client, server                     PostgreSQL module

Para instalar PostgreSQL, tenemos que habilitar el flujo del módulo correspondiente.

$ sudo dnf module enable postgresql:13

Cuando se te pida, introduce Y para habilitar el flujo.

A continuación, instala el servidor PostgreSQL.

$ sudo dnf install postgresql-server

Es posible que quieras instalar el paquete contrib, que añade varias funciones adicionales al sistema de bases de datos PostgreSQL.

$ sudo dnf install postgresql-contrib

Ahora que el servidor está instalado, tenemos que crear un nuevo usuario.

Paso 2 - Crear un nuevo cluster de bases de datos PostgreSQL

En primer lugar, tienes que crear un nuevo clúster de base de datos PostgreSQL. Un clúster de bases de datos es un conjunto de bases de datos gestionadas por una única instancia de servidor. Al crear un clúster se crearán directorios en los que se colocará la base de datos. Todo este proceso también es similar a la inicialización de PostgreSQL.

Este proceso crea las bases de datostemplate1 y postgres. La base de datos template1 es una plantilla que utiliza PostgreSQL para crear nuevas bases de datos. La base de datos postgres es la base de datos por defecto que utilizan los usuarios, las utilidades y las aplicaciones de terceros.

Para crear el clúster de bases de datos para inicializar PostgreSQL, utiliza el siguiente comando.

$ sudo postgresql-setup --initdb

Ahora, inicia el servicio PostgreSQL.

$ sudo systemctl start postgresql

Habilita el servicio PostgreSQL.

$ sudo systemctl enable postgresql

Ahora que PostgreSQL está en marcha, podemos crear nuevos usuarios y bases de datos y empezar a utilizarlos.

Paso 3 - Roles y métodos de autenticación de PostgreSQL

Postgres utiliza el concepto de "roles" para gestionar la autenticación y los permisos. PostgreSQL admite varios métodos de autenticación. Los métodos más utilizados son

  • Confianza - Un rol que puede conectarse sin contraseña, siempre que se cumplan las condiciones definidas en/var/lib/pgsql/pg_hba.conf.
  • Contraseña - Un rol que utiliza la contraseña para conectarse. Las contraseñas pueden almacenarse como md5, scram-sha-256 y en texto claro.
  • Ident - Requiere el nombre de usuario del SO del cliente y sólo se admite en conexiones TCP/IP.
  • Peer - Igual que Ident pero sólo se admite en conexiones localhost.

Postgres utiliza la autenticación por pares por defecto, lo que significa que asocia los roles de Postgres con la coincidencia de una cuenta de usuario de Linux. Si un rol existe dentro de Postgres, un nombre de usuario de Linux con el mismo nombre puede iniciar sesión como ese rol. Los detalles de la autenticación del cliente se almacenan en el archivo /var/lib/pgsql/pg_hba.conf.

El proceso de instalación de Postgres crea una cuenta de usuario llamada postgres que está asociada al rol por defecto de Postgres.

Pasa a la cuenta postgres.

$ sudo -i -u postgres

Puedes acceder al prompt de Postgres utilizando el siguiente comando.

$ psql

Esto te hará entrar en el prompt de PostgreSQL, donde puedes acceder y utilizar las bases de datos mediante varios comandos. Puedes salir del prompt escribiendo:

postgres-# \q

Esto te devolverá a la cuenta Linux de la cuenta Postgres. Para salir de nuevo a tu propia cuenta de usuario, escribe exit en el prompt.

También puedes acceder al prompt de Postgres sin cambiar de cuenta escribiendo el siguiente comando.

$ sudo -u postgres psql

Para salir del prompt, escribe:

postgres-# \q

Paso 4 - Crear nuevos roles y bases de datos.

Puedes crear roles y bases de datos directamente desde el shell bash o el shell psql. Para nuestro propósito, utilizaremos el shell psql ya que hace el trabajo más rápidamente.

Primero, conéctate al shell psql.

$ sudo -u postgres psql

Crea un nuevo rol de PostgreSQL con permisos como Superusuario, Crear base de datos, Crear rol e Iniciar sesión. Este usuario se utilizará más adelante en el tutorial para iniciar sesión enphpPgAdmin.

postgres-# CREATE ROLE username WITH SUPERUSER CREATEDB CREATEROLE LOGIN ENCRYPTED PASSWORD 'yourpassword';

Puedes comprobar todos los usuarios disponibles con el siguiente comando.

postgres-# \du
                                   List of roles
 Role name |                         Attributes                         | Member of
-----------+------------------------------------------------------------+-----------
 username  | Superuser, Create role, Create DB                          | {}
 postgres  | Superuser, Create role, Create DB, Replication, Bypass RLS | {}

Crea una nueva base de datos.

postgres-# CREATE DATABASE userdb;

Concede privilegios al usuario en la base de datos que acabamos de crear ejecutando la siguiente consulta.

postgres-# GRANT ALL PRIVILEGES ON DATABASE userdb TO username;

Puedes comprobar todas las bases de datos disponibles con el siguiente comando.

postgres-# \l
                                  List of databases
   Name    |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges
-----------+----------+----------+-------------+-------------+-----------------------
 userdb    | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =Tc/postgres         +
           |          |          |             |             | postgres=CTc/postgres+
           |          |          |             |             | navjot=CTc/postgres
 postgres  | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
 template0 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
 template1 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
(4 rows)

Paso 5 - Habilitar el acceso remoto al servidor PostgreSQL

Por defecto, el servidor PostgreSQL sólo escucha en la interfaz localhost. Para habilitar el acceso remoto a tu servidor PostgreSQL, abre el archivo postgresql.conf.

$ sudo nano /var/lib/pgsql/data/postgresql.conf

Desplázate hasta la sección CONEXIONES Y AUTENTICACIÓN y cambia/edita la siguiente línea eliminando el símbolo de la almohadilla.

#listen_addresses = 'localhost'         # what IP address(es) to listen on;

Cambia la línea por la siguiente.

listen_addresses = '*' 			        # what IP address(es) to listen on;

Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando te lo pida.

El siguiente paso es configurar el servidor para que acepte conexiones remotas editando el archivo pg_hba.conf.

$ sudo nano /var/lib/pgsql/data/pg_hba.conf

Hay varias formas de dar acceso a las conexiones remotas. Puedes restringir las conexiones remotas a un solo usuario o a una sola base de datos, o a todos ellos y restringir las conexiones a cada dirección IP o a una ubicación de confianza.

# TYPE  DATABASE        USER            ADDRESS                 METHOD

# The user jane can access all databases from all locations using an md5 password
host    all             john            0.0.0.0/0                md5

# The user jane can access only the janedb database from all locations using an md5 password
host    johndb          john            0.0.0.0/0                md5

# The user jane can access all databases from a trusted location (192.168.1.110) without a password
host    all             john            192.168.1.110            trust

También hay otras entradas en el archivo, y el método de autenticación que aparece para ellas es ident. Tendrás que cambiar el valor de ident por el de md5 si quieres conectarte a través de la interfaz web.

Añade la configuración necesaria y luego guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te pida.

Reinicia el servidor PostgreSQL para que el cambio surta efecto.

$ sudo systemctl restart postgresql

Verifica los cambios con la utilidad ss.

$ ss -nlt | grep 5432
LISTEN   0    128    0.0.0.0:5432    0.0.0.0:*       
LISTEN   0    128    [::]:5432      [::]:*  

Esto muestra que el servidor PostgreSQL está escuchando en el puerto por defecto en todas las interfaces.

Paso 6 - Instalar phpPgAdmin, Nginx y PHP

phpPgAdmin suele venir con el repositorio de PostgreSQL o de Fedora, pero no en Fedora 34. Por lo tanto, tendrás que instalarlo manualmente. Junto con phpPgAdmin, también necesitas instalar el servidor web Nginx y el software PHP.

Descarga la última versión de phpPgAdmin desde la páginapágina de publicaciones de Github. En el momento de escribir este tutorial, la última versión disponible es la 7.13.0.

$ wget https://github.com/phppgadmin/phppgadmin/releases/download/REL_7-13-0/phpPgAdmin-7.13.0.tar.gz

Extrae el archivo descargado.

$ tar -zxvf phpPgAdmin-7.13.0.tar.gz

Crea el directorio donde vivirá tu sitio.

$ sudo mkdir /var/www/phppgadmin/html -p

Mueve los archivos extraídos al directorio /var/www/phppgadmin/html.

$ sudo mv phpPgAdmin-7.13.0/ /var/www/phppgadmin/html

Instala el servidor Nginx y PHP junto con los módulos PHP adecuados.

$  sudo dnf install nginx php-fpm php-cli php-pgsql php-mbstring

Configura el cortafuegos de Fedora.

$ sudo firewall-cmd --permanent --add-service=http
$ sudo firewall-cmd --permanent --add-service=https

Recarga el cortafuegos para activar las reglas.

$ sudo firewall-cmd --reload

Configura el PHP

Abre el archivo /etc/php-fpm.d/www.conf para editarlo con nano editor.

$ sudo nano /etc/php-fpm.d/www.conf

Necesitamos establecer el usuario/grupo Unix de los procesos PHP a nginx. Busca las líneas user=apache y group=apache en el archivo y cámbialas a nginx.

...
; Unix user/group of processes
; Note: The user is mandatory. If the group is not set, the default user's group
;       will be used.
; RPM: apache user chosen to provide access to the same directories as httpd
user = nginx
; RPM: Keep a group allowed to write in log dir.
group = nginx
...

Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando te lo pida.

Reinicia el proceso PHP-fpm.

$ sudo systemctl restart php-fpm

Configurar Nginx

Ejecuta el siguiente comando para añadir un archivo de configuración para tu sitio.

$ sudo nano /etc/nginx/conf.d/phppgadmin.conf

Pega el siguiente código en el editor.

server {
  listen          *:80;
  server_name     phppgadmin.example.com;
  root            /var/www/phppgadmin/html;
  index           index.php;

  location / {
    try_files   $uri $uri/ =404;
  }
    
  access_log /var/log/nginx/phppgadmin.access.log;
  error_log /var/log/nginx/phppgadmin.error.log;

  location ~ \.php$ {
    try_files $uri =404;
    fastcgi_pass  unix:/run/php-fpm/www.sock;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_index index.php;
    include  fastcgi_params;
  }
}

Pulsa Ctrl + X para cerrar el editor y pulsa Y cuando te lo pida para guardar el archivo.

Este archivo asume que vamos a alojar phppgadmin.example.com en el directorio /var/www/html/phppgadmin.

Prueba la configuración de Nginx.

$ sudo nginx -t

Deberías ver la siguiente salida que indica que tu configuración es correcta.

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Inicia y activa el servicio Nginx.

$ sudo systemctl start nginx
$ sudo systemctl enable nginx

Inicia http://phppgadmin.example.com en tu navegador, y deberías ver la página predeterminada de phpPgAdmin en tu navegador.

Página de inicio de phpPgAdmin

Haz clic en el enlace PostgreSQL de la barra lateral izquierda e introduce el usuario y la contraseña que creaste anteriormente para iniciar sesión y acceder al portal.

Panel de control de phpPgAdmin

Paso 7 - Instalar SSL (opcional)

Podemos activar el SSL utilizando el servicio Let's Encrypt SSL. Para ello, instala la herramienta Certbot.

$ sudo dnf install certbot-nginx

Genera el certificado SSL.

$ sudo certbot --nginx -d phppgadmin.example.com

Se te pedirá tu dirección de correo electrónico y que aceptes las condiciones del servicio. Cuando te pidan el acceso HTTPS, elige el método Seguro para redirigir todas las peticiones de HTTP a HTTPS.

Deberías poder acceder a phpPgAdmin escribiendo https://phppgadmin.example.com en tu navegador.

Configurar SSL para la renovación automática

Abre el editor Crontab.

$ EDITOR=nano sudo crontab -e

Pega la siguiente línea en la parte inferior.

. . .
25 2 * * * /usr/bin/certbot renew --quiet

La parte 25 2 * * * de esta línea significa "ejecutar el siguiente comando a las 2:25 de la madrugada, todos los días". Puedes elegir cualquier hora.

Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te pida.

Tu certificado SSL se renovará automáticamente.

Conclusión

Con esto concluye nuestro tutorial sobre cómo instalar PostgreSQL y phpPgAdmin en un servidor basado en Fedora 34. Si tienes alguna pregunta, publícala en los comentarios de abajo.

También te podría gustar...