Table of Contents

Caddy

Installing Caddy

On Ubuntu:

sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo tee /etc/apt/trusted.gpg.d/caddy-stable.asc
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list
sudo apt update
sudo apt install caddy

Domain Configuration

  • With a Google Domain, Go to the Custom Resource Records, and set an A level record with a TTL to 1h and set the data field to the IPv4 address you have configured.
  • Wait for about 5 minutes for the changes to take effect.
  • Port 80 and Port 443 must be open.
  • Run the following commands to open traffic to port 80 and 443.
  • sudo iptables -A INPUT -p tcp -m multiport --dports 80,443 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT

Persisting iptable rules

  • sudo apt-get install iptables-persistent will allow iptable rules to persist through restarts
  • at any time if you update rules, run sudo netfilter-persistent save to have them persist.

Running the Caddyfile

  • Create a Caddyfile with the following contents, in /etc/caddy/Caddyfile
domain.com

respond "Hello, Https!"
  • Then, when you go to the domain, you should notice the server being served over https with a cert from letsencrypt.

As Reverse Proxy

  • You can also use Caddy as a reverse proxy:
  • run your server on a different port and have it route to it by using this Caddyfile
domain.com

reverse_proxy 127.0.0.1:${PORT}

Setup

Docs here: https://github.com/pratiktri/server_init_harden

Setting up a VPS:

First, create a new Debian based VM (Debian or Ubuntu).

Then, fetch the hardening script:

wget -q https://sot.li/hardensh -O init-linux-harden.sh && \
bash ./init-linux-harden.sh -d -q -hide

Run the tail command to get the username, password, passphrase, and key pair for the new user to login as. Add the key to your ~/.ssh folder and delete the line in your ~/.ssh/known_hosts file that contains the ip address to the VM.

Next, run:

ssh-agent

Copy paste the top two lines it emits then:

ssh-add ${path_to_key}

And enter the passphrase for the key.

Finally, set an alias in your bashrc file for the ssh command to invoke the ssh login, since this can be a pain to type out. And you're done: a fully secured VM in a few minutes that is ready to serve traffic.

Host linode
  HostName ${IP_ADDRESS}
  User ${USER}
  IdentityFile ${PATH_TO_PEM_FILE}

Apps

Newsboat

Repo: https://sr.ht/~sircmpwn/aerc/

Docs: https://aerc-mail.org/

Installation: brew install aerc

Configuration

accounts.conf

[Personal]
source        = maildir://~/mail
outgoing      = /usr/local/bin/msmtpq
default       = gmail/INBOX
smtp-starttls = yes
from          = Takashi Idobe <idobetakashi@gmail.com>
copy-to       = Sent

aerc.conf

[viewer]
#
# Specifies the pager to use when displaying emails. Note that some filters
# may add ANSI codes to add color to rendered emails, so you may want to use a
# pager which supports ANSI codes.
#
# Default: less -R
# pager=/usr/local/bin/bat
# Prefer HTML over plain text.
alternatives=text/html,text/plain

