1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
|
---
title: "Transitioning to self-hosting"
date: 2026-05-01
taxonomies:
tags: ["web", "self-hosting"]
---
I have migrated this site from [Codeberg Pages](https://codeberg.page/) (and
before that, [sourcehut pages](https://srht.site/)[^1]) to a VPS. This is something
I've been considering for a long time and finally got around to it this week,
in no small part encouraged by recent discourse (see: [one], [two], [three]).
Git
===
I already moved off GitHub many years ago, seeing the, uh, direction, it was taking
after the Microsoft acquisition... I remember when GitHub used to be a good
example of a lightweight website, but much ink has been spilled already on its
overall degradation (see above, also [four]).
I've also set up my server to host [my git repos], inspired by the post [Git
without a forge]. This amounts to a bunch of bare repos and [cgit] as a
frontend.
However, for now I will continue using [Codeberg](https://codeberg.org/lsof/)
for public projects for exposure, reachability, ease for potential contributors,
etc.
Setup
=====
This site and everything in this domain is running in a cheap VPS (1 vCPU, 1GB
RAM) with nginx. Using [Tailscale], I can very easily access it remotely. I use
[Zola] for the static site, building it on my computer and scp'ing the
generated HTML over to the remote server[^2].
For the git 'server', I created a `git` user with its home in `/srv/git/`,
where the bare repos live. This gives me write access to it via ssh with a
remote like `git@<VPS tailnet IP>:<repo name>`. I have the actual VPS
firewalled to reject all traffic except for HTTP (port 80) and HTTPS (port
443), so I can only SSH to it via tailscale, which is good for security
(probably). I also support regular HTTPS cloning. For the frontend I use [cgit]
as mentioned. It integrates easily with nginx, is lightweight, and has a
configurable cache. I've lightly customised its CSS.
TODOs, Future Plans
======================
1. Contingency measures to deal with higher traffic load (nginx cache? rate
limiting? anti-crawler blockers ([Anubis](https://anubis.techaro.lol/)?
[Iocaine](https://iocaine.madhouse-project.org/)?).
2. Performance/load monitoring tools (Grafana?).
3. A personal fediverse server, considering some lightweight options:
- [Akkoma](https://akkoma.social), well established. Elixir + postgres.
- [GoToSocial](https://gotosocial.org/), more frugal. Go + sqlite/postgres.
- [snac](https://codeberg.org/grunfink/snac2), very minimalistic. C + UNIXy filesystem-based DB.
4. Run the actual server locally (I have an old Raspberry Pi around, or an old
laptop..) and keep the VPS just as a reverse proxy that essentially tunnels
the local server over tailscale, maybe with caching and anti-bot filters on
top of that. That way I get to run the server locally without exposing my
home IP. I like the idea of my servers being something I can physically
access.
[one]: https://technomancy.us/204
[two]: https://lonami.dev/blog/ditching-github/
[three]: https://dbushell.com/2026/04/29/github-is-sinking/
[four]: https://mitchellh.com/writing/ghostty-leaving-github
[Git without a forge]: https://www.chiark.greenend.org.uk/~sgtatham/quasiblog/git-no-forge/
[my git repos]: https://git.lemon.rip
[cgit]: https://git.zx2c4.com/cgit/about/
[Zola]: https://www.getzola.org/
[Tailscale]: https://tailscale.com/
[^1]: And before *that*, GitHub Pages. I gotta keep this one around for
[something I made that the OoT speedrunners
use](https://lemon32767.github.io/ootfname.html), or at least just that page.
[^2]: I *could* automate this step by having a post-receive hook in the server
that runs `zola build` when `push`ed to, but it's fine like this.
|