fadenstack 0.4.2__tar.gz → 0.4.4__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {fadenstack-0.4.2 → fadenstack-0.4.4}/PKG-INFO +4 -4
- {fadenstack-0.4.2 → fadenstack-0.4.4}/README.md +1 -1
- {fadenstack-0.4.2 → fadenstack-0.4.4}/pyproject.toml +3 -3
- {fadenstack-0.4.2 → fadenstack-0.4.4}/src/faden_cli/__init__.py +1 -1
- {fadenstack-0.4.2 → fadenstack-0.4.4}/src/faden_cli/bundle/shared/docker-compose.yaml +90 -5
- {fadenstack-0.4.2 → fadenstack-0.4.4}/src/faden_cli/bundle/shared/nginx/locations.conf +28 -0
- {fadenstack-0.4.2 → fadenstack-0.4.4}/src/faden_cli/cli.py +2 -0
- {fadenstack-0.4.2 → fadenstack-0.4.4}/src/faden_cli/commands/admin.py +6 -1
- {fadenstack-0.4.2 → fadenstack-0.4.4}/src/faden_cli/commands/backup.py +12 -3
- {fadenstack-0.4.2 → fadenstack-0.4.4}/src/faden_cli/commands/deploy.py +104 -34
- {fadenstack-0.4.2 → fadenstack-0.4.4}/src/faden_cli/commands/dev/dev_up.py +2 -2
- {fadenstack-0.4.2 → fadenstack-0.4.4}/src/faden_cli/commands/rebuild.py +11 -1
- {fadenstack-0.4.2 → fadenstack-0.4.4}/src/faden_cli/commands/restore.py +43 -17
- fadenstack-0.4.4/src/faden_cli/commands/secrets.py +145 -0
- {fadenstack-0.4.2 → fadenstack-0.4.4}/src/faden_cli/commands/up.py +6 -0
- {fadenstack-0.4.2 → fadenstack-0.4.4}/src/faden_cli/commands/upgrade.py +10 -1
- fadenstack-0.4.4/src/faden_cli/core/backup.py +1251 -0
- {fadenstack-0.4.2 → fadenstack-0.4.4}/src/faden_cli/core/compose.py +22 -1
- {fadenstack-0.4.2 → fadenstack-0.4.4}/src/faden_cli/core/dev_modules.py +3 -0
- {fadenstack-0.4.2 → fadenstack-0.4.4}/src/faden_cli/core/env_gen.py +107 -7
- {fadenstack-0.4.2 → fadenstack-0.4.4}/src/faden_cli/core/local_node.py +180 -65
- {fadenstack-0.4.2 → fadenstack-0.4.4}/src/faden_cli/core/maintenance.py +2 -2
- {fadenstack-0.4.2 → fadenstack-0.4.4}/src/faden_cli/core/registry.py +8 -0
- {fadenstack-0.4.2 → fadenstack-0.4.4}/src/faden_cli/core/release_feed.py +7 -1
- {fadenstack-0.4.2 → fadenstack-0.4.4}/src/faden_cli/core/schedule.py +1 -1
- fadenstack-0.4.4/src/faden_cli/core/secret_rotation.py +451 -0
- {fadenstack-0.4.2 → fadenstack-0.4.4}/tests/conftest.py +11 -0
- fadenstack-0.4.4/tests/test_backup_retention.py +79 -0
- {fadenstack-0.4.2 → fadenstack-0.4.4}/tests/test_backup_schedule.py +2 -2
- {fadenstack-0.4.2 → fadenstack-0.4.4}/tests/test_backup_volumes.py +63 -3
- fadenstack-0.4.4/tests/test_binary_notices.py +126 -0
- fadenstack-0.4.4/tests/test_data_dir_move.py +328 -0
- fadenstack-0.4.4/tests/test_data_volumes_logs.py +352 -0
- fadenstack-0.4.4/tests/test_deploy_summary.py +23 -0
- {fadenstack-0.4.2 → fadenstack-0.4.4}/tests/test_dev_up_terminal.py +2 -0
- fadenstack-0.4.4/tests/test_generated_env_reaches_compose.py +58 -0
- {fadenstack-0.4.2 → fadenstack-0.4.4}/tests/test_installation.py +2 -2
- fadenstack-0.4.4/tests/test_internal_token_env.py +86 -0
- fadenstack-0.4.4/tests/test_local_node.py +151 -0
- {fadenstack-0.4.2 → fadenstack-0.4.4}/tests/test_private_files.py +2 -2
- fadenstack-0.4.4/tests/test_rebuild.py +50 -0
- fadenstack-0.4.4/tests/test_redis_limits.py +56 -0
- {fadenstack-0.4.2 → fadenstack-0.4.4}/tests/test_release_bundle.py +6 -0
- {fadenstack-0.4.2 → fadenstack-0.4.4}/tests/test_release_feed.py +7 -0
- {fadenstack-0.4.2 → fadenstack-0.4.4}/tests/test_required_env.py +51 -4
- fadenstack-0.4.4/tests/test_restore_maintenance.py +96 -0
- {fadenstack-0.4.2 → fadenstack-0.4.4}/tests/test_runtime_images.py +2 -2
- fadenstack-0.4.4/tests/test_secret_rotation.py +443 -0
- fadenstack-0.4.4/tests/test_service_logins.py +63 -0
- {fadenstack-0.4.2 → fadenstack-0.4.4}/tests/test_shared_compose_ports.py +2 -1
- {fadenstack-0.4.2 → fadenstack-0.4.4}/tests/test_tls.py +10 -10
- {fadenstack-0.4.2 → fadenstack-0.4.4}/tests/test_tls_renew.py +4 -4
- fadenstack-0.4.4/tests/test_trusted_keys.py +32 -0
- fadenstack-0.4.2/OFFICIAL.md +0 -9
- fadenstack-0.4.2/src/faden_cli/bundle/shared/OFFICIAL.md +0 -9
- fadenstack-0.4.2/src/faden_cli/core/backup.py +0 -717
- fadenstack-0.4.2/tests/test_generated_env_reaches_compose.py +0 -32
- fadenstack-0.4.2/tests/test_internal_token_env.py +0 -34
- {fadenstack-0.4.2 → fadenstack-0.4.4}/.gitignore +0 -0
- {fadenstack-0.4.2 → fadenstack-0.4.4}/LICENSE +0 -0
- {fadenstack-0.4.2 → fadenstack-0.4.4}/NOTICE +0 -0
- {fadenstack-0.4.2 → fadenstack-0.4.4}/hatch_build.py +0 -0
- {fadenstack-0.4.2 → fadenstack-0.4.4}/src/faden_cli/__main__.py +0 -0
- {fadenstack-0.4.2 → fadenstack-0.4.4}/src/faden_cli/bundle/shared/.gitignore +0 -0
- {fadenstack-0.4.2 → fadenstack-0.4.4}/src/faden_cli/bundle/shared/LICENSE +0 -0
- {fadenstack-0.4.2 → fadenstack-0.4.4}/src/faden_cli/bundle/shared/NOTICE +0 -0
- {fadenstack-0.4.2 → fadenstack-0.4.4}/src/faden_cli/bundle/shared/README.md +0 -0
- {fadenstack-0.4.2 → fadenstack-0.4.4}/src/faden_cli/bundle/shared/agent-binaries/.gitignore +0 -0
- {fadenstack-0.4.2 → fadenstack-0.4.4}/src/faden_cli/bundle/shared/alloy/config.alloy +0 -0
- {fadenstack-0.4.2 → fadenstack-0.4.4}/src/faden_cli/bundle/shared/clickhouse/config.d/system-logs.xml +0 -0
- {fadenstack-0.4.2 → fadenstack-0.4.4}/src/faden_cli/bundle/shared/docker-compose.gpu.yaml +0 -0
- {fadenstack-0.4.2 → fadenstack-0.4.4}/src/faden_cli/bundle/shared/grafana/dashboards/templates/vllm-runtime.json +0 -0
- {fadenstack-0.4.2 → fadenstack-0.4.4}/src/faden_cli/bundle/shared/grafana/provisioning/dashboards/dashboard.yml +0 -0
- {fadenstack-0.4.2 → fadenstack-0.4.4}/src/faden_cli/bundle/shared/grafana/provisioning/dashboards/json/faden-overview.json +0 -0
- {fadenstack-0.4.2 → fadenstack-0.4.4}/src/faden_cli/bundle/shared/grafana/provisioning/datasources/ds.yaml +0 -0
- {fadenstack-0.4.2 → fadenstack-0.4.4}/src/faden_cli/bundle/shared/grafana/provisioning/datasources/prometheus.yaml +0 -0
- {fadenstack-0.4.2 → fadenstack-0.4.4}/src/faden_cli/bundle/shared/initdb/01-init.sql +0 -0
- {fadenstack-0.4.2 → fadenstack-0.4.4}/src/faden_cli/bundle/shared/loki/local-config.yaml +0 -0
- {fadenstack-0.4.2 → fadenstack-0.4.4}/src/faden_cli/bundle/shared/nginx/maintenance.html +0 -0
- {fadenstack-0.4.2 → fadenstack-0.4.4}/src/faden_cli/bundle/shared/nginx/nginx-tls.conf +0 -0
- {fadenstack-0.4.2 → fadenstack-0.4.4}/src/faden_cli/bundle/shared/nginx/nginx.conf +0 -0
- {fadenstack-0.4.2 → fadenstack-0.4.4}/src/faden_cli/bundle/shared/nginx/rate-limits.conf +0 -0
- {fadenstack-0.4.2 → fadenstack-0.4.4}/src/faden_cli/bundle/shared/nginx/security-headers.conf +0 -0
- {fadenstack-0.4.2 → fadenstack-0.4.4}/src/faden_cli/bundle/shared/nginx/select-config.sh +0 -0
- {fadenstack-0.4.2 → fadenstack-0.4.4}/src/faden_cli/bundle/shared/prometheus/prometheus.yml +0 -0
- {fadenstack-0.4.2 → fadenstack-0.4.4}/src/faden_cli/bundle/shared/rabbitmq/definitions.json.example +0 -0
- {fadenstack-0.4.2 → fadenstack-0.4.4}/src/faden_cli/bundle/shared/tls/README.md +0 -0
- {fadenstack-0.4.2 → fadenstack-0.4.4}/src/faden_cli/commands/__init__.py +0 -0
- {fadenstack-0.4.2 → fadenstack-0.4.4}/src/faden_cli/commands/config.py +0 -0
- {fadenstack-0.4.2 → fadenstack-0.4.4}/src/faden_cli/commands/dev/__init__.py +0 -0
- {fadenstack-0.4.2 → fadenstack-0.4.4}/src/faden_cli/commands/dev/dev_doctor.py +0 -0
- {fadenstack-0.4.2 → fadenstack-0.4.4}/src/faden_cli/commands/dev/dev_down.py +0 -0
- {fadenstack-0.4.2 → fadenstack-0.4.4}/src/faden_cli/commands/dev/dev_group.py +0 -0
- {fadenstack-0.4.2 → fadenstack-0.4.4}/src/faden_cli/commands/dev/dev_init.py +0 -0
- {fadenstack-0.4.2 → fadenstack-0.4.4}/src/faden_cli/commands/dev/dev_pull.py +0 -0
- {fadenstack-0.4.2 → fadenstack-0.4.4}/src/faden_cli/commands/dev/dev_status.py +0 -0
- {fadenstack-0.4.2 → fadenstack-0.4.4}/src/faden_cli/commands/doctor.py +0 -0
- {fadenstack-0.4.2 → fadenstack-0.4.4}/src/faden_cli/commands/down.py +0 -0
- {fadenstack-0.4.2 → fadenstack-0.4.4}/src/faden_cli/commands/logs_cmd.py +0 -0
- {fadenstack-0.4.2 → fadenstack-0.4.4}/src/faden_cli/commands/maintenance.py +0 -0
- {fadenstack-0.4.2 → fadenstack-0.4.4}/src/faden_cli/commands/module.py +0 -0
- {fadenstack-0.4.2 → fadenstack-0.4.4}/src/faden_cli/commands/observe.py +0 -0
- {fadenstack-0.4.2 → fadenstack-0.4.4}/src/faden_cli/commands/ports.py +0 -0
- {fadenstack-0.4.2 → fadenstack-0.4.4}/src/faden_cli/commands/runtime_images.py +0 -0
- {fadenstack-0.4.2 → fadenstack-0.4.4}/src/faden_cli/commands/status.py +0 -0
- {fadenstack-0.4.2 → fadenstack-0.4.4}/src/faden_cli/commands/tls.py +0 -0
- {fadenstack-0.4.2 → fadenstack-0.4.4}/src/faden_cli/commands/tune.py +0 -0
- {fadenstack-0.4.2 → fadenstack-0.4.4}/src/faden_cli/commands/version.py +0 -0
- {fadenstack-0.4.2 → fadenstack-0.4.4}/src/faden_cli/core/__init__.py +0 -0
- {fadenstack-0.4.2 → fadenstack-0.4.4}/src/faden_cli/core/api_client.py +0 -0
- {fadenstack-0.4.2 → fadenstack-0.4.4}/src/faden_cli/core/bootstrap.py +0 -0
- {fadenstack-0.4.2 → fadenstack-0.4.4}/src/faden_cli/core/bundle.py +0 -0
- {fadenstack-0.4.2 → fadenstack-0.4.4}/src/faden_cli/core/clickhouse.py +0 -0
- {fadenstack-0.4.2 → fadenstack-0.4.4}/src/faden_cli/core/console.py +0 -0
- {fadenstack-0.4.2 → fadenstack-0.4.4}/src/faden_cli/core/detect.py +0 -0
- {fadenstack-0.4.2 → fadenstack-0.4.4}/src/faden_cli/core/docker_env.py +0 -0
- {fadenstack-0.4.2 → fadenstack-0.4.4}/src/faden_cli/core/edge.py +0 -0
- {fadenstack-0.4.2 → fadenstack-0.4.4}/src/faden_cli/core/git.py +0 -0
- {fadenstack-0.4.2 → fadenstack-0.4.4}/src/faden_cli/core/install.py +0 -0
- {fadenstack-0.4.2 → fadenstack-0.4.4}/src/faden_cli/core/installation.py +0 -0
- {fadenstack-0.4.2 → fadenstack-0.4.4}/src/faden_cli/core/private_files.py +0 -0
- {fadenstack-0.4.2 → fadenstack-0.4.4}/src/faden_cli/core/rmq.py +0 -0
- {fadenstack-0.4.2 → fadenstack-0.4.4}/src/faden_cli/core/runtime_images.py +0 -0
- {fadenstack-0.4.2 → fadenstack-0.4.4}/src/faden_cli/core/settings.py +0 -0
- {fadenstack-0.4.2 → fadenstack-0.4.4}/src/faden_cli/core/sysinfo.py +0 -0
- {fadenstack-0.4.2 → fadenstack-0.4.4}/src/faden_cli/core/tls.py +0 -0
- {fadenstack-0.4.2 → fadenstack-0.4.4}/src/faden_cli/core/tune.py +0 -0
- {fadenstack-0.4.2 → fadenstack-0.4.4}/src/faden_cli/core/update_check.py +0 -0
- {fadenstack-0.4.2 → fadenstack-0.4.4}/src/faden_cli/core/workspace.py +0 -0
- {fadenstack-0.4.2 → fadenstack-0.4.4}/src/faden_cli/templates/env.j2 +0 -0
- {fadenstack-0.4.2 → fadenstack-0.4.4}/src/faden_cli/tui/__init__.py +0 -0
- {fadenstack-0.4.2 → fadenstack-0.4.4}/src/faden_cli/tui/widgets/__init__.py +0 -0
- {fadenstack-0.4.2 → fadenstack-0.4.4}/src/faden_cli/tui/wizard/__init__.py +0 -0
- {fadenstack-0.4.2 → fadenstack-0.4.4}/tests/test_backup_tls.py +0 -0
- {fadenstack-0.4.2 → fadenstack-0.4.4}/tests/test_bootstrap_token.py +0 -0
- {fadenstack-0.4.2 → fadenstack-0.4.4}/tests/test_cli_output_encoding.py +0 -0
- {fadenstack-0.4.2 → fadenstack-0.4.4}/tests/test_dev_env_loopback.py +0 -0
- {fadenstack-0.4.2 → fadenstack-0.4.4}/tests/test_dev_modules.py +0 -0
- {fadenstack-0.4.2 → fadenstack-0.4.4}/tests/test_dev_up_port_holders.py +0 -0
- {fadenstack-0.4.2 → fadenstack-0.4.4}/tests/test_dev_up_reclaim.py +0 -0
- {fadenstack-0.4.2 → fadenstack-0.4.4}/tests/test_dev_up_service_hosts.py +0 -0
- {fadenstack-0.4.2 → fadenstack-0.4.4}/tests/test_docker_env.py +0 -0
- {fadenstack-0.4.2 → fadenstack-0.4.4}/tests/test_doctor_ports.py +0 -0
- {fadenstack-0.4.2 → fadenstack-0.4.4}/tests/test_edge.py +0 -0
- {fadenstack-0.4.2 → fadenstack-0.4.4}/tests/test_main.py +0 -0
- {fadenstack-0.4.2 → fadenstack-0.4.4}/tests/test_maintenance.py +0 -0
- {fadenstack-0.4.2 → fadenstack-0.4.4}/tests/test_module_env.py +0 -0
- {fadenstack-0.4.2 → fadenstack-0.4.4}/tests/test_postgres_logins.py +0 -0
- {fadenstack-0.4.2 → fadenstack-0.4.4}/tests/test_registry_gateway_env.py +0 -0
- {fadenstack-0.4.2 → fadenstack-0.4.4}/tests/test_tune.py +0 -0
- {fadenstack-0.4.2 → fadenstack-0.4.4}/tests/test_tune_memory.py +0 -0
- {fadenstack-0.4.2 → fadenstack-0.4.4}/tests/test_update_check.py +0 -0
- {fadenstack-0.4.2 → fadenstack-0.4.4}/tests/test_update_feed.py +0 -0
- {fadenstack-0.4.2 → fadenstack-0.4.4}/tests/test_upgrade_housekeeping.py +0 -0
- {fadenstack-0.4.2 → fadenstack-0.4.4}/tests/test_upgrade_rabbitmq.py +0 -0
- {fadenstack-0.4.2 → fadenstack-0.4.4}/tests/test_workspace_detection.py +0 -0
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: fadenstack
|
|
3
|
-
Version: 0.4.
|
|
3
|
+
Version: 0.4.4
|
|
4
4
|
Summary: CLI installer and management tool for the Fadenstack platform
|
|
5
|
-
Project-URL: Homepage, https://fadenstack.
|
|
5
|
+
Project-URL: Homepage, https://fadenstack.com
|
|
6
6
|
Project-URL: Repository, https://github.com/fadenstack/fadenstack
|
|
7
|
-
Project-URL: Documentation, https://fadenstack.
|
|
7
|
+
Project-URL: Documentation, https://help.fadenstack.com
|
|
8
8
|
Project-URL: Issues, https://github.com/fadenstack/fadenstack/issues
|
|
9
9
|
Author-email: Sachith Liyanagama <liyanagama@outlook.de>
|
|
10
10
|
Maintainer-email: Sachith Liyanagama <liyanagama@outlook.de>
|
|
@@ -50,7 +50,7 @@ faden deploy # installs Fadenstack into ~/fadenstack and starts
|
|
|
50
50
|
```
|
|
51
51
|
|
|
52
52
|
The CLI carries the deployment files of its release and runs that release's
|
|
53
|
-
published images: `fadenstack 0.4.
|
|
53
|
+
published images: `fadenstack 0.4.3` deploys Fadenstack 0.4.3. To upgrade,
|
|
54
54
|
upgrade the CLI and run `faden upgrade`. See
|
|
55
55
|
[Installing Fadenstack](https://github.com/fadenstack/fadenstack/blob/main/docs/help/pages/operate/installing.md).
|
|
56
56
|
|
|
@@ -15,7 +15,7 @@ faden deploy # installs Fadenstack into ~/fadenstack and starts
|
|
|
15
15
|
```
|
|
16
16
|
|
|
17
17
|
The CLI carries the deployment files of its release and runs that release's
|
|
18
|
-
published images: `fadenstack 0.4.
|
|
18
|
+
published images: `fadenstack 0.4.3` deploys Fadenstack 0.4.3. To upgrade,
|
|
19
19
|
upgrade the CLI and run `faden upgrade`. See
|
|
20
20
|
[Installing Fadenstack](https://github.com/fadenstack/fadenstack/blob/main/docs/help/pages/operate/installing.md).
|
|
21
21
|
|
|
@@ -10,7 +10,7 @@ packages = ["src/faden_cli"]
|
|
|
10
10
|
|
|
11
11
|
[project]
|
|
12
12
|
name = "fadenstack"
|
|
13
|
-
version = "0.4.
|
|
13
|
+
version = "0.4.4"
|
|
14
14
|
requires-python = ">=3.12,<4.0"
|
|
15
15
|
description = "CLI installer and management tool for the Fadenstack platform"
|
|
16
16
|
authors = [
|
|
@@ -49,9 +49,9 @@ dependencies = [
|
|
|
49
49
|
]
|
|
50
50
|
|
|
51
51
|
[project.urls]
|
|
52
|
-
Homepage = "https://fadenstack.
|
|
52
|
+
Homepage = "https://fadenstack.com"
|
|
53
53
|
Repository = "https://github.com/fadenstack/fadenstack"
|
|
54
|
-
Documentation = "https://fadenstack.
|
|
54
|
+
Documentation = "https://help.fadenstack.com"
|
|
55
55
|
Issues = "https://github.com/fadenstack/fadenstack/issues"
|
|
56
56
|
|
|
57
57
|
[project.scripts]
|
|
@@ -11,6 +11,16 @@
|
|
|
11
11
|
# unpacks the release into (~/fadenstack by default).
|
|
12
12
|
name: fadenstack
|
|
13
13
|
|
|
14
|
+
# Docker's own log of every container (what `docker logs` and Alloy read) rotates:
|
|
15
|
+
# at most FADEN_LOG_MAX_FILE files of FADEN_LOG_MAX_SIZE each per container, the
|
|
16
|
+
# oldest dropped. Without it the json-file driver grows until the disk is full.
|
|
17
|
+
# Set in .env (faden deploy --log-max-size / --log-max-file; Help: Installing).
|
|
18
|
+
x-logging: &faden-logging
|
|
19
|
+
driver: json-file
|
|
20
|
+
options:
|
|
21
|
+
max-size: ${FADEN_LOG_MAX_SIZE:-50m}
|
|
22
|
+
max-file: "${FADEN_LOG_MAX_FILE:-5}"
|
|
23
|
+
|
|
14
24
|
services:
|
|
15
25
|
# -----------------------------
|
|
16
26
|
# Platform base image (build-only, no runtime container)
|
|
@@ -28,6 +38,7 @@ services:
|
|
|
28
38
|
nginx:
|
|
29
39
|
image: nginx:1-alpine
|
|
30
40
|
container_name: faden-nginx
|
|
41
|
+
logging: *faden-logging
|
|
31
42
|
restart: unless-stopped
|
|
32
43
|
ports:
|
|
33
44
|
- "${FADEN_HTTP_PORT:-80}:80"
|
|
@@ -67,6 +78,7 @@ services:
|
|
|
67
78
|
postgres:
|
|
68
79
|
image: pgvector/pgvector:pg17
|
|
69
80
|
container_name: faden-postgres
|
|
81
|
+
logging: *faden-logging
|
|
70
82
|
restart: unless-stopped
|
|
71
83
|
# Parallel index builds (pgvector HNSW) work in shared memory; Docker's
|
|
72
84
|
# default 64 MB /dev/shm fails them ("could not resize shared memory
|
|
@@ -106,6 +118,7 @@ services:
|
|
|
106
118
|
# CLICKHOUSE_IMAGE=clickhouse/clickhouse-server:<tag>
|
|
107
119
|
image: ${CLICKHOUSE_IMAGE:-clickhouse/clickhouse-server:25.10}
|
|
108
120
|
container_name: faden-clickhouse
|
|
121
|
+
logging: *faden-logging
|
|
109
122
|
restart: unless-stopped
|
|
110
123
|
user: "101:101"
|
|
111
124
|
environment:
|
|
@@ -131,13 +144,24 @@ services:
|
|
|
131
144
|
redis:
|
|
132
145
|
image: redis:7.2
|
|
133
146
|
container_name: faden-redis
|
|
147
|
+
logging: *faden-logging
|
|
134
148
|
restart: unless-stopped
|
|
149
|
+
# Capped, so a runaway writer fills Redis rather than the host: at the cap Redis refuses writes
|
|
150
|
+
# (noeviction) and the writers carry on without them (a chat reply's shared log, device presence).
|
|
151
|
+
# It is not evicting because Langfuse's queues (BullMQ) and the chat replies' live events must not
|
|
152
|
+
# be dropped silently. Everything the gateway keeps here has a TTL; what it holds is a few tens
|
|
153
|
+
# of MB (110 MB for 9,500 replies kept 15 minutes in plain text, now 1 minute), so the 1gb default
|
|
154
|
+
# leaves a Langfuse backlog room. FADEN_REDIS_MAXMEMORY in .env changes it (Help, Installing).
|
|
135
155
|
command: >
|
|
136
|
-
--requirepass ${REDIS_AUTH:?set it in .env, as faden deploy and faden upgrade do (Help, Installing, Secrets in .env)} --maxmemory-policy noeviction
|
|
156
|
+
--requirepass ${REDIS_AUTH:?set it in .env, as faden deploy and faden upgrade do (Help, Installing, Secrets in .env)} --maxmemory ${FADEN_REDIS_MAXMEMORY:-1gb} --maxmemory-policy noeviction
|
|
157
|
+
environment:
|
|
158
|
+
# redis-cli reads the password from here: on its command line (-a) it showed in `ps`.
|
|
159
|
+
REDISCLI_AUTH: ${REDIS_AUTH:?set it in .env, as faden deploy and faden upgrade do (Help, Installing, Secrets in .env)}
|
|
137
160
|
ports:
|
|
138
161
|
- "127.0.0.1:6379:6379"
|
|
139
162
|
healthcheck:
|
|
140
|
-
|
|
163
|
+
# NOAUTH and the like exit 0 as well, so the answer itself is checked.
|
|
164
|
+
test: ["CMD-SHELL", "redis-cli ping | grep -q PONG"]
|
|
141
165
|
interval: 3s
|
|
142
166
|
timeout: 10s
|
|
143
167
|
retries: 10
|
|
@@ -145,6 +169,7 @@ services:
|
|
|
145
169
|
minio:
|
|
146
170
|
image: cgr.dev/chainguard/minio:latest
|
|
147
171
|
container_name: faden-minio
|
|
172
|
+
logging: *faden-logging
|
|
148
173
|
restart: unless-stopped
|
|
149
174
|
entrypoint: sh
|
|
150
175
|
command: -c 'mkdir -p /data/langfuse && minio server --address ":9000" --console-address ":9001" /data'
|
|
@@ -169,6 +194,7 @@ services:
|
|
|
169
194
|
langfuse-worker:
|
|
170
195
|
image: docker.io/langfuse/langfuse-worker:3
|
|
171
196
|
container_name: faden-worker
|
|
197
|
+
logging: *faden-logging
|
|
172
198
|
restart: unless-stopped
|
|
173
199
|
depends_on:
|
|
174
200
|
postgres:
|
|
@@ -219,6 +245,7 @@ services:
|
|
|
219
245
|
langfuse-web:
|
|
220
246
|
image: docker.io/langfuse/langfuse:3
|
|
221
247
|
container_name: faden-web
|
|
248
|
+
logging: *faden-logging
|
|
222
249
|
restart: unless-stopped
|
|
223
250
|
ports:
|
|
224
251
|
# LLM observability UI (traces / evals / datasets), plain HTTP: on this
|
|
@@ -288,6 +315,7 @@ services:
|
|
|
288
315
|
faden-rmq:
|
|
289
316
|
image: rabbitmq:4.2.1-management-alpine
|
|
290
317
|
container_name: faden-rmq
|
|
318
|
+
logging: *faden-logging
|
|
291
319
|
restart: unless-stopped
|
|
292
320
|
ports:
|
|
293
321
|
- "127.0.0.1:5672:5672"
|
|
@@ -322,6 +350,7 @@ services:
|
|
|
322
350
|
faden-gateway-migrator:
|
|
323
351
|
image: ${REGISTRY:-ghcr.io/fadenstack}/gateway:${VERSION:-latest}
|
|
324
352
|
container_name: faden-gateway-migrator
|
|
353
|
+
logging: *faden-logging
|
|
325
354
|
restart: on-failure:5
|
|
326
355
|
command: ["sh", "-c", "sleep 5 && alembic upgrade head"]
|
|
327
356
|
depends_on:
|
|
@@ -333,6 +362,11 @@ services:
|
|
|
333
362
|
FADEN_GATEWAY_DB_USER: ${POSTGRES_USER:-postgres}
|
|
334
363
|
FADEN_GATEWAY_DB_PASS: ${POSTGRES_PASSWORD:?set it in .env; an install that ran without it keeps its data only with the old default value (Help, Installing, Secrets in .env)}
|
|
335
364
|
FADEN_GATEWAY_DB_BASE: faden_gateway
|
|
365
|
+
# The migration that seals the provider API keys (pr0vk3yg) uses the backend's master key; without it
|
|
366
|
+
# the migrator used the published development default.
|
|
367
|
+
FADEN_GATEWAY_SETTINGS_MASTER_KEY: ${FADEN_BACKEND_SETTINGS_MASTER_KEY:?set it in .env; an install that ran without it keeps its data only with the old default value (Help, Installing, Secrets in .env)}
|
|
368
|
+
# That migration refuses the published development key unless the install keeps it on purpose.
|
|
369
|
+
FADEN_GATEWAY_ALLOW_PUBLISHED_KEYS: ${FADEN_ALLOW_PUBLISHED_KEYS:-false}
|
|
336
370
|
|
|
337
371
|
# -----------------------------
|
|
338
372
|
# faden_gateway (OpenAI-compatible endpoint gateway)
|
|
@@ -346,6 +380,7 @@ services:
|
|
|
346
380
|
args:
|
|
347
381
|
BASE_IMAGE: ${REGISTRY:-ghcr.io/fadenstack}/base:${VERSION:-latest}
|
|
348
382
|
container_name: faden-gateway
|
|
383
|
+
logging: *faden-logging
|
|
349
384
|
restart: unless-stopped
|
|
350
385
|
depends_on:
|
|
351
386
|
postgres:
|
|
@@ -372,6 +407,9 @@ services:
|
|
|
372
407
|
# These two env vars enable that path; no static JWT_SECRET env var is needed.
|
|
373
408
|
FADEN_GATEWAY_BACKEND_DB_BASE: faden_backend
|
|
374
409
|
FADEN_GATEWAY_SETTINGS_MASTER_KEY: ${FADEN_BACKEND_SETTINGS_MASTER_KEY:?set it in .env; an install that ran without it keeps its data only with the old default value (Help, Installing, Secrets in .env)}
|
|
410
|
+
# Set only while `faden secrets rotate` is unfinished: values sealed with the old key still open.
|
|
411
|
+
FADEN_GATEWAY_SETTINGS_MASTER_KEY_PREVIOUS: ${FADEN_BACKEND_SETTINGS_MASTER_KEY_PREVIOUS:-}
|
|
412
|
+
FADEN_GATEWAY_ENCRYPTION_KEY_PREVIOUS: ${FADEN_GATEWAY_ENCRYPTION_KEY_PREVIOUS:-}
|
|
375
413
|
# An install that has stored data under the published development key may
|
|
376
414
|
# keep it, with a warning at every start, until it is changed (Help:
|
|
377
415
|
# Installing, Secrets in .env). Outside development the service refuses it otherwise.
|
|
@@ -405,6 +443,7 @@ services:
|
|
|
405
443
|
# PII module integration (set via .env or COMPOSE_PROFILES)
|
|
406
444
|
FADEN_GATEWAY_PII_ENABLED: ${FADEN_GATEWAY_PII_ENABLED:-false}
|
|
407
445
|
FADEN_GATEWAY_PII_SERVICE_URL: ${FADEN_GATEWAY_PII_SERVICE_URL:-http://faden-pii:8000}
|
|
446
|
+
FADEN_GATEWAY_PII_SERVICE_TOKEN: ${FADEN_GATEWAY_PII_SERVICE_TOKEN:?set it in .env, as faden deploy and faden upgrade do (Help, Installing, Secrets in .env)}
|
|
408
447
|
# MCP tool registry integration (set via .env or COMPOSE_PROFILES)
|
|
409
448
|
FADEN_GATEWAY_MCP_ENABLED: ${FADEN_GATEWAY_MCP_ENABLED:-false}
|
|
410
449
|
FADEN_GATEWAY_MCP_SERVICE_URL: ${FADEN_GATEWAY_MCP_SERVICE_URL:-http://faden-mcp:8000}
|
|
@@ -431,6 +470,13 @@ services:
|
|
|
431
470
|
FADEN_GATEWAY_DB_MAX_OVERFLOW: ${FADEN_GATEWAY_DB_MAX_OVERFLOW:-5}
|
|
432
471
|
FADEN_GATEWAY_RABBIT_POOL_SIZE: ${FADEN_GATEWAY_RABBIT_POOL_SIZE:-2}
|
|
433
472
|
FADEN_GATEWAY_RABBIT_CHANNEL_POOL_SIZE: ${FADEN_GATEWAY_RABBIT_CHANNEL_POOL_SIZE:-10}
|
|
473
|
+
volumes:
|
|
474
|
+
# Chat attachments (chat_file_store_root). In the container layer until this release: every upgrade
|
|
475
|
+
# and restore replaced the container and lost them. With FADEN_DATA_DIR set in .env the source is
|
|
476
|
+
# that directory plus /chat-files on the host (a company's own storage); empty, the named volume
|
|
477
|
+
# below. `faden upgrade` copies what the old container holds into it first. FADEN_DATA_DIR covers this
|
|
478
|
+
# and the knowledge files only; never the database, the models or the observability data.
|
|
479
|
+
- ${FADEN_DATA_DIR:-faden_chat_files}${FADEN_DATA_DIR:+/chat-files}:/data/faden/chat-files
|
|
434
480
|
healthcheck:
|
|
435
481
|
test: ["CMD", "python", "-c", "import urllib.request; urllib.request.urlopen('http://localhost:8000/api/health', timeout=3).read()"]
|
|
436
482
|
interval: 5s
|
|
@@ -443,6 +489,7 @@ services:
|
|
|
443
489
|
faden-backend-migrator:
|
|
444
490
|
image: ${REGISTRY:-ghcr.io/fadenstack}/backend:${VERSION:-latest}
|
|
445
491
|
container_name: faden-backend-migrator
|
|
492
|
+
logging: *faden-logging
|
|
446
493
|
restart: on-failure:5
|
|
447
494
|
command: ["sh", "-c", "sleep 5 && alembic upgrade head"]
|
|
448
495
|
depends_on:
|
|
@@ -454,6 +501,11 @@ services:
|
|
|
454
501
|
FADEN_BACKEND_DB_USER: ${POSTGRES_USER:-postgres}
|
|
455
502
|
FADEN_BACKEND_DB_PASS: ${POSTGRES_PASSWORD:?set it in .env; an install that ran without it keeps its data only with the old default value (Help, Installing, Secrets in .env)}
|
|
456
503
|
FADEN_BACKEND_DB_BASE: faden_backend
|
|
504
|
+
# The migration that seals the remote providers' API keys (pr0vk3ys) seals them with this key.
|
|
505
|
+
# Without it the migrator used the published development default, and the backend could not open them.
|
|
506
|
+
FADEN_BACKEND_SETTINGS_MASTER_KEY: ${FADEN_BACKEND_SETTINGS_MASTER_KEY:?set it in .env; an install that ran without it keeps its data only with the old default value (Help, Installing, Secrets in .env)}
|
|
507
|
+
# That migration refuses the published development key unless the install keeps it on purpose.
|
|
508
|
+
FADEN_BACKEND_ALLOW_PUBLISHED_KEYS: ${FADEN_ALLOW_PUBLISHED_KEYS:-false}
|
|
457
509
|
|
|
458
510
|
faden-backend:
|
|
459
511
|
image: ${REGISTRY:-ghcr.io/fadenstack}/backend:${VERSION:-latest}
|
|
@@ -467,6 +519,7 @@ services:
|
|
|
467
519
|
args:
|
|
468
520
|
BASE_IMAGE: ${REGISTRY:-ghcr.io/fadenstack}/base:${VERSION:-latest}
|
|
469
521
|
container_name: faden-backend
|
|
522
|
+
logging: *faden-logging
|
|
470
523
|
restart: unless-stopped
|
|
471
524
|
depends_on:
|
|
472
525
|
postgres:
|
|
@@ -504,6 +557,11 @@ services:
|
|
|
504
557
|
FADEN_BACKEND_RABBIT_VHOST: /
|
|
505
558
|
FADEN_BACKEND_GATEWAY_URL: ${FADEN_BACKEND_GATEWAY_URL:-http://faden-gateway:8000}
|
|
506
559
|
FADEN_BACKEND_SETTINGS_MASTER_KEY: ${FADEN_BACKEND_SETTINGS_MASTER_KEY:?set it in .env; an install that ran without it keeps its data only with the old default value (Help, Installing, Secrets in .env)}
|
|
560
|
+
# Set only while `faden secrets rotate` is unfinished: values sealed with the old key still open.
|
|
561
|
+
FADEN_BACKEND_SETTINGS_MASTER_KEY_PREVIOUS: ${FADEN_BACKEND_SETTINGS_MASTER_KEY_PREVIOUS:-}
|
|
562
|
+
# What the machines' credential hashes are keyed with. Once the master key itself; a rotation
|
|
563
|
+
# changes the master key and must not change this, or every machine would have to enroll again.
|
|
564
|
+
FADEN_BACKEND_CREDENTIAL_PEPPER: ${FADEN_BACKEND_CREDENTIAL_PEPPER:?set it in .env, as faden upgrade does (it keeps the machines' credentials valid; Help, Rotating the keys)}
|
|
507
565
|
# An install that has stored data under the published development key may
|
|
508
566
|
# keep it, with a warning at every start, until it is changed (Help:
|
|
509
567
|
# Installing, Secrets in .env). Outside development the service refuses it otherwise.
|
|
@@ -528,6 +586,7 @@ services:
|
|
|
528
586
|
# Module enabled flags + service URLs (Docker-internal for health probes)
|
|
529
587
|
FADEN_BACKEND_PII_ENABLED: ${FADEN_BACKEND_PII_ENABLED:-false}
|
|
530
588
|
FADEN_BACKEND_PII_SERVICE_URL: ${FADEN_BACKEND_PII_SERVICE_URL:-http://faden-pii:8000/api}
|
|
589
|
+
FADEN_BACKEND_PII_SERVICE_TOKEN: ${FADEN_BACKEND_PII_SERVICE_TOKEN:?set it in .env, as faden deploy and faden upgrade do (Help, Installing, Secrets in .env)}
|
|
531
590
|
FADEN_BACKEND_INTERNAL_TOKEN: ${FADEN_BACKEND_INTERNAL_TOKEN:-}
|
|
532
591
|
FADEN_BACKEND_MCP_ENABLED: ${FADEN_BACKEND_MCP_ENABLED:-false}
|
|
533
592
|
FADEN_BACKEND_MCP_SERVICE_URL: ${FADEN_BACKEND_MCP_SERVICE_URL:-http://faden-mcp:8000}
|
|
@@ -561,8 +620,10 @@ services:
|
|
|
561
620
|
- faden_models:/srv/faden/models
|
|
562
621
|
# Knowledge base uploads (rag_lite.file_store_root): written here, read by faden-backend-worker,
|
|
563
622
|
# which ingests them. Each container had its own: the worker found no file, every ingest failed,
|
|
564
|
-
# and the uploads went with the container.
|
|
565
|
-
|
|
623
|
+
# and the uploads went with the container. With FADEN_DATA_DIR set in .env the source is that
|
|
624
|
+
# directory plus /knowledge on the host; empty, the named volume. The CLI copies the volume's files
|
|
625
|
+
# into the folder before the container is created.
|
|
626
|
+
- ${FADEN_DATA_DIR:-faden_rag_lite}${FADEN_DATA_DIR:+/knowledge}:/data/faden/rag-lite
|
|
566
627
|
# Runtime monitoring — shared with the prometheus + grafana
|
|
567
628
|
# services (see their mounts). The backend generates
|
|
568
629
|
# prometheus/targets.json and dashboards/*.json here; grafana
|
|
@@ -588,6 +649,7 @@ services:
|
|
|
588
649
|
faden-backend-worker:
|
|
589
650
|
image: ${REGISTRY:-ghcr.io/fadenstack}/backend:${VERSION:-latest}
|
|
590
651
|
container_name: faden-backend-worker
|
|
652
|
+
logging: *faden-logging
|
|
591
653
|
restart: unless-stopped
|
|
592
654
|
command:
|
|
593
655
|
- taskiq
|
|
@@ -621,6 +683,11 @@ services:
|
|
|
621
683
|
FADEN_BACKEND_RABBIT_VHOST: /
|
|
622
684
|
FADEN_BACKEND_GATEWAY_URL: ${FADEN_BACKEND_GATEWAY_URL:-http://faden-gateway:8000}
|
|
623
685
|
FADEN_BACKEND_SETTINGS_MASTER_KEY: ${FADEN_BACKEND_SETTINGS_MASTER_KEY:?set it in .env; an install that ran without it keeps its data only with the old default value (Help, Installing, Secrets in .env)}
|
|
686
|
+
# Set only while `faden secrets rotate` is unfinished: values sealed with the old key still open.
|
|
687
|
+
FADEN_BACKEND_SETTINGS_MASTER_KEY_PREVIOUS: ${FADEN_BACKEND_SETTINGS_MASTER_KEY_PREVIOUS:-}
|
|
688
|
+
# What the machines' credential hashes are keyed with. Once the master key itself; a rotation
|
|
689
|
+
# changes the master key and must not change this, or every machine would have to enroll again.
|
|
690
|
+
FADEN_BACKEND_CREDENTIAL_PEPPER: ${FADEN_BACKEND_CREDENTIAL_PEPPER:?set it in .env, as faden upgrade does (it keeps the machines' credentials valid; Help, Rotating the keys)}
|
|
624
691
|
FADEN_BACKEND_LLM_GRAPH_DB_HOST: postgres
|
|
625
692
|
FADEN_BACKEND_LLM_GRAPH_DB_USER: ${POSTGRES_USER:-postgres}
|
|
626
693
|
FADEN_BACKEND_LLM_GRAPH_DB_PASS: ${POSTGRES_PASSWORD:?set it in .env; an install that ran without it keeps its data only with the old default value (Help, Installing, Secrets in .env)}
|
|
@@ -631,6 +698,7 @@ services:
|
|
|
631
698
|
FADEN_BACKEND_MCP_ENABLED: ${FADEN_BACKEND_MCP_ENABLED:-false}
|
|
632
699
|
FADEN_BACKEND_SKILLS_ENABLED: ${FADEN_BACKEND_SKILLS_ENABLED:-false}
|
|
633
700
|
FADEN_BACKEND_PII_SERVICE_URL: ${FADEN_BACKEND_PII_SERVICE_URL:-http://faden-pii:8000/api}
|
|
701
|
+
FADEN_BACKEND_PII_SERVICE_TOKEN: ${FADEN_BACKEND_PII_SERVICE_TOKEN:?set it in .env, as faden deploy and faden upgrade do (Help, Installing, Secrets in .env)}
|
|
634
702
|
FADEN_BACKEND_INTERNAL_TOKEN: ${FADEN_BACKEND_INTERNAL_TOKEN:-}
|
|
635
703
|
FADEN_BACKEND_MCP_SERVICE_URL: ${FADEN_BACKEND_MCP_SERVICE_URL:-http://faden-mcp:8000}
|
|
636
704
|
FADEN_BACKEND_MCP_SERVICE_TOKEN: ${FADEN_BACKEND_MCP_SERVICE_TOKEN:?set it in .env, as faden deploy and faden upgrade do (Help, Installing, Secrets in .env)}
|
|
@@ -652,7 +720,7 @@ services:
|
|
|
652
720
|
volumes:
|
|
653
721
|
- /var/run/docker.sock:/var/run/docker.sock:ro
|
|
654
722
|
- faden_models:/srv/faden/models
|
|
655
|
-
- faden_rag_lite:/data/faden/rag-lite
|
|
723
|
+
- ${FADEN_DATA_DIR:-faden_rag_lite}${FADEN_DATA_DIR:+/knowledge}:/data/faden/rag-lite
|
|
656
724
|
|
|
657
725
|
# -----------------------------
|
|
658
726
|
# frontend (React admin console)
|
|
@@ -666,6 +734,7 @@ services:
|
|
|
666
734
|
additional_contexts:
|
|
667
735
|
docs: ../docs
|
|
668
736
|
container_name: faden-frontend
|
|
737
|
+
logging: *faden-logging
|
|
669
738
|
restart: unless-stopped
|
|
670
739
|
depends_on:
|
|
671
740
|
faden-backend:
|
|
@@ -691,6 +760,7 @@ services:
|
|
|
691
760
|
args:
|
|
692
761
|
BASE_IMAGE: ${REGISTRY:-ghcr.io/fadenstack}/base:${VERSION:-latest}
|
|
693
762
|
container_name: faden-pii
|
|
763
|
+
logging: *faden-logging
|
|
694
764
|
restart: unless-stopped
|
|
695
765
|
depends_on:
|
|
696
766
|
faden-rmq:
|
|
@@ -702,6 +772,9 @@ services:
|
|
|
702
772
|
FADEN_PII_ENVIRONMENT: ${FADEN_PII_ENVIRONMENT:-production}
|
|
703
773
|
FADEN_PII_BACKEND_URL: http://faden-backend:8000
|
|
704
774
|
FADEN_PII_BACKEND_TOKEN: ${FADEN_PII_BACKEND_TOKEN:-}
|
|
775
|
+
# What the gateway, the backend and MCP present on every call but health. Required: empty, the
|
|
776
|
+
# service would refuse them all.
|
|
777
|
+
FADEN_PII_SERVICE_TOKEN: ${FADEN_PII_SERVICE_TOKEN:?set it in .env, as faden deploy and faden upgrade do (Help, Installing, Secrets in .env)}
|
|
705
778
|
FADEN_PII_RABBIT_HOST: faden-rmq
|
|
706
779
|
FADEN_PII_RABBIT_PORT: 5672
|
|
707
780
|
FADEN_PII_RABBIT_USER: faden-pii
|
|
@@ -721,6 +794,7 @@ services:
|
|
|
721
794
|
profiles: ["pii"]
|
|
722
795
|
image: ${REGISTRY:-ghcr.io/fadenstack}/pii:${VERSION:-latest}
|
|
723
796
|
container_name: faden-pii-worker
|
|
797
|
+
logging: *faden-logging
|
|
724
798
|
restart: unless-stopped
|
|
725
799
|
command:
|
|
726
800
|
- taskiq
|
|
@@ -750,6 +824,7 @@ services:
|
|
|
750
824
|
profiles: ["mcp"]
|
|
751
825
|
image: ${REGISTRY:-ghcr.io/fadenstack}/mcp:${VERSION:-latest}
|
|
752
826
|
container_name: faden-mcp-migrator
|
|
827
|
+
logging: *faden-logging
|
|
753
828
|
restart: on-failure:5
|
|
754
829
|
command: ["sh", "-c", "sleep 5 && alembic upgrade head"]
|
|
755
830
|
depends_on:
|
|
@@ -772,6 +847,7 @@ services:
|
|
|
772
847
|
args:
|
|
773
848
|
BASE_IMAGE: ${REGISTRY:-ghcr.io/fadenstack}/base:${VERSION:-latest}
|
|
774
849
|
container_name: faden-mcp
|
|
850
|
+
logging: *faden-logging
|
|
775
851
|
restart: unless-stopped
|
|
776
852
|
depends_on:
|
|
777
853
|
postgres:
|
|
@@ -795,8 +871,10 @@ services:
|
|
|
795
871
|
FADEN_MCP_REDIS_PASS: ${REDIS_AUTH:?set it in .env, as faden deploy and faden upgrade do (Help, Installing, Secrets in .env)}
|
|
796
872
|
FADEN_MCP_REDIS_BASE: 3
|
|
797
873
|
FADEN_MCP_PII_SERVICE_URL: ${FADEN_MCP_PII_SERVICE_URL:-http://faden-pii:8000}
|
|
874
|
+
FADEN_MCP_PII_SERVICE_TOKEN: ${FADEN_MCP_PII_SERVICE_TOKEN:?set it in .env, as faden deploy and faden upgrade do (Help, Installing, Secrets in .env)}
|
|
798
875
|
FADEN_MCP_SERVICE_TOKEN: ${FADEN_MCP_SERVICE_TOKEN:?set it in .env, as faden deploy and faden upgrade do (Help, Installing, Secrets in .env)}
|
|
799
876
|
FADEN_MCP_ENCRYPTION_KEY: ${FADEN_MCP_ENCRYPTION_KEY:?set it in .env; an install that ran without it keeps its data only with the old default value (Help, Installing, Secrets in .env)}
|
|
877
|
+
FADEN_MCP_ENCRYPTION_KEY_PREVIOUS: ${FADEN_MCP_ENCRYPTION_KEY_PREVIOUS:-}
|
|
800
878
|
# An install that has stored data under the published development key may
|
|
801
879
|
# keep it, with a warning at every start, until it is changed (Help:
|
|
802
880
|
# Installing, Secrets in .env). Outside development the service refuses it otherwise.
|
|
@@ -820,6 +898,7 @@ services:
|
|
|
820
898
|
profiles: ["skills"]
|
|
821
899
|
image: ${REGISTRY:-ghcr.io/fadenstack}/skills:${VERSION:-latest}
|
|
822
900
|
container_name: faden-skills-migrator
|
|
901
|
+
logging: *faden-logging
|
|
823
902
|
restart: on-failure:5
|
|
824
903
|
command: ["sh", "-c", "sleep 5 && alembic upgrade head"]
|
|
825
904
|
depends_on:
|
|
@@ -842,6 +921,7 @@ services:
|
|
|
842
921
|
args:
|
|
843
922
|
BASE_IMAGE: ${REGISTRY:-ghcr.io/fadenstack}/base:${VERSION:-latest}
|
|
844
923
|
container_name: faden-skills
|
|
924
|
+
logging: *faden-logging
|
|
845
925
|
restart: unless-stopped
|
|
846
926
|
depends_on:
|
|
847
927
|
postgres:
|
|
@@ -885,6 +965,7 @@ services:
|
|
|
885
965
|
# compose-private.
|
|
886
966
|
image: prom/prometheus:v2.53.0
|
|
887
967
|
container_name: faden-prometheus
|
|
968
|
+
logging: *faden-logging
|
|
888
969
|
restart: unless-stopped
|
|
889
970
|
ports:
|
|
890
971
|
# Not 9090 on the host: MinIO's API is published there in this stack,
|
|
@@ -910,6 +991,7 @@ services:
|
|
|
910
991
|
loki:
|
|
911
992
|
image: grafana/loki:3.0.0
|
|
912
993
|
container_name: faden-loki
|
|
994
|
+
logging: *faden-logging
|
|
913
995
|
restart: unless-stopped
|
|
914
996
|
# Loki has no authentication — it must never be reachable from the
|
|
915
997
|
# network. Default to the loopback interface only; set LOKI_BIND
|
|
@@ -930,6 +1012,7 @@ services:
|
|
|
930
1012
|
# back needs the backup the upgrade makes.
|
|
931
1013
|
image: grafana/grafana:12.4.12@sha256:a3b504df900c24db125e5ec0646f3ac3428db38161302d69f05d0db70a330a90
|
|
932
1014
|
container_name: faden-grafana
|
|
1015
|
+
logging: *faden-logging
|
|
933
1016
|
restart: unless-stopped
|
|
934
1017
|
ports:
|
|
935
1018
|
# Dashboards, anonymous read-only (login form disabled), plain HTTP. The
|
|
@@ -970,6 +1053,7 @@ services:
|
|
|
970
1053
|
# last. --disable-reporting: no usage reports to Grafana Labs.
|
|
971
1054
|
image: grafana/alloy:v1.20.1@sha256:2aa2099af76c0098d4af7a4d6e48f86cb66dc1a000222ad927a1c67c6542d13f
|
|
972
1055
|
container_name: faden-alloy
|
|
1056
|
+
logging: *faden-logging
|
|
973
1057
|
restart: unless-stopped
|
|
974
1058
|
ports:
|
|
975
1059
|
- "127.0.0.1:12345:12345"
|
|
@@ -996,3 +1080,4 @@ volumes:
|
|
|
996
1080
|
prom_data:
|
|
997
1081
|
faden_models:
|
|
998
1082
|
faden_rag_lite:
|
|
1083
|
+
faden_chat_files:
|
|
@@ -97,6 +97,7 @@ location = /api/health {
|
|
|
97
97
|
proxy_set_header X-Real-IP $remote_addr;
|
|
98
98
|
proxy_set_header X-Forwarded-For $remote_addr;
|
|
99
99
|
proxy_set_header X-Forwarded-Proto $scheme;
|
|
100
|
+
proxy_set_header X-Forwarded-Host $http_host;
|
|
100
101
|
}
|
|
101
102
|
|
|
102
103
|
# ── Backend API (/api/*) ──────────────────────────────────────
|
|
@@ -119,6 +120,7 @@ location /api/ {
|
|
|
119
120
|
proxy_set_header X-Real-IP $remote_addr;
|
|
120
121
|
proxy_set_header X-Forwarded-For $remote_addr;
|
|
121
122
|
proxy_set_header X-Forwarded-Proto $scheme;
|
|
123
|
+
proxy_set_header X-Forwarded-Host $http_host;
|
|
122
124
|
|
|
123
125
|
# SSE streaming: disable buffering
|
|
124
126
|
proxy_buffering off;
|
|
@@ -132,6 +134,25 @@ location /api/ {
|
|
|
132
134
|
proxy_set_header Connection $connection_upgrade;
|
|
133
135
|
}
|
|
134
136
|
|
|
137
|
+
# ── Backend API docs (/api/docs, /api/redoc, /api/openapi.json) ─
|
|
138
|
+
# The schema lists every route of the admin API, so it is for a signed-in
|
|
139
|
+
# console session only: the same check as /grafana/ (/_console_access/grafana
|
|
140
|
+
# below). A regex location wins over the /api/ prefix above.
|
|
141
|
+
location ~ ^/api/(docs|redoc|openapi\.json)$ {
|
|
142
|
+
if (-f /etc/nginx/faden/maintenance.flag) {
|
|
143
|
+
return 503;
|
|
144
|
+
}
|
|
145
|
+
error_page 502 503 = @faden_maintenance_api;
|
|
146
|
+
auth_request /_console_access/grafana;
|
|
147
|
+
set $backend http://faden-backend:8000;
|
|
148
|
+
proxy_pass $backend;
|
|
149
|
+
proxy_set_header Host $http_host;
|
|
150
|
+
proxy_set_header X-Real-IP $remote_addr;
|
|
151
|
+
proxy_set_header X-Forwarded-For $remote_addr;
|
|
152
|
+
proxy_set_header X-Forwarded-Proto $scheme;
|
|
153
|
+
proxy_set_header X-Forwarded-Host $http_host;
|
|
154
|
+
}
|
|
155
|
+
|
|
135
156
|
# ── OpenAI-compatible API (/v1/*) ─────────────────────────────
|
|
136
157
|
# External API clients (curl, SDKs) can hit /v1/* through the
|
|
137
158
|
# same origin instead of needing a separate port.
|
|
@@ -146,6 +167,7 @@ location /v1/ {
|
|
|
146
167
|
proxy_set_header X-Real-IP $remote_addr;
|
|
147
168
|
proxy_set_header X-Forwarded-For $remote_addr;
|
|
148
169
|
proxy_set_header X-Forwarded-Proto $scheme;
|
|
170
|
+
proxy_set_header X-Forwarded-Host $http_host;
|
|
149
171
|
|
|
150
172
|
# SSE streaming
|
|
151
173
|
proxy_buffering off;
|
|
@@ -171,6 +193,8 @@ location /gateway-static/ {
|
|
|
171
193
|
# ── Gateway API docs (iframe-friendly path) ──────────────────
|
|
172
194
|
# Proxies /gateway-docs/* → faden-gateway /api/*
|
|
173
195
|
location /gateway-docs/ {
|
|
196
|
+
# Signed-in console sessions only, as for the backend's docs above.
|
|
197
|
+
auth_request /_console_access/grafana;
|
|
174
198
|
set $gateway_docs http://faden-gateway:8000;
|
|
175
199
|
rewrite ^/gateway-docs/(.*)$ /api/$1 break;
|
|
176
200
|
proxy_pass $gateway_docs;
|
|
@@ -178,6 +202,7 @@ location /gateway-docs/ {
|
|
|
178
202
|
proxy_set_header X-Real-IP $remote_addr;
|
|
179
203
|
proxy_set_header X-Forwarded-For $remote_addr;
|
|
180
204
|
proxy_set_header X-Forwarded-Proto $scheme;
|
|
205
|
+
proxy_set_header X-Forwarded-Host $http_host;
|
|
181
206
|
|
|
182
207
|
# Rewrite absolute asset paths in Swagger/ReDoc HTML so they
|
|
183
208
|
# load through /gateway-static/ and /gateway-docs/ instead of
|
|
@@ -206,6 +231,7 @@ location /grafana/ {
|
|
|
206
231
|
proxy_set_header X-Real-IP $remote_addr;
|
|
207
232
|
proxy_set_header X-Forwarded-For $remote_addr;
|
|
208
233
|
proxy_set_header X-Forwarded-Proto $scheme;
|
|
234
|
+
proxy_set_header X-Forwarded-Host $http_host;
|
|
209
235
|
|
|
210
236
|
# WebSocket support for Grafana Live
|
|
211
237
|
proxy_http_version 1.1;
|
|
@@ -223,6 +249,7 @@ location = /_console_access/grafana {
|
|
|
223
249
|
proxy_set_header Cookie $http_cookie;
|
|
224
250
|
proxy_set_header Authorization $http_authorization;
|
|
225
251
|
proxy_set_header X-Forwarded-Proto $scheme;
|
|
252
|
+
proxy_set_header X-Forwarded-Host $http_host;
|
|
226
253
|
}
|
|
227
254
|
|
|
228
255
|
# ── Frontend (everything else) ────────────────────────────────
|
|
@@ -238,6 +265,7 @@ location / {
|
|
|
238
265
|
proxy_set_header X-Real-IP $remote_addr;
|
|
239
266
|
proxy_set_header X-Forwarded-For $remote_addr;
|
|
240
267
|
proxy_set_header X-Forwarded-Proto $scheme;
|
|
268
|
+
proxy_set_header X-Forwarded-Host $http_host;
|
|
241
269
|
|
|
242
270
|
proxy_http_version 1.1;
|
|
243
271
|
proxy_set_header Upgrade $http_upgrade;
|
|
@@ -98,6 +98,7 @@ def register_core_commands(group: click.Group | None = None) -> None:
|
|
|
98
98
|
from faden_cli.commands.tls import tls_group
|
|
99
99
|
from faden_cli.commands.ports import ports_cmd
|
|
100
100
|
from faden_cli.commands.maintenance import maintenance_group
|
|
101
|
+
from faden_cli.commands.secrets import secrets_group
|
|
101
102
|
|
|
102
103
|
target.add_command(version_cmd, "version")
|
|
103
104
|
target.add_command(doctor_cmd, "doctor")
|
|
@@ -120,6 +121,7 @@ def register_core_commands(group: click.Group | None = None) -> None:
|
|
|
120
121
|
target.add_command(tls_group, "tls")
|
|
121
122
|
target.add_command(ports_cmd, "ports")
|
|
122
123
|
target.add_command(maintenance_group, "maintenance")
|
|
124
|
+
target.add_command(secrets_group, "secrets")
|
|
123
125
|
|
|
124
126
|
|
|
125
127
|
register_core_commands()
|
|
@@ -51,6 +51,8 @@ def reset_password_cmd(*, email: str, password: str | None, yes: bool) -> None:
|
|
|
51
51
|
|
|
52
52
|
This bypasses the API and sets the password hash in PostgreSQL.
|
|
53
53
|
The backend container must be running (needed for password hashing).
|
|
54
|
+
It changes the console sign-in only: Grafana, Langfuse and RabbitMQ
|
|
55
|
+
have passwords of their own in .env, which it leaves as they are.
|
|
54
56
|
"""
|
|
55
57
|
# Validate email early to prevent any injection
|
|
56
58
|
if not _EMAIL_RE.match(email):
|
|
@@ -110,8 +112,9 @@ def reset_password_cmd(*, email: str, password: str | None, yes: bool) -> None:
|
|
|
110
112
|
|
|
111
113
|
# Both `hashed` (bcrypt output we generated) and `email` (validated
|
|
112
114
|
# above by regex) are safe for SQL string interpolation here.
|
|
115
|
+
# The sign-ins end with the old password (sessions_valid_after): a reset is often meant to lock someone out.
|
|
113
116
|
sql = (
|
|
114
|
-
f"UPDATE \"user\" SET hashed_password = '{hashed}' "
|
|
117
|
+
f"UPDATE \"user\" SET hashed_password = '{hashed}', sessions_valid_after = now() "
|
|
115
118
|
f"WHERE email = '{email}';"
|
|
116
119
|
)
|
|
117
120
|
|
|
@@ -138,6 +141,8 @@ def reset_password_cmd(*, email: str, password: str | None, yes: bool) -> None:
|
|
|
138
141
|
sys.exit(1)
|
|
139
142
|
|
|
140
143
|
success(f"Password reset for '{email}'.")
|
|
144
|
+
# Only the console's password: Grafana, Langfuse and RabbitMQ have passwords of their own in .env.
|
|
145
|
+
info("Grafana, Langfuse and RabbitMQ sign-ins are not touched: their passwords are in .env.")
|
|
141
146
|
|
|
142
147
|
# ── 3. Display credentials ────────────────────────────────
|
|
143
148
|
from rich.panel import Panel
|
|
@@ -17,7 +17,7 @@ from pathlib import Path
|
|
|
17
17
|
|
|
18
18
|
import click
|
|
19
19
|
|
|
20
|
-
from faden_cli.core.backup import create_backup
|
|
20
|
+
from faden_cli.core.backup import BACKUP_KINDS, DEFAULT_KIND, create_backup
|
|
21
21
|
from faden_cli.core.compose import build_context_from_config
|
|
22
22
|
from faden_cli.core.console import console, error, info, success, warning
|
|
23
23
|
from faden_cli.core.private_files import private_dir
|
|
@@ -44,7 +44,14 @@ from faden_cli.core.settings import load_config
|
|
|
44
44
|
type=int,
|
|
45
45
|
default=5,
|
|
46
46
|
show_default=True,
|
|
47
|
-
help="Keep only the N most recent backups.",
|
|
47
|
+
help="Keep only the N most recent backups of this kind (nightly, manual and upgrade backups count apart).",
|
|
48
|
+
)
|
|
49
|
+
@click.option(
|
|
50
|
+
"--kind",
|
|
51
|
+
type=click.Choice(BACKUP_KINDS),
|
|
52
|
+
default=DEFAULT_KIND,
|
|
53
|
+
hidden=True,
|
|
54
|
+
help="What the backup is, recorded in it; --retain only counts backups of the same kind. The nightly timer sets it.",
|
|
48
55
|
)
|
|
49
56
|
@click.option(
|
|
50
57
|
"--db-only",
|
|
@@ -60,6 +67,7 @@ def backup_cmd(
|
|
|
60
67
|
output_dir: str,
|
|
61
68
|
include_volumes: bool,
|
|
62
69
|
retain: int,
|
|
70
|
+
kind: str,
|
|
63
71
|
db_only: bool,
|
|
64
72
|
yes: bool,
|
|
65
73
|
) -> None:
|
|
@@ -88,6 +96,7 @@ def backup_cmd(
|
|
|
88
96
|
include_volumes=include_volumes,
|
|
89
97
|
db_only=db_only,
|
|
90
98
|
retain=retain,
|
|
99
|
+
kind=kind,
|
|
91
100
|
)
|
|
92
101
|
|
|
93
102
|
if not result.ok:
|
|
@@ -113,7 +122,7 @@ def backup_cmd(
|
|
|
113
122
|
|
|
114
123
|
@backup_cmd.command("schedule")
|
|
115
124
|
@click.option("--at", "at", default="03:00", show_default=True, help="Time of day, HH:MM (server time).")
|
|
116
|
-
@click.option("--retain", type=int, default=7, show_default=True, help="Keep the N most recent backups.")
|
|
125
|
+
@click.option("--retain", type=int, default=7, show_default=True, help="Keep the N most recent nightly backups.")
|
|
117
126
|
@click.option("--off", is_flag=True, default=False, help="Stop the nightly backup.")
|
|
118
127
|
def schedule_cmd(*, at: str, retain: int, off: bool) -> None:
|
|
119
128
|
"""Back up every night, keeping the most recent few.
|