[filters]
#
# Filters allow you to pipe an email body through a shell command to render
# certain emails differently, e.g. highlighting them with ANSI escape codes.
#
# The first filter which matches the email's mimetype will be used, so order
# them from most to least specific.
#
# You can also match on non-mimetypes, by prefixing with the header to match
# against (non-case-sensitive) and a comma, e.g. subject,text will match a
# subject which contains "text". Use header,~regex to match against a regex.
subject,~^\[PATCH=awk -f /usr/local/share/aerc/filters/hldiff
text/html=bash /usr/local/share/aerc/filters/html
# application/pdf=bash @SHAREDIR@/filters/pdf
# audio/mpeg=bash @SHAREDIR@/filters/mpeg
text/*=awk -f /usr/local/share/aerc/filters/plaintext
#image/*=catimg -w $(tput cols) -

binds.conf

# Binds are of the form <key sequence> = <command to run>
# To use '=' in a key sequence, substitute it with "Eq": "<Ctrl+Eq>"
# If you wish to bind #, you can wrap the key sequence in quotes: "#" = quit
<C-p> = :prev-tab<Enter>
<C-n> = :next-tab<Enter>
<C-t> = :term<Enter>

[messages]
q = :quit<Enter>

j = :next<Enter>
<Down> = :next<Enter>
<C-d> = :next 50%<Enter>
<C-f> = :next 100%<Enter>
<PgDn> = :next -s 100%<Enter>

k = :prev<Enter>
<Up> = :prev<Enter>
<C-u> = :prev 50%<Enter>
<C-b> = :prev 100%<Enter>
<PgUp> = :prev -s 100%<Enter>
g = :select 0<Enter>
G = :select -1<Enter>

J = :next-folder<Enter>
K = :prev-folder<Enter>

v = :mark -t<Enter>
V = :mark -v<Enter>

l = :view<Enter>
d = :prompt 'Really delete this message?' 'delete-message'<Enter>
D = :delete<Enter>
A = :archive flat<Enter>

C = :compose<Enter>

rr = :reply -a<Enter>
rq = :reply -aq<Enter>
Rr = :reply<Enter>
Rq = :reply -q<Enter>

c = :cf<space>
$ = :term<space>
! = :term<space>
| = :pipe<space>

/ = :search<space>
\ = :filter<space>
n = :next-result<Enter>
N = :prev-result<Enter>

[view]
q = :close<Enter>
| = :pipe<space>
D = :delete<Enter>
S = :save<space>
A = :archive flat<Enter>

f = :forward<Enter>
rr = :reply -a<Enter>
rq = :reply -aq<Enter>
Rr = :reply<Enter>
Rq = :reply -q<Enter>

H = :toggle-headers<Enter>
<C-k> = :prev-part<Enter>
<C-j> = :next-part<Enter>
J = :next<Enter>
K = :prev<Enter>

[compose]
# Keybindings used when the embedded terminal is not selected in the compose
# view
$ex = <C-x>
<C-k> = :prev-field<Enter>
<C-j> = :next-field<Enter>
<tab> = :next-field<Enter>

[compose::editor]
# Keybindings used when the embedded terminal is selected in the compose view
$noinherit = true
$ex = <C-x>
<C-k> = :prev-field<Enter>
<C-j> = :next-field<Enter>
<C-p> = :prev-tab<Enter>
<C-n> = :next-tab<Enter>

[compose::review]
# Keybindings used when reviewing a message to be sent
y = :send<Enter>
n = :abort<Enter>
p = :postpone<Enter>
q = :abort<Enter>
e = :edit<Enter>
a = :attach<space>

[terminal]
$noinherit = true
$ex = <C-x>

<C-p> = :prev-tab<Enter>
<C-n> = :next-tab<Enter>

bat

Repo: https://github.com/sharkdp/bat

Docs: https://github.com/sharkdp/bat#readme

Installation: brew install bat

Calcurse

Repo: https://github.com/lfos/calcurse

Docs: https://calcurse.org/

Installation: brew install calcurse

Configuration

caldav/config

[General]
DryRun = No
Hostname = apidata.googleusercontent.com
Path = /caldav/v2/idobetakashi@gmail.com/events/
AuthMethod = oauth2
SyncFilter = cal

[OAuth2]
ClientID=$CLIENT_ID
ClientSecret=$CLIENT_SECRET
Scope=https://www.googleapis.com/auth/calendar
RedirectURI=http://127.0.0.1

keys

#
# Calcurse keys configuration file
#
# In this file the keybindings used by Calcurse are defined.
# It is generated automatically by Calcurse and is maintained
# via the key configuration menu of the interactive user
# interface. It should not be edited directly.

generic-cancel  ESC
generic-select  SPC
generic-credits  @
generic-help  ?
generic-quit  q Q
generic-save  s S ^S
generic-reload  R
generic-copy  c
generic-paste  p ^V
generic-change-view  TAB
generic-import  i I
generic-export  x X
generic-goto  g G
generic-other-cmd  o O
generic-config-menu  C
generic-redraw  ^R
generic-add-appt  ^A
generic-add-todo  ^T
generic-prev-day  T ^H
generic-next-day  t ^L
generic-prev-week  W ^K
generic-next-week  w
generic-prev-month  M
generic-next-month  m
generic-prev-year  Y
generic-next-year  y
generic-scroll-down  ^N
generic-scroll-up  ^P
generic-goto-today  ^G
generic-command  :
move-right  l L RGT
move-left  h H LFT
move-down  j J DWN
move-up  k K UP
start-of-week  0
end-of-week  $
add-item  a A
del-item  d D
edit-item  e E
view-item  v V RET
pipe-item  |
flag-item  !
repeat  r
edit-note  n N
view-note  >
raise-priority  +
lower-priority  -

Eget

Eget is a program that allows you to download other binaries.

Repo: https://github.com/zyedidia/eget

Usage:

Download a prebuilt binary for the current system from a repository on GitHub:

eget zyedidia/micro

Download from a URL:

eget https://go.dev/dl/go1.17.5.linux-amd64.tar.gz

Specify the location to place the downloaded files:

eget zyedidia/micro --to=path/to/directory

Specify a Git tag instead of using the latest version:

eget zyedidia/micro --tag=v2.0.10

Install the latest pre-release instead of the latest stable version:

eget zyedidia/micro --pre-release

Only download the asset, skipping extraction:

eget zyedidia/micro --download-only

Only download if there is a newer release then the currently downloaded version:

eget zyedidia/micro --upgrade-only

Configuration

Use ~/.eget.toml to set the location where binaries are downloaded.

~/eget.toml

[global]
target = "~/.local/bin"

jless

Repo: https://github.com/PaulJuliusMartinez/jless

Docs: https://pauljuliusmartinez.github.io/

Installation:

curl -OL https://github.com/PaulJuliusMartinez/jless/releases/download/v0.7.1/jless-v0.7.1-x86_64-apple-darwin.zip
unzip jless-v0.7.1-x86_64-apple-darwin.zip

jq

Repo: https://github.com/stedolan/jq

Docs: https://stedolan.github.io/jq/

Installation: brew install jq

Kiwix

Link: https://www.kiwix.org/en/

Repo: https://github.com/kiwix/kiwix-desktop

Installation: brew install --cask kiwix

Mpv

Repo: https://github.com/yt-dlp/yt-dlp

Docs: https://github.com/yt-dlp/mpv

Installation: sudo dnf install mpv, brew install mpv

Usage

A audio/video player based on MPlayer. See also: mplayer, vlc. More information: https://mpv.io.

Play a video or audio from a URL or file:

mpv url|path/to/file'

Jump backward/forward 5 seconds:

LEFT <or> RIGHT

Jump backward/forward 1 minute:

DOWN <or> UP

Decrease or increase playback speed by 10%:

[ <or> ]

Take a screenshot of the current frame (saved to ./mpv-shotNNNN.jpg by default):

s

Play a file at a specified speed (1 by default):

mpv --speed=0.01..100 path/to/file

Play a file using a profile defined in the mpv.conf file:

mpv --profile profile_name path/to/file

Display the output of webcam or other video input device:

mpv /dev/video0

Configuration

~/.config/mpv/mpv.conf

hwdec=vaapi
sub-auto=fuzzy
slang=en
# use this for normal youtube video (watch streams in 1080p
# ytdl-format=bestvideo[height<=?1080]+bestaudio/best
# use this for bad internet (480p)
ytdl-format=bestvideo[height<=?480]+bestaudio/best[height<=?480]/worst
ytdl-raw-options=ignore-config=,sub-lang=en,write-sub=,write-auto-sub=

Newsboat

Repo: https://github.com/newsboat/newsboat

Docs: https://newsboat.org/releases/2.10.1/docs/newsboat.html

Installation: brew install newsboat

Configuration

~/.newsboat/config

# general settings
auto-reload yes
max-items 50

# externel browser
browser "open %u"
macro m set browser "/usr/local/bin/mpv %u"; open-in-browser ; set browser "/usr/local/bin/w3m %u"
macro l set browser "/usr/local/bin/firefox %u"; open-in-browser ; set browser "/usr/local/bin/w3m %u"

# unbind keys
unbind-key ENTER
unbind-key j
unbind-key k
unbind-key J
unbind-key K

# Fix g and GG
unbind-key g # bound to `sort` by default
bind-key g home
unbind-key G # bound to `rev-sort` by default
bind-key G end

# bind keys - vim style
bind-key j down
bind-key k up
bind-key l open
bind-key h quit

# highlights
highlight article "^(Title):.*$" blue default
highlight article "https?://[^ ]+" red default
highlight article "\\[image\\ [0-9]+\\]" green default

urls-source "freshrss"
freshrss-url "https://rss.takashiidobe.com/api/greader.php"
freshrss-login "freshrss"
freshrss-password "$PASSWORD"
freshrss-min-items 500
freshrss-show-special-feeds "false"

~/.newsboat/urls

http://jvns.ca/atom.xml
https://hnrss.org/frontpage?count=50
https://lobste.rs/rss
https://danluu.com/atom.xml
https://www.elidedbranches.com/atom.xml
https://huyenchip.com/feed.xml
https://randomascii.wordpress.com/feed.xml
https://mcfunley.com/feed.xml
https://eli.thegreenplace.net/feeds/all.atom.xml
https://brooker.co.za/blog/atom.xml
https://lab.whitequark.org/atom.xml
http://yosefk.com/blog/feed
http://pvk.ca/atom.xml
https://medium.com/feed/@steve-yegge/
https://medium.com/feed/@copyconstruct/
https://medium.com/feed/@vaidehijoshi/
http://steve-yegge.blogspot.com/atom.xml
https://stopa.io/feed.atom
https://idea.popcount.org/rss.xml
https://mrale.ph/atom.xml
https://raphlinus.github.io/feed
https://neverworkintheory.org/atom.xml
https://scattered-thoughts.net/atom.xml
https://drewdevault.com/blog/index.xml
https://kamalmarhubi.com/blog/feed.xml
https://fasterthanli.me/index.xml
https://www.evanmiller.org/news.xml
https://brson.github.io/feed
https://www.youtube.com/feeds/videos.xml?channel_id=UC0VVYtw21rg2cokUystu2Dw
https://www.youtube.com/feeds/videos.xml?channel_id=UCQHX6ViZmPsWiYSFAyS0a3Q
https://www.youtube.com/feeds/videos.xml?channel_id=UCd6Za0CXVldhY8fK8eYoIuw
https://jamesclear.com/feed
https://feeds.feedburner.com/StudyHacks
http://export.arxiv.org/rss/cs
https://jpop-recommend.blogspot.com/atom.xml
https://yumehokori.wordpress.com/feed
https://takashiidobe.com/rss.xml
http://cliffle.com/rss.xml

Sc-im

Sc-im is a tui for spreadsheets.

Installation

I build sc-im from source:

$ git clone https://github.com/andmarti1424/sc-im.git
cd sc-im/src
make
# change prefix in Makefile to ~/.local
make install

Configuration

~/.config/sc-im/scimrc

set autocalc
set numeric
set numeric_decimal=0
set overlap
set xlsx_readformulas

Sc-im can be used to edit csvs, xlsx, and other files.

yq

Repo: https://github.com/mikefarah/yq

Docs: https://mikefarah.gitbook.io/yq/

Installation: brew install yq

yt-dlp

Repo: https://github.com/yt-dlp/yt-dlp

Docs: https://github.com/yt-dlp/yt-dlp

Installation: brew install yt-dlp

Dynamic Sites

Books

Link: https://books.takashiidobe.com

Repository

Repo: https://github.com/Takashiidobe/books

Systemd file

books.service

[Unit]
Description=Books

[Service]
type=oneshot
User=root
Group=root
WorkingDirectory=/home/git/books
ExecStart=git pull

books.timer

[Unit]
Description="Pull Books Repo"

[Timer]
OnUnitActiveSec=1800s
OnBootSec=1800s

[Install]
WantedBy=timers.target

J-pop Server

Link: https://jpop-server.takashiidobe.com

Repository

Repo: https://github.com/Takashiidobe/jpop-server

Systemd file

[Unit]
Description=jpop-server
Documentation=https://caddyserver.com/docs/
After=network.target network-online.target
Requires=network-online.target

[Service]
Type=simple
User=git
Group=git
WorkingDirectory=/home/git/jpop-server
ExecStart=yarn prod
ExecReload=yarn prod
TimeoutStopSec=5s
LimitNOFILE=1048576
LimitNPROC=512
PrivateTmp=true
ProtectSystem=full
AmbientCapabilities=CAP_NET_BIND_SERVICE

[Install]
WantedBy=multi-user.target

Monitor

Link: https://monitor.takashiidobe.com/

Tech Stack

This site uses Gotty to cast terminal output of Zenith to be viewable through the web.

Systemd file

[Unit]
Description=Gotty
After=network.target

[Service]
Environment="GOTTY_PORT=61208"
Environment="GOTTY_CREDENTIAL=admin:iOWiT1v7hpbgM/5jB4Tk6A"
ExecStart=gotty zenith --disable-history
Restart=on-abort
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

Papers

Link: https://papers.takashiidobe.com

Repository

Repo: https://github.com/Takashiidobe/papers

Systemd file

papers.service

[Unit]
Description=Papers

[Service]
type=oneshot
User=root
Group=root
WorkingDirectory=/home/git/papers
ExecStart=git pull

papers.timer

[Unit]
Description="Pull Papers Repo"

[Timer]
OnUnitActiveSec=1800s
OnBootSec=1800s

[Install]
WantedBy=timers.target

Recipe Scraper

Link: https://recipes.takashiidobe.com

Repository

Repo: https://github.com/Takashiidobe/web-recipes

Systemd file

[Unit]
Description=web-recipes
Documentation=https://caddyserver.com/docs/
After=network.target network-online.target
Requires=network-online.target

[Service]
Type=notify
User=git
Group=git
WorkingDirectory=/home/git/web-recipes
ExecStart=/usr/local/bin/gunicorn -b 0.0.0.0:4321 wsgi:app
ExecReload=/usr/local/bin/gunicorn -b 0.0.0.0:4321 wsgi:app
TimeoutStopSec=5s
LimitNOFILE=1048576
LimitNPROC=512
PrivateTmp=true
ProtectSystem=full
AmbientCapabilities=CAP_NET_BIND_SERVICE

[Install]
WantedBy=multi-user.target

Static Sites

Amazon Interview Notes:

Link: https://amazon-interview-notes.takashiidobe.com/

Repo: https://github.com/Takashiidobe/amazon-interview-prep

Minimalistic Anime Database

Repo: https://github.com/Takashiidobe/anime-db

Blog

Link: https://takashiidobe.com

Crypto Charts

Link: https://crypto-charts.takashiidobe.com/

Cryptographic algorithms in Rust

  • This repo implements some common cryptography algorithms with finite fields.

Link: https://crypto.takashiidobe.com/

Jpop Charts

Link: https://jpop.takashiidobe.com/

Links

Link: https://links.takashiidobe.com

Repo: https://github.com/Takashiidobe/links

Music

Link: https://music.takashiidobe.com

MuslCC

Link: https://musl.takashiidobe.com/

Repo: https://github.com/Takashiidobe/muslcc

Notes

Link: https://notes.takashiidobe.com/

Resume

Link: https://resume.takashiidobe.com/

Retirement Calculator

Link: https://retirement-calculator.takashiidobe.com/

Repo: https://github.com/Takashiidobe/retirement-calculator

Stock Charts

Link: https://stock-charts.takashiidobe.com/

Repo: https://github.com/Takashiidobe/stock-dashboard

Stock Dashboard

Link: https://stocks.takashiidobe.com/

System Design Primer

Link: https://system-design-primer.takashiidobe.com

Repo: https://github.com/donnemartin/system-design-primer

Talks

Link: https://talks.takashiidobe.com/

Repo: https://github.com/Takashiidobe/monorepo

Walk and Listen

Link: https://walk.takashiidobe.com

Repo: https://github.com/Takashiidobe/walk-and-listen

Weather App

Link: https://weather.takashiidobe.com/

Repo: https://github.com/Takashiidobe/react-weather

Third Party Services

Cors Anywhere

Link: https://cors-anywhere.takashiidobe.com/

Docs

Docs: https://github.com/Rob--W/cors-anywhere/blob/master/README.md

Repository

Repo: https://github.com/Rob--W/cors-anywhere

Systemd file

[Unit]
Description=cors-anywhere
Documentation=https://github.com/Rob--W/cors-anywhere
After=network.target network-online.target
Requires=network-online.target

[Service]
Type=simple
User=git
Group=git
WorkingDirectory=/home/git/cors-anywhere
ExecStart=/home/git/cors-anywhere/app.js
ExecReload=/home/git/cors-anywhere/app.js
TimeoutStopSec=5s
LimitNOFILE=1048576
LimitNPROC=512
PrivateTmp=true
ProtectSystem=full
AmbientCapabilities=CAP_NET_BIND_SERVICE

[Install]
WantedBy=multi-user.target

FreshRSS

Link: https://rss.takashiidobe.com

Docs

Docs: https://github.com/FreshRSS/FreshRSS/blob/edge/README.md

Repository

Repo: https://github.com/FreshRSS/FreshRSS/

Systemd File

[Unit]
Description=FreshRSS
Requires=docker.service
After=docker.service
Documentation=https://freshrss.github.io/FreshRSS/en/
BindsTo=docker.service
ReloadPropagatedFrom=docker.service

[Service]
RemainAfterExit=true
WorkingDirectory=/home/git/FreshRSS/Docker/
ExecStart=/usr/bin/docker-compose up -d
ExecStop=/usr/bin/docker-compose down
ExecReload=docker-compose up -d

[Install]
WantedBy=multi-user.target

Gitea

Link: https://git.takashiidobe.com

Docs

Docs: https://docs.gitea.io/en-us/

Repository

Repo: https://github.com/go-gitea/gitea

Systemd file

[Unit]
Description=Gitea (Git with a cup of tea)
After=syslog.target
After=network.target
#Requires=mysql.service
#Requires=mariadb.service
#Requires=postgresql.service
#Requires=memcached.service
#Requires=redis.service

[Service]
# Modify these two values and uncomment them if you have
# repos with lots of files and get an HTTP error 500 because
# of that
###
#LimitMEMLOCK=infinity
#LimitNOFILE=65535
RestartSec=2s
Type=simple
User=git
Group=git
WorkingDirectory=/var/lib/gitea/
ExecStart=/usr/local/bin/gitea web -c /etc/gitea/app.ini
Restart=always
Environment=USER=git HOME=/home/git GITEA_WORK_DIR=/var/lib/gitea
# If you want to bind Gitea to a port below 1024 uncomment
# the two values below
###
#CapabilityBoundingSet=CAP_NET_BIND_SERVICE
#AmbientCapabilities=CAP_NET_BIND_SERVICE

[Install]
WantedBy=multi-user.target

Joplin

Link: https://joplin.takashiidobe.com/

Docs

Docs: https://joplinapp.org/

Repository

Repo: https://github.com/laurent22/joplin

Systemd file

[Unit]
Description=joplin
Requires=docker.service
After=docker.service
Documentation=https://github.com/laurent22/joplin
BindsTo=docker.service
ReloadPropagatedFrom=docker.service

[Service]
RemainAfterExit=true
WorkingDirectory=/home/git/joplin
ExecStart=/usr/bin/docker-compose up -d
ExecStop=/usr/bin/docker-compose down
ExecReload=/usr/bin/docker-compose up -d

[Install]
WantedBy=multi-user.target

Libreddit

Link: https://reddit.takashiidobe.com/

Docs

Docs: https://github.com/spikecodes/libreddit/

Repository

Repo: https://github.com/spikecodes/libreddit

Installation

wget https://github.com/spikecodes/libreddit/releases/download/v0.21.7/libreddit

Systemd file

[Unit]
Description=Libreddit
After=syslog.target
After=network.target

[Service]
RestartSec=2s
Type=simple
User=git
Group=git
ExecStart=/usr/bin/libreddit -p 60012
Restart=always
Environment=USER=git

[Install]
WantedBy=multi-user.target

Linkding

Link: https://bookmarks.takashiidobe.com/bookmarks

Docs

Docs: https://github.com/sissbruecker/linkding/blob/master/docs/API.md

Repository

Repo: https://github.com/sissbruecker/linkding

Systemd file

[Unit]
Description=linkding
Requires=docker.service
After=docker.service
Documentation=https://github.com/sissbruecker/linkding/blob/master/docs/API.md
BindsTo=docker.service
ReloadPropagatedFrom=docker.service

[Service]
RemainAfterExit=true
WorkingDirectory=/home/git/linkding
ExecStart=/usr/bin/docker-compose up -d
ExecStop=/usr/bin/docker-compose down
ExecReload=docker-compose up -d

[Install]
WantedBy=multi-user.target

Nitter

Link: https://twitter.takashiidobe.com/

Docs

Docs: https://github.com/zedeus/nitter/blob/master/README.md

Repository

Repo: https://github.com/zedeus/nitter

Systemd file

[Unit]
Description=nitter
Requires=docker.service
After=docker.service
Documentation=https://github.com/zedeus/nitter
BindsTo=docker.service
ReloadPropagatedFrom=docker.service

[Service]
RemainAfterExit=true
WorkingDirectory=/home/git/nitter
ExecStart=/usr/bin/docker-compose up -d
ExecStop=/usr/bin/docker-compose down
ExecReload=docker-compose up -d

[Install]
WantedBy=multi-user.target

OpenVPN

OpenVPN uses your VPS as a reverse proxy.

Docs

Docs: https://openvpn.net/cloud-docs/

Repository

Repository: https://github.com/OpenVPN/openvpn

Installation

Installation: https://github.com/angristan/openvpn-install

Plausible

Link: https://plausible.takashiidobe.com/

Docs

Docs: https://plausible.io/self-hosted-web-analytics

Repository

Repo: https://github.com/plausible/analytics

Systemd file

[Unit]
Description=Plausible
Documentation=https://plausible.io/docs/
Requires=docker.service
After=docker.service
BindsTo=docker.service
ReloadPropagatedFrom=docker.service

[Service]
User=git
Group=git
RemainAfterExit=true
WorkingDirectory=/home/git/plausible
ExecStart=/usr/bin/docker-compose up -d
ExecStop=/usr/bin/docker-compose down
ExecReload=docker-compose up -d

[Install]
WantedBy=multi-user.target