поднимаем selfhost инфраструктуру на debian
есть старый сервер, 8 гб озу, debian. хочется: git-хостинг, блог, синхронизация заметок. без лишнего.
что получилось#
- forgejo — git-хостинг вместо gitlab. потребляет ~140 мб против 4-6 гб
- hugo + dario — статический блог. сборка за 60ms
- syncthing — синхронизация заметок obsidian между устройствами
- nginx — реверс-прокси, ssl, отдаёт статику
- всё в docker, одна сеть
docker-network
структура сервисов#
graph TD
A[nginx :80/:443] --> B[forgejo :3000]
A --> C[webhook :9000]
A --> D[статика блога]
E[syncthing :8384] --> F[устройства]
C --> G[hugo build]
G --> D
сервисы разнесены по папкам — можно перезапустить один не трогая остальные. все подключены к одной docker сети, nginx видит их по именам контейнеров.
автодеплой блога#
самая интересная часть.
sequenceDiagram
participant O as obsidian
participant G as forgejo
participant W as webhook
participant H as hugo
participant N as nginx
O->>G: git push
G->>W: POST /hooks/blog-deploy
W->>G: git pull
W->>H: hugo --minify
H->>N: public/
N->>N: отдаёт новую версию
forgejo шлёт POST на https://pipoduster.ru/hooks/blog-deploy при каждом пуше в main. на сервере висит простой python http сервер который ловит запрос и запускает скрипт деплоя. git тянет изменения через ssh по имени контейнера — они в одной docker сети. hugo пересобирает сайт, nginx отдаёт из той же папки.
ssl#
wildcard сертификат *.pipoduster.ru от let’s encrypt через хостера. один раз выдал — покрывает все поддомены. http автоматически редиректит на https через return 301.
потребление ресурсов#
| сервис | ram |
|---|---|
| forgejo | ~140 мб |
| syncthing | ~70 мб |
| nginx | ~10 мб |
| webhook | ~30 мб |
| итого | ~250 мб из 8 гб |
gitlab на той же машине ел 4-6 гб. разница очевидна.
итог#
пишу пост в obsidian → коммичу → пушу в forgejo → блог обновляется сам. заметки синхронизируются на все устройства через syncthing. всё крутится на одном debian сервере и почти не замечается.