Servidor de correo Postfix (Parte I)
Después de un largo tiempo sin «postear» voy a hacer una serie de entradas sobre cómo instalar un servidor de correos completo con Postfix.
Como viene siendo habitual usaré Debian, en su versión Stretch, que es donde me parece más sencillo de explicar, hacerlo en CentOS (yo lo tengo en CentOS) u otros SO me obligaría a hacer un post más extenso y compilar paquetes, lo que quizás se salga un poco del objetivo de la entrada.
Hoja de ruta
Los servicios que voy a instalar son estos, por orden:
- Servidor de Bases de datos, Postgres (espero no cogerme los dedos luego con Postfix).
- Interfaz web para gestionar la base de datos, PgAdmin 4 v2.0.
- Interfaz web para gestionar los buzones, PostfixAdmin.
- Postfix.
Instalación de Postgres
Postgres viene en los repos oficiales de Debian así que es rápido:
apt update && apt install --no-install-recommends postgresql
Últimamente, me esta dando coraje que al instalar cualquier paquete, apt, me llene el disco duro de cosas que no he pedido ni voy a usar nunca, así que le meto ese flag.
Para prevenir un paso de después, voy a crear una cuenta de ‘administrador’ en Postgres que tenga acceso por socket TCP/IP en localhost para el usuario ‘pgadmin’ con password ‘pgadmin’. Este usuario tendrá acceso a la base de datos ‘postgres’ que es la única que hay de momento.
su - -c 'createuser -Ps pgadmin' postgres
Alguien podrá decir que si no modifico nada en Postgres para poder loguear. Postgres en Debian Stretch viene por defecto escuchando en el puerto 5432 en localhost sobre la IP 127.0.0.1 aceptando contraseñas md5.
PgAdmin
PgAdmin es una interfaz web para Postgres. Aunque no es estrictamente necesario para PgAdmin, ya que es una aplicación web Python que puede ser lanzada por ella misma en modo ‘standalone’ sobre un puerto, o bien con Gunicorn o uWsgi del mismo modo, voy a instalar NGIN-x, que además luego vendrá bien para instalar Roundcube como cliente Web de correo.
Instalación de NGIN-x
Junto a la instalación de NGIN-x activaré también PHP 7.0.
apt install nginx-full php7.0-fpm
Configuración de NGIN-x en ‘/etc/nginx/sites-enabled/default’
Añadimos index.php a la lista de páginas por defecto:
index index.php index.html index.htm index.nginx-debian.html;
Añadimos el paso de ficheros .php a fpm descomentando el siguiente bloque:
location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/var/run/php/php7.0-fpm.sock; }
Guardamos y reiniciamos NGIN-x:
nginx -s reload
Creamos una página de comprobación de php:
printf '<?php phpinfo();\n' > /var/www/html/index.php
Y comprobamos que podemos acceder…
Instalación de PgAdmin
Para tener la última versión de PgAdmin, lo mejor es instalarlo con python-pip. Y a su vez lo mejor para instalar paquetes con python-pip es hacerlo dentro de un entorno virtual python. 😀
Instalamos las dependencias necesarias:
apt install virtualenv build-essential libpq-dev python-dev python3-virtualenv python3-dev
Se puede ver que me he decantado por instalarlo en Python 3.
Creación del entorno virtual
Voy a crear 2 entornos virtuales. Uno para tener la versión de uwsgi de Python 3, y otro para la aplicación. He tomado esta decisión porque así puedo usar ese uWsgi con otras aplicaciones sin necesidad de tener que instalarlo repetidamente para cada aplicación.
Primero el entorno virtual para uWsgi:
virtualenv -p /usr/bin/python3 /usr/local/share/uwsgi3 source /usr/local/share/uwsgi3/bin/activate (uwsgi3) root@stretch-1:~# pip install --upgrade pip (uwsgi3) root@stretch-1:~# pip install uwsgi (uwsgi3) root@stretch-1:~# deactivate
Ahora el entorno virtual y la aplicación PgAdmin:
mkdir -p /var/www/py3apps chown www-data. -R /var/www/py3apps su - -s /bin/bash \ -c 'virtualenv -p /usr/bin/python3 py3apps/pgadmin4vEnv' www-data su - -s /bin/bash \ -c 'wget https://ftp.postgresql.org/pub/pgadmin/pgadmin4/v2.0/pip/pgadmin4-2.0-py2.py3-none-any.whl -P py3apps' www-data su - -s /bin/bash \ -c 'source py3apps/pgadmin4vEnv/bin/activate; \ pip install --upgrade--no-cache-dir
pip; \ pip install--no-cache-dir
py3apps
/pgadmin4-2.0-py2.py3-none-any.whl' www-data
Con esto quedan instalados todos los ficheros necesarios.
Antes de ejecutar el fichero de «auto-configuración» que trae pgAdmin, hay que configurar la ruta donde se van a guardar los datos de la aplicación.
Esa configuración se encuentra en ‘/var/www/py3apps/pgadmin4vEnv/lib/python3.5/site-packages/pgadmin4/config.py’. Como lo estoy dejando ‘/var/www/py3apps’ pondré estas rutas en el fichero:
... DATA_DIR = '/var/www/py3apps/pgadmin4' ... ... LOG_FILE = '/var/www/py3apps/pgadmin4/log/pgadmin4.log' ...
Lo siguiente será ejecutar el fichero de auto-configuración de PgAdmin:
su - -s /bin/bash \ -c 'source py3apps/pgadmin4vEnv/bin/activate; \ python py3apps/pgadmin4vEnv/lib/python3.5/site-packages/pgadmin4/setup.py' www-data
Y cumplimentamos los datos que nos pide…
NOTE: Configuring authentication for SERVER mode. Enter the email address and password to use for the initial pgAdmin user account: Email address: webmaster@linuxarena.net Password: Retype password: pgAdmin 4 - Application Initialisation ======================================
Con esto ya tenemos garantizado el acceso y configurada la aplicación.
Esas credenciales que acabamos de introducir se guardan en un fichero sqlite3 según la ruta que hemos definido en el fichero de configuración, en ‘/var/www/py3apps/pgadmin4/pgadmin4.db’. Con cualquier cliente de sqlite3 podréis ver las tablas que contiene.
Lanzamiento del demonio uWsgi
Ahora hay que lanzar correctamente el demonio de uWsgi pasándole como parámetro nuestra aplicación python.
Durante el proceso de instalación he optado por crear la estructura dentro del directorio ‘/var/www’, típicamente usado por los servidores webs Linux, con propietario el usuario ‘www-data’ para evitar tener corriendo en el sistema como ‘root’ una aplicación que perfectamente puede funcionar como un usuario sin privilegios.
El fichero de configuración del demonio también lo situaré en su lugar típico, ‘/etc/default’, y el demonio será lanzado mediante ‘systemd’.
El fichero de configuraciónde la aplicación será un .ini de nombre ‘/etc/default/pgadmin4.ini’ con este contenido:
[uwsgi] socket = /var/www/py3apps/run/pgadmin4.sock wsgi-file = /var/www/pgadmin4vEnv/lib/python3.5/site-packages/pgadmin4/pgAdmin4.wsgi uid = www-data gid = www-data daemonize = /var/www/py3apps/log/pgadmin4.log pidfile = /var/www/py3apps/run/pgadmin4.pid thread = true mount = /pgadmin=/var/www/pgadmin4vEnv/lib/python3.5/site-packages/pgadmin4/pgAdmin4.wsgi venv = /var/www/py3apps/pgadmin4vEnv manage-script-name = true
Será necesario crear los 2 directorios que en él aparecen:
su - -s /bin/bash -c 'mkdir py3apps/{run,log}' www-data
Y por último, la creación del servicio de systemd:
systemctl edit --full --force uwsgi3@.service
Y definimos las siguientes directivas en él:
[Unit] Description=Python 3 uWsgi service After=network.target [Service] ExecStart=/usr/local/share/uwsgi3/bin/uwsgi --ini /etc/default/%I.ini Type=forking Restart=on-failure RestartSec=30s [Install] WantedBy=multi-user.target
uWsgi en NGIN-x
La configuración de Nginx es muy sencilla.
Añadimos el bloque upstream al principio de nuestro ‘/etc/nginx/sites-enabled/default’ con la ruta al socket:
upstream pgadmin { server unix:///var/www/py3apps/run/pgadmin4.sock; }
Y en el bloque del virtualhost donde queremos que esté el subdirectorio que se definió en el .ini, en este caso lo llamé ‘/pgadmin’, configuramos el siguiente subdirectorio web:
location /pgadmin { uwsgi_pass pgadmin; include uwsgi_params; }
Reniciamos de nuevo Nginx para aplicar los nuevos cambios, lanzo el demonio de uWsgi y si accedemos a nuestro servidor debe aparecer la aplicación…
nginx -s reload systemctl start uwsgi3@pgadmin4
La configuración de PgAdmin la podrás hacer sin problemas usando el usuario y la contraseña que definimos al principio:
Errores que te puedes encontrar
Aparte de las erratas que haya podido cometer durante la escritura de este post, cosa que me parece increíble porque he ido ejecutando en la máquina virtual dónde estoy desplegando el servidor de correo y a mí me funciona, si por lo que sea algún paso te falla, te recomiendo revisar lo siguiente:
Errores con php -fpm
Si no te funciona la página de info de php:
- Comprueba que el servicio php-fpm está corriendo.
- Comprueba el socket, si es socket Linux o socket TCP/IP.
- Comprueba también el propietario del socket y si tiene los permisos adecuados.
Errores con la instalación de PgAdmin
- Cuando lo levanté en un Debian 8, lo tuve que hacer con Python 2, me dio problemas la versión 3 y no quise enredarme mucho.
Errores con uWsgi
- Comprueba los directorios del archivo .ini, su existencia, propietarios y permisos.
- Tienes el fichero de log en /var/www/py3apps/log, es de mucha utilidad usar tailf y lanzar el demonio para ver donde falla.
Si tienes otros problemas, puedes enviarme un correo a webmaster@linuxarena.net, o dejar un comentario.
Comentarios recientes