This website setup
This post is more for my own good if I have to setup my website once again. Maybe someone find it useful.
Tools
Hugo
I use Hugo [1] to generate my website. Hugo is a fantastic tool for generate static web pages in an flexible way.
All pages is written in reStructured Text [2] which is the markup syntax I strongly prefer.
The setup
The server
Everything is running on a virtual server that I hire on Digital Ocean [8]. I have used Digital Ocean since 2015 and it hasn't been any problems whatsoever.
DNS configuration
I have registered my domain at Loopia [7]. In order to point the domain to my server, I have to create a few DNS records:
| Record | Type | TTL | Prio | Data |
|---|---|---|---|---|
| A | 300 | 0 | 46.101.69.237 | |
| @ | A | 300 | 0 | 46.101.69.237 |
| @ | NS | 3600 | 0 | ns1.loopia.se |
| @ | NS | 3600 | 0 | ns2.loopia.se |
| @ | AAAA | 300 | 0 | 2a03:b0c0:3:d0::1845:c001 |
| www | A | 300 | 0 | 46.101.69.237 |
Please note that 46.101.69.237 and 2a03:b0c0:3:d0::1845:c001 is my IPv4 and IPv6 addresses.
Nginx configuration
I do not install nginx on my server but using a docker container that hosts the service. A label-file is needed to tell traefik how it should route.
The label file I use:
traefik.http.middlewares.website0.redirectregex.regex=^https://marcusfolkesson.se/(.*) traefik.http.middlewares.website0.redirectregex.replacement=https://www.marcusfolkesson.se/$1 traefik.http.middlewares.website1.redirectregex.regex=^https://www.marcusfolkesson.se/$ traefik.http.middlewares.website1.redirectregex.replacement=https://www.marcusfolkesson.se/blog/ traefik.http.middlewares.website2.redirectregex.regex=^https://.*mfoconsulting.se/$ traefik.http.middlewares.website2.redirectregex.replacement=https://www.marcusfolkesson.se/blog/ traefik.enable=true traefik.http.routers.website.rule=Host(`www.marcusfolkesson.se`, `marcusfolkesson.se`, `www.mfoconsulting.se`, `mfoconsulting.se`) traefik.http.routers.website.tls.certresolver=myresolver traefik.http.routers.website.middlewares=website0@docker,website1@docker,website2@docker
Great, now start the container:
docker run -d \
--restart=always \
-v /home/marcus/website:/usr/share/nginx/html \
--label-file=labels \
--name marcusfolkesson.se \
--network=web \
nginx
Traefik configuration
Traefik can to a lot of things, but what I use traefik for is only to route incoming request to a certain service (nginx in this case) that can handle them.
As with nginx, traefik is also running in a docker container.
The configuration file (traefik.tml) that I feed the container with:
defaultEntryPoints = ["https", "http"]
[log]
Level = "DEBUG"
[traefikLog]
filePath = "/logs/traefik.log"
format = "json"
[accessLog]
filePath = "/logs/access.log"
format = "json"
[entryPoints]
[entryPoints.http]
address = ":80"
[entryPoints.http.http.redirections.entryPoint]
to = "websecure"
scheme = "https"
[entryPoints.websecure]
address = ":443"
[providers.docker]
exposedbydefault = false
network = "web"
[certificatesresolvers.myresolver.acme.httpChallenge]
entryPoint = "http"
[certificatesresolvers.myresolver.acme]
email = "marcus.folkesson@gmail.com"
storage = "/acme.json"
Then it's only to start the container:
docker run -d \
-v /var/run/docker.sock:/var/run/docker.sock:ro \
-v $PWD/acme.json:/acme.json \
-v $PWD/traefik.toml:/traefik.toml \
-v $PWD/logs:/logs \
-p 80:80 \
-p 443:443 \
--network web \
--name traefik_router2 \
traefik:v2.2.1 -c /traefik.toml
Conclusion
I do not find server administration satisfying at all, but running services inside containers makes it a smooth experience, which I appreciate. Traefik is a hero. There is no mess with SSL certificates and let it handle multiple domains is only another container away.