From e6a94943860e40b570bf536bad8ad860a2f26b23 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian-Samuel=20Geb=C3=BChr?= Date: Sun, 16 Jul 2023 23:21:43 +0200 Subject: [PATCH] Add post on static sites with traefik --- content/post/static-sites-with-mash.md | 171 ++++++++++++++++++ .../static-sites-with-traefik/html.png | Bin 0 -> 39919 bytes 2 files changed, 171 insertions(+) create mode 100644 content/post/static-sites-with-mash.md create mode 100644 static/uploads/static-sites-with-traefik/html.png diff --git a/content/post/static-sites-with-mash.md b/content/post/static-sites-with-mash.md new file mode 100644 index 0000000..1ea879a --- /dev/null +++ b/content/post/static-sites-with-mash.md @@ -0,0 +1,171 @@ +--- +title: "Hosting static sites with Traefik" +date: 2023-07-16T15:10:10+02:00 +draft: false +image: "/uploads/static-sites-with-traefik/html.png" +categrories: ['English'] +tags: ['MASH', 'hugo', 'english', 'ansible', 'traefik', 'SWS'] +--- + +# Hosting Static Sites with [Traefik](https://traefik.io/) and [Static Web Server](https://static-web-server.net/features/docker/#run-a-container) + +Traefik is amazing to host complex services like with containers. On the other hand it's harder than you'd think to host a simple static html site. I wanted to share my current approach that is based on [Static Web Server Project](https://static-web-server.net/features/docker/#run-a-container). + + +## Static Web Server (SWS) + +Static Web Server (or SWS abbreviated) is a simple and really fast web server with the goal to serve static web files or assets. The tiny docker image is only 4 MB with a small memory footprint. We can therefore afford to run a container for each static site. + +## Architecture + + +On the server we set up all static sites in one folder called `static-sites`. As we run the SWS with [docker-compose](https://docs.docker.com/compose/) we add the `docker-compose.yml` to this folder too. The following is an example setup with two static sites on seperate domains. + + +``` +| static-sites +| +| docker-compose.yml +| - domain1.example.org + | - index.html +| - domain2.example.org + | - index.html + | - fonts + | - Open-Dyslexic.odf +``` + +For each domain we add a folder. I like to name them by the domain name but this is not necessary (just remember the volume in the `docker-compose.yml` too). + +With this done we can now fill the appropriate information in the `docker-compose.yml`. Copy the following and replace `domain1.example.org`, `domain2.example.org`, `site-one` and `site-two`. + + +```yaml +version: "3.3" + +services: + domain1.example.org: + image: joseluisq/static-web-server:2 + container_name: "domain1.example.org" + environment: + # Note: those envs are customizable but also optional + - SERVER_PORT=8080 + - SERVER_ROOT=/public + - SERVER_LOG_LEVEL=info + volumes: + - ./domain1.example.org:/public + labels: + - "traefik.enable=true" + - "traefik.docker.network=traefik" + - "traefik.http.routers.site-one.rule=Host(`domain1.example.org`)" + - "traefik.http.routers.site-one.service=site-one" + - "traefik.http.routers.site-one.entrypoints=web-secure" + - "traefik.http.routers.site-one.tls=true" + - "traefik.http.routers.site-one.tls.certResolver=default" + - "traefik.http.services.site-one.loadbalancer.server.port=8080" + networks: + - traefik + + domain2.example.org: + image: joseluisq/static-web-server:2 + container_name: "domain2.example.org" + environment: + # Note: those envs are customizable but also optional + - SERVER_PORT=8080 + - SERVER_ROOT=/public + - SERVER_LOG_LEVEL=info + volumes: + - ./domain2.example.org:/public + labels: + - "traefik.enable=true" + - "traefik.docker.network=traefik" + - "traefik.http.routers.site-two.rule=Host(`domain2.example.org`)" + - "traefik.http.routers.site-two.service=site-two" + - "traefik.http.routers.site-two.entrypoints=web-secure" + - "traefik.http.routers.site-two.tls=true" + - "traefik.http.routers.site-two.tls.certResolver=default" + - "traefik.http.services.site-two.loadbalancer.server.port=8080" + networks: + - traefik + +networks: + traefik: + name: traefik + external: true +``` + +This assumes traefik runs in a docker-network called traefik. This network must already exist. + + +As a last step add at least a `index.html` in the appropriate folder. Then you can start the webserver with `docker-compose up`. Add `-d` to run it in the background. + + +# Deploying static sites + +Deploying files manually (via Filezilla, scp or rsync) is not something I like to do. I therefore normally set up a CI job to automatically deploy the site when I push a new commit to GitHub, either via GitHub Actions or my [Woodpecker CI](https://woodpecker-ci.org/docs/usage/intro) instance. + +I order to do that I + +* create a new user on the server, specifically for that purpose (one per site). The command is `useradd USERNAME -m` +* create a SSH key without a password `ssh-keygen -t ed25519 -a 100 -C "COMMENT" -f FILENAME` +* copy the public key that was just created at `FILENAME.pub` on the server in the textfile `/home/USERNAME/.ssh/authorized_keys` +* Add the private key to the secrets of your CI + +A typical CI configuration will look like this with a static site and GitHub Actions + +```yaml +name: Deploy Production Website via SSH + +on: + push: + branches: [main] + +jobs: + build: + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v1 + - name: Deploy to Server + uses: easingthemes/ssh-deploy@main + env: + SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }} + ARGS: "-rltgoDzvO --delete" + SOURCE: "" + REMOTE_HOST: ${{ secrets.REMOTE_HOST }} + REMOTE_USER: ${{ secrets.REMOTE_USER }} + TARGET: ${{ secrets.REMOTE_PRODUCTION_TARGET }} + EXCLUDE: ".github/, .gitignore" +``` + +or this, when using [HUGO](https://gohugo.io/) and Woodpecker CI + +```yaml +--- + +pipeline: + build: + image: klakegg/hugo + commands: + - hugo + + deploy: + image: appleboy/drone-scp + settings: + strip_components: 1 + host: + - example.org + username: moanos + target: /home/USERNAME/static-sites/ + source: public/ + key: + from_secret: ssh_key + +``` + + + + + + +not manually put the files on the server diff --git a/static/uploads/static-sites-with-traefik/html.png b/static/uploads/static-sites-with-traefik/html.png new file mode 100644 index 0000000000000000000000000000000000000000..d7252ba5a6b87529f7d8e658cc101b367a8dbeba GIT binary patch literal 39919 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 V?