135 lines
3.9 KiB
Nix
135 lines
3.9 KiB
Nix
{
|
|
config,
|
|
pkgs,
|
|
...
|
|
}:
|
|
let
|
|
cfg = config.services.affine;
|
|
in
|
|
{
|
|
options.services.affine =
|
|
let
|
|
lib = pkgs.lib;
|
|
in
|
|
{
|
|
port = lib.mkOption {
|
|
type = lib.types.port;
|
|
default = 3010;
|
|
description = "Port number for the AFFiNE service";
|
|
};
|
|
dataDir = lib.mkOption {
|
|
type = lib.types.path;
|
|
default = "/var/lib/affine";
|
|
description = "Directory to store AFFiNE data";
|
|
};
|
|
};
|
|
|
|
config = {
|
|
systemd.services.create-affine-network = {
|
|
description = "Create Docker network for LibreChat";
|
|
serviceConfig.Type = "oneshot";
|
|
wantedBy = [ "multi-user.target" ];
|
|
script = ''
|
|
if ! ${pkgs.docker}/bin/docker network inspect affine-network >/dev/null 2>&1; then
|
|
${pkgs.docker}/bin/docker network create affine-network
|
|
fi
|
|
'';
|
|
};
|
|
|
|
virtualisation.oci-containers.containers = {
|
|
#############
|
|
# AFFiNE #
|
|
#############
|
|
# NOTE settings live in `/var/lib/librechat` manually right now
|
|
# Note to remove limits from user need to mark user as subscriber in the database manually
|
|
# docker exec it affine_postgres psql -U affine
|
|
# select id, feature, configs from features;
|
|
# select * from users;
|
|
# select * from user_features;
|
|
# feature_id = YOUR FEATURE ID YOU WANT TO ASSIGN (get it from 'List possible feature id's')
|
|
# user_id = YOUR USER ID YOU WANT TO CHANGE (get it from 'List users with id's')
|
|
# update user_features set feature_id = 35 where user_id = 'xxxxxx-xxxx-xxxxxxx-xxxx-xxxxxxxxxxxx';
|
|
affine = {
|
|
user = "root";
|
|
image = "ghcr.io/toeverything/affine-graphql:stable";
|
|
ports = [
|
|
"${toString cfg.port}:${toString cfg.port}"
|
|
];
|
|
dependsOn = [
|
|
"affine_redis"
|
|
"affine_postgres"
|
|
"affine_migration"
|
|
];
|
|
environment = {
|
|
REDIS_SERVER_HOST = "affine_redis";
|
|
DATABASE_URL = "postgresql://affine:password@affine_postgres:5432/affine";
|
|
};
|
|
volumes = [
|
|
"${cfg.dataDir}/storage:/root/.affine/storage"
|
|
"${cfg.dataDir}/config:/root/.affine/config"
|
|
];
|
|
extraOptions = [
|
|
"--network=affine-network"
|
|
];
|
|
};
|
|
|
|
affine_migration = {
|
|
user = "root";
|
|
image = "ghcr.io/toeverything/affine-graphql:stable";
|
|
dependsOn = [
|
|
"affine_redis"
|
|
"affine_postgres"
|
|
];
|
|
volumes = [
|
|
"${cfg.dataDir}/storage:/root/.affine/storage"
|
|
"${cfg.dataDir}/config:/root/.affine/config"
|
|
];
|
|
environment = {
|
|
REDIS_SERVER_HOST = "affine_redis";
|
|
DATABASE_URL = "postgresql://affine:password@affine_postgres:5432/affine";
|
|
};
|
|
cmd = [
|
|
"sh"
|
|
"-c"
|
|
"node ./scripts/self-host-predeploy.js"
|
|
];
|
|
extraOptions = [ "--network=affine-network" ];
|
|
};
|
|
|
|
affine_redis = {
|
|
user = "root";
|
|
image = "redis";
|
|
extraOptions = [
|
|
"--network=affine-network"
|
|
"--health-cmd=\"CMD-SHELL redis-cli ping\""
|
|
"--health-interval=30s"
|
|
"--health-timeout=10s"
|
|
"--health-retries=3"
|
|
"--health-start-period=30s"
|
|
];
|
|
};
|
|
|
|
affine_postgres = {
|
|
user = "root";
|
|
image = "postgres:16";
|
|
environment = {
|
|
POSTGRES_USER = "affine";
|
|
POSTGRES_PASSWORD = "password";
|
|
POSTGRES_DB = "affine";
|
|
POSTGRES_INITDB_ARGS = "--data-checksums";
|
|
};
|
|
volumes = [
|
|
"${cfg.dataDir}/postgres:/var/lib/postgresql/data"
|
|
];
|
|
extraOptions = [
|
|
"--network=affine-network"
|
|
"--health-cmd=\"CMD-SHELL pg_isready -U affine\""
|
|
"--health-interval=10s"
|
|
"--health-timeout=5s"
|
|
"--health-retries=5"
|
|
"--health-start-period=30s"
|
|
];
|
|
};
|
|
};
|
|
};
|
|
}
|