This article describes how to host a web site on IPFS.
Requirements:
Access to a Registered Domain and DNS records.
Edit your DNS to point the A record to the IPFS server. We will need this to resolve in order to install a Let’s Encrypt Certificate.
Lets Start with an Update
# sudo apt update # sudo apt upgrade -y
Lets create a new user account to run IPFS and switch to it:
# adduser ipfs
Install sudo
# apt install sudo
Edit sudo and add the ipfs user
# visudo
Add the IPFS user below root
# User privilege specification root ALL=(ALL:ALL) ALL ipfs ALL=(ALL:ALL) ALL
change to the IPFS user.
# su ipfs
Install IPFS
Get the latest release at https://dist.ipfs.tech/#kubo
$ wget https://dist.ipfs.tech/kubo/v0.16.0/kubo_v0.16.0_linux-amd64.tar.gz $ tar xfv kubo_v0.16.0_linux-amd64.tar.gz $ cd kubo ./install.sh
Initialize IPFS:
$ ipfs init --profile=server
Switch to the root user:
$ exit
Allow the ipfs user to run long-running services by enabling user lingering for that user:
# loginctl enable-linger ipfs
Create the file /etc/systemd/system/ipfs.service with this content:
# nano /etc/systemd/system/ipfs.service
[Unit] Description=IPFS Daemon After=syslog.target network.target remote-fs.target nss-lookup.target [Service] Type=simple ExecStart=/usr/local/bin/ipfs daemon --enable-namesys-pubsub User=ipfs [Install] WantedBy=multi-user.target
Enable and start the service:
# systemctl enable ipfs # systemctl start ipfs
IPFS should be up and running, and start when the server boots.
Check IPFS
$ su ipfs $ ipfs swarm peers
Add Website Files
Create a folderfor your website files. Add this folder in the ipfs/home directory
$ cd ~ $ mkdir mysitefiles
Upload the site files to the directory. Now we can add these to IPFS with the following contect
$ ipfs add -r <path>
This adds all contents of the folder at to IPFS, recursively. You should see output similar to this:
$ ipfs add -r mysitefiles
Output:
ipfs add -r mysitefiles/ added QmZrSe9TABdSsWL38FJTp4fW7TposFuzRLSBRYAEMVt1RE mysitefiles/about.html added Qmdf1mYmCjivJWcXpGikf87PV5VkBo6DQugsjq6GdNZ1az mysitefiles/index.html added QmW8U3NEHx3p73Nj9645sGnGa8XzR43rQh3Kd52UKncWMo mysitefiles/moon-logo.png added QmQ91HDqAt1eE7X4DHuJ9r74U3KgKN3pDGidLM6sadK2q2 mysitefiles 12.66 KiB / 12.66 KiB [==================================================================================================] 100.00%
Each of the long sequence of numbers is called a Content Identifier or CID. These are cryptographically hashed. We can now check to see if the site loads. You can check and use an active gateway here: https://ipfs.github.io/public-gateway-checker/
Add the main Content Identifier (CID) folder ID to the URL. How to link to content on IPFS.
https://ipfs.io/ipfs/<CID> # e.g https://ipfs.io/ipfs/QmQ91HDqAt1eE7X4DHuJ9r74U3KgKN3pDGidLM6sadK2q2
Now we can set up the DNS records. See: https://dnslink.io/#introduction
Login to manage your DNS. Add the following TXT Record:
dnslink=/ipfs/QmQ91HDqAt1eE7X4DHuJ9r74U3KgKN3pDGidLM6sadK2q2
Install nginx with Let’s Encrypt SSL certs
Change to root
$ su root
# apt-get update # apt-get install nginx
Check status to make sure it started and is not throwing any errors:
$ systemctl status nginx
Results
● nginx.service - A high performance web server and a reverse proxy server Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: en Active: active (running) since Wed 2021-06-16 22:59:51 UTC; 1min 44s ago Docs: man:nginx(8) Process: 13062 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process Process: 13063 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (cod Main PID: 13064 (nginx) Tasks: 2 (limit: 1163) Memory: 5.3M CGroup: /system.slice/nginx.service ├─13064 nginx: master process /usr/sbin/nginx -g daemon on; master_pr └─13065 nginx: worker process Jun 16 22:59:51 ip-10-0-1-209 systemd[1]: Starting A high performance web server Jun 16 22:59:51 ip-10-0-1-209 systemd[1]: nginx.service: Failed to parse PID fro Jun 16 22:59:51 ip-10-0-1-209 systemd[1]: Started A high performance web server lines 1-16/16 (END)
Get your IP and open it with browser to make sure Nginx is serving its default page:
$ curl -s domain.com $ curl -s Ip_address
Now browse to http://your-ip-here and you should see the Nginx default page “Welcome to Nginx”.
Set Up your nginx configs:
$ sudo mv /etc/nginx/sites-available/default /etc/nginx/sites-available/default_back # sudo nano /etc/nginx/sites-available/default
Copy and paste this config (change example.com to your domain)
server { server_name example.com www.example.com; server_tokens off; listen 80; listen [::]:80; listen 443 ssl; listen [::]:443 ssl; location / { proxy_pass http://localhost:8080; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; } }
Test that new config syntax and make sure it is ok:
$ sudo nginx -t
If all good reload:
$ sudo systemctl reload nginx
Add Lets Encrypt according to this article – https://www.geekdecoder.com/set-up-lets-encrypt-on-debian-10/
The final config should resemble this:
server { server_name example.com www.example.com; server_tokens off; location / { proxy_pass http://localhost:8080; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; } listen [::]:443 ssl ipv6only=on; # managed by Certbot listen 443 ssl; # managed by Certbot ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; # managed by Certbot ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; # managed by Certbot include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot } server { if ($host = www.example.com) { return 301 https://$host$request_uri; } # managed by Certbot if ($host = example.com) { return 301 https://$host$request_uri; } # managed by Certbot server_name example.com www.example.com; listen 80; listen [::]:80; return 404; # managed by Certbot }
The site should now be available.