Compare commits
23
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
264f4e7379 | ||
|
|
9bbbd5fae3 | ||
|
|
e33fd8695f | ||
|
|
1828c89194 | ||
|
|
9ec5353d7e | ||
|
|
dfa0d34a83 | ||
|
|
66638dd743 | ||
|
|
355ccada8c | ||
|
|
096ebd6de5 | ||
|
|
980c54f84e | ||
|
|
324a06ed2d | ||
|
|
cee47822ec | ||
|
|
68365746a6 | ||
|
|
eecfcf9367 | ||
|
|
d01c763354 | ||
|
|
0baee47b67 | ||
|
|
0435def8a0 | ||
|
|
ded255decc | ||
|
|
ac091999b4 | ||
|
|
a15e0100df | ||
|
|
bcfb24b16d | ||
|
|
42d31e38e4 | ||
|
|
16a01a9ea5 |
+88
-16
@@ -173,12 +173,42 @@ steps:
|
||||
from_secret: ai_litellm_salt_key
|
||||
AI_LITELLM_DB_PASSWORD:
|
||||
from_secret: ai_litellm_db_password
|
||||
AI_WEBUI_SECRET_KEY:
|
||||
AI_LITELLM_DATABASE_MIGRATIONS:
|
||||
from_secret: litellm_database_migrations
|
||||
AI_LITELLM_MODIFY_PARAMS:
|
||||
from_secret: litellm_modify_params
|
||||
AI_OPEN_WEBUI_SECRET_KEY:
|
||||
from_secret: ai_webui_secret_key
|
||||
AI_OPEN_WEBUI_DATABASE_URL:
|
||||
from_secret: ai_open_webui_database_url
|
||||
AI_OAUTH_CLIENT_SECRET:
|
||||
AI_OPEN_WEB_UI_OAUTH_CLIENT_SECRET:
|
||||
from_secret: ai_oauth_client_secret
|
||||
AI_OPEN_WEB_UI_ENABLE_OAUTH_SIGNUP:
|
||||
from_secret: ai_open_web_ui_enable_oauth_signup
|
||||
AI_OPEN_WEB_UI_OAUTH_MERGE_ACCOUNTS_BY_EMAIL:
|
||||
from_secret: ai_open_web_ui_oauth_merge_accounts_by_email
|
||||
AI_OPEN_WEB_UI_OAUTH_PROVIDER_NAME:
|
||||
from_secret: ai_open_web_ui_oauth_provider_name
|
||||
AI_OPEN_WEB_UI_OPENID_PROVIDER_URL:
|
||||
from_secret: ai_open_web_ui_openid_provider_url
|
||||
AI_OPEN_WEB_UI_OAUTH_CLIENT_ID:
|
||||
from_secret: ai_open_web_ui_oauth_client_id
|
||||
AI_OPEN_WEB_UI_OAUTH_SCOPES:
|
||||
from_secret: ai_open_web_ui_oauth_scopes
|
||||
AI_OPEN_WEB_UI_OPENID_REDIRECT_URI:
|
||||
from_secret: ai_open_web_ui_openid_redirect_uri
|
||||
AI_LITELLM_DATABASE_URL:
|
||||
from_secret: ai_litellm_database_url
|
||||
AI_LITELLM_POSTGRES_PASSWORD:
|
||||
from_secret: ai_litellm_postgres_password
|
||||
AI_AWS_REGION_NAME:
|
||||
from_secret: ai_aws_region_name
|
||||
FLOWAGENT_AZURE_CLIENT_ID:
|
||||
from_secret: flowagent_azure_client_id
|
||||
FLOWAGENT_AZURE_TENANT_ID:
|
||||
from_secret: flowagent_azure_tenant_id
|
||||
FLOWAGENT_AZURE_CLIENT_SECRET:
|
||||
from_secret: flowagent_azure_client_secret
|
||||
commands:
|
||||
- apk add --no-cache openssh-client
|
||||
- mkdir -p ~/.ssh
|
||||
@@ -221,10 +251,36 @@ steps:
|
||||
ssh -o StrictHostKeyChecking=no root@$${SWARM_MANAGER_IP} "source /tmp/cs.sh
|
||||
create_or_update_secret 'gamma_auth_token' '$${GAMMA_AUTH_TOKEN}'";;
|
||||
git)
|
||||
ssh -o StrictHostKeyChecking=no root@$${SWARM_MANAGER_IP} "source /tmp/cs.sh
|
||||
create_or_update_secret 'git_db_password' '$${GIT_DB_PASSWORD}'
|
||||
create_or_update_secret 'git_runner_token' '$${GIT_RUNNER_TOKEN}'
|
||||
create_or_update_secret 'git_mcp_access_token' '$${GIT_MCP_ACCESS_TOKEN}'";;
|
||||
# PATTERN B, DELIBERATE (see decision notes) — git hosts the source
|
||||
# of truth for every other stack's compose files, so it must be
|
||||
# restorable from a flat git.yaml + git.env backup alone, with zero
|
||||
# dependency on a running Swarm's Docker secret store. Native Docker
|
||||
# secrets (Pattern C) can't satisfy that: they only exist inside an
|
||||
# already-running Swarm, which is exactly the circular dependency
|
||||
# this stack can't have. Mirrors the ai) case's grep -v + printf
|
||||
# rewrite-in-place approach, never sed (values may contain slash,
|
||||
# dollar sign, ampersand).
|
||||
#
|
||||
# TEST PHASE: target is git.env.pipelinetest, NOT the real git.env.
|
||||
# The real file is never opened for writing by this step. First run
|
||||
# seeds the test file from the real git.env (carries over all
|
||||
# non-secret lines untouched); every push after that only refreshes
|
||||
# the 3 secret lines below. Also strips the legacy GITEA_ACCESS_TOKEN
|
||||
# key name so the test file converges on the git.env.example-
|
||||
# documented GITEA_MCP_ACCESS_TOKEN key. Cutover to the real file —
|
||||
# and pointing git.yaml/stack-deploy at it — is a deliberate,
|
||||
# separate follow-up after manually diffing this render.
|
||||
ssh -o StrictHostKeyChecking=no root@$${SWARM_MANAGER_IP} "FILE=/volume1/docker/compose-files/git.env.pipelinetest
|
||||
TMP=\$FILE.tmp.\$\$
|
||||
[ -f \$FILE ] || cp /volume1/docker/compose-files/git.env \$FILE
|
||||
grep -vE '^(GITEA__database__PASSWD|GITEA_RUNNER_REGISTRATION_TOKEN|GITEA_MCP_ACCESS_TOKEN|GITEA_ACCESS_TOKEN)=' \$FILE > \$TMP 2>/dev/null || touch \$TMP
|
||||
{ cat \$TMP
|
||||
printf 'GITEA__database__PASSWD=%s\n' '$${GIT_DB_PASSWORD}'
|
||||
printf 'GITEA_RUNNER_REGISTRATION_TOKEN=%s\n' '$${GIT_RUNNER_TOKEN}'
|
||||
printf 'GITEA_MCP_ACCESS_TOKEN=%s\n' '$${GIT_MCP_ACCESS_TOKEN}'
|
||||
} > \$FILE
|
||||
rm -f \$TMP
|
||||
echo ' [OK] git.env.pipelinetest updated - real git.env untouched'";;
|
||||
homeassistant)
|
||||
ssh -o StrictHostKeyChecking=no root@$${SWARM_MANAGER_IP} "source /tmp/cs.sh
|
||||
create_or_update_secret 'homeassistant_frigate_rtsp_password' '$${HOMEASSISTANT_FRIGATE_RTSP_PASSWORD}'
|
||||
@@ -279,22 +335,38 @@ steps:
|
||||
# unresolved at compose-render time (empty), silently breaking Bedrock auth.
|
||||
# All other migrated vars in ai.yaml use plain (unprefixed) names, so only
|
||||
# these two lines need the AI_ prefix.
|
||||
#
|
||||
# FLOWAGENT NOTE (added alongside the ai.yaml mcpo image/secrets cutover):
|
||||
# the 3 flowagent_azure_* values are provisioned as native Docker secrets
|
||||
# below (Pattern C, matches every other _FILE-convention stack), NOT written
|
||||
# into ai/ai.env — mcpo's flowagent entry reads them via
|
||||
# /run/secrets/flowagent_azure_* (see mcp-config/flowagent/entrypoint.sh),
|
||||
# not via env var, so they don't belong in this stack's Pattern B .env block.
|
||||
ssh -o StrictHostKeyChecking=no root@$${SWARM_MANAGER_IP} "FILE=/volume1/docker/compose-files/ai/ai.env
|
||||
TMP=\$FILE.tmp.\$\$
|
||||
grep -vE '^(AI_AWS_ACCESS_KEY_ID|AI_AWS_SECRET_ACCESS_KEY|LITELLM_MASTER_KEY|LITELLM_SALT_KEY|POSTGRES_PASSWORD|DATABASE_URL|WEBUI_SECRET_KEY|OPEN_WEBUI_DATABASE_URL|OAUTH_CLIENT_SECRET)=' \$FILE > \$TMP 2>/dev/null || touch \$TMP
|
||||
grep -vE '^(AI_AWS_ACCESS_KEY_ID|AI_AWS_SECRET_ACCESS_KEY|AI_LITELLM_MASTER_KEY|AI_LITELLM_SALT_KEY|AI_LITELLM_POSTGRES_PASSWORD|AI_LITELLM_DATABASE_URL|AI_OPEN_WEBUI_SECRET_KEY|AI_OPEN_WEBUI_DATABASE_URL|AI_OPEN_WEB_UI_OAUTH_CLIENT_SECRET)=' \$FILE > \$TMP 2>/dev/null || touch \$TMP
|
||||
{ cat \$TMP
|
||||
printf 'AI_AWS_ACCESS_KEY_ID=%s\n' '$${AI_AWS_ACCESS_KEY_ID}'
|
||||
printf 'AI_AWS_SECRET_ACCESS_KEY=%s\n' '$${AI_AWS_SECRET_ACCESS_KEY}'
|
||||
printf 'LITELLM_MASTER_KEY=%s\n' '$${AI_LITELLM_MASTER_KEY}'
|
||||
printf 'LITELLM_SALT_KEY=%s\n' '$${AI_LITELLM_SALT_KEY}'
|
||||
printf 'POSTGRES_PASSWORD=%s\n' '$${AI_LITELLM_DB_PASSWORD}'
|
||||
printf 'DATABASE_URL=postgresql://LiteLLM:%s@postgresql:5432/litellm\n' '$${AI_LITELLM_DB_PASSWORD}'
|
||||
printf 'WEBUI_SECRET_KEY=%s\n' '$${AI_WEBUI_SECRET_KEY}'
|
||||
printf 'OPEN_WEBUI_DATABASE_URL=%s\n' '$${AI_OPEN_WEBUI_DATABASE_URL}'
|
||||
printf 'OAUTH_CLIENT_SECRET=%s\n' '$${AI_OAUTH_CLIENT_SECRET}'
|
||||
printf 'AI_AWS_REGION_NAME=%s\n' '$${AI_AWS_REGION_NAME}'
|
||||
printf 'AI_LITELLM_MASTER_KEY=%s\n' '$${AI_LITELLM_MASTER_KEY}'
|
||||
printf 'AI_LITELLM_SALT_KEY=%s\n' '$${AI_LITELLM_SALT_KEY}'
|
||||
printf 'AI_LITELLM_POSTGRES_PASSWORD=%s\n' '$${AI_LITELLM_DB_PASSWORD}'
|
||||
printf 'AI_LITELLM_DATABASE_URL=%s\n' '$${AI_LITELLM_DATABASE_URL}'
|
||||
printf 'AI_LITELLM_POSTGRES_PASSWORD=%s\n' '$${AI_LITELLM_POSTGRES_PASSWORD}'
|
||||
printf 'AI_LITELLM_MODIFY_PARAMS=%s\n' '$${AI_LITELLM_MODIFY_PARAMS}'
|
||||
printf 'AI_LITELLM_DATABASE_MIGRATIONS=%s\n' '$${AI_LITELLM_DATABASE_MIGRATIONS}'
|
||||
printf 'AI_OPEN_WEBUI_SECRET_KEY=%s\n' '$${AI_OPEN_WEBUI_SECRET_KEY}'
|
||||
printf 'AI_OPEN_WEBUI_DATABASE_URL=%s\n' '$${AI_OPEN_WEBUI_DATABASE_URL}'
|
||||
printf 'AI_WEBUI_SECRET_KEY=%s\n' '$${AI_OPEN_WEBUI_SECRET_KEY}'
|
||||
printf 'AI_OPEN_WEBUI_OAUTH_CLIENT_SECRET=%s\n' '$${AI_OPEN_WEBUI_OAUTH_CLIENT_SECRET}'
|
||||
} > \$FILE
|
||||
rm -f \$TMP
|
||||
echo ' [OK] ai/ai.env secrets updated'";;
|
||||
echo ' [OK] ai/ai.env secrets updated'
|
||||
source /tmp/cs.sh
|
||||
create_or_update_secret 'flowagent_azure_client_id' '$${FLOWAGENT_AZURE_CLIENT_ID}'
|
||||
create_or_update_secret 'flowagent_azure_tenant_id' '$${FLOWAGENT_AZURE_TENANT_ID}'
|
||||
create_or_update_secret 'flowagent_azure_client_secret' '$${FLOWAGENT_AZURE_CLIENT_SECRET}'";;
|
||||
entertainment)
|
||||
ssh -o StrictHostKeyChecking=no root@$${SWARM_MANAGER_IP} "source /tmp/cs.sh
|
||||
create_or_update_secret 'entertainment_discord_token' '$${ENTERTAINMENT_DISCORD_TOKEN}'
|
||||
@@ -352,7 +424,7 @@ steps:
|
||||
|
||||
# Bootstrap-tier guard: file synced to host, deploy is MANUAL
|
||||
case "$STACK" in
|
||||
traefik|woodpecker|postgresql|secrets)
|
||||
traefik|woodpecker|postgresql|secrets|git)
|
||||
echo " [BOOTSTRAP] $STACK: file synced. Deploy is MANUAL."
|
||||
echo " Run: bash /volume1/docker/compose-files/deploy/stack-deploy.sh $STACK"
|
||||
continue ;;
|
||||
|
||||
+34
-20
@@ -1,6 +1,6 @@
|
||||
services:
|
||||
open-webui:
|
||||
image: ghcr.io/open-webui/open-webui:0.11.1
|
||||
image: ghcr.io/open-webui/open-webui:0.11.3 #
|
||||
entrypoint:
|
||||
- /bin/bash
|
||||
- /app/tools/startup.sh
|
||||
@@ -16,20 +16,20 @@ services:
|
||||
start_period: 60s
|
||||
environment:
|
||||
- OLLAMA_BASE_URL=http://ollama-intel-arc:11434
|
||||
- WEBUI_SECRET_KEY=${WEBUI_SECRET_KEY}
|
||||
- WEBUI_SECRET_KEY=${AI_OPEN_WEBUI_SECRET_KEY}
|
||||
- WEBUI_DB_HOST=postgresql
|
||||
- DATABASE_URL=${OPEN_WEBUI_DATABASE_URL}
|
||||
- DATABASE_URL=${AI_OPEN_WEBUI_DATABASE_URL}
|
||||
- ENABLE_TOOL_SERVER_CALLING=true
|
||||
- TOOL_SERVER_CALLING=true
|
||||
- WEBUI_URL=${WEBUI_URL}
|
||||
- ENABLE_OAUTH_SIGNUP=${ENABLE_OAUTH_SIGNUP}
|
||||
- OAUTH_MERGE_ACCOUNTS_BY_EMAIL=${OAUTH_MERGE_ACCOUNTS_BY_EMAIL}
|
||||
- OAUTH_PROVIDER_NAME=${OAUTH_PROVIDER_NAME}
|
||||
- OPENID_PROVIDER_URL=${OPENID_PROVIDER_URL}
|
||||
- OAUTH_CLIENT_ID=${OAUTH_CLIENT_ID}
|
||||
- OAUTH_CLIENT_SECRET=${OAUTH_CLIENT_SECRET}
|
||||
- OAUTH_SCOPES=${OAUTH_SCOPES}
|
||||
- OPENID_REDIRECT_URI=${OPENID_REDIRECT_URI}
|
||||
- WEBUI_URL=${AI_OPEN_WEBUI_URL}
|
||||
- ENABLE_OAUTH_SIGNUP=${AI_OPEN_WEBUI_ENABLE_OAUTH_SIGNUP}
|
||||
- OAUTH_MERGE_ACCOUNTS_BY_EMAIL=${AI_OPEN_WEBUI_OAUTH_MERGE_ACCOUNTS_BY_EMAIL}
|
||||
- OAUTH_PROVIDER_NAME=${AI_OPEN_WEBUI_OAUTH_PROVIDER_NAME}
|
||||
- OPENID_PROVIDER_URL=${AI_OPEN_WEBUI_OPENID_PROVIDER_URL}
|
||||
- OAUTH_CLIENT_ID=${AI_OPEN_WEBUI_OAUTH_CLIENT_ID}
|
||||
- OAUTH_CLIENT_SECRET=${AI_OPEN_WEBUI_OAUTH_CLIENT_SECRET}
|
||||
- OAUTH_SCOPES=${AI_OPEN_WEBUI_OAUTH_SCOPES}
|
||||
- OPENID_REDIRECT_URI=${AI_OPEN_WEBUI_OPENID_REDIRECT_URI}
|
||||
networks:
|
||||
- traefik_backend
|
||||
- postgresql_db-backend
|
||||
@@ -62,13 +62,13 @@ services:
|
||||
environment:
|
||||
- AWS_ACCESS_KEY_ID=${AI_AWS_ACCESS_KEY_ID}
|
||||
- AWS_SECRET_ACCESS_KEY=${AI_AWS_SECRET_ACCESS_KEY}
|
||||
- AWS_REGION_NAME=${AWS_REGION_NAME}
|
||||
- LITELLM_MASTER_KEY=${LITELLM_MASTER_KEY}
|
||||
- LITELLM_SALT_KEY=${LITELLM_SALT_KEY}
|
||||
- DATABASE_URL=${DATABASE_URL}
|
||||
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
|
||||
- LITELLM_MODIFY_PARAMS=${LITELLM_MODIFY_PARAMS}
|
||||
- LITELLM_DATABASE_MIGRATIONS=${LITELLM_DATABASE_MIGRATIONS}
|
||||
- AWS_REGION_NAME=${AI_AWS_REGION_NAME}
|
||||
- LITELLM_MASTER_KEY=${AI_LITELLM_MASTER_KEY}
|
||||
- LITELLM_SALT_KEY=${AI_LITELLM_SALT_KEY}
|
||||
- DATABASE_URL=${AI_LITELLM_DATABASE_URL}
|
||||
- POSTGRES_PASSWORD=${AI_LITELLM_POSTGRES_PASSWORD}
|
||||
- LITELLM_MODIFY_PARAMS=${AI_LITELLM_MODIFY_PARAMS}
|
||||
- LITELLM_DATABASE_MIGRATIONS=${AI_LITELLM_DATABASE_MIGRATIONS}
|
||||
networks:
|
||||
- traefik_backend
|
||||
- postgresql_db-backend
|
||||
@@ -127,7 +127,7 @@ services:
|
||||
labels:
|
||||
- traefik.enable=false
|
||||
mcpo:
|
||||
image: ghcr.io/open-webui/mcpo:main
|
||||
image: git.bryanmail.net/homelab/flowagent-mcpo:c5b22618404a
|
||||
command:
|
||||
- --config
|
||||
- /app/config/config.json
|
||||
@@ -141,6 +141,13 @@ services:
|
||||
- /volume1/docker/mcpo/data:/mcpo_data
|
||||
- /volume1/docker/cronicle/ssh_keys:/app/ssh_keys:ro
|
||||
- /volume1/docker/mcpo/uv-cache:/app/uv-cache
|
||||
secrets:
|
||||
- source: flowagent_azure_client_id
|
||||
target: flowagent_azure_client_id
|
||||
- source: flowagent_azure_tenant_id
|
||||
target: flowagent_azure_tenant_id
|
||||
- source: flowagent_azure_client_secret
|
||||
target: flowagent_azure_client_secret
|
||||
networks:
|
||||
- traefik_backend
|
||||
deploy:
|
||||
@@ -173,6 +180,13 @@ services:
|
||||
- traefik.http.middlewares.n8n.headers.STSPreload=true
|
||||
- traefik.http.routers.n8n.middlewares=forwardAuth-authentik@file, crowdsec@file
|
||||
- traefik.swarm.network=traefik_backend
|
||||
secrets:
|
||||
flowagent_azure_client_id:
|
||||
external: true
|
||||
flowagent_azure_tenant_id:
|
||||
external: true
|
||||
flowagent_azure_client_secret:
|
||||
external: true
|
||||
networks:
|
||||
traefik_backend:
|
||||
external: true
|
||||
|
||||
Reference in New Issue
Block a user