nix-config/hosts/heather/arion-compose.nix
mikl ebf74814bf heather: fix arion volumes declaration + syncthing configDir perms
- arion-compose: project.name (required) + docker-compose.volumes (correct
  option, was docker-compose.raw.volumes which didn't exist)
- syncthing: tmpfiles for /var/lib/syncthing (configDir) owned by mikl,
  fixes 'mkdir /var/lib/syncthing: permission denied' when running as non-default user
2026-07-12 12:39:26 +03:00

140 lines
6.4 KiB
Nix
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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, ... }:
{
# Обязательное имя проекта (COMPOSE_PROJECT_NAME). Объекты префиксуются им:
# heather_forgejo-data и т.д.
project.name = "heather";
# --- Named volumes (декларируем явно, никаких анонимных хэшей) ---
# docker volume create <name> при первом up. Видно в `docker volume ls`.
docker-compose.volumes = {
forgejo-data = {};
tuwunel-data = {};
tuwunel-media-cache = {};
teable-data = {};
teable-db = {};
teable-redis = {};
# jitsi-стек (когда добавим):
# jitsi-prosody-config = {};
# jitsi-jvb-config = {};
};
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: добавить когда основные сервисы мигрированы.
};
}