I have an "amazing" website here www.themwebs.me it's fast simple and cheaply hosted with a yearly fixed cost on a VPS with www.hostinger.com.
I wanted a space where I could play with stuff, containers, apis, test tools, test web frameworks, backend and frontend.
Specifically: I needed a place to host backend APIs that I might create like this one made with with python using Flask.
I have these apps running:
Now if playing with servers is not your jam, stop reading and head over to your favourite backend as service or serverless platforms those are great too I use them often.
knowledge about docker is assumed. I will be focusing on Traefik and configuring it more than docker basics.
We will be building a small microservices architecture on our server using docker.
It looks like this:
So that we can quickly deploy backend api using any language. It's fun to try out new languages and frameworks e.g Deno, Rust and maybe some Go lang in the future. This way we will be able to deploy the code and have live URL's to test with.
We will be using docker, docker compose and Traefik as the proxy to containers.
I have already set up a repo with different "services" here.
- one folder per service, each service has it's own Dockerfile
- a single
docker-compose file to start the services from the root.
Traefik is an open-source Edge Router that makes publishing your services a fun and easy experience. It receives requests on behalf of your system and finds out which components are responsible for handling them.
Imagine you have a website at www.website.com and an api at api.website.com, Traefik will direct the request to the appropriate service based on the sub domain.
Traefik will also help create SSL certificates using ACME provider Lets Encrypt.
This is configured via a .toml configuration file called traefik.toml and traefik_dynamic.toml. In these configuration files we specify:
- Entry points,
- Middlewares, e.g SSL certificate resolver.
- Services Traefik supports
Read file here
# Network entry points into Traefik, defines which port will get accept traffick on either TCP or UDP
address = ":80"
to = "websecure"
scheme = "https"
address = ":443"
# Enables the monitoring dashboard, a docker container itself, it shows you an overview of all your running containers (services)
dashboard = true
# Certificate resolver, tells Traefik which certificate generator to use and configures the admin email.
email = "firstname.lastname@example.org"
storage = "acme.json"
# specifies which provider you are using, there are a few supported ones (Kubernetes, Marathon, Rancher)
watch = true
network = "web"
# imports an extension configuration file for more traefik settings
filename = "traefik_dynamic.toml"
Read file here
# Here we configure Middleware and HTTP Routers
# Middleware are plugins that enable and can extend the features of Traefik
# We are using the basicAuth on here to allow us to protect our admin portal website that shows our running containters
# users: tells it which are the authenticated users.
users = [
# Router configuration
# Rule: which url must Traefik must assign to the container that runs the web portal site, so entering https://monitor.company.com will load the admin site.
# entrypoint: the name of middleware to use which is simpleAuth
# service: which service is it, it is "api" and it is an internal one
# certResolver: tells Traefik to use lets-encrypt as the provider.
rule = "Host(`monitor.company.com`)"
entrypoints = ["websecure"]
middlewares = ["simpleAuth"]
service = "api@internal"
certResolver = "lets-encrypt"
Admin page running on monitor.company.com domain, secured behind a username and password
Here is sample of my server showing the containers running on their respective ports
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a153cafbc934 factbookapi "flask run --host 0.…" 2 weeks ago Up 2 weeks 5000/tcp factbookapi-service
9a32240c2384 musicwall "docker-entrypoint.s…" 2 weeks ago Up 2 weeks 3000/tcp musicwall-service
a4d4ad1cd697 home "/docker-entrypoint.…" 2 weeks ago Up 2 weeks 80/tcp home-service
1346eb22b039 traefik:v3.0 "/entrypoint.sh --ac…" 2 weeks ago Up 2 weeks 0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp traefik
That will do for now, take a break and we will dive into the docker parts in part 2.
Stay up to date
Consider keeping up to date with software development and design by signing up to my newsletter.I will only email you when I make a new post.