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"
Buen tutorial. ¿Qué opinas de Docusaurus, el gestor de documentación creado por Facebook?
https://docusaurus.io/