Mediawiki en Lightsail

1
2207

Cuando estudio tomo muchas notas para no olvidar lo que leo, porque escribir me fuerza a aclarar las ideas, y para que me sirva de material de referencia. Para anotar fragmentos de código y algoritmos uso Quiver, y para el resto uso una instancia de Mediawiki. Mediawiki es el software sobre el que se basa Wikipedia.

Aquí voy a explicar cual es la opción más económica y fiable para instalar una instancia privada de Mediawiki: Amazon Lightsail. Aunque hay instancias con aplicaciones pre-instaladas, aquí la instalaré manualmente en un Ubuntu. Si no eres técnico, la aplicación pre-instalada es una opción aceptable.

LightSail

Lightsail es la versión económica de Amazon EC2. Los precios mensuales van de $5 (20Gb SSD, 500Mb RAM), $10 (20Gb SSD, 1Gb RAM), hasta 80$ al mes. Puedes crear una instancia en segundos basada en Ubuntu, Debian, FreeBSD, OpenSUSE, o Amazon Linux. Las versiones con aplicaciones pre-instaladas usan imágenes de Bitnami.

Vamos a abrir una cuenta en Lightsail. Ve a https://amazonlightsail.com/ y crea una cuenta o entra con tus credenciales de Amazon. Aparecerán dos botones: Create Instance, y Create static IP. Los dialogos que aparecen a continuación son auto explicativos. Si quieres seguir este tutorial crea una instancia Linux, con solo sistema operativo (OS Only) de tipo Ubuntu. Más abajo puedes escoger el tipo de instancia. Para ejecutar mediawiki te vale la de 5 dólares, que además te da un mes gratis, así que hacer este tutorial no te cuesta nada.

Cuando crees la instancia, tardará unos 10 segundos en estar disponible. Podrás acceder por SSH inmediatamente pulsando en el icono. Pero primero, añade una IP estática a la instancia que acabas de crear.

Yo he creado una instancia, y le he añadido IP estática. Si te pide que les pongas un nombre inventa uno, no importa. Lo de añadir IP estática es simplemente decirle a Amazon, no me cambies la IP cuando reinicie la máquina. He aquí mis instancias:

Yo he contratado la de $10 para poder ejecutar Node, que requiere más memoria. No me gustó Node pero por pereza no he migrado a la de $5.

Puedes acceder a tu máquina desde el navegador abriendo un terminal SSH. Pero es más cómodo si subes tu clave SSH y la añades a tu cuenta (pulsa en Account, y luego en SSH keys). Cuando subes una clave SSH a una región, la clave vale para todas las instancias de esa región. Si te fijas en los pantallazos mi máquina está en Londres, porque escogí esa región cuando la cree.

Instalación

LAMP

Accedemos al terminal por SSH e instalamos LAMP (Apache, MySQL, PHP), imagemagick (mediawiki lo usa para redimensionar gráficos).

sudo apt update
sudo apt upgrade
sudo apt-get install apache2 imagemagick php-cli libapache2-mod-php mysql-server php php-apcu php-mcrypt php-mysql php7.0-intl php7.0-mbstring php7.0-xml

Los comandos anteriores descargan e instalan unos 400MB de software. Veremos que las instancias de Amazon se ejecutan en hardware de alto rendimiento, e instalar todo esto tarda unos cuatro minutos. Si te pregunta algo escoge la opción por defecto.

Apache

Instala Apache

sudo apt-get install apache2

SOLO si tienes un nombre de dominio edita la configuración

sudo nano /etc/apache2/apache2.conf

Y añade esto al final

ServerName jano.com.es

Ahora vamos a verificar la corrección de nuestra configuración y reiniciar Apache (si no configuraste un nombre de dominio te puedes saltar este paso).

sudo apache2ctl configtest
sudo systemctl restart apache2

UFW

UFW es el “firewall sencillo” (Uncomplicated Firewall) de Ubuntu. Efectivamente es muy simple de usar.

Comprueba que UFW tiene un perfil para Apache. Un perfil es una serie de normas pre-configuradas.

sudo ufw app list

Comprueba que UFW tiene un perfil “Apache Full” que activa los puertos 80 y 443.

sudo ufw app info "Apache Full"

SOLO si en vez del puerto 80, quieres usar el puerto 90, tendras que cambiar el puerto 80 a 90 en /etc/apache2/ports.conf, y /etc/apache2/sites-enabled/000-default.conf. Luego tendrás que abrir el puerto en el firewall con este comando:

sudo ufw allow 90/tcp

Comprueba que la página por defecto de Apache es accesible a través del firewall. Usa tu dominio o dirección IP si no tienes dominio: http://jano.com.es.

Algo que NO me funcionó fue preguntarle a mi máquina su IP con:

ip addr show eth0 | grep inet | awk '{ print $2; }' | sed 's/\/.*$//'

