summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRomain Gonçalves <me@rgoncalves.se>2021-01-18 12:52:27 +0100
committerRomain Gonçalves <me@rgoncalves.se>2021-01-18 12:52:27 +0100
commite80f58116a9ecd67b2febe06778c624fd42ed1c6 (patch)
tree7200fc2c0da09bd7386bc74c2a538ac5bebd37e3
downloadold-website-e80f58116a9ecd67b2febe06778c624fd42ed1c6.tar.gz
Restart repo from scratch
-rw-r--r--.gitignore1
-rw-r--r--config.toml17
-rw-r--r--content/services.md23
-rw-r--r--content/writeups/_index.md6
-rw-r--r--content/writeups/archlinux_installation.md181
-rw-r--r--content/writeups/homelab.md59
-rw-r--r--content/writeups/lockdown-chapter-2.md88
-rw-r--r--content/writeups/wireguard_and_ipv6.md56
-rwxr-xr-xdeploy9
-rw-r--r--httpd.conf22
-rw-r--r--sass/style/cgit.sass589
-rw-r--r--sass/style/common.sass32
-rw-r--r--sass/style/style.sass98
-rw-r--r--static/fonts/IBMPlexMono-Medium.woffbin0 -> 51872 bytes
-rw-r--r--static/fonts/Terminus.woffbin0 -> 40524 bytes
-rw-r--r--static/images/external.svg6
-rw-r--r--static/images/grafana_01.jpgbin0 -> 127464 bytes
-rw-r--r--static/images/homelab_front_01.jpgbin0 -> 255450 bytes
-rw-r--r--static/images/homelab_old_01.jpgbin0 -> 255662 bytes
-rw-r--r--static/images/homelab_wip_01.jpgbin0 -> 256994 bytes
-rw-r--r--static/images/homelab_wip_02.jpgbin0 -> 254156 bytes
-rw-r--r--static/images/openbsd_drawing_01.jpgbin0 -> 256838 bytes
-rw-r--r--static/images/r710_and_switch.jpgbin0 -> 255880 bytes
-rw-r--r--static/logo.jpgbin0 -> 267363 bytes
-rw-r--r--static/logo.pngbin0 -> 1291 bytes
-rw-r--r--static/public/pgp.pub.txt110
-rw-r--r--sync1
-rw-r--r--templates/base.html35
-rw-r--r--templates/directory-page.html7
-rw-r--r--templates/directory.html9
-rw-r--r--templates/index.html30
-rw-r--r--templates/robots.txt2
-rw-r--r--templates/sitemap.xml1
-rwxr-xr-xupdate_images15
34 files changed, 1397 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..1fb9ef5
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+tmp/*
diff --git a/config.toml b/config.toml
new file mode 100644
index 0000000..7e18c5a
--- /dev/null
+++ b/config.toml
@@ -0,0 +1,17 @@
+# The URL the site will be built for
+base_url = "http://rgoncalves.se"
+
+# Whether to automatically compile all Sass files in the sass directory
+compile_sass = true
+
+# Whether to do syntax highlighting
+# Theme can be customised by setting the `highlight_theme` variable to a theme supported by Zola
+highlight_code = true
+
+higlight_theme = "css"
+
+# Whether to build a search index to be used later on by a JavaScript library
+build_search_index = false
+
+[extra]
+# Put all your custom variables here
diff --git a/content/services.md b/content/services.md
new file mode 100644
index 0000000..83a8c87
--- /dev/null
+++ b/content/services.md
@@ -0,0 +1,23 @@
++++
+title = "Services"
+template = "directory-page.html"
+date = 2020-11-10
++++
+
+I tend to host all my services for my personal use on my infrastructure.
+By default everything run smoothly in an internal vpn powered by wireguard,
+openbsd and pf.
+
+| service | domain | available | public(1) |
+| ----------- | ------------------------- | ----------- | ----------- |
+| minecraft | rgoncalves.se[:25565] | yes | yes |
+| factorio | rgoncalves.se[:34197] | yes | yes |
+| git | git.rgoncalves.se | yes | yes |
+| nextcloud | cloud.rgoncalves.se | no | no |
+| sourcehut | srht.rgoncalves.se | no | no |
+
+> (1) : scream at *support[at]rgoncalves.se*
+>
+> (*) : only "available" services are running. Consider this list as a todo list
+
+
diff --git a/content/writeups/_index.md b/content/writeups/_index.md
new file mode 100644
index 0000000..2a2974e
--- /dev/null
+++ b/content/writeups/_index.md
@@ -0,0 +1,6 @@
++++
+title = "Writeups"
+sort_by = "date"
+template = "directory.html"
+page_template = "directory-page.html"
++++
diff --git a/content/writeups/archlinux_installation.md b/content/writeups/archlinux_installation.md
new file mode 100644
index 0000000..4a54636
--- /dev/null
+++ b/content/writeups/archlinux_installation.md
@@ -0,0 +1,181 @@
++++
+title = "Archlinux installation"
+date = 2020-07-01
++++
+
+<section>
+
+## Introduction
+Through my 5 years with different Archlinux installations, I made up my mind to
+document the one that fullfills my needs. The main goal is a minimal arch install
+(like any other), including systemd and refind, without using any crappy ncurses
+interface, and of course powered by btrfs (zfs an other day).
+
+Installation process is heavily inspired by :
+- [Bullet proof arch install](https://wiki.archlinux.org/index.php/User:Altercation/Bullet_Proof_Arch_Install)
+</section>
+
+<section>
+
+## Partitions
+``` bash
+$ sgdisk --clear \
+ --new=1:0:+550MiB --typecode=1:ef00 --change-name=1:EFI \
+ --new=2:0:+8GiB --typecode=2:8200 --change-name=2:cryptswap \
+ --new=3:0:0 --typecode=3:8300 --change-name=3:cryptsystem \
+ /dev/nvme0n1
+$ sgdisk --clear \
+ --new=1:0:1025GiB --typecode=1:8300 --change-name=1:wsd \
+/dev/sda
+```
+</section>
+
+<section>
+
+## Encryption
+
+```bash
+$ cryptsetup luksFormat --align-payload=8192 -s 256 -c aes-xts-plain64 /dev/disk/by-partlabel/cryptsystem
+$ cryptsetup open /dev/disk/by-partlabel/cryptsystem system
+$ cryptsetup open --type plain --key-file /dev/urandom /dev/disk/by-partlabel/cryptswap swap
+$ mkswap -L swap /dev/mapper/swap
+$ swapon -L swap
+```
+</section>
+
+<section>
+
+## File format
+
+```bash
+$ mkfs.fat -F32 -n EFI /dev/disk/by-partlabel/EFI
+$ mkfs.ext4 -n wsd /dev/disk/by-partlabel/wsd
+$ mkfs.btrfs --force --label system /dev/mapper/system
+$ o=defaults,x-mount.mkdir
+$ o_btrfs=$o,compress=lzo,ssd,noatime
+$ mount -t btrfs LABEL=system /mnt
+$ mount -t btrfs LABEL=system /mnt
+$ btrfs subvolume create /mnt/root
+$ btrfs subvolume create /mnt/home
+$ btrfs subvolume create /mnt/snapshots
+$ umount -R /mnt
+$ mount -t btrfs -o subvol=root,$o_btrfs LABEL=system /mnt
+$ mount -t btrfs -o subvol=home,$o_btrfs LABEL=system /mnt/home
+$ mount -t btrfs -o subvol=snapshots,$o_btrfs LABEL=system /mnt/.snapshots
+$ mkdir /mnt/wsd
+$ mount LABEL=wsd /mnt/wsd
+$ mkdir /mnt/boot
+$ mount LABEL=EFI /mnt/boot
+```
+</section>
+
+<section>
+## Base install
+
+```bash
+$ pacstrap /mnt basenvim
+$ genfstab -L -p /mnt >> /mnt/etc/fstab
+```
+Open up /mnt/etc/fstab (old, new):
+```bash
+LABEL=swap none swap defaults 0 0
+```
+```bash
+/dev/mapper/cryptswap none swap sw 0 0
+```
+Open up /mnt/etc/crypttab, append at the end:
+```bash
+swap /dev/disk/by-partlabel/cryptswap /dev/urandom swap,offset=2048,cipher=aes-xts-plain64,size=256
+```
+</section>
+
+<section>
+
+## Base systemd
+
+The only way to have a non-biased opinion about systemd is to mix it yourself in your base install.
+
+```bash
+$ systemd-nspawn -bD /mnt
+$ localectl set-locale LANG=en_US.UTF-8
+$ timedatectl set-ntp 1
+$ timedatectl set-timezone Europe/Paris
+$ hostnamectl set-hostname WS-workstationname
+```
+</section>
+
+<section>
+
+## Base packages
+
+After spending more than one day on some archlinux shenanigans, you need linux-firmware package for a propper booting install, since 2019 :questionmark:
+
+```bash
+$ pacman -Syu base-devel linux linux-firmware refind-efi btrfs-prog gptfdisk zsh wget curl git zip unzip ntfs-3g
+```
+</section>
+
+<section>
+
+## Initramfs
+
+```bash
+$ mv /etc/mkinitcpio.conf /etc/mkinitcpio.conf.orig
+```
+ Open up /etc/mkinitcpio.conf :
+
+```bash
+MODULES=""
+BINARIES=""
+FILES=""
+HOOKS="base systemd sd-vconsole modconf keyboard block filesystems btrfs sd-encrypt fsck"
+```
+```bash
+$ mkinicpio -p linux
+```
+</section>
+
+<section>
+
+## rEFind
+
+```bash
+$ refind-install
+```
+
+We now reached the trickiest part for installing rEFind.
+Hit Ctrl+Alt+F2, exec this last code block, and then reach back TTy1 (nspawn doesn't allow deep disk modification / access).
+
+```bash
+$ arch-chroot /mnt
+$ refind-install
+```
+Open up /boot/EFI/refind/refind.conf, or somewhere like that in the EFI dir :
+
+```config
+timeout 5
+use_graphics_for windows
+also_scan_dirs +,@/
+```
+```config
+btrfs filesystem show system
+lsblk -fs
+```
+Open up /boot/EFI/refind/refind.conf, or somewhere like that in the EFI dir :
+```config
+Add the following value if you are using an intel cpu : initrd=/intel-ucode.img
+"Boot with standard options" "rd.luks.name=*FILL IN UUID FROM PARTITION*=cryptsystem root=UUID=*UUID FROM encrypted root subvolume* rootflags=subvol=root initrd=/initramfs-linux.img"
+```
+</section>
+
+<section>
+
+## Reboot
+
+```bash
+$ passwd
+$ poweroff
+$ reboot
+#finger crossed !!
+```
+</section>
diff --git a/content/writeups/homelab.md b/content/writeups/homelab.md
new file mode 100644
index 0000000..3f325a9
--- /dev/null
+++ b/content/writeups/homelab.md
@@ -0,0 +1,59 @@
++++
+title = "Making an homelab"
+date = 2020-07-20
++++
+
+<section>
+
+## Motivations
+
+- Fun ! (We are hackers, aren't we ?)
+- Private git hosting, syncthing, game servers and build servers ..
+- Gaining more and more experiences
+- Portfolio ;) ?
+</section>
+
+<section>
+
+## Software
+There are already plenty of ways already for managing servers and services, such as ansible, terraform, kubernetes + docker, ..
+But why should I spend a LOT of time learning all these tools seperately (and together) ?
+Right, they are used for professional needs.
+But I got a keyboard.
+Seriously.
+Let's spend twice that time on making my own infrastructure scripts !
+
+[Gitlab repository](https://gitlab.com/rgoncalves.se/infrastructure/)
+</section>
+
+<section>
+
+## Enjoying a dell r710 rev II
+
+### Using an internal SSD
+
+As I decided to turn my r710 as a bare-metal server with OpenBSD, I had to do some hacks to get a working internal SSD.
+
+- Yes, I could have used the internal USB 2.0 port with a USB drive, but we are talking about a bare-metal server, not EsXi loaded in ram.
+- Yes, using the internal SATA ports (as SATA 2) will reduce the speed allowed by my SSD, but it's a spare one, and the main goal is to get an **internal 2'5 drive** or replace that term with whatever you want.
+
+![](/images/r710_and_switch.jpg)
+</section>
+
+<section>
+
+## Building a rack
+
+(Never use pine wood.)
+
+I finally ended up using pine wood (here planks).
+The key is to build a shelf intended to support at least 100Kg.
+So don't use beams or other shitty structure, 4 four plains planks are enough.
+
+Below, before and after :
+
+![](/images/homelab_old_01.jpg)
+![](/images/homelab_wip_01.jpg)
+![](/images/homelab_wip_02.jpg)
+![](/images/homelab_front_01.jpg)
+</section>
diff --git a/content/writeups/lockdown-chapter-2.md b/content/writeups/lockdown-chapter-2.md
new file mode 100644
index 0000000..9e462c6
--- /dev/null
+++ b/content/writeups/lockdown-chapter-2.md
@@ -0,0 +1,88 @@
++++
+title = "Lockdown chapter 2"
+date = 2020-11-10
++++
+
+## ansible
+
+For this lockdown part. 2, it makes sense to run my internal servers and
+infrastructure 24/7, so I can monitor the stress load and continously deploy
+and provision my services between two stupid courses or useless java exercises.
+
+I was already using Ansible for small tasks such as updating everything at once,
+or generating git/syncthing/ssh configuration. This time I refactored my use of
+Ansible, using
+[best practices](https://docs.ansible.com/ansible/latest/user_guide/playbooks_best_practices.html).
+
+Previously, my inventory was generated from an external YAML, but why should I
+keep an additional layer of abstraction that adds nothing but complicated
+infrastructure management ? Therefore, I refactored all my hosts, services and
+meta details in the inventory file in YAML format. Yes, it does make my roles
+and scripts more dependent to my specific inventory, but I can describe per-host
+services and use dynamically loaded roles.
+
+## stack
+
+My main server running OpenBSD, using Docker is not possible. I have seen some
+guys on Internet running Docker on an Alpine vm, but it adds two level of
+abstraction, and I dont like cluttering my system with too many complex and
+exotic setup when not needed.
+
+Therefore, I have my own Ansible roles and playbooks for deploying Alpine or
+OpenBSD iso on my hypervisor. Each services/type of services will leave in a
+virtual machine, allowing me to backup disk images or making snapshots thanks
+to qcow2.
+
+> After tinkering around with vmm, it gaves me poor results for realtime needs
+> in virtual machine (such as minecraft, factorio, ...) due to a high number
+> of cpu interruptions.
+>
+> I then went with freebsd and bhyve.
+
+```
++-------------------+
+| domain controller |
+| * openbsd |
+| * ^irtual |
++-------------------+
+ ^
+ |
+ v
++--------+----------+
+| lan router |
+| * ddwrt |
+| * physical |
++--------+----------+
+ ^
+ |
+ v
++--------+----------+
+| 24 ports switch |
+| * fiber ports |
++--------+-+-+------+
+ ^ | |
+ | | +--------------------------------------------------------------------+
+ | +-------------------------------------------------+ |
+ v v v
++--------+--------------------------------------+ +--------+---------+ +------+---------+
+| | | workstation | | laptop |
+| Dell poweredge R710 | | * archlinux | | * archlinux |
+| * 48GB ram | | * btrfs | | # encrypted |
+| * freebsd /openbsd/ (ssd disk) | * encrypted | | |
+| | +------------------+ +----------------+
+| +------------+ +------------+ +-------------+ |
+| | vm0 | | vm1 | | vm/n | |
+| | * alpine | | * alpine | | * openbsd \ | |
+| | | | | | alpine \ | |
+| | | | | | ... | |
+| +------------+ +------------+ +-------------+ |
+| |
++-----------------------------------------------+
+```
+
+## grafana
+
+<img class="wide-3 shadow-1" src="/images/grafana_01.jpg">
+
+Thanks to ansible, I wrote roles for deploying grafana on a virtual machines,
+then for deploying *prometheus* and *node_exporter* on all my servers.
diff --git a/content/writeups/wireguard_and_ipv6.md b/content/writeups/wireguard_and_ipv6.md
new file mode 100644
index 0000000..8d00cd9
--- /dev/null
+++ b/content/writeups/wireguard_and_ipv6.md
@@ -0,0 +1,56 @@
++++
+title = "Wireguard and IPV6"
+date = 2020-08-26
++++
+
+<section>
+
+## Preambule
+
+I decided to connect all my services and servers behind my domain controller,
+which has a dedicated IPv4 and IPv6 address, and which basically host that
+website. This would allow me to remotely manage and enjoy my infrastructure
+when I'm away from my homelab.
+</section>
+
+<section>
+
+## IPv6 journey
+
+When I first used WireGuard with my new OpenBSD vm on all my devices, i noticed
+that my some of my requests towards specific services were not working anymore.
+For instance, I spent some time trying to reach :
+
+- gitlab.com
+- github.com
+- ungleich.ch
+
+In fact, I had hard times accessing these services only when I was connected to
+my WireGuard server (which has IPv4 and IPv6, with some default wireguard
+settings I carried with me for six months), and only through my system dns.
+
+In fact I figured out that it happened only when I was under an IPv6 capable
+router.
+
+### Solution ?
+
+Adding IPv6 subnet to server and clients configuration files.
+
+### Next ?
+
+Enable IPv6 routing in the domain controller, for a single-ip usage.
+</section>
+
+<section>
+
+## *BSD routing
+The default routing configuration does not allow my domain controller to reach
+the **ungleich's infrastructure and services**.
+
+```bash
+echo "\!/sbin/route add -inet 185.203.112/24 185.203.114.1" >> /etc/hostname.vio1
+```
+
+Then I want to be able to access IPv6 only services when I'm using my wireguard
+server (right now it only allows to force IPv4 to the client).
+</section>
diff --git a/deploy b/deploy
new file mode 100755
index 0000000..94351c9
--- /dev/null
+++ b/deploy
@@ -0,0 +1,9 @@
+#!/bin/bash
+#
+
+set -e
+
+zola build
+rsync -r $(pwd)/public/ puffy@dcontroller:/var/www/htdocs/rgoncalves.se
+rsync -r $(pwd)/httpd.conf root@dcontroller:/etc/httpd.conf
+rm -r public
diff --git a/httpd.conf b/httpd.conf
new file mode 100644
index 0000000..c02b4f0
--- /dev/null
+++ b/httpd.conf
@@ -0,0 +1,22 @@
+server "rgoncalves.se" {
+ listen on * port 80
+ root "/htdocs/rgoncalves.se"
+
+ location "/public/*" {
+ directory auto index
+ }
+
+ location "/semester_*/*" {
+ directory auto index
+ }
+}
+
+types {
+ text/css css
+ text/html html htm
+ text/plain txt pgp
+ image/gif gif
+ image/jpeg jpeg jpg
+ image/png png
+}
+
diff --git a/sass/style/cgit.sass b/sass/style/cgit.sass
new file mode 100644
index 0000000..c79117e
--- /dev/null
+++ b/sass/style/cgit.sass
@@ -0,0 +1,589 @@
+
+/* sass ~~ /style/cgit.css */
+
+@import "common.sass"
+
+div#cgit
+ padding: 0em
+ margin: 0em
+ font-family: sans-serif
+ font-size: 10pt
+ color: $fg
+ background: $bg
+ padding: 4px
+
+a
+ color: $blue
+ text-decoration: none
+ &:hover
+ text-decoration: underline
+ &::selection
+ color: $white
+ background-color: $blue
+ &.button
+ font-size: 80%
+ padding: 0em 0.5em
+ &.primary
+ font-size: 100%
+ &.secondary
+ font-size: 90%
+ &.branch-deco
+ margin: 0px 0.5em
+ padding: 0px 0.25em
+ background-color: $green
+ border: solid 1px $black
+ &.tag-annotated-deco
+ margin: 0px 0.5em
+ padding: 0px 0.25em
+ background-color: $yellow
+ border: solid 1px $black
+ &.remote-deco
+ margin: 0px 0.5em
+ padding: 0px 0.25em
+ background-color: $grey_2
+ border: solid 1px $black
+ &.deco
+ margin: 0px 0.5em
+ padding: 0px 0.25em
+ background-color: $red
+ border: solid 1px $black
+
+table
+ border-collapse: collapse
+ &.tabs
+ border-bottom: solid 3px $grey_2
+ border-collapse: collapse
+ margin-top: 2em
+ margin-bottom: 0px
+ width: 100%
+ td
+ padding: 0px 1em
+ vertical-align: bottom
+ a
+ padding: 2px 0.75em
+ color: $grey_3
+ font-size: 110%
+ &.active
+ color: $black
+ background-color: $grey_2
+ &.form
+ text-align: right
+ form
+ padding-bottom: 2px
+ font-size: 90%
+ white-space: nowrap
+ &.list
+ width: 100%
+ border: none
+ border-collapse: collapse
+ tr
+ background: $white
+ &.logheader
+ background: $grey
+ &:nth-child(even)
+ background: $white
+ &:nth-child(odd)
+ background: $white
+ &:hover
+ background: $grey
+ &.nohover
+ background: $white
+ &:hover
+ background: $white
+ &.nohover-highlight
+ &:hover
+ &:nth-child(even)
+ background: $white
+ &:nth-child(odd)
+ background: $white
+ th
+ font-weight: bold
+ padding: 0.1em 0.5em 0.05em 0.5em
+ vertical-align: baseline
+ td
+ border: none
+ padding: 0.1em 0.5em 0.1em 0.5em
+ &.commitgraph
+ font-family: monospace
+ white-space: pre
+ .column1
+ color: $red
+ .column2
+ color: $green
+ .column3
+ color: $red
+ .column4
+ color: $blue
+ .column5
+ color: #a0a
+ .column6
+ color: #0aa
+ &.logsubject
+ font-family: monospace
+ font-weight: bold
+ &.logmsg
+ font-family: monospace
+ white-space: pre
+ padding: 0 0.5em
+ a
+ color: black
+ &.ls-dir
+ font-weight: bold
+ color: $blue
+ &:hover
+ color: $blue
+ &.reposection
+ font-style: italic
+ color: $grey_3
+ padding-top: 1em
+ &.sublevel-repo
+ padding-left: 1.5em
+ &.blob
+ margin-top: 0.5em
+ border-top: solid 1px $black
+ td
+ &.lines
+ margin: 0
+ padding: 0 0 0 0.5em
+ vertical-align: top
+ color: black
+ &.linenumbers
+ margin: 0
+ padding: 0 0.5em 0 0.5em
+ vertical-align: top
+ text-align: right
+ border-right: 1px solid $grey_3
+ pre
+ padding: 0
+ margin: 0
+ &.bin-blob
+ margin-top: 0.5em
+ border: solid 1px black
+ th
+ font-family: monospace
+ white-space: pre
+ border: solid 1px $grey_3
+ padding: 0.5em 1em
+ td
+ font-family: monospace
+ white-space: pre
+ border-left: solid 1px $grey_3
+ padding: 0em 1em
+ &.nowrap
+ td
+ white-space: nowrap
+ &.commit-info
+ border-collapse: collapse
+ margin-top: 1.5em
+ th
+ text-align: left
+ font-weight: normal
+ padding: 0.1em 1em 0.1em 0.1em
+ vertical-align: top
+ td
+ font-weight: normal
+ padding: 0.1em 1em 0.1em 0.1em
+ &.diffstat
+ border-collapse: collapse
+ border: solid 1px $grey_2
+ background-color: $grey_1
+ th
+ font-weight: normal
+ text-align: left
+ text-decoration: underline
+ padding: 0.1em 1em 0.1em 0.1em
+ font-size: 100%
+ td
+ padding: 0.2em 0.2em 0.1em 0.1em
+ font-size: 100%
+ border: none
+ &.mode
+ white-space: nowrap
+ span
+ &.modechange
+ padding-left: 1em
+ color: $red
+ &.add
+ a
+ color: $green
+ &.del
+ a
+ color: $red
+ &.upd
+ a
+ color: $blue
+ &.graph
+ width: 500px
+ vertical-align: middle
+ table
+ border: none
+ td
+ padding: 0px
+ border: 0px
+ height: 7pt
+ &.add
+ background-color: $green
+ &.rem
+ background-color: $red
+ &.diff
+ width: 100%
+ td
+ font-family: monospace
+ white-space: pre
+ div
+ &.head
+ font-weight: bold
+ margin-top: 1em
+ color: $black
+ &.hunk
+ color: $blue
+ &::selection
+ background-color: $blue
+ &.add
+ color: $green
+ &::selection
+ background-color: $green
+ &.del
+ color: $red
+ &::selection
+ background-color: $red
+ &.stats
+ border: solid 1px black
+ border-collapse: collapse
+ th
+ text-align: left
+ padding: 1px 0.5em
+ background-color: $grey_1
+ border: solid 1px $black
+ td
+ text-align: right
+ padding: 1px 0.5em
+ border: solid 1px $black
+ &.total
+ font-weight: bold
+ text-align: left
+ &.sum
+ color: $red
+ font-weight: bold
+ &.left
+ text-align: left
+ &.vgraph
+ border-collapse: separate
+ border: solid 1px black
+ height: 200px
+ th
+ background-color: $grey
+ font-weight: bold
+ border: solid 1px $white
+ padding: 1px 0.5em
+ td
+ vertical-align: bottom
+ padding: 0px 10px
+ div
+ &.bar
+ background-color: $grey
+ &.hgraph
+ border: solid 1px black
+ width: 800px
+ th
+ background-color: $grey
+ font-weight: bold
+ border: solid 1px black
+ padding: 1px 0.5em
+ td
+ vertical-align: middle
+ padding: 2px 2px
+ div
+ &.bar
+ background-color: $grey
+ height: 1em
+ &.ssdiff
+ width: 100%
+ td
+ font-size: 75%
+ font-family: monospace
+ white-space: pre
+ padding: 1px 4px 1px 4px
+ border-left: solid 1px $grey_1
+ border-right: solid 1px $grey_1
+ &.add
+ color: black
+ background: #cfc
+ min-width: 50%
+ &.add_dark
+ color: black
+ background: #aca
+ min-width: 50%
+ &.del
+ color: black
+ background: #fcc
+ min-width: 50%
+ &.del_dark
+ color: black
+ background: #caa
+ min-width: 50%
+ &.changed
+ color: black
+ background: #ffc
+ min-width: 50%
+ &.changed_dark
+ color: black
+ background: #cca
+ min-width: 50%
+ &.lineno
+ color: black
+ background: $grey_1
+ text-align: right
+ width: 3em
+ min-width: 3em
+ &.hunk
+ color: black
+ background: #ccf
+ border-top: solid 1px $grey_2
+ border-bottom: solid 1px $grey_2
+ &.head
+ border-top: solid 1px $grey_2
+ border-bottom: solid 1px $grey_2
+ div
+ &.head
+ font-weight: bold
+ color: black
+ &.foot
+ border-top: solid 1px $grey_2
+ border-left: none
+ border-right: none
+ border-bottom: none
+ &.space
+ border: none
+ div
+ min-height: 3em
+ span
+ &.add
+ background: #cfc
+ font-weight: bold
+ &.del
+ background: #fcc
+ font-weight: bold
+
+table#header
+ width: 100%
+ margin-bottom: 1em
+ td
+ &.logo
+ width: 5em
+ vertical-align: top
+ &.main
+ font-size: 250%
+ padding-left: 10px
+ white-space: nowrap
+ a
+ color: #000
+ &.form
+ text-align: right
+ vertical-align: bottom
+ padding-right: 1em
+ padding-bottom: 2px
+ white-space: nowrap
+ &.sub
+ color: $grey_3
+ border-top: solid 1px $grey_1
+ padding-left: 10px
+
+div
+ &.path
+ margin: 0px
+ padding: 5px 2em 2px 2em
+ color: #000
+ background-color: $grey_2
+ &.content
+ margin: 0px
+ padding: 2em
+ border-bottom: solid 3px $grey_1
+ &.error
+ color: red
+ font-weight: bold
+ margin: 1em 2em
+ &.cgit-panel
+ float: right
+ margin-top: 1.5em
+ table
+ border-collapse: collapse
+ border: solid 1px $grey_2
+ background-color: $grey
+ th
+ text-align: center
+ td
+ padding: 0.25em 0.5em
+ &.label
+ padding-right: 0.5em
+ &.ctrl
+ padding-left: 0.5em
+ &.commit-subject
+ font-weight: bold
+ font-size: 125%
+ margin: 1.5em 0em 0.5em 0em
+ padding: 0em
+ &.commit-msg
+ white-space: pre
+ font-family: monospace
+ &.notes-header
+ font-weight: bold
+ padding-top: 1.5em
+ &.notes
+ white-space: pre
+ font-family: monospace
+ border: solid 1px #ee9
+ background-color: #ffd
+ padding: 0.3em 2em 0.3em 1em
+ float: left
+ &.notes-footer
+ clear: left
+ &.diffstat-header
+ font-weight: bold
+ padding-top: 1.5em
+ &.diffstat-summary
+ color: #888
+ padding-top: 0.5em
+ &.footer
+ margin-top: 0.5em
+ text-align: center
+ font-size: 80%
+ color: $grey_2
+ a
+ color: $grey_2
+ text-decoration: none
+ &:hover
+ text-decoration: underline
+
+img
+ border: none
+
+input#switch-btn
+ margin: 2px 0px 0px 0px
+
+td#sidebar
+ input
+ &.txt
+ width: 100%
+ margin: 2px 0px 0px 0px
+
+table#grid
+ margin: 0px
+
+td#content
+ vertical-align: top
+ padding: 1em 2em 1em 1em
+ border: none
+
+div#summary
+ vertical-align: top
+ margin-bottom: 1em
+
+table#downloads
+ float: right
+ border-collapse: collapse
+ border: solid 1px $grey_3
+ margin-left: 0.5em
+ margin-bottom: 0.5em
+ th
+ background-color: $grey_2
+
+div#blob
+ border: solid 1px $black
+
+td
+ &.ls-size
+ text-align: right
+ font-family: monospace
+ width: 10em
+ &.ls-mode
+ font-family: monospace
+ width: 10em
+ &.toplevel-repo
+
+.sha1
+ font-family: monospace
+ font-size: 90%
+
+.left
+ text-align: left
+
+.right
+ text-align: right
+
+ul
+ &.pager
+ list-style-type: none
+ text-align: center
+ margin: 1em 0em 0em 0em
+ padding: 0
+ li
+ display: inline-block
+ margin: 0.25em 0.5em
+ a
+ color: $grey_3
+ .current
+ font-weight: bold
+
+span
+ &.age-mins
+ font-weight: bold
+ color: #080
+ &.age-hours
+ color: #080
+ &.age-days
+ color: #040
+ &.age-weeks
+ color: #444
+ &.age-months
+ color: $grey_3
+ &.age-years
+ color: #bbb
+ &.insertions
+ color: #080
+ &.deletions
+ color: #800
+
+table#header td.form form,
+table#header td.form input,
+table#header td.form select
+ font-size: 90%
+
+table.tabs a[href^="http://"]:after, table.tabs a[href^="https://"]:after
+ content: url(data:image/png )
+ opacity: 0.5
+ margin: 0 0 0 5px
+
+table.tabs td.form input,
+table.tabs td.form select
+ font-size: 90%
+
+table.blob td.linenumbers a,
+table.ssdiff td.lineno a
+ color: gray
+ text-align: right
+ text-decoration: none
+
+table.blob td.linenumbers a:hover,
+table.ssdiff td.lineno a:hover
+ color: black
+
+div.commit-subject a.branch-deco,
+div.commit-subject a.tag-annotated-deco,
+div.commit-subject a.remote-deco,
+div.commit-subject a.deco
+ margin-left: 1em
+ font-size: 75%
+
+img
+ width: 4em
+
+select,
+input
+ background-color: $accent
+ color: $white
+ border: .1em solid $black
+ font-width: 2em
+
+div#summary
+ white-space: pre
diff --git a/sass/style/common.sass b/sass/style/common.sass
new file mode 100644
index 0000000..a128cce
--- /dev/null
+++ b/sass/style/common.sass
@@ -0,0 +1,32 @@
+
+/* sass ~~ /style/common.css */
+
+/*
+ * variables
+ */
+
+$white: #ffffff
+$black: #000000
+$blue: #0077ff
+$red: #ff0000
+$yellow: #ccaa00
+$green: #33cc44
+$grey: #eeeeee
+$grey_1: #cccccc
+$grey_2: #aaaaaa
+$grey_3: #888888
+$bg: $white
+$fg: $black
+$accent: $blue
+$font-path: "/fonts"
+
+/*
+ * font
+ */
+
+::selection
+ color: $bg
+ background-color: $fg
+
+*
+ font-family: monospace, monospace
diff --git a/sass/style/style.sass b/sass/style/style.sass
new file mode 100644
index 0000000..e0afc79
--- /dev/null
+++ b/sass/style/style.sass
@@ -0,0 +1,98 @@
+
+/* sass ~~ /style/style.css */
+
+@import "common.sass"
+
+/*
+ * html native elements
+ */
+
+*
+ text-align: justify
+
+body
+ background-color: $bg
+ font-family: "monospace"
+ margin: 0 1em 0 1em
+ padding: 0
+ width: 80ch
+
+header nav
+ border-bottom: solid 2px $grey_1
+ margin-bottom: 1em
+
+footer
+ margin: 2em 0 2em 0
+ padding: .1em 0 .1em 0
+ background-color: $grey
+ p
+ text-align: center
+ max-width: none
+
+h1
+ font-size: 3em
+
+h2
+ font-size: 2em
+ margin: 1.2em 0 .6em 0
+
+h3
+ font-size: 1.3em
+
+a
+ background-color: $grey_1
+ padding: .1em
+ color: $fg
+
+a[href^="http"]
+ background: url(/images/external.svg) center right no-repeat $grey;
+ padding-right: 1em
+
+article
+ background-color: $grey
+ margin: .1em 0 .1em 0
+ padding: .2em 0 .2em 0
+
+p
+ overflow: hidden
+
+blockquote
+ min-width: 100%
+ margin: 1em 0 1em 0
+ padding: .4em
+ font-weight: 100
+ font-style: italic
+ background-color: $grey
+ border-left: solid .2em $grey_1
+
+pre
+ padding: 1em
+ border-radius: .4em
+ overflow: auto
+
+img
+ max-width: 100%
+ margin: 0 auto 0 auto
+
+time
+ display: block
+ margin-top: 1em
+
+table
+ border-collapse: collapse
+ min-width: 100%
+ display: table
+ th, td
+ border: 0 $grey_1 solid
+ padding: .4em 1em .4em 1em
+ margin: 0
+ overflow: hidden
+ tr:hover
+ background-color: $grey
+
+@media only screen and (max-width: 100ch)
+ body
+ width: 90%
+ nav *
+ display: block
+ margin: .2em 0 .2em 0
diff --git a/static/fonts/IBMPlexMono-Medium.woff b/static/fonts/IBMPlexMono-Medium.woff
new file mode 100644
index 0000000..fc65a67
--- /dev/null
+++ b/static/fonts/IBMPlexMono-Medium.woff
Binary files differ
diff --git a/static/fonts/Terminus.woff b/static/fonts/Terminus.woff
new file mode 100644
index 0000000..fe98116
--- /dev/null
+++ b/static/fonts/Terminus.woff
Binary files differ
diff --git a/static/images/external.svg b/static/images/external.svg
new file mode 100644
index 0000000..137638e
--- /dev/null
+++ b/static/images/external.svg
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12">
+ <path fill="#fff" stroke="#36c" d="M1.5 4.518h5.982V10.5H1.5z"/>
+ <path fill="#36c" d="M5.765 1H11v5.39L9.427 7.937l-1.31-1.31L5.393 9.35l-2.69-2.688 2.81-2.808L4.2 2.544z"/>
+ <path fill="#fff" d="M9.995 2.004l.022 4.885L8.2 5.07 5.32 7.95 4.09 6.723l2.882-2.88-1.85-1.852z"/>
+</svg>
diff --git a/static/images/grafana_01.jpg b/static/images/grafana_01.jpg
new file mode 100644
index 0000000..77dec3f
--- /dev/null
+++ b/static/images/grafana_01.jpg
Binary files differ
diff --git a/static/images/homelab_front_01.jpg b/static/images/homelab_front_01.jpg
new file mode 100644
index 0000000..aed5c63
--- /dev/null
+++ b/static/images/homelab_front_01.jpg
Binary files differ
diff --git a/static/images/homelab_old_01.jpg b/static/images/homelab_old_01.jpg
new file mode 100644
index 0000000..ba7733f
--- /dev/null
+++ b/static/images/homelab_old_01.jpg
Binary files differ
diff --git a/static/images/homelab_wip_01.jpg b/static/images/homelab_wip_01.jpg
new file mode 100644
index 0000000..d572dec
--- /dev/null
+++ b/static/images/homelab_wip_01.jpg
Binary files differ
diff --git a/static/images/homelab_wip_02.jpg b/static/images/homelab_wip_02.jpg
new file mode 100644
index 0000000..9fd3ce2
--- /dev/null
+++ b/static/images/homelab_wip_02.jpg
Binary files differ
diff --git a/static/images/openbsd_drawing_01.jpg b/static/images/openbsd_drawing_01.jpg
new file mode 100644
index 0000000..2af524c
--- /dev/null
+++ b/static/images/openbsd_drawing_01.jpg
Binary files differ
diff --git a/static/images/r710_and_switch.jpg b/static/images/r710_and_switch.jpg
new file mode 100644
index 0000000..73b2beb
--- /dev/null
+++ b/static/images/r710_and_switch.jpg
Binary files differ
diff --git a/static/logo.jpg b/static/logo.jpg
new file mode 100644
index 0000000..3fe00f2
--- /dev/null
+++ b/static/logo.jpg
Binary files differ
diff --git a/static/logo.png b/static/logo.png
new file mode 100644
index 0000000..dd4a23e
--- /dev/null
+++ b/static/logo.png
Binary files differ
diff --git a/static/public/pgp.pub.txt b/static/public/pgp.pub.txt
new file mode 100644
index 0000000..cecce64
--- /dev/null
+++ b/static/public/pgp.pub.txt
@@ -0,0 +1,110 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+
+mQINBF5zMOcBEADL3CTqwOUm6S9LlrBo72oOHn3RCpZH7VpogE/ynNID2lsajPG8
+Izsfuy2WuUOyS5rJaUwUa/eitR5fEAjJWeDaDXDuYZAE2J1ZwkFavXQAI01H7Efb
+jkPUGiIXtnVWt70uifPCugYyIW4LzTLai5bxE8mrjTXVNq/R36trg+BKVim5QXLZ
+mKytNjuUmQANZcgQpeNjW/nXrCsYRd0qpqdqVynEalPX2EZaFZGQYZ3rL+pXpR4e
+PH5SmuC4Q5+HoD/qzLjtG+k78PzZj3x+hjC3hm+FRH+CrovYZVQOLshX7FkAfCS0
+u8n1mRoYODfzrZbrT462aAEaZEKd+5JMa3NwHdxTNgWP7oeQqAKztMeKXE+iJ3B6
+q3J5pmJfywxGCyGk7MJUaIF+kFo0qDVdT/Vt/rcR7flfKPug0UdXhAt0Ttpl450/
+fe3+hs1N8Ajix8RKIU5Gcvx4RFH8BdkY8AXa9N3pgqSqUoKAeYnWmY0cOWeNqeV4
+xsisaq2WBgLoo4FGqWzM9B6b3dFbXof4HHR5yimmgKd9B48JqWAOBP5+SccRqOLq
+utV08rC8xEQ31IIHM1iIThqmVX1I5gwurcGiaE+wHqRc03zqKFIyIwi8lrfxF8If
+JRpeuxT3gS57cBz5Y4FIzZYjEn6Suj9AemnvEPPZ474tnDD5KpKqjE5FNQARAQAB
+tCFyb21haW4gKEhlbGxvKSA8bWVAcmdvbmNhbHZlcy5zZT6JAkwEEwEKADYWIQSM
+fW2vFPgUJkDOg+r4XNAttBnWjAUCXnMw5wIbAQQLCQgHBBUKCQgFFgIDAQACHgEC
+F4AACgkQ+FzQLbQZ1owjvA/9E7z9HoTQMOlBS5Tg1axYouwH4+XZ7QDr/H3/ccTY
+8HBaLpF5KAGcaV7C+WzbZf5zPoP4avcNFlir7ncm+8MJUDXp8XGSlFRWuQ/MLsVU
+or81jOHCl0CXSdS1iUe0tNt9Mge9QfB1W7+au3byOCXj3KK7yfOBCYNbubWwoZq4
+wyPOg1zhsi3dSbKgnclS+sDyyJdZv+dzG5ZLuBbiA5qWchVTdKfGIYdft5C/i9c5
+V3FkFlCEyeQ6gYCoN22IHvhoIBXmORbYzzQwzXWOf/0ViXRqrrbViQ1WgIP6blWP
+pboko3ZaExCCVLCZ0W58wK1xQafK5uURmbh4NhL6guaOq285r9IOIRTb5tadkkR0
+qlDz36F4Pr1tSiQ+RvQoRMm11Zo84pr6wCmXn+jRLc4gS1JopeYhdFeE/TFFl/yM
+J+S5T6KivUedWGB3jN52TC9F4acs3rVwcJHhxJtaE7zvWNnZh2ujEbbX41wk/g9/
+ZFJaC+2XLyw3Vgn78h7uzK1+3LrWi1e12qqeyITSviedDA3aFDhzbjlzI7wdjZhI
+2XWHcGX1gxQEqx5XzOCaP76lj1E6tGsAB0140nggRhoqGbdYR2Ufh34AVkoSvQEA
+j2A5aDWIc94neWfRyMHfuW2PFb2hFNtJSSajlxtEsg1/zKP8lRxw2IaHfeMpuNG1
+yyG5Ag0EXnMyQQEQAOJJ016xc91HLpJxd4WsK8BmCTLMmNZf4xfJOSaCCEC7Uh7r
+7fybIsFWJUf/fMf1seBZ0IB2mznaKp6fE78gU1s/wKjQl6yYxt2dmXvoOpCTCb1B
+Zqu2lN54h2+OvRyq/UPXxOCKVZfMqrc6C/eoyl4VorUfBJrhg9VVbciqIOnO11uJ
+UMQZQsYr7uvdFFJYyePI4FyjCytUPnnH38IIHlyL8YYf8mo3TJJGkohuAw/a87GY
+AIFpxk39obIuLbHpQAKSoQKlPCjEjGD/c9dSLmkl/16XnWyMuyIcv6Vw2ek2f0TL
+Bj5Jo26YXwU7+JJL4N3RgEAW6XLEa5Ylirpskt6qjHjlyNfxtnefrVMOL4k/hANQ
+MlBdnE+5oONUlXcuVgSsCGtuMsV2P8dI5Hw3Cr9YkFPzkpJhLLdwPcCLvZz5DM7C
+xrv6+TJEPqtVN3V9ZupRUprS+8E61XfdTZX1CYNytYTHGpb7qJ2wsvPST/GvZbui
+Aa6CrwJb7RkCkoaD0kf5iIDpCmtMZtESivqrbC7J1KONCXL/uK6G5aW/Vr8Gqnvl
+B5vZLb7GxJpYISkmGtegHAGOCd3ecGUJf8S3DLHyghskt2JKsUszaWqHmTsYYLQ4
+QB0ihz3ikoRMs9nd3k+CZwI8BMNKQE0l0rQCxlXhjCGwoibxNFA+vFq4kXcHABEB
+AAGJBGwEGAEKACAWIQSMfW2vFPgUJkDOg+r4XNAttBnWjAUCXnMyQQIbAgJACRD4
+XNAttBnWjMF0IAQZAQoAHRYhBNb92WprxEfuG/J00SQUnphu2qDFBQJeczJBAAoJ
+ECQUnphu2qDFARAQAK0Qs5KGWE1Ark8d0efTr8zQExebx8QJjsIXhdDxy/xJSt1l
+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
+jMkprlyrNuAcrXbn0AsZnS79DA==
+=2hJ5
+-----END PGP PUBLIC KEY BLOCK-----
+
diff --git a/sync b/sync
new file mode 100644
index 0000000..a9bf588
--- /dev/null
+++ b/sync
@@ -0,0 +1 @@
+#!/bin/bash
diff --git a/templates/base.html b/templates/base.html
new file mode 100644
index 0000000..0795d4a
--- /dev/null
+++ b/templates/base.html
@@ -0,0 +1,35 @@
+<!DOCTYPE html>
+<html lang="en">
+ <head>
+ <title>rgoncalves.se</title>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0 minimum-scale=1">
+ <link rel="icon" type="image/png" href="logo.png">
+ <link href="/style/style.css" rel="stylesheet" type="text/css">
+ </head>
+ <body>
+ <header>
+ {% if title is defined %}
+ <h1>{{ title }}</h1>
+ {% else %}
+ <h1>rgoncalves.se</h1>
+ {% endif %}
+ <nav>
+ &nbsp;
+ <a href="/">home</a>
+ <a href="/writeups/">writeups</a>
+ <a href="/services/">services</a>
+ <a href="/public">public</a>
+ <a href="http://git.rgoncalves.se">git</a>
+ <a href="https:/gitlab.com/rgoncalves.se/infrastructure/">infrastructure</a>
+ </nav>
+ </header>
+
+ {% block content %} {% endblock %}
+
+ <footer class="delimiter">
+ <p>Proudly powered by <a target="_blank" href="https://ungleich.ch">ungleich.ch</a>'s servers and dam !</p>
+ <p>Zero carbon - 100% renewable energy</p>
+ </footer>
+ </body>
+</html>
diff --git a/templates/directory-page.html b/templates/directory-page.html
new file mode 100644
index 0000000..5b2c5d5
--- /dev/null
+++ b/templates/directory-page.html
@@ -0,0 +1,7 @@
+{% extends "base.html" %}
+
+{% block content %}
+
+{{ page.content | safe }}
+
+{% endblock content %}
diff --git a/templates/directory.html b/templates/directory.html
new file mode 100644
index 0000000..c4130fb
--- /dev/null
+++ b/templates/directory.html
@@ -0,0 +1,9 @@
+{% extends "base.html" %}
+
+{% block content %}
+{% for page in section.pages %}
+<article>
+ {{ page.date }} : <a href="{{ page.permalink | safe }}">{{ page.title }}</a>
+</article>
+{% endfor %}
+{% endblock content %}
diff --git a/templates/index.html b/templates/index.html
new file mode 100644
index 0000000..87812ea
--- /dev/null
+++ b/templates/index.html
@@ -0,0 +1,30 @@
+{% extends "base.html" %}
+
+{% block content %}
+
+<p>
+ My name is Romain GONCALVES, usually rgoncalves/binary550 on git.
+</p>
+<p>
+Actually studying computer science, I would like to progress in infrastructure and administration of
+Unix based systems.
+Running my machines on Archlinux and OpenBSD, I deploy and maintain my internal servers and services
+for my own use. Moreover, I develop my own solutions or set of scripts.
+</p>
+
+<h2>crypto</h2>
+<ul>
+ <li><code>pgp</code> <a href="public/pgp.pub.txt">8C7D 6DAF 14F8 1426 40CE 83EA F85C D02D B419 D68C</a>
+</ul>
+
+<h2>contact</h2>
+<nav>
+ <a target="_blank" href="https://github.com/binary550">github</a>
+ <a target="_blank" href="https://gitlab.com/binary550">gitlab</a>
+ <a target="_blank" href="https://artstation.com/binary550">artstation</a>
+ <a target="_blank" href="https://matrix.to/#/@romaingoncalves:ungleich.ch">matrix</a>
+ <a target="_blank" href="https://www.linkedin.com/in/rgoncalvesse/">linkedin</a>
+ <a href="mailto:contact@rgoncalves.se">contact@rgoncalves.se</a>
+</nav>
+
+{% endblock content %}
diff --git a/templates/robots.txt b/templates/robots.txt
new file mode 100644
index 0000000..c6742d8
--- /dev/null
+++ b/templates/robots.txt
@@ -0,0 +1,2 @@
+User-Agent: *
+Disallow: /
diff --git a/templates/sitemap.xml b/templates/sitemap.xml
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/templates/sitemap.xml
@@ -0,0 +1 @@
+
diff --git a/update_images b/update_images
new file mode 100755
index 0000000..fd8f8fa
--- /dev/null
+++ b/update_images
@@ -0,0 +1,15 @@
+#!/bin/bash
+#
+# Update pictures,
+# recursively remove metadata and decrease file size,
+# for each pictures
+
+IMG_DIR="static/images"
+IMG_LIST=$(find ${IMG_DIR})
+IMG_MAX_SIZE="250k"
+
+for img in ${IMG_LIST[@]}; do
+ jhead -purejpg "${img}"
+ jpegoptim --size "${IMG_MAX_SIZE}" "${img}"
+done
+
remember that computers suck.