Added Personal Infrastructure talk

This commit is contained in:
AverageMarcus committed 2021-02-10 09:45:42 +00:00
1 parent 624ef4f394
commit bf05413aff
7 files changed
+418 -15

No files matched your search

+1
View File
@@ -16,3 +16,4 @@ lerna-debug.log*
.vscode
*.code-workspace
.history/
Dockerfile
+19
View File
@@ -0,0 +1,19 @@
FROM node:14-alpine AS builder
WORKDIR /app
RUN npm install -g @marp-team/marp-cli
ADD . .
RUN find . -maxdepth 2 -mindepth 2 -name "*.md" -not -name "README.md" -print0 | xargs -0 marp {} \;
RUN mkdir -p out && \
find . -maxdepth 2 -mindepth 2 -name "*.html" -exec mv {} ./out/ \;
FROM nginx:stable-alpine
ENV NGINX_ENTRYPOINT_QUIET_LOGS=1
COPY --from=builder /app/out/* /usr/share/nginx/html/
ADD index.html /usr/share/nginx/html/index.html
RUN echo "server { listen 80; server_name localhost; location / { root /usr/share/nginx/html; index index.html; rewrite ^/([a-zA-Z0-9\-_]+)/?$ /\$1.html last; } }" > /etc/nginx/conf.d/default.conf
+5 -15
View File
@@ -1,6 +1,6 @@
.DEFAULT_GOAL := default
IMAGE ?= docker.cluster.fun/private/talks:latest
IMAGE ?= docker.cluster.fun/averagemarcus/talks:latest
.PHONY: test # Run all tests, linting and format checks
test: lint check-format run-tests
@@ -33,17 +33,11 @@ run-tests:
.PHONY: fetch-deps # Fetch all project dependencies
fetch-deps:
@echo "⚠️ 'fetch-deps' unimplemented"
# GO Projects
# @go mod tidy
# Node Projects
# @npm install
@npm install -g @marp-team/marp-cli
.PHONY: build # Build the project
build: lint check-format fetch-deps
@echo "⚠️ 'build' unimplemented"
# GO Projects
# @go build -o PROJECT_NAME main.go
@find . -maxdepth 2 -mindepth 2 -name "*.md" -not -name "README.md" -print0 | xargs -0 marp {} \;
.PHONY: docker-build # Build the docker image
docker-build:
@@ -54,12 +48,8 @@ docker-publish:
@docker push $(IMAGE)
.PHONY: run # Run the application
run:
@echo "⚠️ 'run' unimplemented"
# GO Projects
# @go run main.go
# Node Projects
# @npm start
run: docker-build
@docker run --rm -it -p 8080:80 $(IMAGE)
.PHONY: ci # Perform CI specific tasks to perform on a pull request
ci:
+1
View File
@@ -0,0 +1 @@
*.html
@@ -0,0 +1,356 @@
---
title: Personal Infrastructure
theme: gaia
_class: lead
backgroundColor: #fff
backgroundImage: url('https://0.s3.envato.com/files/138380962/Preview%20Image%20White%20Low%20Poly%20Background2.jpg')
marp: true
---
![bg left:40% 80%](data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAASABIAAD/4QCgRXhpZgAATU0AKgAAAAgABQESAAMAAAABAAEAAAEaAAUAAAABAAAASgEbAAUAAAABAAAAUgExAAIAAAAHAAAAWodpAAQAAAABAAAAYgAAAAAAAABIAAAAAQAAAEgAAAABR29vZ2xlAAAABJAAAAcAAAAEMDIyMKABAAMAAAABAAEAAKACAAQAAAABAAABC6ADAAQAAAABAAABLAAAAAD/7QA4UGhvdG9zaG9wIDMuMAA4QklNBAQAAAAAAAA4QklNBCUAAAAAABDUHYzZjwCyBOmACZjs+EJ+/8AAEQgBLAELAwESAAIRAQMRAf/EAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC//EALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5+v/EAB8BAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC//EALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5+jp6vLz9PX29/j5+v/bAEMAAwICCwkIDQoKCggIDQgICAgICQkICAgICggHCAcHCAgIBwcHBwcHCAcHBwcHCgcHBwgJCQkHBw0NCggNBwgJCP/bAEMBAwQEBgUGCgYGCg0NCg0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDf/dAAQAIv/aAAwDAQACEQMRAD8A+kPBcn+hxMoU+fBC4yowS0avnIB5bDHjrg85HMXgWyaPTIoz8hiW22k87JI5I4yCf7ouFKvzkLJJ/dFeNUqWlZnr8j3Re8dagYrUXSD57CSO9j+VSWEB/wBIiA+6Rc2j3Fsedv70HqAK6DXIA8D/ACFwEEwj7soJd4ivckxywMvcnBPJrONTlkDTasye41MW16ls4zb3crLp1wQCIbr5ydLumIJjSYI7WNw58tmWW1YxyRWX2jZ8W+Horu38qUGWC/RY3dXKMkkgQ288cikNE7lYTHcRkPDdx2jqU8xnHRCam7Mwd0PvLEKSSqjsy7VBDEHBxt5DDkN0ZfmGeRWLo+uTwgQ3S/a2jLRmZAI5pJIwHkj25KCaaIre2ysDHM7z28nkSiNp7lSfTUaLtrbYYfKueoIVQePX5flBGfUHoeDXRW9oJFWSFllSVVdJFJ2ujqHRh3VWUhivPPy81wSnyuxvHVGY+n72A6IsqPJwM/uysgizjKpIwQnJ+UblJw6GuU/aR+N8WgaU052zXEiyJZRMQokuNu5riZvuxWlqp8yWVjsAEUS5kmijYpRlUdor5kyaW58jf8FGf2l3nZtEsmCpHIq6rIqZknuCizJp0Kqu+RIkaKa6WMEyO0UOQouFr4AOrXd5O5iWWWW5aR2lOBKxkfzrmc5wsLTzO0styWVY1cxbwoUH26NBU0Y8yXmzndfnMRK+azyE/vPKkJjUY5TzFIEr9m2/ImCvzEHGzafDNzGrDafNl8mORuI3mBKiC3UESzYbPm3QVYoAjjIIwezfcwnOUjFtbiQws6gqoKxtIegMittiXPHmSKpkLj51RGIIGSfRPiMctDp9qn7uD5USNRvur2UKLm7kwNzy3B2wwruaKG2jUoVSRwdFHyNGpJe8zz6z01UUSzSO5/ghRiJHVfvF5ju+zxKeA+1jJ84QLjfXtVh8J001HnlMd5MPLWBdoksopWBYu7sVN+8SgNHGmIIwnnSAJJb74aRssNJrmSsu7PPE0KW8kV3SOxiEQER2eXGlvGofcgkPmz5BLNeTviRiSZGwErs9C8L3l4JLiJXuCrqGmm2lElOJkLCTalxPtLSpZNGsdsFSWRYl8lRD9bCUYpbNv8DxnxRMolKRCREQbB5hIkYDOXkU42mTO7YQABt4A4rrdA8PqkrSyuJNoLtNu8xVbdkSRlwftkh+VlYoYvmJxIY1Ri9jBQc32RW8JeB3ly80n2eNBly25nwADtEZK5bad43sNqlCQQyg9N4MtxqV6IWke1toQ01zMuD5UEPzySl2JQSEnas0mdjuXIYxlGxqN27Ho0lCOiu2d54b8BxG3a5QtaW8AeNrptjXdzKFIeG1aRTEGQMGnnCCKzBVEWSVgteyeIYoSqKVFqkFtCtnbsjMNMsDlreeWCZit5rOoKpmsbWYBrSLfd3RMs4jHJe2p2QU56JP0R4j8OfAkl9ckrDOltAyoyw5N1cTOp8mztmkyVuJgVnllndRZWxkuZZEdkx0/iz46yOi6dosUlsp3xtIrE3k2W3TMt0WR4UnfdLPeOVuLjd8xto44VbVS67LzJ9hJ6O/ojhf2hb6C2ka3Ekd3dRhYZFgJfTdNSPI+wWjSEvf3cWSlxqEwYZZsEyF8bej/AiPA3YlkOFfbxEvfZbrtAIToJWADDcQqDAo+s04bu4/7LrVFdKyPnB7yWTq8rfV3b6YBY19q2P7OMOPuDnrv5z9VUBSfrxjsayeZUlshxyaf2mfGNrp0r93Iz1LHb9eTjjv6Y7V+hXh34MW8XSGJjwd7opbtjHy4UcZAGB0Jx3weawvojaOUWerPiDQvh3PKMLv2nv84jyx4C9pHY8AIDk4BIyDX6X+GPhdEu2RlDO2PLBAwgOQCoxwzLySR+7TGMZYnGWZeh1xy1RPgSH9n+4jUNI8i56ooZ5MdQNivtU45wxOO4r9Nl+HMXQrnP3scL/+r3J/AZ54p5jKWzsaRwFM/OzS/gtJnczTEnH7sOXb/ttKT5ZJyB5aBgG7kHA/S3SvhvAvypFEvOS2PmyPVjkjvx+Y6VxSzGa6nRHCwXQ/P+f9mq6lACMyE8gbnC9+PlbfkD+JlHf0FfpTpPg9U+6q/NyzHgnB6c/dXj7q8ZHIO45IZlNdS3Sh2PyT+IvwC1CyG+VZWjGP3qSvJEOP43yPLxjrIFXp83av1/Hg5T1QDPUbRg+uVwQfoRz74r0aeaP7RxTw8GfhjdWjqcs0jY7Fm/D5izHH+71HQ9DX6bftA/sGw3itPpwSzn+ZmgPy2k7Hk8AH7JKx586IeW5JMkb8MvdDMITe9vI5JYddEfljcXj5OWfknIDNg9+menpmvQfiX8FbqwcrcQSQlSA2RgozfdWQAkLuPCyKzwSHASWQnFevTqRaPPqUnF6o8vuLps5yfbkjjt3/AFp09kc9D7Z/zxXXFqx59SLuOt75ifvv6n5m6Dk9WxwOa3vBGrxWr/aHAmki5toTgxmcYKTXGfvQWzYlEK/6+VY1OFSQ1EmkYqfKy54mlMLCIj50iETg5DJPMBJITyBmBGSJeBhvMJ5BNZepaRI2J5CXa5YyKpOZnWRyTMQBlDPKSke5cylmZV2qM5qK6lOo5PU9Z+C1pcXKPDG0UMcYWW5vpovNjtIS5QSJGqmW5u553W3s7OMNLd3TIqA7GKOv9de08uztCwSwEc+pzqhPn6lL8h2MAC62282VgjKhDrLKm11WQROzd7HRKo3psfUGk69JeQppdsjtHP8A8Su2tJJF3yiHdLcR3VzFuzdXJRtQ169+aPTrNUs4FmuLyaQ+x/sfabBp+ni+AjuL+9jW2gicgLb+cpli06JwGVdgjF9qUsagskLM6rDBaxnmc43stwlGaWzXqehfBjwGmkQPCiwSmwVY7q8ljZIzdzKk97cJFGJJJbm8uLi3tYdPt2/cqixB4/8AVP0fws8OG4n4YT2uj3DfM29ft/iIlmuJZCu2JrfTbiWaebInH9pTMD5UmhIGnRfEzKUuh2dpp94katLJbGaUhpYzbbgrTZaOyiEc6YMUSmSWR3fkSyOwURgdzeRrEoJPmOQWZjwXkkaNTgclBNMY0wMlY1QdEIGE5rohxctzkbjTLxQSq2Vz3KqXtm9ggljmiYqDxvePccbsbs16BAABjltg3MeheQsMYHYE5bHRU2DpiuPmu9h87PO4/FboAr2d0rADcPIgfkgHO9JWRs53blODnt0r1ZNLB5ZkySSc4zkkk9+nPA7DA7Vuot9CPan/0PsCw0xXgCyci4jKykd2uU3Mw95HklQYJIkkh654veAL5LyEEBowV2FSSdkigYRnBGUdAtxbznaZYynCSQup+fqQnGSuj2uZLRMw/COukxJ5rL5tvcmwvT8oCXbCPZKUBO2O+b7JdxoxBK6hCcD5hUnijS1Yl3z5d3t0zU13vHJE29ooLlSmDHNbXcohMyCI+TdW8u4i0jy3BSfZk82lztdH01RCbdgdmHjUA4PlPyYcjG1od/7s9TE0R58tqxPCOrS+asFwwE+141cgLFefZzneowFhvrdNxuLUACWOUSxeZEoEUunKGq3JbVzVk0d2cFiHkeNY3bICztCd9pdqoACSgArOgAKsEChtsDVsW8gIbzAECliS3AQJkyMTnIxjJYHIKg9laq9tJ6PcOTlRzXxO+J1roWm+dNnCt5VvCgHn3V3MZJFht42ZQ8kzl5DllSJN8jsiQuw/NL4vfFa78XeIWjsji3s1litLiRXAt9PJjSa9IVld7nVWQ/MuHmtmtok8ndeSx9MMGm+eo/kRBuTsrnnfxo+JVx4i1GWe6lEUFrGZL2ZD/o9taLine truncated
# **Personal Infrastructure**
**Marcus Noble**
🔗 https://marcusnoble.co.uk
🐦 @Marcus_Noble_
✨ AverageMarcus
---
<!-- _class: lead -->
## A little about me and the past
- I work professionally as a "DevOps" engineer at Elsevier with a focus on Kubernetes and containers
- Previously a JavaScript developer, now a Go developer
- I've been running my own servers for as long back as I can recall
- I like to tinker with "Smart Home" stuff
---
<!-- _class: lead -->
### 1. Personal network setup
### 2. Smart home
### 3. Replacing Google Analytics
---
<!-- _class: lead -->
## Personal network setup
---
## Where things are at today...
* **87** uniquely identifiable devices connected to my home network
* A Zigbee network with **32** devices
* A single-node Kubernetes cluster running on a dedicated desktop machine hosting **14** applications
* An autoscaling 1-3 node Kubernetes cluster hosted on Scaleway running **~30** applications
* 1 Raspberry Pi running Home Assistant to control all smart devices in my home
* 1 Raspberry Pi running OctoPi to control my 3D printer
---
## Previously
* Raspberry Pi 4 running k3s Kubernetes cluster
- Only ARM arch support - required me to manually rebuild some images
- I had stability and performance issues
* Dokku running on a VPS server hosted on bHost (now Mythic Beasts)
---
<!-- _class: lead -->
## Local Network setup
**FTTP** - Zen Internet
↯
**ISP Modem**
↯
**Powerline**
↯
**Router** - TP-Link Archer C7
↯
**Mesh WiFi beacons** - TP-Link Deco M4 (x3)
↯
**87 devices**
---
<!-- _class: lead -->
## Local Network setup
5 devices connected via ethernet
Everything else via WiFi
All devices have static IPs and assigned hostnames
(based on the periodic table of elements)
---
## Kubernetes - local
An old desktop machine repurposed as a single-node Kubernetes cluster
**OS**: Ubuntu
**Kubernetes Version**: Microk8s v1.20.1
**Specs**: CPU - 4 core | Memory - 12Gb | HDD - Lots
---
## Kubernetes - local
**Primary Use**: Hosting sensitive or local-specific applications that I want to keep off the internet.
E.g.
- custom built CCTV monitoring application covering the 8 cameras I currently have set up
- automated download tools so I can kick off downloads remotely while I'm out
- DNS-based ad blocker (AdGuard)
---
## Kubernetes - cloud
Hosted on Scaleway's managed Kubernetes platform, Kapsule.
1-3 *DEV1_M* instances, autoscaled based on load.
All defined in code using Terraform and stored in git.
**Kubernetes Version**: v1.20
**Specs**: CPU - 3 vCPUs | Memory - 4Gb | HDD - 40Gb + 14 PVCs of varying size
---
## Kubernetes - cloud
<style scoped>p, ul { font-size: 0.85em; }</style>
**Primary Use**: Hosting internet facing services and providing a secure, authenticated tunnel to my local cluster
E.g.
- My personal blog plus some related sites
- Self-hosted alternatives to cloud services: Gitea, Nextcloud, Harbor, Photoprism, etc.
- Tekton - handle all my CI/CD needs, triggered by webhooks from Gitea
- "Utility" applications to make my life easier:
- Convert SVG to DXF - used when creating 3D print designs from SVG
- website-to-remarkable - lets me send a webpage as a PDF to my reMarkable tablet for later reading
---
<!-- _class: lead -->
## Time for a quick break
☕️
Questions so far?
---
<!-- _class: lead -->
## Smart Home
---
<style scoped>ul { font-size: 0.95em; }</style>
- Home Assistant centrally controlling all devices
- Combination of Zigbee and WiFi devices
- Amazon Echo in every room
- Most rooms have smart lighting: ceiling bulbs, floor lamps, LED strips
- Motion and light sensors used to trigger turning lights on
- Outdoor lighting with LED strips + motion/light sensors
- Cheap Android tablets acting as dashboards
![bg right:30% 90%](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABosAAAN6CAYAAABWinCdAAABQ2lDQ1BJQ0MgUHJvZmlsZQAAKJFjYGASSCwoyGFhYGDIzSspCnJ3UoiIjFJgf8rAxMDBwMIgzyCSmFxc4BgQ4ANUwgCjUcG3awyMIPqyLsisTWtmdsvq208uM3NZ/diBKRpTPQrgSkktTgbSf4A4KbmgqISBgTEByFYuLykAsVuAbJEioKOA7BkgdjqEvQbEToKwD4DVhAQ5A9lXgGyB5IzEFCD7CZCtk4Qkno7EhtoLAhzBxiZepqYVBJxKOihJrSgB0c75BZVFmekZJQqOwBBKVfDMS9bTUTAyMDJkYACFN0T15xvgcGQU40CI5W5mYLCoYmBgkkGIpfQwMOyQB3r5LEJMZToDA386A8Mel4LEokS4Axi/sRSnGRtB2NzbGRhYp/3//zmcgYFdk4Hh7/X//39v////7zIGBuZbDAwHvgEAAOtdAF3raekAAABWZVhJZk1NACoAAAAIAAGHaQAEAAAAAQAAABoAAAAAAAOShgAHAAAAEgAAAESgAgAEAAAAAQAABougAwAEAAAAAQAAA3oAAAAAQVNDSUkAAABTY3JlZW5zaG90UPp4ngAAAddpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IlhNUCBDb3JlIDUuNC4wIj4KICAgPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIKICAgICAgICAgICAgeG1sbnM6ZXhpZj0iaHR0cDovL25zLmFkb2JlLmNvbS9leGlmLzEuMC8iPgogICAgICAgICA8ZXhpZjpQaXhlbFhEaW1lbnNpb24+MTY3NTwvZXhpZjpQaXhlbFhEaW1lbnNpb24+CiAgICAgICAgIDxleGlmOlVzZXJDb21tZW50PlNjcmVlbnNob3Q8L2V4aWY6VXNlckNvbW1lbnQ+CiAgICAgICAgIDxleGlmOlBpeGVsWURpbWVuc2lvbj44OTA8L2V4aWY6UGl4ZWxZRGltZW5zaW9uPgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4K/R7RggAAQABJREFUeAHs3QecJWWZL+C38+Q8wJCTRAHJYEAwoSIYAROIIoooezHvuncXFd1dDGu4ZgUjoiAqKoKiS1BZEBGJkuMMafJM96ROt96qqZ6egRl6AiB9nhpPV/qqzqmnzu/n4fzP+31N/cUUJgIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgYYUaG7Iq3bRBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECpYCwyBuBAAECBAgQIECAAAECBAgQIECAAAECBAgQINDAAsKiBr75Lp0AAQIECBAgQIAAAQIECBAgQIAAAQIECBAgICzyHiBAgAABAgQIECBAgAABAgQIECBAgAABAgQINLCAsKiBb75LJ0CAAAECBAgQIECAAAECBAgQIECAAAECBAgIi7wHCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQINLCAsauCb79IJECBAgAABAgQIECBAgAABAgQIECBAgAABAsIi7wECBAgQIECAAAECBAgQIECAAAECBAgQIECAQAMLCIsa+Oa7dAIECBAgQIAAAQIECBAgQIAAAQIECBAgQICAsMh7gAABAgQIECBAgAABAgQIECBAgAABAgQIECDQwALCoga++S6dAAECBAgQIECAAAECBAgQIECAAAECBAgQICAs8h4gQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECDSwgLCogW++SydAgAABAgQIECBAgAABAgQIECBAgAABAgQICIu8BwgQIECAAAECBAgQIECAAAECBAgQIECAAAECDSwgLGrgm+/SCRAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQLCIu8BAgQIECBAgAABAgQIECBAgAABAgQIECBAgEADCwiLGvjmu3QCBAgQIECAAAECBAgQIECAAAECBAgQIECAgLDIe4AAAQIECBAgQIAAAQIECBAgQIAAAQIECBAg0MACwqIGvvkunQABAgQIECBAgAABAgQIECBAgAABAgQIECAgLPIeIECAAAECBAgQIECAAAECBAgQIECAAAECBAg0sICwqIFvvksnQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECAiLvAcIECBAgAABAgQIECBAgAABAgQIECBAgAABAg0sICxq4Jvv0gkQIECAAAECBAgQIECAAAECBAgQIECAAAECwiLvAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAAwsIixr45rt0AgQIECBAgAABAgQIECBAgAABAgQIECBAgICwyHuAAAECBAgQIECAAAECBAgQIECAAAECBAgQINDAAsKiBr75Lp0AAQIECBAgQIAAAQIECBAgQIAAAQIECBAgICzyHiBAgAABAgQIECBAgAABAgQIECBAgAABAgQINLCAsKiBb75LJ0CAAAECBAgQIECAAAECBAgQIECAAAECBAgIi7wHCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQINLCAsauCb79IJECBAgAABAgQIECBAgAABAgQIECBAgAABAsIi7wECBAgQIECAAAECBAgQIECAAAECBAgQIECAQAMLCIsa+Oa7dAIECBAgQIAAAQIECBAgQIAAAQIECBAgQICAsMh7gAABAgQIECBAgAABAgQIECBAgAABAgQIECDQwALCoga++S6dAAECBAgQIECAAAECBAgQIECAAAECBAgQICAs8h4gQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECDSwgLCogW++SydAgAABAgQIECBAgAABAgQIECBAgAABAgQICIu8BwgQIECAAAECBAgQIECAAAECBAgQIECAAAECDSwgLGrgm+/SCRAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQLCIu8BAgQIECBAgAABAgQIECBAgAABAgQIECBAgEADCwiLGvjmu3QCBAgQIECAAAECBAgQIECAAAECBAgQIECAgLDIe4AAAQIECBAgQIAAAQIECBAgQIAAAQIECBAg0MACwqIGvvkunQABAgQIECBAgAABAgQIECBAgAABAgQIECAgLPIeIECAAAECBAgQIECAAAECBAgQIECAAAECBAg0sICwqIFvvksnQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECAiLvAcIECBAgAABAgQIECBAgAABAgQIECBAgAABAg0sICxq4Jvv0gkQIECAAAECBAgQIECAAAECBAgQIECAAAECwiLvAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAAwsIixr45rt0AgQIECBAgAABAgQIECBAgAABAgQIECBAgICwyHuAAAECBAgQIECAAAECBAgQIECAAAECBAgQINDAAsKiBr75Lp0AAQIECBAgQIAAAQIECBAgQIAAAQIECBAgICzyHiBAgAABAgQIECBAgAABAgQIECBAgAABAgQINLCAsKiBb75LJ0CAAAECBAgQIECAAAECBAgQIECAAAECBAgIi7wHCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQINLCAsauCb79IJECBAgAABAgQIECBAgAABAgQIECBAgAABAsIi7wECBAgQIECAAAECBAgQIECAAAECBAgQIECAQAMLCIsa+Oa7dAIECBAgQIAAAQIECBAgQIAAAQIECBAgQICAsMh7gAABAgQIECBAgAABAgQIECBAgAABAgQIECDQwALCoga++S6dAAECBAgQIECAAAECBAgQIECAAAECBAgQICAs8h4gQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECDSwgLCogW++SydAgAABAgQIECBAgAABAgQIECBAgAABAgQICIu8BwgQIECAAAECBAgQIECAAAECBAgQIECAAAECDSwgLGrgm+/SCRAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQLCIu8BAgQIECBAgAABAgQIECBAgAABAgQIECBAgEADCwiLGvjmu3QCBAgQIECAAAECBAgQIECAAAECBAgQIECAgLDIe4AAAQIECBAgQIAAAQIECBAgQIAAAQIECBAg0MACwqIGvvkunQABAgQIECBAgAABAgQIECBAgAABAgQIECAgLPIeIECAAAECBAgQIECAAAECBAgQIECAAAECBAg0sICwqIFvvksnQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECAiLvAcIECBAgAABAgQIECBAgAABAgQIECBAgAABAg0sICxq4Jvv0gkQIECAAAECBAgQIECAAAECBAgQIECAAAECwiLvAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAAwsIixr45rt0AgQIECBAgAABAgQIECBAgAABAgQIECBAgICwyHuAAAECBAgQIECAAAECBAgQIECAAAECBAgQINDAAsKiBr75Lp0AAQIECBAgQIAAAQIECBAgQIAAAQIECBAgICzyHiBAgAABAgQIECBAgAABAgQIECBAgAABAgQINLCAsKiBb75LJ0CAAAECBAgQIECAAAECBAgQIECAAAECBAgIi7wHCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQINLCAsauCb79IJECBAgAABAgQIECBAgAABAgQIECBAgAABAsIi7wECBAgQIECAAAECBAgQIECAAAECBAgQIECAQAMLCIsa+Oa7dAIECBAgQIAAAQIECBAgQIAAAQIECBAgQICAsMh7gLine truncated
---
<style scoped>ul { font-size: 0.9em; }</style>
## Typical Day
* 🌙 Wake up at 5am 🥱
* Take my phone off charge 📱 and my office lights automatically turn on along with my monitor 💡🖥
* 🚶🏽‍♂️ Walk downstairs and as I pass through the landing and the hallway the lights automatically turn on at 20% brightness 💡
* Enter the kitchen to get a drink and again the light turns on at 20% brightness 🥛💡
* Go through to the living room and tap on the tablet by the door to turn on the sofa lamp 🛋
* Open the back door to let the dog out 🐶 the LED strip along the garden fence lights up as the door opens
---
<style scoped>ul { font-size: 0.9em; }</style>
## Typical Day
* Time to get some work done 👨🏻‍💻
* Check my calendar for meetings - morning free so decide to set my 3D printer going
* Tap on the tablet mounted in front of my monitor to turn on my 3D printer and start it pre-heating 🔥
* Access my OctoPrint webpage and select the model to print 🖨
* Some time later access my 📹 CCTV webpage to check what the dog is up to downstairs 🐕
* Head down to the kitchen for a snack 🍪 - this time the lights come on at 100% brightness as does the lamp in the kitchen 💡
---
<style scoped>ul { font-size: 0.9em; }</style>
## Typical Day
* Lunchtime - head down for food 🧆 this time the lights don't come on as there is already enough natural light
* While eating my 3D printer finishes printing and shortly after turns itself off 🔌
* Back to work... 👨🏻‍💻
---
<style scoped>ul { font-size: 0.9em; }</style>
## Typical Day
* Evening - take the dog for a walk 🦮 outdoor lights come on as the front door is opened, turning off automatically a few minutes later
* When returning back the lights again turn on automatically as I approach to illuminate the keyhole
* Dinner time 🍔 put food in the over then ask Echo to set a timer
* Timer sounds - take food out and plate up. 🍛 Tap a button on the tablet that triggers an announcement on all the Echos in the house letting the family know food is ready 📣
* Daughter's bedtime 🛏 lights on her desk flash briefly letting her know it's bedtime and the lights under her bed turn on to a dim glow
---
<style scoped>ul { font-size: 0.9em; }</style>
## Typical Day
* Bedtime 🛏
* While getting ready for bed I check my phone to make sure all lights are turned off through the house and if not toggle them off 🎚
* When in bed - "Echo, turn the lights off" 🌑
* 😴
---
<style scoped>p { font-size: 0.9em; }</style>
## Security
Where possible devices have been flashed with custom firmware that makes them run in a local-only mode. This is done on all cameras, all compatible WiFi plugs and most of the LED strips.
Unnecessary external network traffic is blocked by AdGuard.
Firewall on router blocks all incoming ports.
Amazon Echo's ... 🤷🏼‍♂️
Secure external access is provides via a tunnel between my local cluster and my remote cluster. All endpoints authenticated and monitored. Local cluster connects to internet via a VPN.
---
## Misc
- Automation handles brightness of lights based on time of day and amount of light already in the room
- Automation controls the volume of the Echos throughout the house based on time of day
- Alerts sent to phones when outside doors, garden gate or garage door are left open for too long
- Most lights set to automatically turn off after a period of inactivity
- 4 Tablets mounted throughout the house as dashboards
---
<!-- _class: lead -->
## Time for a quick break
☕️
Questions so far?
---
<!-- _class: lead -->
## Replacing Google Analytics
---
### Why?
- Never used 99% of the functionality that Google Analytics provides
- Slowly de-google-ing myself so I should do the same for my website visitors
- Client-side analytics are flakey at best
- All I really wanted to know was:
- What pages are popular when?
- How are bots trying to do naughty things?
- Anything throwing error codes?
---
### The solution!
<style scoped>p {text-align: center;}</style>
Traefik + Loki + Grafana
* Traefik - Handles all incoming HTTP requests and logs out to an access log in JSON format.
* Loki - Collects all logs from the application in my cluster and stores them ready for querying.
* Grafana - Queries the Loki data and displays it as a dashboard
---
### Example Access Log
```json
{
"BackendAddr": "100.64.128.16:8000", "BackendName": "http-https_marcusnoble.co.uk/",
"BackendURL": { "Scheme": "http", "Opaque": "", "User": null, "Host": "100.64.128.16:8000", "Path": "", "RawPath": "", "ForceQuery": false, "RawQuery": "", "Fragment": "" },
"ClientAddr": "100.64.0.1:10948", "ClientHost": "100.64.0.1", "ClientPort": "10948", "ClientUsername": "-",
"DownstreamContentSize": 1245, "DownstreamStatus": 200,"DownstreamStatusLine": "200 OK",
"Duration": 25958433,
"FrontendName": "http-https_marcusnoble.co.uk/",
"OriginContentSize": 1245, "OriginDuration": 25716428, "OriginStatus": 200, "OriginStatusLine": "200 OK",
"Overhead": 242005,
"RequestAddr": "marcusnoble.co.uk", "RequestContentSize": 0, "RequestCount": 50101, "RequestHost": "marcusnoble.co.uk",
"RequestLine": "GET /css/main.css?202102052202 HTTP/1.1",
"RequestMethod": "GET", "RequestPath": "/css/main.css?202102052202", "RequestPort": "-", "RequestProtocol": "HTTP/1.1",
"RetryAttempts": 0,
"StartLocal": "2021-02-09T10:04:23.441099709Z", "StartUTC": "2021-02-09T10:04:23.441099709Z",
"downstream_Accept-Ranges": "bytes", "downstream_Cache-Control": "public, max-age=0", "downstream_Content-Encoding": "gzip", "downstream_Content-Type": "text/css; charset=UTF-8",
"downstream_Date": "Tue, 09 Feb 2021 10:04:23 GMT", "downstream_Etag": "W/\"13dc-1777437f9e8\"", "downstream_Last-Modified": "Fri, 05 Feb 2021 22:02:41 GMT",
"downstream_Vary": "Accept-Encoding", "downstream_X-Powered-By": "Express",
"level": "info",
"msg": "",
"origin_Accept-Ranges": "bytes", "origin_Cache-Control": "public, max-age=0", "origin_Content-Encoding": "gzip", "origin_Content-Type": "text/css; charset=UTF-8",
"origin_Date": "Tue, 09 Feb 2021 10:04:23 GMT", "origin_Etag": "W/\"13dc-1777437f9e8\"", "origin_Last-Modified": "Fri, 05 Feb 2021 22:02:41 GMT", "origin_Vary": "Accept-Encoding", "origin_X-Powered-By": "Express",
"request_Accept": "text/css,*/*;q=0.1", "request_Accept-Encoding": "gzip,deflate,br", "request_Accept-Language": "en-US", "request_Connection": "keep-alive", "request_From": "googlebot(at)googlebot.com",
"request_Referer": "https://marcusnoble.co.uk/",
"request_User-Agent": "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; Googlebot/2.1; +http://www.google.com/bot.html) Safari/537.36",
"time": "2021-02-09T10:04:23Z"
}
```
---
![bg contain](data:image/png;base64,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 truncated
---
![bg contain](data:image/png;base64,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 truncated
---
![bg contain](data:image/png;base64,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 truncated
---
![bg contain](data:image/png;base64,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 truncated
---
![bg contain](data:image/png;base64,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 truncated
---
![bg contain]( data:image/png;base64,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 truncated
---
<!-- _class: lead -->
## Fin!
Question?
+3
View File
@@ -0,0 +1,3 @@
# Personal Infrastructure
A casual talk given at [Not JSOxford](https://not.jsoxford.com/) on 10th February 2021 about my personal infrastructure setup, my smart home devices and how I make use of Kubernetes for a bunch of stuff.
+33
View File
@@ -0,0 +1,33 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Talks</title>
<style>
body {
display: flex;
flex-direction: column;
text-align: center;
font-size: 2em;
font-family: monospace;
background-color: gainsboro;
}
a {
color: tomato !important;
}
</style>
</head>
<body>
<h1>Marcus Noble - Talks</h1>
<figure>
<iframe src="/PersonalInfrastructure" width="500px" height="300px"></iframe>
<figcaption>
<a href="/PersonalInfrastructure">Personal Infrastructure</a>
</figcaption>
</figure>
</body>
</html>