Seguramente esto corre en un contenedor con una subred y gateway propio. Como no sé cuál es la topología de red tengo que consultar la IP en la consola de Lightsail, o preguntarle a este servidor:

curl http://icanhazip.com

Let’s Encrypt

SOLO si has comprado un dominio y quieres instalar un certificado SSL con Let’s encrypt haz lo siguiente:

sudo add-apt-repository ppa:certbot/certbot
sudo apt-get install python-certbot-apache
sudo certbot --apache -d jano.com.es
sudo certbot --apache -d jano.com.es -d jano.com.es

En este ejemplo mi dominio es jano.com.es, reemplazalo por el tuyo.

MySQL

Esto ya lo hemos hecho arriba para ahorrar tiempo, pero si quisieras instalar MySQL harías esto (no lo hagas ahora porque no hace falta):

sudo apt-get install mysql-server

Opcionalmente puedes ejecutar un script para securizar MySQL:

mysql_secure_installation

PHP

Ahora vamos a instalar PHP en Apache.

sudo apt-get install php libapache2-mod-php php-mcrypt php-mysql

Dile a Apache que sirva el index.php antes que la página por defecto index.html. Edita el /etc/apache2/mods-enabled/dir.conf y pon el index.php primero.

sudo nano /etc/apache2/mods-enabled/dir.conf

Reinicia Apache

sudo systemctl restart apache2

Comprueba el estado de Apache (si no ves errores todo está bien):

sudo systemctl status apache2

Comprueba que PHP funciona creando una página:

sudo nano /var/www/html/info.php

con este contenido

<?php
phpinfo();
?>

Carga la página: http://jano.com.es/info.php (usa tu IP o dominio), y a continuación borrala para que nadie vea la información de tu servidor:

sudo rm /var/www/html/info.php

Mediawiki

Es hora de instalar Mediawiki

sudo apt install imagemagick php-cli php-apcu
sudo apt install php7.0-mbstring
sudo apt install php7.0-xml
sudo phpenmod mbstring
sudo phpenmod xml

La configuración de PHP está aquí: sudo nano /etc/php/7.0/apache2/php.ini Ahora mismo no necesitas cambiar nada.

Instala fastcgi:

sudo apt-get install libapache2-mod-fastcgi

Activa los módulos de Apache proxy, proxy_http, rewrite, y reinicia Apache. Se hace así:

sudo a2enmod proxy
sudo a2enmod proxy_http
sudo a2enmod rewrite
sudo a2enmod ssl
sudo service apache2 restart

Si antes no configuraste un certificado SSL no te va a servir de mucho activar el módulo SSL, pero no importa. Seguiremos el tutorial usando HTTP.

Probablemente Perl se haya quejado amargamente de que no has configurado tu idioma. En realidad no importa, pero por curiosidad se arregla añadiendo lo siguiente en ~/.bashrc (no hace falta que lo hagas ahora):

export LC_CTYPE=en_US.UTF-8
export LC_ALL=en_US.UTF-8

La configuración de Apache está en /etc/apache2/apache2.conf (no necesitas cambiarla ahora).

Descomprime la distribución mediawiki en el directorio /var/www/wikijano (el nombre del directorio puedes cambiarlo)

cd /var/www/
sudo curl https://releases.wikimedia.org/mediawiki/1.29/mediawiki-1.29.1.tar.gz -o mediawiki-1.29.1.tar.gz
sudo tar -zxvf mediawiki-1.29.1.tar.gz
sudo mv mediawiki-1.29.1 wikijano
sudo chown -R root:root wikijano

Edita /etc/apache2/sites-available/000-default.conf y sustituye DocumentRoot /var/www/html por DocumentRoot /var/www/wikijano. Reinicia Apache con sudo systemctl restart apache2

Ve al navegador y accede a http://awsjano/

(usa tu IP o nombre de dominio). Aquí podrás iniciar la configuración de mediawiki, que creará la base de datos en MySQL. Ve leyendo y dándole a siguiente, pero acuérdate de escribir la contraseña de MySQL que escogiste cuando instalaste MySQL.

Importante: Al terminar de instalar mediawiki te ofrece la descarga de LocalSettings.php. Bajatela, copia todo el contenido al portapapeles, crea el fichero en remoto con sudo nano /var/www/wikijano/LocalSettings.php, pega lo que copiaste antes, y graba el fichero. Esto completa la instalación.

Ahora accede a tu servidor http://awsjano (usa tu IP) y disfruta de tu Mediawiki!

Otras cosas útiles

Backup

Me conecto por SSH a la máquina awsjano con nombre de usuario ubuntu. awsjano es un alias de la IP que tengo en /etc/hosts.
Tú tendrás que usar tu IP, o nombre de dominio, o el alias que hayas creado en /etc/hosts.

ssh -l ubuntu awsjano

Las siguientes líneas hacen un backup comprimido en el directorio ~/backup de la base de datos wikijano, y del directorio /var/www/wikijano donde instalamos la mediawiki. Si usaste nombres diferentes reemplazalos en el script.

