/ Software

Tutorial, Tu propio blog con Ghost-nginx-ubuntu

Hay muchas formas de hacer lo mismo

Esta es una de ellas, en mi opinión es la mejor, pero las opiniones pueden variar, Ahí les va.

1. Instalar Ubuntu

Esta parte es tan sencilla que no tiene caso explicarla, hablando de servidores, prefiero utilizar el disco de instalación minima (Link aqui) que te permite entre otras cosas seleccionar solo los paquetes que requieres para correr tu servicio, adicionalmente, prefiero la versión mas reciente, que no es necesariamente una versión LTS, pero todo esto lo puedes decidir tu, después de todo, es tu servidor

Una cosa mas, siendo Ubuntu basado en debian, lo mas probable es que este tutorial funcione para otros sistemas operativos basados en debian

Los comandos en esta guía, están diseñados para ser utilizados con el usuario root pero seguramente un usuario normal con sudo podrá ejecutarlos también

ademas asumiré que estas usando ssh para trabajar en tu servidor, aunque no es completamente necesario

2. Actualiza e instala tus paquetes

Actualizar es una lata, no me gusta hacerlo, pero cuando no lo haces, generas otros problemas que tampoco me gusta resolver, afortunadamente, ya existen servicios que se encargan de eso por ti, en ubuntu, el servicio se llama <unattended-upgrades>, es una maravilla, actualiza tu software, puedes configurarlo para reiniciar a cierta hora cuando la actualización lo requiere, y también para deshacerse de los paquetes que ya no usas.

el comando es:

 apt-get install unattended-upgrades

el archivo de configuración es /etc/apt/apt.conf.d/50unattended-upgrades y es bastante claro así que no entrare en detalles

ahora solo queda actualizar e instalar los paquetes necesarios de los repositorios de ubuntu y reiniciar (mejor reiniciar de una vez, es muy probable que sea requerido)

apt-get update; apt-get install build-essential nginx curl unzip; apt-get dist-upgrade; reboot
3. Instala Node.js

Node.js es un entorno en tiempo de ejecución multiplataforma, basado en el motor V8 de Google, es indispensable para hacer funcionar Ghost

Aunque Node.js se encuentra en los repos de Ubuntu, no pude hacer funcionar ghost con la version disponible ahi, puede que esto cambie con el tiempo, pero de momento, obtendremos nuestro Node.js del PPA oficial.

la versión LTS 6.x es soportada hasta abril de 2018 y funciono muy bien con la versión actual de ghost, para obtenerla usaremos el siguiente script:

curl -sL https://deb.nodesource.com/setup_6.x -o nodesource_setup.sh

Puedes examinarlo (te recomiendo que lo hagas), lo único que hace es agregar una fuente mas a tu gestor de paquetes, ahora hay que ejecutarlo.

bash nodesource_setup.sh

despues de ejecutarlo, solo queda instalar nodejs

apt-get update; apt-get install nodejs
4. Instala Ghost

Ahora ghost, puedes bajar la versión mas reciente ghost para comenzar, actualizar ghost es relativamente sencillo, pero siempre es mejor comenzar con la ultima versión estable.

wget https://ghost.org/zip/ghost-latest.zip

puedes extraer su contenido donde quieras, pero este contenido, debe ser accesible desde nginx, personalmente, recomiendo /var/www/ghost.

todas las publicaciones de tu blog se almacenaran en content dentro del directorio donde decidas extraer el zip, así que considera algún medio de almacenamiento separado (yo prefiero NAS) para separar el contenido de tu blog, del disco utilizado por tu servidor, nunca se sabe cuando decidirás moverte a un servidor diferente o a la nube (a mi me gusta Digital Ocean).

una vez extraído, comencemos:

cd /var/www/ghost
npm install --production

Esto tomara un tiempo, si haz seguido las instrucciones hasta ahora, lo mas probable es que no tengas errores, pero de ser así, el comando arrojara detalles sobre donde te equivocaste, solo basta corregir y seguir adelante. Si todo sale bien, veras que el comando termina sin complicaciones y te dirá que todo va de acuerdo a plan

El archivo de configuración de ghost es /var/www/ghost/config.js y aun no existe, afortunadamente, hay un archivo ejemplo llamado config.example.js, solo hay que copiarlo y editarlo un poco

 cp config.example.js config.js

busca dentro del archivo la sección de producción y haz los ajustes apropiados.

     ....    
