summaryrefslogtreecommitdiff
path: root/_posts/es/2023-08-31-host_jekyll_apache.md
blob: 62eec05dac28fabfe4abe8cf83453a86e11e18c2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
---
layout: post
title: "Cómo hostear tu sitio de Jekyll en Apache2"
lang: es
date: 2023-08-31
tag: Tutoriales
---

Pues finalmente tengo un blog personal justo como lo quiero. No diría que fue tardado (me tomó un par de días) o que mejor hubiera
usado alguna alternativa más compleja, como WordPress. Pero he de reconocer que no fue tan sencillo cómo lo esperaba. Fuera de las
personalizaciones que hice al tema que utilizo, creo que el mayor responsable de mi sufrimiento fue apache.

Así que creo que una guía de qué hacer para hostear un sitio estático hecho con jekyll en un VPS con apache2 es buena idea para un
primer post, así que vamos para allá. Nota, ya asumo que tienes tu sitio en jekyll y sólo buscas desplegarlo a tu servidor, así que
omitiré el cómo generarlo.

# Requisitos
- Un VPS, ya sea con un proveedor de hosting como vultr o una computadora prendida 24/7 en tu casa. Sólo cerciórate de que sea accesible
  al internet (que tenga una IP pública fija), que es lo importante.
- Alguna distribución linux instalada como sistema operativo en tu servidor. Yo uso Debian pero las instrucciones que aquí mostraré son
  independientes de la distribución.
- Apache2
- Ruby; recomiendo usar [rbenv][rbenv]

# Apache2
Si deseas tener tu sitio en el directorio principal de apache (en debian es /var/www/html/) y por ende, en tu dominio principal (no subdominio)
entonces no hay más configuración extra que la que mostraré. Si en cambio hostearás tu blog en un subdominio, ten en cuenta que hay algunas
cosas que tendrás que tomar a consideración, como el nombre del servidor y el directorio donde residirá tu blog.

Buscamos, o bueno, yo buscaba dos cosas: **internacionalización** y **URLs bonitos**. La configuración que mostraré a continuación toma en
cuenta estos dos puntos, y los logra mediante [mod_rewrite][mod_rewrite].

```apache
<VirtualHost _default_:443>
	ServerName example.com

	DocumentRoot /var/www/html/
	DirectoryIndex index.html	
		
	RewriteEngine On
	RewriteRule ^/(page[1-9]+)$ %{DOCUMENT_ROOT}/$1/index.html
	RewriteRule ^/en/(page[1-9]+)$ %{DOCUMENT_ROOT}/en/$1/index.html
	RewriteRule ^/en/$ %{DOCUMENT_ROOT}/en/index.html
	RewriteCond %{REQUEST_FILENAME} !-f
	RewriteCond %{REQUEST_FILENAME} !-d	
	RewriteRule ^([^\.]+)$ $1.html [NC,L]
	
	ErrorDocument 404 "/not-found"

	ErrorLog ${APACHE_LOG_DIR}/error.log
	CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
```

Las dos primeras reglas son para paginación, utilizando la rubygem jekyll-paginate. Si no
utilizarás paginación puedes omitirla, aunque recomiendo que si hagas uso de ella.

La segunda es un caso, por ahora sólo tendré el blog en español e inglés, aunque si deseo,
en el futuro, agregar un tercer idioma, podría cambiar la expresión regular a:

`^/(en|fr)/(page[1-9]+)$`

Lo mismo para la siguiente expresión regular, que se ocupa de servir el índice en cada idioma.
Las otras tres que le siguen son para tener URLs bonitos (sin la extensión de los archivos).

La última configuración es la página que mostrará el servidor web siempre que haya un 404, lo más
probable es que el tema que estés utilizando tenga una, y si no, vale la pena crearla pues la que
muestra apache no es particularmente bonita.

# Permisos de usuario

El directorio /var/www/html suele pertenecer al grupo y usuario www-data, pero si gustas puedes añadirte
a este grupo o mejor, convertirte en el dueño:

{% highlight shell %}
sudo chown -R $(whoami) /var/www/html
{% endhighlight %}

Esto es útil si deseas hacer uso de hooks en tu repositorio de git, para que con cada cambio la página
se actualice automáticamente, así no le tendrías nada que envidiar a un blog en wordpress.

# Deploy hook

Si usas un usuario especial como dueño de tus repositorios de git como yo, (mi usuario git en mi VPS no
tiene acceso a una terminal por ejemplo) entonces puedes crear otro repositorio remoto y apuntar hacia él:

## Servidor

{% highlight shell %}
git --bare init tu_blog.git
cd tu_blog.git
touch hooks/post-receive
{% endhighlight %}

## Cliente (donde escribas tus entradas)

{% highlight shell %}
git remote add deploy tu_usuario@example.com:/home/tu_usuario/tu_blog.git
git push deploy
{% endhighlight %}

## Script post-receive

Ahora, el script que se ejecutará cada que hagas git push es el siguiente, cortesía de la [documentación de jekyll][jekyll_docs].
Lo modifiqué pues yo uso rbenv, será tu caso si también lo utilizas, pero si instalaste ruby y bundler con, por ejemplo, tu gestor
de paquetes, entonces no necesitarás añadir el directorio de tus rubygems a tu PATH, pero si instalaste ruby de otra forma, si es
necesario.

```bash
#!/bin/bash -l

export GEM_HOME=$HOME/.rbenv/shims/
export PATH=$GEM_HOME:$PATH

GIT_DIR=$HOME/blog.git
TMP_GIT_CLONE=$HOME/tmp
GEMFILE=$TMP_GIT_CLONE/Gemfile
PUBLIC_WWW=/var/www/html # Usa el directorio desde donde sirvas tu blog.

git clone $GIT_DIR $TMP_GIT_CLONE
BUNDLE_GEMFILE=$GEMFILE bundle install
BUNDLE_GEMFILE=$GEMFILE bundle exec jekyll build -s $TMP_GIT_CLONE -d $PUBLIC_WWW
rm -Rf $TMP_GIT_CLONE
exit
```

# Conclusiones

Pues ese fue el _setup_ de mi página web. Personalmente pienso que si hay cierta barrera técnica, y es una lástima porque
jekyll cubre con creces muchos casos de uso, pero a los usuarios técnicos a veces se nos olvida que lo que es fácil para
nosotros, como un git push, es magia negra para otros, ya no hablemos del tocho de configuración que usa nuestro servidor
apache o haber tenido que escribir un hook de git. Aún así, disfruto de jekyll, y disfruté de este proceso, y espero que
tú también lo hagas.

[rbenv]: https://github.com/rbenv/rbenv
[mod_rewrite]: https://httpd.apache.org/docs/2.4/rewrite/intro.html
[jekyll_docs]: https://jekyllrb.com/docs/deployment/automated/