mkdir -p ~/backup
mysqldump -u root --password=secreto --single-transaction -B wikijano | gzip > ~/backup/`date +%m_%d_%y`_wikijano.gz
tar -czf ~/backup/wikijano_`date +%m_%d_%y`.tgz /var/www/wikijano

En mi wiki, MySQL exporta 21MB de backup en 5 segundos. Mi directorio de mediawiki pesa 160MB comprimido. Los backups los puedes dejar en tu instancia de Lightsail, recuerda que tienes gigas de sobra. También deberías descargar una copia y colocarla en otro sitio. Por ejemplo en Google Drive.

Para descargar los ficheros comprimidos yo uso Transmit que es de pago. Pero puedes hacerlo por SSH desde el terminal.

Como crear una clave SSH

Como ejemplo voy a generar una clave para awsjano, que es un nombre que previamente he asociado a la IP en /etc/hosts. El procedimiento para otro dominio es el mismo, solo cambia el dominio y el nombre de usuario.

Genera tus claves

ssh-keygen -t rsa -C "jano@autentia.com"

Edita la configuración

nano ~/.ssh/config

Y añade lo siguiente

Host awsjano
    User root
    Hostname 35.176.128.11
    PreferredAuthentications publickey
    IdentitiesOnly yes
    IdentityFile ~/.ssh/awsjano

Permissions

chmod 700 ~/.ssh
chmod 600 ~/.ssh/*

Copia el contenido de id_rsa.pub al portapapeles. Si estas en Linux no te va a funcionar pbcopy, puedes instalar xclip o hacerlo a mano.

pbcopy < ~/.ssh/id_rsa.pub

Comprueba que todo funciona

ssh -T git@awsjano

Cómo crear claves SSH para varias instancias

Esto es lo mismo pero para el caso en que tienes varios sitios para los que crear las claves, que es lo normal. Por ejemplo, vamos a crear claves para awsjano y github.com

Crea una clave para cada servicio o identidad:

mkdir -p ~/.ssh
cd ~/.ssh
ssh-keygen -t rsa -f ~/.ssh/awsjano -C "jano@autentia.com"
ssh-keygen -t rsa -f ~/.ssh/github -C "jano@autentia.com"

Copia las claves públicas y pegalas en cada sitio.

pbcopy < ~/.ssh/awsjano
pbcopy < ~/.ssh/github.pub

Añade la ruta a la clave privada en el keychain

ssh-add -K ~/.ssh/awsjano
ssh-add -K ~/.ssh/github

Crea un fichero de configuración

nano ~/.ssh/config

y pega el siguiente contenido

Host awsjano
    User git
    Hostname awsjano
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/awsjano

Host github.com
    User git
    Hostname github.com
    PreferredAuthentications publickey
    IdentitiesOnly yes
    IdentityFile ~/.ssh/github

Ahora cuando hagas SSH a un host, SSH seleccionará automáticamente la clave para ese host. Esto vale para hacer ssh a la máquina de Amazon, o para usar git con direcciones git@domain/path/repository.git.

Cómo configurar una misma clave para una segunda instancia

Supón que creas otra instancia en la misma zona que la primera y en /etc/hosts configuras la IP como awsjano2. Ahora quieres usar la misma clave ssh para esta instancia. Pues logate con ssh -l ubuntu awsjano2 después de haber añadido la siguiente entrada a ~/.ssh/config:

Host awsjano2
    User git
    Hostname awsjano2
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/awsjano

Cómo resetear la clave de MySQL

# Para MySQL
sudo service mysql stop

# Crea un directorio para el servicio MySQL
sudo mkdir /var/run/mysqld

# Cambia el propietario del directorio del servicio
sudo chown mysql: /var/run/mysqld

# Arranca MySQL sin permisos ni red
sudo mysqld_safe --skip-grant-tables --skip-networking &

# Logueate sin password
mysql -uroot mysql

Ejecuta este SQL. Cambia SECRETO por una contraseña que te inventes, obviamente.

UPDATE mysql.user SET authentication_string=PASSWORD('SECRETO'), plugin='mysql_native_password' WHERE User='root' AND Host='%';
EXIT;

Arranca MySQL normalmente.

# Apaga MySQL
sudo mysqladmin -S /var/run/mysqld/mysqld.sock shutdown

# Arranca MySQL normalmente
sudo service mysql start

Cómo resetear la clave de Mediawiki

cd /var/www/wikijano
sudo php ./maintenance/changePassword.php --user="jano" --password="SECRETO"

1 COMENTARIO

DEJA UNA RESPUESTA

Por favor ingrese su comentario!

He leído y acepto la política de privacidad

Por favor ingrese su nombre aquí

Información básica acerca de la protección de datos

  • Responsable:
  • Finalidad:
  • Legitimación:
  • Destinatarios:
  • Derechos:
  • Más información: Puedes ampliar información acerca de la protección de datos en el siguiente enlace:política de privacidad