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
Alevel record with aTTLto1hand 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-persistentwill allow iptable rules to persist through restarts- at any time if you update rules, run
sudo netfilter-persistent saveto have them persist.
Running the Caddyfile
- Create a
Caddyfilewith 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
- Anime DB
- Blog
- Crypto
- Crypto Charts
- Jpop
- Music
- Musl CC
- Notes
- Resume
- Stocks
- Stock Charts
- System Design Primer
- Walk
- Weather
- Retirement Calculator
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