Compare commits
2 Commits
3e2f9c0684
...
42cbd0e54a
Author | SHA1 | Date | |
---|---|---|---|
42cbd0e54a | |||
25a2de77a1 |
|
@ -84,9 +84,8 @@ sslcacertfile = /etc/ssl/certs/ca-certificates.crt
|
|||
|
||||
### Notes
|
||||
|
||||
I use Standard Notes to take notes and wrote the tool
|
||||
[standardnotes-fs](https://github.com/tannercollin/standardnotes-fs) to mount my
|
||||
notes as a file system to view and edit them as plain text files.
|
||||
I use Standard Notes to take notes and wrote the tool [standardnotes-fs](https://github.com/tannercollin/standardnotes-fs)
|
||||
to mount my notes as a file system to view and edit them as plain text files.
|
||||
|
||||
I take weekly backups of the mounted file system on my media server with cron:
|
||||
|
||||
|
@ -131,9 +130,7 @@ in case Telegram disappears or my account gets banned.
|
|||
<span class="aside">Saves the messages to a sqlite db</span>
|
||||
|
||||
Telegram includes a data export feature, but it can't be automated. Instead I
|
||||
run the deprecated software
|
||||
[telegram-export](https://github.com/expectocode/telegram-export) hourly with
|
||||
cron:
|
||||
run the deprecated software [telegram-export](https://github.com/expectocode/telegram-export) hourly with cron:
|
||||
|
||||
```
|
||||
0 * * * * bash -c 'timeout 50m /home/tanner/opt/telegram-export/env/bin/python -m telegram_export' > /var/log/telegramexport.log 2>&1
|
||||
|
@ -144,16 +141,12 @@ Hasn't corrupted the database yet.
|
|||
|
||||
### Phone
|
||||
|
||||
[Signal
|
||||
Messenger](https://play.google.com/store/apps/details?id=org.thoughtcrime.securesms&hl=en_CA&gl=US)
|
||||
automatically exports a copy of my text messages database, and
|
||||
[Aegis](https://play.google.com/store/apps/details?id=com.beemdevelopment.aegis&hl=en_CA&gl=US)
|
||||
allows me to export an encrypted JSON file of my two-factor authentication
|
||||
[Signal Messenger](https://play.google.com/store/apps/details?id=org.thoughtcrime.securesms&hl=en_CA&gl=US) automatically exports a copy of my text messages database, and
|
||||
[Aegis](https://play.google.com/store/apps/details?id=com.beemdevelopment.aegis&hl=en_CA&gl=US) allows me to export an encrypted JSON file of my two-factor authentication
|
||||
codes.
|
||||
|
||||
I mount my phone's internal storage as a file system on my desktop using
|
||||
[adbfs-rootless](https://github.com/spion/adbfs-rootless). I then rsync the
|
||||
files over to my media server:
|
||||
[adbfs-rootless](https://github.com/spion/adbfs-rootless). I then rsync the files over to my media server:
|
||||
|
||||
```
|
||||
$ ./adbfs ~/mntphone
|
||||
|
@ -181,9 +174,8 @@ All the files will be included in the 1 TB hard drive backup rotations.
|
|||
|
||||
### Web Services
|
||||
|
||||
Web services that I run like [txt.t0.vc](https://txt.t0.vc) and
|
||||
[QotNews](https://news.t0.vc) are backed up daily, weekly, and monthly depending
|
||||
on how frequently the data changes.
|
||||
Web services that I run like [txt.t0.vc](https://txt.t0.vc) and [QotNews](https://news.t0.vc) are backed up daily, weekly,
|
||||
and monthly depending on how frequently the data changes.
|
||||
|
||||
I run `rdiff-backup` on the remote server with cron:
|
||||
|
||||
|
@ -206,11 +198,9 @@ the `rdiff-backup --server` command for security.
|
|||
|
||||
### Protospace
|
||||
|
||||
I run a lot of services for [Protospace](https://protospace.ca/), my city's
|
||||
makerspace.
|
||||
I run a lot of services for [Protospace](https://protospace.ca/), my city's makerspace.
|
||||
|
||||
The member portal I wrote called [Spaceport](https://my.protospace.ca/) creates
|
||||
an archive I download daily:
|
||||
The member portal I wrote called [Spaceport](https://my.protospace.ca/) creates an archive I download daily:
|
||||
|
||||
```
|
||||
40 10 * * * wget --content-disposition \
|
||||
|
@ -220,8 +210,7 @@ an archive I download daily:
|
|||
https://api.my.protospace.ca/backup/
|
||||
```
|
||||
|
||||
The website and [wiki](https://wiki.protospace.ca) that I sysadmin get
|
||||
backed up weekly:
|
||||
The website and [wiki](https://wiki.protospace.ca) that I sysadmin both get backed up weekly:
|
||||
|
||||
```
|
||||
0 12 * * 1 mysqldump --all-databases > /var/www/dump.sql
|
||||
|
@ -229,9 +218,7 @@ backed up weekly:
|
|||
20 12 * * 1 rdiff-backup /var/www pshostbak@remotebackup::/mnt/backup/remote/pshostbak/weekly/www/
|
||||
```
|
||||
|
||||
The Protospace [Minecraft
|
||||
server](http://games.protospace.ca:8123/?worldname=world&mapname=flat&zoom=3&x=74&y=64&z=354)
|
||||
I run gets backed up daily:
|
||||
The Protospace [Minecraft server](http://games.protospace.ca:8123/?worldname=world&mapname=flat&zoom=3&x=74&y=64&z=354) I run gets backed up daily:
|
||||
|
||||
```
|
||||
00 15 * * * date -Iseconds > /home/tanner/minecraft/backup_check.txt
|
||||
|
@ -300,14 +287,11 @@ correctly.
|
|||
## Rotating Hard Drives
|
||||
|
||||
I rotate through 2.5" 1 TB hard drives each Saturday when I do a backup. They
|
||||
are quite cheap at [$65 CAD](https://www.memoryexpress.com/Products/MX65194)
|
||||
each so I can have a bunch floating around.
|
||||
|
||||
are quite cheap at [$65 CAD](https://www.memoryexpress.com/Products/MX65194) each so I can have a bunch floating around.
|
||||
|
||||
I keep one connected to the server, one in my bag, one offsite, one at my
|
||||
mother's house, and one at my dad's house. Every Saturday I run the script above
|
||||
to take a copy and then swap the drive with the one in my bag. It then gets
|
||||
<span class="aside">I go back home about twice per year</span>
|
||||
to take a copy and then swap the drive with the one in my bag. It then gets <span class="aside">I go back home about twice per year</span>
|
||||
swapped when I visit my offsite location. Same for when I visit my parents. This
|
||||
means that all hard drives eventually get rotated through with new data and
|
||||
don't sit too long unpowered.
|
||||
|
|
|
@ -15,16 +15,15 @@ This article explains how I set it up and is targeted towards Linux sysadmins.
|
|||
|
||||
## Overview
|
||||
|
||||
I have a cheap $5 per month virtual server with [Digital
|
||||
Ocean](https://digitalocean.com) that runs Debian GNU/Linux 10. An OpenVPN
|
||||
server is running on this virtual server.
|
||||
I have a cheap $5 per month virtual server with [Digital Ocean](https://digitalocean.com) that runs
|
||||
Debian GNU/Linux 10. An OpenVPN server is running on this virtual server.
|
||||
|
||||
My media server at home has an OpenVPN client connected to the server and is
|
||||
assigned a static IP on the VPN network.
|
||||
|
||||
The virtual server has routing enabled and forwards inbound traffic __from the
|
||||
internet__ to my media server at home. This allows me to have external HTTP and SSH
|
||||
access.
|
||||
internet__ to my media server at home. This allows me to have external HTTP and
|
||||
SSH access.
|
||||
|
||||
## Server Setup
|
||||
|
||||
|
@ -41,8 +40,7 @@ $ sudo apt install openvpn ufw
|
|||
|
||||
### OpenVPN Server
|
||||
|
||||
These steps roughly follow [this
|
||||
guide](https://wiki.debian.org/OpenVPN#TLS-enabled_VPN).
|
||||
These steps roughly follow [this guide](https://wiki.debian.org/OpenVPN#TLS-enabled_VPN).
|
||||
|
||||
Generate TLS certificates and keys:
|
||||
|
||||
|
@ -89,7 +87,8 @@ We make a `mediaserver` client because we want to assign a static IP to it. You
|
|||
need to make a different one for each client you want with a static IP.
|
||||
|
||||
Also, if you want generic clients that all get dynamic IPs for use on your
|
||||
laptop, phone, etc. to protect you from public WiFi (like a normal VPN), create only a single extra one:
|
||||
laptop, phone, etc. to protect you from public WiFi (like a normal VPN), create
|
||||
only a single extra one:
|
||||
|
||||
```
|
||||
$ ./easyrsa build-client-full client nopass # optional
|
||||
|
@ -136,7 +135,8 @@ $ sudo mkdir ccd
|
|||
$ sudo touch ccd/mediaserver
|
||||
```
|
||||
|
||||
Replace `mediaserver` with whatever client name you used above. Edit it like so:
|
||||
Replace `mediaserver` with whatever client name you used above. Edit it like
|
||||
so:
|
||||
|
||||
<span class="aside">Your home server will be `10.8.0.100`</span>
|
||||
|
||||
|
@ -221,11 +221,11 @@ COMMIT
|
|||
Replace `123.123.123.123` with your VPN server's external IP address and `eth0`
|
||||
with the external interface.
|
||||
|
||||
This will forward TCP traffic on port 2222 to your home server. If you want to use
|
||||
port 22, then you need to set the VPN SSH server to something else.
|
||||
This will forward TCP traffic on port 2222 to your home server. If you want to
|
||||
use port 22, then you need to set the VPN SSH server to something else.
|
||||
|
||||
A full example of `/etc/ufw/before.rules` with other ports included can be found
|
||||
here:
|
||||
A full example of `/etc/ufw/before.rules` with other ports included can be
|
||||
found here:
|
||||
|
||||
[https://txt.t0.vc/URUG](https://txt.t0.vc/URUG)
|
||||
|
||||
|
@ -248,7 +248,8 @@ $ sudo apt install openvpn
|
|||
|
||||
### Client Configs
|
||||
|
||||
For static IP clients (like your home server), create the config file `/etc/openvpn/client.conf`:
|
||||
For static IP clients (like your home server), create the config file
|
||||
`/etc/openvpn/client.conf`:
|
||||
|
||||
```
|
||||
client
|
||||
|
@ -288,7 +289,8 @@ $ sudo cat /etc/openvpn/easy-rsa/pki/ca.crt
|
|||
|
||||
Also replace `vpn.example.com` with the subdomain you assigned earlier.
|
||||
|
||||
For device clients (like your laptop and phone), create the config file `client.ovpn`:
|
||||
For device clients (like your laptop and phone), create the config file
|
||||
`client.ovpn`:
|
||||
|
||||
<span class="aside">`redirect-gateway def1` forces traffic over the VPN</span>
|
||||
|
||||
|
|
BIN
content/images/wine/wine1.jpg
Normal file
BIN
content/images/wine/wine1.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 77 KiB |
BIN
content/images/wine/wine2.jpg
Normal file
BIN
content/images/wine/wine2.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 88 KiB |
BIN
content/images/wine/wine3.jpg
Normal file
BIN
content/images/wine/wine3.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 92 KiB |
6
content/pages/creations.md
Normal file
6
content/pages/creations.md
Normal file
|
@ -0,0 +1,6 @@
|
|||
Title: Creations
|
||||
Template: creations
|
||||
Slug: z
|
||||
|
||||
|
||||
Qot.
|
6
content/pages/projects.md
Normal file
6
content/pages/projects.md
Normal file
|
@ -0,0 +1,6 @@
|
|||
Title: Projects
|
||||
Template: projects
|
||||
Slug: y
|
||||
|
||||
|
||||
Qot.
|
|
@ -1,6 +0,0 @@
|
|||
Title: Text Files
|
||||
Template: text-files
|
||||
Slug: x
|
||||
|
||||
|
||||
Qot.
|
6
content/pages/writing.md
Normal file
6
content/pages/writing.md
Normal file
|
@ -0,0 +1,6 @@
|
|||
Title: Writing
|
||||
Template: writing
|
||||
Slug: x
|
||||
|
||||
|
||||
Qot.
|
28
content/wine-crate-coffee-table.md
Normal file
28
content/wine-crate-coffee-table.md
Normal file
|
@ -0,0 +1,28 @@
|
|||
Title: Wine Crate Coffee Table
|
||||
Date: 2018-09-12
|
||||
Category: Creations
|
||||
Summary: A coffee table made out of wooden wine creates.
|
||||
Short: 0
|
||||
|
||||
My close friend Odai saw a simple coffee table design online that was built out
|
||||
of four wooden wine crates. They are quite cheap and available at any hardware
|
||||
store. We each wanted to make one so went and bought eight crates and some
|
||||
plywood to use as a base.
|
||||
|
||||
We went to my local makerspace, Protospace, to build them in the wood shop. We
|
||||
thought it would be a quick job only taking a few hours, but it turned out to be
|
||||
a twelve hour job over a couple of days. At least we were in good company!
|
||||
|
||||
![the table before staining. four box-like wine crates are on their sides and joined together in a spiral. a messy wood shop is in the background]({static}/images/wine/wine1.jpg)
|
||||
|
||||
![the two tables after staining. one face is centred and the contrast between the dark stain and light wood grain shows.]({static}/images/wine/wine2.jpg)
|
||||
|
||||
The wine crates were glued and then brad-nailed together. Extra wood was added
|
||||
under the thin top strips for support. After the glue dried, the brad nails were
|
||||
painstakingly removed because the ones we used were too long and stuck out.
|
||||
|
||||
After being attached to the base, the entire table was sanded and then stained.
|
||||
We let it dry overnight and returned the following day to add a quick layer of
|
||||
varnish.
|
||||
|
||||
![the table in my living room with blankets inside the wine crates and a plant pot in the centre growing a bonsai tree and a succulent]({static}/images/wine/wine3.jpg)
|
|
@ -1,6 +1,7 @@
|
|||
#!/usr/bin/env python
|
||||
# -*- coding: utf-8 -*- #
|
||||
from __future__ import unicode_literals
|
||||
import os
|
||||
|
||||
AUTHOR = 'Tanner Collin'
|
||||
SITENAME = 'Tanner Collin'
|
||||
|
@ -55,7 +56,14 @@ CATEGORIES_SAVE_AS = ''
|
|||
TAGS_SAVE_AS = ''
|
||||
|
||||
INDEX_SAVE_AS = 'index.html'
|
||||
ARTICLE_URL = '{date:%d}/'
|
||||
ARTICLE_SAVE_AS = '{date:%d}/index.html'
|
||||
ARTICLE_URL = '{short}/'
|
||||
ARTICLE_SAVE_AS = '{short}/index.html'
|
||||
PAGE_URL = '{slug}'
|
||||
PAGE_SAVE_AS = '{slug}/index.html'
|
||||
|
||||
def list_text_files():
|
||||
return sorted(os.listdir('./content/text'))
|
||||
|
||||
JINJA_GLOBALS = {'list_text_files': list_text_files}
|
||||
|
||||
PROD = False
|
||||
|
|
|
@ -56,7 +56,7 @@ CATEGORIES_SAVE_AS = ''
|
|||
TAGS_SAVE_AS = ''
|
||||
|
||||
INDEX_SAVE_AS = 'index.html'
|
||||
ARTICLE_URL = '{short}'
|
||||
ARTICLE_URL = '{short}/'
|
||||
ARTICLE_SAVE_AS = '{short}/index.html'
|
||||
PAGE_URL = '{slug}'
|
||||
PAGE_SAVE_AS = '{slug}/index.html'
|
||||
|
|
21
themes/lite/templates/creations.html
Normal file
21
themes/lite/templates/creations.html
Normal file
|
@ -0,0 +1,21 @@
|
|||
{% extends "base.html" %}
|
||||
{% block meta %}
|
||||
{% endblock %}
|
||||
|
||||
{% block style %}
|
||||
{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
Creations
|
||||
=========
|
||||
|
||||
Sometimes I create art or interactive tech.
|
||||
|
||||
{% for article in articles if article.category.name == 'Creations' %}
|
||||
<a href="/{{ article.url }}">{{ article.title }}</a>
|
||||
{{ article.summary | striptags }}
|
||||
|
||||
{% endfor %}
|
||||
|
||||
{% endblock %}
|
||||
|
|
@ -1,14 +1,14 @@
|
|||
{% extends "base.html" %}
|
||||
{% block content %}
|
||||
Hi, I'm Tanner! I like home automation, bots, privacy,
|
||||
Python, Debian, coffee, and makerspaces.
|
||||
Hi, I'm Tanner! I like home automation, <a href=d>sensors</a>, bots,
|
||||
privacy, Python, Debian, coffee, and makerspaces.
|
||||
|
||||
Please sign my <a href=g>Guest Book</a>!
|
||||
|
||||
Email: site3@tannercollin.com
|
||||
Telegram: @tannercollin
|
||||
|
||||
Resume:
|
||||
Resume
|
||||
|
||||
Firmware Engineer at Cabana Blockchain, 2018-
|
||||
Lead Hardware Engineer at Critical Control, 2016-2018
|
||||
|
@ -16,26 +16,29 @@ Electrical Engineer at Opener Aero, 2016-2016
|
|||
Electrical Engineer Intern at Pason Systems, 2014-2015
|
||||
BSc. Electrical Engineering from University of Calgary
|
||||
|
||||
Projects:
|
||||
Projects
|
||||
|
||||
<a href=q>QotNews*
|
||||
<a href=n>Notica*
|
||||
<a href=m>Spaceport*
|
||||
<a href=t>t0txt*
|
||||
<a href=s>standardnotes-fs*</a>
|
||||
<a href=y>[more]</a>
|
||||
|
||||
* external link
|
||||
|
||||
Creations:
|
||||
Creations
|
||||
|
||||
{% for article in articles_page.object_list if article.category.name == 'Creations' %}
|
||||
{% if loop.index <= 4 %}
|
||||
<a href={{ article.url }}>{{ article.title }}
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
<a href=z>[more]
|
||||
</a>
|
||||
Writing:
|
||||
Writing
|
||||
|
||||
{% for article in articles_page.object_list if article.category.name == 'Writing' %}
|
||||
<a href={{ article.url }}>{{ article.title }}
|
||||
{% endfor %}
|
||||
<a href=x>[Text Files]
|
||||
<a href=x>[more]
|
||||
{% endblock %}
|
||||
|
|
36
themes/lite/templates/projects.html
Normal file
36
themes/lite/templates/projects.html
Normal file
|
@ -0,0 +1,36 @@
|
|||
{% extends "base.html" %}
|
||||
{% block meta %}
|
||||
{% endblock %}
|
||||
|
||||
{% block style %}
|
||||
{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
Projects
|
||||
========
|
||||
|
||||
My main hobby is working on software projects. I typically design websites or
|
||||
build tools that make my life easier.
|
||||
|
||||
<a href="https://news.t0.vc/" target="_blank" rel="noreferrer noopener">QotNews*</a> - <a class="source" href="https://git.tannercollin.com/tanner/qotnews" target="_blank" rel="noreferrer noopener">source code*</a>
|
||||
Hacker News, Reddit, Lobsters, and Tildes articles pre-rendered in reader mode.
|
||||
Optimized for speed and distraction-free reading.
|
||||
|
||||
<a href="https://notica.us" target="_blank" rel="noreferrer noopener">Notica*</a> - <a class="source" href="https://github.com/tannercollin/Notica" target="_blank" rel="noreferrer noopener">source code*</a>
|
||||
Send browser notifications from your terminal. No installation. No registration.
|
||||
|
||||
<a href="https://my.protospace.ca" target="_blank" rel="noreferrer noopener">Spaceport*</a> - <a class="source" href="https://github.com/Protospace/spaceport" target="_blank" rel="noreferrer noopener">source code*</a>
|
||||
Makerspace members' portal for Calgary Protospace. It tracks membership,
|
||||
courses, training, access cards, and more.
|
||||
|
||||
<a href="https://txt.t0.vc" target="_blank" rel="noreferrer noopener">t0txt*</a> - <a class="source" href="https://github.com/tannercollin/t0txt" target="_blank" rel="noreferrer noopener">source code*</a>
|
||||
Minimal command line pastebin. Allows you to upload text notes from a bash pipe
|
||||
or web browser.
|
||||
|
||||
<a href="https://github.com/tannercollin/standardnotes-fs" target="_blank" rel="noreferrer noopener">standardnotes-fs*</a>
|
||||
A filesystem that mounts your Standard Notes account as a directory of text
|
||||
files that you can edit.
|
||||
|
||||
* external link
|
||||
{% endblock %}
|
||||
|
|
@ -1,15 +0,0 @@
|
|||
{% extends "base.html" %}
|
||||
{% block meta %}
|
||||
{% endblock %}
|
||||
|
||||
{% block style %}
|
||||
{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<h1>Text Files</h1>
|
||||
Here are some various text notes that I share with the public.
|
||||
<hr />
|
||||
{% for f in list_text_files() %}
|
||||
<a href="../text/{{ f }}">{{ f }}</a>
|
||||
{% endfor %}
|
||||
{% endblock %}
|
28
themes/lite/templates/writing.html
Normal file
28
themes/lite/templates/writing.html
Normal file
|
@ -0,0 +1,28 @@
|
|||
{% extends "base.html" %}
|
||||
{% block meta %}
|
||||
{% endblock %}
|
||||
|
||||
{% block style %}
|
||||
{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
Writing
|
||||
=======
|
||||
|
||||
Various articles, mostly about computers.
|
||||
|
||||
{% for article in articles if article.category.name == 'Writing' %}
|
||||
<a href="/{{ article.url }}">{{ article.title }}</a>
|
||||
{{ article.summary | striptags }}
|
||||
|
||||
{% endfor %}
|
||||
|
||||
Text Files
|
||||
----------
|
||||
|
||||
Here are some random text notes that I share with the public.
|
||||
|
||||
{% for f in list_text_files() %}
|
||||
<a href="../text/{{ f }}">{{ f }}</a>
|
||||
{% endfor %}
|
||||
{% endblock %}
|
Loading…
Reference in New Issue
Block a user