config = {
     // ### Production
     // When running Ghost in the wild, use the production environment.
     // Configure your URL and mail settings here
production: {
         url: 'https://Tu_propio_dominio_o_IP',
         mail: {},
         database: {
             client: 'sqlite3',
             connection: {
                 filename: path.join(__dirname, ntent/data/ghost.db')
             },
        debug: false
        },

        server: {
            host: '127.0.0.1',
            port: '2368'
        }
},
     .... 

lo único que hay que hacer es sustituir la porción de tu dirección, puedes usar tu dominio si tienes uno, o tu ip, si no tienes.

Los dominios ya son muy baratos y muy fáciles de usar (igual y luego platico un poco sobre dominios), en cuanto a proveedores, me gusta Namecheap.

La s hace que todo el trafico hacia ghost este encriptado (se acuerdan de mi post?, apenas fue ayer), recomiendo que hagan el cambio, cuando tengan su dominio y sus certificados, por lo pronto, pueden dejar la configuración sin la s.

Y Listo, ghost esta listo para funcionar, aunque no es el final del post, ustedes pueden terminar aquí, lanzandolo con el siguiente comando.

npm start --production
5. Configurando Ghost

El servicio de ghost seguira funcionando en el foreground hasta que tu decidas, pero no es la mejor manera de correr servicios (a menos que te guste esa onda de los microservicios y docker, después platicamos de esos).

Lo ideal seria que el servicio funcionara en el background y de preferencia con un usuario que no fuera root, y de preferencia sin privilegios muy avanzados. comencemos por ahi

Agregar un usuario en linux puede ser tan sencillo o complicado como quieras, entre mas tiempo inviertas en tus decisiones mejor quedara tu ambiente, seleccionar uid, gid, y demas opciones, las considero importantes, pero a momentos, son irrelevantes, para el caso en cuestión un simple comando:

 useradd -s /bin/bash ghost

Después, hay que aseguraros que el usuario ghost tenga todos los permisos necesarios en los archivos de ghost

chown -R ghost:ghost /var/www/ghost/

Para transformarlo en servicio, crearemos un archivo llamado ghost.service y lo pondremos en el directorio /etc/systemd/system/ puedes hacerlo omo quieras, pero debe pertener a root, y debe contener la siguiente informacion (asegurate de cambiar la ruta de ghost para coincidir con la ruta que tu estas usando)

[Unit]
Description=Ghost
After=network.target

[Service]
Type=simple

WorkingDirectory=/var/www/ghost
User=ghost
Group=ghost

ExecStart=/usr/bin/npm start --production
ExecStop=/usr/bin/npm stop --production
Restart=always
SyslogIdentifier=Ghost

[Install]
WantedBy=multi-user.target

Para iniciar el servicio usaremos el comando

systemctl start ghost.service

Para asegurarnos que el servicio inicie automaticamente en caso de un reinicio usaremos el siguiente comando

systemctl enable ghost.service
6. Configurando nginx

Como algunos de ustedes notaron, el servicio de ghost escucha en 127.0.0.1:2368

Usaremos nginx como proxy, redireccionando las solicitudes web, hacia el servicio de ghost, ademas de agregar una capa mas de seguridad, te permitirá hostear distintos portales web en un solo servidor/cluster, puedes poner tu blog en blog.tudominio.com y tu pagina personal en www.tudominio.com, o una tiendita en shop.tudominio.com, nginx no es el único que hace eso, pero a mi me gusta y se aguantan.

Comencemos por agregar un archivo de configuracion llamado /etc/nginx/sites-available/ghost

server {
    listen 80;
    # Manten esto comentado hasta que tengas tu certificado
    # listen 443 ssl;

    server_name tu_dominio_o_IP;
    root /usr/share/nginx/html;

    # Estas lineas deberán permanecer comentadas hasta que tengas tus certificados, luego regresas a quitar el # de las siguientes lineas,porque ahorita, ni certificados tienes
    # ssl_certificate /etc/letsencrypt/live/tu_dominio_o_IP/fullchain.pem;
    # ssl_certificate_key /etc/letsencrypt/live/tu_dominio_o_IP/privkey.pem;

    # Esta seccion le permitira al certbot hacer su chamba
    location ~ /.well-known {
        allow all;
        # Esto prevendra cualquier tipo de redirect mientras el cerbot hace su chamba
        break;
    }

    location / {
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_set_header X-NginX-Proxy true;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
        # Aqui es donde redireccionas las solicitudes hacia tu servicio Ghost
        proxy_pass http://localhost:2368;
        # Aqui evitamos que nginx haga redirecciones raras con tu sitio
        proxy_redirect off;
    }
}

Ahora que tenemos nuestro archivo listo, haremos un enlace suave en el directorio /etc/nginx/sites-enabled/

ln -s /etc/nginx/sites-available/ghost /etc/nginx/sites-enabled/ghost

y borraremos el archivo que anda por ahí estorbando

rm /etc/nginx/sites-enabled/default

ejecutaremos el comando nginx -t para verificar que no existan errores sintacticos y ahora reiniciamos el servicio

service nginx restart

ahora seguramente puedes visitar tu nuevo blog en http://tu_dominio_o_IP

7. Certificado SSL

Ahora que ya tienes tu blog, no seria bonito agregarle SSL?

bueno, ahora es mas rápido que nunca, gracias a Certbot

si haz seguido este tutorial hasta aqui, basta con instalar certbot:

add-apt-repository ppa:certbot/certbot
apt-get update; apt-get install certbot

y despues, lanzar a certbot a hacer tu trabajo (recuerda sustituir en el comando tu dominio o tu ip)

certbot certonly -a webroot --webroot-path=/usr/share/nginx/html -d Tu_Dominio_o_IP

y si todo salio bien, ya tienes tus certificados, donde te dije que iban a estar, te acuerdas? en el archivo de configuración de nginx?

recuerda Quitar los # donde te dije que podías quitarlos, y agregar las s donde te dije que podías agregarla

8. Todo atrás de UFW

UFW Es un firewall diseñado para ser de fácil uso desarrollado por Ubuntu. (nomas es un iptables para los que no les gusta el iptables)

ya viene preinstalado, pero deshabilitado, y te servirá para proteger tu servidor de ataques básicos.

Para nuestro servidor, solo hay que ejecutar lo siguiente:

ufw allow 'Nginx HTTP'
ufw allow 'Nginx HTTPS'
ufw allow 'OpenSSH'
ufw enable

Cada servicio fue permitido por separado, te toca decidir que permitir y que bloquear.

Listo, verdad que fue muy fácil?

Conclusiones

Eso fue todo gente, espero alguien lo lea algún día, prometo luego poner otros tutoriales sobre alguna otra babosada.

SI LES GUSTA ME DICEN, Y SI NO, PUES DE TODOS MODOS YA LO HICE