{ config, ... }: let inherit (config.virtualisation.quadlet) containers networks; appEnv = config.sops.secrets."containers/thetree-app.env".path; databaseEnv = config.sops.secrets."containers/thetree-database.env".path; searchEnv = config.sops.secrets."containers/thetree-search.env".path; rustfsEnv = config.sops.secrets."containers/thetree-rustfs.env".path; in { sops.secrets = { "containers/thetree-app.env" = { sopsFile = ../../secrets/thetree-app.env; format = "dotenv"; key = ""; mode = "0400"; restartUnits = [ "thetree-app.service" ]; }; "containers/thetree-database.env" = { sopsFile = ../../secrets/thetree-database.env; format = "dotenv"; key = ""; mode = "0400"; restartUnits = [ "thetree-database.service" ]; }; "containers/thetree-search.env" = { sopsFile = ../../secrets/thetree-search.env; format = "dotenv"; key = ""; mode = "0400"; restartUnits = [ "thetree-search.service" ]; }; "containers/thetree-rustfs.env" = { sopsFile = ../../secrets/thetree-rustfs.env; format = "dotenv"; key = ""; mode = "0400"; restartUnits = [ "thetree-rustfs.service" ]; }; }; virtualisation.quadlet = { networks.thetree = { }; containers = { thetree-database = { containerConfig = { image = "docker.io/library/mongo:latest"; networks = [ networks.thetree.ref ]; networkAliases = [ "db" ]; volumes = [ "/home/imnyang/Docker/thetree/db:/data/db:Z" ]; environmentFiles = [ databaseEnv ]; }; serviceConfig.Restart = "always"; }; thetree-redis = { containerConfig = { image = "docker.io/library/redis:latest"; networks = [ networks.thetree.ref ]; networkAliases = [ "redis" ]; volumes = [ "/home/imnyang/Docker/thetree/redis:/data:Z" ]; }; serviceConfig.Restart = "always"; }; thetree-search = { containerConfig = { image = "docker.io/getmeili/meilisearch:v1.23"; networks = [ networks.thetree.ref ]; networkAliases = [ "search" ]; volumes = [ "/home/imnyang/Docker/thetree/meili_data:/meili_data:Z" ]; environmentFiles = [ searchEnv ]; }; serviceConfig.Restart = "always"; }; thetree-rustfs = { containerConfig = { image = "docker.io/rustfs/rustfs:latest"; networks = [ networks.thetree.ref ]; networkAliases = [ "rustfs" "thetree.rustfs" ]; publishPorts = [ "9000:9000" "9001:9001" ]; podmanArgs = [ "--security-opt=no-new-privileges:true" ]; volumes = [ "/home/imnyang/Docker/thetree/rustfs/data:/data:Z" "/home/imnyang/Docker/thetree/rustfs/logs:/app/logs:Z" "/home/imnyang/Docker/thetree/rustfs/certs:/opt/tls:Z" ]; environmentFiles = [ rustfsEnv ]; }; serviceConfig.Restart = "always"; }; thetree-app = { containerConfig = { image = "ghcr.io/wjdgustn/thetree:master"; networks = [ networks.thetree.ref ]; publishPorts = [ "51337:3000" ]; addHosts = [ "host.docker.internal:host-gateway" ]; volumes = [ "/home/imnyang/Docker/thetree/skins:/usr/src/app/skins:Z" "/home/imnyang/Docker/thetree/customStatic:/usr/src/app/customStatic:Z" "/home/imnyang/Docker/thetree/plugins:/usr/src/app/plugins:Z" "/home/imnyang/Docker/thetree/cache:/usr/src/app/cache:Z" "/home/imnyang/Docker/thetree/frontend:/usr/src/app/frontend:Z" "/home/imnyang/Docker/thetree/config:/usr/src/app/config:Z" "/etc/timezone:/etc/timezone:ro" "/etc/localtime:/etc/localtime:ro" ]; environmentFiles = [ appEnv ]; }; unitConfig = { Requires = [ containers."thetree-database".ref containers."thetree-redis".ref containers."thetree-search".ref containers."thetree-rustfs".ref ]; After = [ containers."thetree-database".ref containers."thetree-redis".ref containers."thetree-search".ref containers."thetree-rustfs".ref ]; }; serviceConfig.Restart = "always"; }; }; }; }