heather: replace k3s with docker+arion+caddy+syncthing
- remove k3s.nix (1.3GB overhead unjustified for single-node) - add docker.nix (docker + arion CLI, mikl in docker group) - add caddy.nix (edge proxy, TLS via ACME staging, host-based routing) - add syncthing.nix (sync daemon + strelaysrv via systemd, /srv/syncthing) - add arion-compose.nix (forgejo first, others stubbed as TODO) - add arion flake input + nixos module - default.nix: wire up arion project as systemd service (serviceName=heather) Architecture: Caddy (host) terminates TLS, routes to host services (syncthing) and docker containers (arion, 127.0.0.1:PORT). Named volumes everywhere except silverbullet (bind /srv/syncthing/herbarium).
This commit is contained in:
parent
c8b87ffcf1
commit
220d1f651c
8 changed files with 412 additions and 43 deletions
127
hosts/heather/arion-compose.nix
Normal file
127
hosts/heather/arion-compose.nix
Normal file
|
|
@ -0,0 +1,127 @@
|
|||
# heather — Arion compose (nix-native docker-compose).
|
||||
#
|
||||
# Все web-apps в docker-контейнерах, описаны декларативно в nix.
|
||||
# Запускается как systemd-сервис через virtualisation.arion.projects.heather.
|
||||
#
|
||||
# Порты проброшены на localhost (127.0.0.1:PORT) — Caddy на хосте терминирует
|
||||
# TLS и роутит по Host (см. caddy.nix). Контейнеры НЕ выставлены наружу
|
||||
# напрямую (кроме jitsi UDP 10000/19132 — см. jitsi ниже, когда добавим).
|
||||
#
|
||||
# Data: named volumes везде, кроме silverbullet (bind mount на syncthing
|
||||
# sync'аемую папку /srv/syncthing/herbarium — исключение, см. комментарии).
|
||||
#
|
||||
# Backup: offen/docker-volume-backup как sidecar, nightly tar.gz всех named
|
||||
# volumes → /var/backups (добавим последним).
|
||||
#
|
||||
# Порядок миграции: forgejo → tuwunel+admin → cinny → jitsi → teable →
|
||||
# silverbullet. Ниже forgejo как первый proof-of-concept, остальные добавим
|
||||
# по мере миграции (секции заготовлены, закомментированы до теста).
|
||||
|
||||
{ pkgs, ... }:
|
||||
|
||||
{
|
||||
# Named volumes объявляются автоматически docker-compose при упоминании в
|
||||
# services.<name>.service.volumes. Имена префиксуются проектом (heather_forgejo-data)
|
||||
# — видно в `docker volume ls`. Никаких анонимных хэшей.
|
||||
|
||||
services = {
|
||||
# === Forgejo (git.iscg.dev) ===
|
||||
# Первый сервис, proof-of-concept для цепочки arion→docker→Caddy.
|
||||
forgejo = {
|
||||
service.image = "codeberg.org/forgejo/forgejo:9";
|
||||
service.container_name = "forgejo";
|
||||
service.restart = "unless-stopped";
|
||||
service.volumes = [ "forgejo-data:/data" ];
|
||||
service.ports = [
|
||||
"127.0.0.1:3030:3000" # web → Caddy git.iscg.dev
|
||||
"2222:22" # git ssh (публично, как на jul11)
|
||||
];
|
||||
service.environment = {
|
||||
# Домен для клонов: ssh://git@git.iscg.dev:2222/...
|
||||
FORGEJO__server__DOMAIN = "git.iscg.dev";
|
||||
FORGEJO__server__ROOT_URL = "https://git.iscg.dev/";
|
||||
FORGEJO__server__SSH_DOMAIN = "git.iscg.dev";
|
||||
FORGEJO__server__SSH_PORT = "2222";
|
||||
};
|
||||
};
|
||||
|
||||
# === Matrix tuwunel + admin + cinny (iscg.dev, admin/chat.iscg.dev) ===
|
||||
# Добавить после forgejo. Crashloop на jul11 — нужно разобраться с
|
||||
# конфигом/секретами до миграции. См. migration-inventory.md.
|
||||
#
|
||||
# tuwunel = {
|
||||
# service.image = "ghcr.io/matrix-construct/tuwunel:v1.7.1";
|
||||
# service.container_name = "tuwunel";
|
||||
# service.restart = "unless-stopped";
|
||||
# service.volumes = [
|
||||
# "tuwunel-data:/data"
|
||||
# "tuwunel-media-cache:/media-cache"
|
||||
# ];
|
||||
# service.ports = [ "127.0.0.1:8008:8008" ];
|
||||
# # TODO: env vars, secrets (server_name, registration_shared_secret, ...)
|
||||
# };
|
||||
|
||||
# cinny = {
|
||||
# service.image = "ajbura/cinny:latest";
|
||||
# service.container_name = "cinny";
|
||||
# service.restart = "unless-stopped";
|
||||
# service.ports = [ "127.0.0.1:8080:80" ];
|
||||
# };
|
||||
|
||||
# tuwunel-admin был systemd на jul11 (knadh/tuwunel-admin). Если контейнер
|
||||
# существует — добавить сюда, иначе оставить как NixOS-сервис или выкинуть.
|
||||
|
||||
# === Jitsi Meet (jitsi.iscg.dev) ===
|
||||
# Стек: web, jicofo, prosody, jvb, coturn. На jul11 был конфликт :3478
|
||||
# (systemd coturn + docker stack-coturn). На heather — только docker coturn
|
||||
# внутри стека, systemd coturn НЕ поднимаем. Добавить отдельнымcompose-файлом
|
||||
# или секцией после forgejo.
|
||||
|
||||
# === Teable (teable.iscg.dev) ===
|
||||
# Тяжёлый стек: app + postgres + redis. Добавить после forgejo.
|
||||
#
|
||||
# teable = {
|
||||
# service.image = "teableio/teable:latest";
|
||||
# service.container_name = "teable";
|
||||
# service.restart = "unless-stopped";
|
||||
# service.ports = [ "127.0.0.1:2345:3000" ];
|
||||
# service.volumes = [ "teable-data:/app/data" ];
|
||||
# service.depends_on = [ "teable-db" "teable-redis" ];
|
||||
# # TODO: env (DATABASE_URL, REDIS_URL, SECRET_KEY, PUBLIC_ORIGIN, ...)
|
||||
# };
|
||||
# teable-db = {
|
||||
# service.image = "postgres:15-alpine";
|
||||
# service.container_name = "teable-db";
|
||||
# service.restart = "unless-stopped";
|
||||
# service.volumes = [ "teable-db:/var/lib/postgresql/data" ];
|
||||
# # TODO: POSTGRES_PASSWORD (sops)
|
||||
# };
|
||||
# teable-redis = {
|
||||
# service.image = "redis:alpine";
|
||||
# service.container_name = "teable-redis";
|
||||
# service.restart = "unless-stopped";
|
||||
# service.volumes = [ "teable-redis:/data" ];
|
||||
# };
|
||||
|
||||
# === Silverbullet (note.iscg.dev) — ИСКЛЮЧЕНИЕ: bind mount ===
|
||||
# Space = /srv/syncthing/herbarium (sync'ается syncthing на устройства).
|
||||
# Единственный сервис без named volume — по твоему решению, чтобы notes
|
||||
# были доступны и через web UI, и через obsidian/vscode на poppy.
|
||||
# Конфликты syncthing (одновременная правка) решаются через .sync-conflict.
|
||||
#
|
||||
# silverbullet = {
|
||||
# service.image = "zefhemel/silverbullet:latest";
|
||||
# service.container_name = "silverbullet";
|
||||
# service.restart = "unless-stopped";
|
||||
# service.ports = [ "127.0.0.1:3001:3000" ];
|
||||
# service.volumes = [
|
||||
# "/srv/syncthing/herbarium:/space" # bind mount, НЕ named volume
|
||||
# ];
|
||||
# };
|
||||
|
||||
# === Backup sidecar (последним) ===
|
||||
# offen/docker-volume-backup: nightly tar.gz всех named volumes.
|
||||
# Монтирует volumes read-only, шлёт в /var/backups (или S3).
|
||||
# TODO: добавить когда основные сервисы мигрированы.
|
||||
};
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue