Adrianistán

El blog de Adrián Arroyo


Alojando una web en IPFS

- Adrián Arroyo Calle

En el primer post vimos como interactuar con IPFS de forma sencilla. Ahora vamos a dar un paso más y vamos a alojar una web en IPFS, aprovechando todas las ventajas de escalabilidad y disponibilidad que nos ofrece la red. Para ello usaremos además otro protocolo llamado IPNS, que sería similar a DNS pero en la red IPFS.

Las páginas ideales para IPFS actualmente son las que siguen el JAMstack, es decir, uso extensivo de JavaScript en el cliente, que podrá conectarse a APIs para obtener/actualizar información. Las APIs no tienen por qué ser centralizadas, ya que JavaScript con WebRTC puede buscar peers, posibilitando APIs descentralizadas.

Generando el contenido estático


El primer paso será generar el contenido estático de la web. Para ello existen herramientas muy conocidas como Jekyll, Hugo o Pelican.

No nos vamos a alargar más en esto, ya que cada herramienta tiene sus pasos. El resultado final será una carpeta con ficheros HTML, CSS, fuentes, imágenes y JavaScript.

Subir a IPFS


Teniendo el nodo IPFS en funcionamiento, subimos la carpeta del modo habitual, en mi caso, voy a subir la página que está en http://adrianistan.eu .
ipfs add -r adrianistan.eu/

Y anotamos el último hash.

Comprobamos que la web es accesible, tanto desde la gateway del nodo, como una externa:

Tanto en el nodo local como en uno externo, la web carga perfectamente con el hash

IPFS tiene direccionamiento por contenido


En el post anterior mencionamos que IPFS direcciona por contenido gracias a los hashes. Esto tiene unas consecuencias interesantes. Por ejemplo, si se añade un archivo duplicado a IPFS, este tiene exactamente la misma dirección, ya que comparten hash. Por otro lado, los documentos no se pueden actualizar, porque entonces su hash cambia. Sin embargo en una web queremos cambiar contenido, ahí entra en acción IPNS.

IPNS, gestión de nombres para IPFS


IPNS es un protocolo parecido en intenciones a DNS que redirige un ID única al hash correspondiente en ese momento. Registramos el hash de la web actual en IPNS.
ipfs name publish HASH

Ahora sí, el hash IPNS puede publicarse por la red, ya que siempre apuntará a la última versión de la web.

Para acceder a recursos a través de IPNS tenemos que cambiar de protocolo, en vez de /ipfs/HASH, tenemos que poner /ipns/HASH. Vale tanto para comandos como para las gateways HTTP.

https://cloudflare-ipfs.com/ipns/QmYDVeoadAzk9ZW6zwJK3E3KHrA1LWLveEdqUv4XAcCjKa/

En cualquier momento podemos comprobar a que dirección IPFS apunta el hash IPNS:
ipfs name resolve QmYDVeoadAzk9ZW6zwJK3E3KHrA1LWLveEdqUv4XAcCjKa

Para actualizar el contenido simplemente se vuelve a repetir el paso de ipfs name publish. IPFS automáticamente modificará la redirección de IPNS.

Los contenidos antiguos no desaparecen, pero pueden no ser accesibles ya que ningún nodo tenga copia de ellos.

DNSLink


Aún así, ir dándole a la gente un hash IPNS es demasiado complicado. Afortunadamente, podemos usar el DNS tradicional para indicar una ruta IPNS y así, como veremos, facilitar bastante las cosas.

Para ello añadimos un campo TXT en los DNS de nuestro dominio. El contenido es el siguiente:
dnslink=/ipns/HASH

Con esto podremos usar /ipns/dominio.com en la red IPFS. Pero todavía hace falta un cliente IPFS.

Afortunadamente, podemos redirigir mediante CNAME a una gateway HTTP de confianza y ¡la web funcionará correctamente! Para ello hay que crear un campo TXT en el subdominio _dnslink con el mismo contenido que el anterior.

Todas las gateways de IPFS soportan DNSLink para que la transición a IPFS sea lo más transparente posible.

Así, finalmente la página carga con un dominio normal y corriente en un navegador normal y corriente.

Fijaos en la URL

De hecho, vosotros mismos podéis acceder:

http://adrianistan.yayeyo.ga

IPFS Companion


Si usamos mucho IPFS, puede que nos interese una extensión que maneje el protocolo ipfs:// . Tanto en Firefox como en Chrome existe IPFS Companion, una extensión que nos permite acceder a contenido IPFS de forma sencilla.

Servicio systemd


Por último, quiero dejar el servicio de systemd necesario para tener el nodo IPFS funcionando constantemente en nuestro ordenador. En este caso, IPFS lo instalé vía Snap.
[Unit]
Description=IPFS daemon

[Service]
ExecStart=/snap/bin/ipfs daemon
Restart=on-failure

[Install]
WantedBy=default.target

sudo cp ipfs.service /etc/systemd/user/

sudo systemctl --user start ipfs.service
sudo systemctl --user enable ipfs.service

Y con esto ya tendríamos suficiente como para jugar con IPFS un buen rato.

Comentarios

MD
En comparación con zeronet. ¿No hay manera de generar contenido desde la web? Me explico zeronet tiene una magia (porque no se como funciona) que permite por ejemplo hacer un típico blog, en la que terceros dejan sus comentarios.
aarroyoc
Sí se puede pero todavía es complicado. IPFS todavía no puede usarse en sitios webs dinámicos de forma sencilla. Técnicamente puedes hacer llamadas a IPFS desde el JavaScript de la página, pero funciona de forma similar a la línea de comandos y en general nos encontramos con el problema de que en IPFS las rutas hacen referencia al contenido exacto, así que habría que usar IPNS. Se está trabajando en IPRS, que es una tecnología basada en como funciona IPNS internamente, pero todavía no está implementado. ZeroNet lo que hace es adjuntar una base de datos sqlite como archivo al lado de la web, como las direcciones ZeroNet son más "tradicionales" y no referencian al contenido sino a una "localización", es mucho más fácil hacer cambios.
MD
Uy gracias por responder, estoy un poco espeso con lo del zeronet...a ver si me pongo a estudiarlo. Saludos.
Ivan
Muy interesante el artículo y muy bien detallado. Yo también intenté hacer mi web adecuada para ser alojada en IPFS y ZeroNet a partir de ficheros estáticos, pero me topé con dos problemas principales: 1. Para evitar enlaces internos rotos, es necesario que el programa generador del sitio cree enlaces relativos para todo. En mi caso (con Nikola) la configuración no fue trivial e incluso tuve que retocar las plantillas por defecto. Tal vez esto no sea un problema con otros generadores. 2. A diferencia de ZeroNet, con IPFS es necesario que el nodo propietario de la clave privada correspondiente a la dirección IPNS la refresque cada 24 horas (creo), aún cuando haya otros nodos que posean una copia completa del sitio. En la práctica esto hace necesario que el nodo original esté continuamente accesible, como ocurre con un sitio web normal. Vaya, que es posible pero no es lo más amigable del mundo… ¡Saludos!

Añadir comentario

Todos los comentarios están sujetos a moderación