Raspberry PI as a web server setup guide
Raspberry PIs are cheap. Static site generators result in sites which are easy to serve. Lets encrypt offers free SSL certificates and a great tool for managing them. Cloudflare has an API which can be used for dynamic dns, which is also free. £35 for one off website hosting with SSL is pretty cool. Note: You can use Netlify which offers hosting of your static site for free with SSL included. This is likely a good choice for a “real” website but if you have a pi lying around this is a fun little project.
Set a static IP on the PI to allow a port forwarding rule to be setup which will survive server reboots.
Open /etc/dhcpd.conf
sudo reboot
Now setup 2 port forwarding rules on your router. One for port 80 and one for port 443. Normally your router will have a web interface where you can configure such things.
Install Nginx to serve your website. Its a relatively lightweight webserver unlike the more traditional apache.
sudo apt update sudo apt install -y nginx
Link your site to the default
sudo ln -s /home/user/yoursite /var/www/html
Install docker
sudo apt-get install apt-transport-https ca-certificates software-properties-common -y curl -fsSL get.docker.com -o get-docker.sh && sh get-docker.sh sudo usermod -aG docker pi
Add the following to /etc/sources.list
deb https://download.docker.com/linux/raspbian/ stretch stable
sudo apt-get update sudo apt-get upgrade systemctl start docker.service
To check it is installed correctly.
docker info
Move your domain to cloudflare. This process might take 24-48 hours and initially involves opening an account, adding your domain, and then
Install cloudflare dynamic dns updater and run it via docker.
https://github.com/oznu/docker-cloudflare-ddns
Setup certbot
You need to also delete /etc/pip.conf as it will break lets encypt install process.
https://certbot.eff.org/lets-encrypt/pip-nginx
Open 80 and 443 on your router and setup port forwarding to your raspberry pi. Dont expect lightning performance but it is indeed a capable tool for serving static content. Who needs the ‘cloud’?!