@cachly-dev/mcp-server 0.10.47 → 0.10.49
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.
- package/.github/workflows/eas-build-android.yml +58 -0
- package/.github/workflows/eas-update.yml +55 -0
- package/STRATEGY.md +209 -0
- package/apps/travel-chaos-organizer/.env.example +49 -0
- package/apps/travel-chaos-organizer/DEPLOY.md +328 -0
- package/apps/travel-chaos-organizer/Makefile +57 -0
- package/apps/travel-chaos-organizer/README.md +159 -0
- package/apps/travel-chaos-organizer/backend/.env.example +10 -0
- package/apps/travel-chaos-organizer/backend/Dockerfile +25 -0
- package/apps/travel-chaos-organizer/backend/alembic/env.py +56 -0
- package/apps/travel-chaos-organizer/backend/alembic/script.py.mako +24 -0
- package/apps/travel-chaos-organizer/backend/alembic/versions/.gitkeep +0 -0
- package/apps/travel-chaos-organizer/backend/alembic/versions/0001_stripe_customer_id.py +24 -0
- package/apps/travel-chaos-organizer/backend/alembic/versions/0002_telegram_chat_id.py +24 -0
- package/apps/travel-chaos-organizer/backend/alembic.ini +39 -0
- package/apps/travel-chaos-organizer/backend/app/__init__.py +0 -0
- package/apps/travel-chaos-organizer/backend/app/auth/__init__.py +0 -0
- package/apps/travel-chaos-organizer/backend/app/auth/keycloak.py +81 -0
- package/apps/travel-chaos-organizer/backend/app/config.py +66 -0
- package/apps/travel-chaos-organizer/backend/app/db/__init__.py +0 -0
- package/apps/travel-chaos-organizer/backend/app/db/database.py +20 -0
- package/apps/travel-chaos-organizer/backend/app/db/migrations/001_init.sql +71 -0
- package/apps/travel-chaos-organizer/backend/app/db/migrations/002_telemetry_freemium.sql +31 -0
- package/apps/travel-chaos-organizer/backend/app/db/migrations/003_telegram_chat_id.sql +4 -0
- package/apps/travel-chaos-organizer/backend/app/db/migrations/004_stripe_and_email.sql +5 -0
- package/apps/travel-chaos-organizer/backend/app/limiter.py +4 -0
- package/apps/travel-chaos-organizer/backend/app/logging_config.py +25 -0
- package/apps/travel-chaos-organizer/backend/app/main.py +77 -0
- package/apps/travel-chaos-organizer/backend/app/models/__init__.py +0 -0
- package/apps/travel-chaos-organizer/backend/app/models/schemas.py +142 -0
- package/apps/travel-chaos-organizer/backend/app/routers/__init__.py +0 -0
- package/apps/travel-chaos-organizer/backend/app/routers/admin.py +237 -0
- package/apps/travel-chaos-organizer/backend/app/routers/cache.py +13 -0
- package/apps/travel-chaos-organizer/backend/app/routers/events.py +29 -0
- package/apps/travel-chaos-organizer/backend/app/routers/export.py +122 -0
- package/apps/travel-chaos-organizer/backend/app/routers/inbox.py +122 -0
- package/apps/travel-chaos-organizer/backend/app/routers/items.py +130 -0
- package/apps/travel-chaos-organizer/backend/app/routers/mail.py +108 -0
- package/apps/travel-chaos-organizer/backend/app/routers/parse.py +303 -0
- package/apps/travel-chaos-organizer/backend/app/routers/payments.py +179 -0
- package/apps/travel-chaos-organizer/backend/app/routers/trips.py +134 -0
- package/apps/travel-chaos-organizer/backend/app/routers/users.py +169 -0
- package/apps/travel-chaos-organizer/backend/app/routers/waitlist.py +37 -0
- package/apps/travel-chaos-organizer/backend/app/services/__init__.py +0 -0
- package/apps/travel-chaos-organizer/backend/app/services/cache.py +131 -0
- package/apps/travel-chaos-organizer/backend/app/services/drip.py +128 -0
- package/apps/travel-chaos-organizer/backend/app/services/email.py +61 -0
- package/apps/travel-chaos-organizer/backend/app/services/errors.py +44 -0
- package/apps/travel-chaos-organizer/backend/app/services/notifier.py +10 -0
- package/apps/travel-chaos-organizer/backend/app/services/ollama.py +101 -0
- package/apps/travel-chaos-organizer/backend/app/services/parser.py +22 -0
- package/apps/travel-chaos-organizer/backend/app/services/quota.py +85 -0
- package/apps/travel-chaos-organizer/backend/app/services/sentry.py +11 -0
- package/apps/travel-chaos-organizer/backend/app/services/telemetry.py +35 -0
- package/apps/travel-chaos-organizer/backend/pytest.ini +4 -0
- package/apps/travel-chaos-organizer/backend/requirements-dev.txt +6 -0
- package/apps/travel-chaos-organizer/backend/requirements.txt +25 -0
- package/apps/travel-chaos-organizer/backend/tests/__init__.py +0 -0
- package/apps/travel-chaos-organizer/backend/tests/conftest.py +223 -0
- package/apps/travel-chaos-organizer/backend/tests/test_admin.py +99 -0
- package/apps/travel-chaos-organizer/backend/tests/test_cache.py +142 -0
- package/apps/travel-chaos-organizer/backend/tests/test_drip.py +32 -0
- package/apps/travel-chaos-organizer/backend/tests/test_e2e_chain.py +121 -0
- package/apps/travel-chaos-organizer/backend/tests/test_export.py +48 -0
- package/apps/travel-chaos-organizer/backend/tests/test_inbox.py +107 -0
- package/apps/travel-chaos-organizer/backend/tests/test_items.py +138 -0
- package/apps/travel-chaos-organizer/backend/tests/test_mail.py +113 -0
- package/apps/travel-chaos-organizer/backend/tests/test_ollama.py +145 -0
- package/apps/travel-chaos-organizer/backend/tests/test_parse_url.py +98 -0
- package/apps/travel-chaos-organizer/backend/tests/test_parser.py +72 -0
- package/apps/travel-chaos-organizer/backend/tests/test_payments.py +163 -0
- package/apps/travel-chaos-organizer/backend/tests/test_quota.py +46 -0
- package/apps/travel-chaos-organizer/backend/tests/test_search.py +67 -0
- package/apps/travel-chaos-organizer/backend/tests/test_trips.py +123 -0
- package/apps/travel-chaos-organizer/backend/tests/test_users.py +52 -0
- package/apps/travel-chaos-organizer/backups/.gitkeep +0 -0
- package/apps/travel-chaos-organizer/caddy/Caddyfile +27 -0
- package/apps/travel-chaos-organizer/docker-compose.node1.yml +31 -0
- package/apps/travel-chaos-organizer/docker-compose.override.yml +14 -0
- package/apps/travel-chaos-organizer/docker-compose.yml +128 -0
- package/apps/travel-chaos-organizer/frontend/.env.example +13 -0
- package/apps/travel-chaos-organizer/frontend/app/(app)/_layout.tsx +80 -0
- package/apps/travel-chaos-organizer/frontend/app/(app)/inbox.tsx +166 -0
- package/apps/travel-chaos-organizer/frontend/app/(app)/search.tsx +130 -0
- package/apps/travel-chaos-organizer/frontend/app/(app)/settings.tsx +381 -0
- package/apps/travel-chaos-organizer/frontend/app/(app)/trips/[id].tsx +346 -0
- package/apps/travel-chaos-organizer/frontend/app/(app)/trips.tsx +363 -0
- package/apps/travel-chaos-organizer/frontend/app/(app)/upgrade/cancel.tsx +34 -0
- package/apps/travel-chaos-organizer/frontend/app/(app)/upgrade/success.tsx +35 -0
- package/apps/travel-chaos-organizer/frontend/app/(auth)/login.tsx +91 -0
- package/apps/travel-chaos-organizer/frontend/app/_layout.tsx +71 -0
- package/apps/travel-chaos-organizer/frontend/app/auth.tsx +29 -0
- package/apps/travel-chaos-organizer/frontend/app/index.tsx +16 -0
- package/apps/travel-chaos-organizer/frontend/app/onboarding.tsx +119 -0
- package/apps/travel-chaos-organizer/frontend/app.config.ts +54 -0
- package/apps/travel-chaos-organizer/frontend/assets/adaptive-icon.svg +66 -0
- package/apps/travel-chaos-organizer/frontend/assets/icon.svg +79 -0
- package/apps/travel-chaos-organizer/frontend/assets/splash.svg +15 -0
- package/apps/travel-chaos-organizer/frontend/components/BottomSheet.tsx +102 -0
- package/apps/travel-chaos-organizer/frontend/components/ConfettiCannon.tsx +107 -0
- package/apps/travel-chaos-organizer/frontend/components/ConfirmDialog.tsx +109 -0
- package/apps/travel-chaos-organizer/frontend/components/ErrorBoundary.tsx +45 -0
- package/apps/travel-chaos-organizer/frontend/components/FileUploadButton.tsx +19 -0
- package/apps/travel-chaos-organizer/frontend/components/ImportSheet.tsx +155 -0
- package/apps/travel-chaos-organizer/frontend/components/OfflineBadge.tsx +55 -0
- package/apps/travel-chaos-organizer/frontend/components/QRCodeViewer.tsx +80 -0
- package/apps/travel-chaos-organizer/frontend/components/ScoreRing.tsx +39 -0
- package/apps/travel-chaos-organizer/frontend/components/Screen.tsx +39 -0
- package/apps/travel-chaos-organizer/frontend/components/Skeleton.tsx +70 -0
- package/apps/travel-chaos-organizer/frontend/components/SwipeableInboxItem.tsx +121 -0
- package/apps/travel-chaos-organizer/frontend/components/SwipeableTimelineItem.tsx +70 -0
- package/apps/travel-chaos-organizer/frontend/components/TimelineItem.tsx +73 -0
- package/apps/travel-chaos-organizer/frontend/components/TimelineItemDetail.tsx +130 -0
- package/apps/travel-chaos-organizer/frontend/components/Toast.tsx +60 -0
- package/apps/travel-chaos-organizer/frontend/components/ToastContext.tsx +42 -0
- package/apps/travel-chaos-organizer/frontend/components/TripCard.tsx +146 -0
- package/apps/travel-chaos-organizer/frontend/components/TripQRModal.tsx +70 -0
- package/apps/travel-chaos-organizer/frontend/components/UpgradeBanner.tsx +44 -0
- package/apps/travel-chaos-organizer/frontend/eas.json +22 -0
- package/apps/travel-chaos-organizer/frontend/hooks/useInbox.ts +24 -0
- package/apps/travel-chaos-organizer/frontend/hooks/useNetworkSync.ts +60 -0
- package/apps/travel-chaos-organizer/frontend/hooks/useTrips.ts +112 -0
- package/apps/travel-chaos-organizer/frontend/lib/api.ts +223 -0
- package/apps/travel-chaos-organizer/frontend/lib/auth.ts +93 -0
- package/apps/travel-chaos-organizer/frontend/lib/db.ts +86 -0
- package/apps/travel-chaos-organizer/frontend/lib/fileCache.ts +54 -0
- package/apps/travel-chaos-organizer/frontend/lib/haptics.ts +13 -0
- package/apps/travel-chaos-organizer/frontend/lib/notifications.ts +112 -0
- package/apps/travel-chaos-organizer/frontend/lib/offlineQueue.ts +145 -0
- package/apps/travel-chaos-organizer/frontend/lib/quota.tsx +43 -0
- package/apps/travel-chaos-organizer/frontend/lib/sentry.ts +28 -0
- package/apps/travel-chaos-organizer/frontend/lib/shareIntent.ts +44 -0
- package/apps/travel-chaos-organizer/frontend/package-lock.json +13037 -0
- package/apps/travel-chaos-organizer/frontend/package.json +44 -0
- package/apps/travel-chaos-organizer/frontend/tsconfig.json +23 -0
- package/apps/travel-chaos-organizer/keycloak/realm-export.json +59 -0
- package/apps/travel-chaos-organizer/landing/index.html +773 -0
- package/apps/travel-chaos-organizer/scripts/backup.sh +14 -0
- package/apps/travel-chaos-organizer/scripts/configure-env.sh +82 -0
- package/apps/travel-chaos-organizer/scripts/deploy.sh +54 -0
- package/apps/travel-chaos-organizer/scripts/health-check.sh +36 -0
- package/apps/travel-chaos-organizer/scripts/migrate.sh +7 -0
- package/apps/travel-chaos-organizer/scripts/server-setup.sh +85 -0
- package/apps/travel-chaos-organizer/scripts/smoke-test.sh +29 -0
- package/apps/travel-chaos-organizer/scripts/verify-tracking.sh +71 -0
- package/apps/travel-chaos-organizer/telegram-bot/.env.example +3 -0
- package/apps/travel-chaos-organizer/telegram-bot/Dockerfile +6 -0
- package/apps/travel-chaos-organizer/telegram-bot/bot.py +504 -0
- package/apps/travel-chaos-organizer/telegram-bot/requirements.txt +3 -0
- package/dist/packages/telegram-notify/client.d.ts +19 -0
- package/dist/packages/telegram-notify/client.js +75 -0
- package/dist/packages/telegram-notify/client.js.map +1 -0
- package/dist/src/__tests__/auth.test.js.map +1 -0
- package/dist/{__tests__ → src/__tests__}/brain-flow.test.js +143 -2
- package/dist/src/__tests__/brain-flow.test.js.map +1 -0
- package/dist/src/__tests__/confidence.test.js.map +1 -0
- package/dist/src/__tests__/e2e/api-auth.test.js.map +1 -0
- package/dist/src/__tests__/e2e/api-health.test.js.map +1 -0
- package/dist/src/__tests__/e2e/cli.test.js.map +1 -0
- package/dist/src/__tests__/e2e/config.js.map +1 -0
- package/dist/src/__tests__/e2e/funnel.test.js.map +1 -0
- package/dist/src/__tests__/e2e/mcp-tools.test.js.map +1 -0
- package/dist/src/__tests__/e2e/provisioning.test.js.map +1 -0
- package/dist/{__tests__ → src/__tests__}/handlers-unit.test.js +1 -1
- package/dist/src/__tests__/handlers-unit.test.js.map +1 -0
- package/dist/src/__tests__/namespace.test.js.map +1 -0
- package/dist/src/auth.js.map +1 -0
- package/dist/src/ckg.js.map +1 -0
- package/dist/src/confidence.js.map +1 -0
- package/dist/src/embeddings.js.map +1 -0
- package/dist/src/handlers/advanced.js.map +1 -0
- package/dist/{handlers → src/handlers}/brain.js +135 -31
- package/dist/src/handlers/brain.js.map +1 -0
- package/dist/src/handlers/cache.js.map +1 -0
- package/dist/{handlers → src/handlers}/context.js +9 -4
- package/dist/src/handlers/context.js.map +1 -0
- package/dist/{handlers → src/handlers}/fedbrain.d.ts +6 -0
- package/dist/{handlers → src/handlers}/fedbrain.js +15 -2
- package/dist/src/handlers/fedbrain.js.map +1 -0
- package/dist/src/handlers/instances.js.map +1 -0
- package/dist/{handlers → src/handlers}/roadmap.js +8 -4
- package/dist/src/handlers/roadmap.js.map +1 -0
- package/dist/src/handlers/syndicate.js.map +1 -0
- package/dist/src/handlers/tco.d.ts +16 -0
- package/dist/src/handlers/tco.js +303 -0
- package/dist/src/handlers/tco.js.map +1 -0
- package/dist/{handlers → src/handlers}/team.js +1 -1
- package/dist/src/handlers/team.js.map +1 -0
- package/dist/{index.js → src/index.js} +145 -97
- package/dist/src/index.js.map +1 -0
- package/dist/src/namespace.js.map +1 -0
- package/dist/src/notifier.d.ts +5 -0
- package/dist/src/notifier.js +6 -0
- package/dist/src/notifier.js.map +1 -0
- package/dist/{search.js → src/search.js} +3 -3
- package/dist/src/search.js.map +1 -0
- package/dist/src/search.test.js.map +1 -0
- package/dist/{tools.d.ts → src/tools.d.ts} +196 -0
- package/dist/{tools.js → src/tools.js} +178 -0
- package/dist/src/tools.js.map +1 -0
- package/dist/src/utils.js.map +1 -0
- package/package.json +3 -2
- package/packages/telegram-notify/SPLIT_PLAN.md +106 -0
- package/packages/telegram-notify/client.ts +88 -0
- package/packages/telegram-notify/emojis.json +22 -0
- package/packages/telegram-notify/pyproject.toml +17 -0
- package/packages/telegram-notify/telegram_notify/__init__.py +3 -0
- package/packages/telegram-notify/telegram_notify/client.py +87 -0
- package/packages/telegram-notify/telegram_notify/emojis.json +22 -0
- package/scripts/generate-icons.js +28 -0
- package/smithery.yaml +21 -10
- package/src/__tests__/brain-flow.test.ts +176 -2
- package/src/__tests__/handlers-unit.test.ts +1 -1
- package/src/handlers/brain.ts +139 -32
- package/src/handlers/context.ts +9 -4
- package/src/handlers/fedbrain.ts +17 -2
- package/src/handlers/roadmap.ts +8 -4
- package/src/handlers/tco.ts +347 -0
- package/src/handlers/team.ts +1 -1
- package/src/index.ts +137 -147
- package/src/notifier.ts +5 -0
- package/src/search.ts +3 -3
- package/src/tools.ts +191 -0
- package/tsconfig.json +2 -3
- package/dist/__tests__/auth.test.js.map +0 -1
- package/dist/__tests__/brain-flow.test.js.map +0 -1
- package/dist/__tests__/brain-predict-failures.test.d.ts +0 -17
- package/dist/__tests__/brain-predict-failures.test.js +0 -339
- package/dist/__tests__/brain-predict-failures.test.js.map +0 -1
- package/dist/__tests__/confidence.test.js.map +0 -1
- package/dist/__tests__/e2e/api-auth.test.js.map +0 -1
- package/dist/__tests__/e2e/api-health.test.js.map +0 -1
- package/dist/__tests__/e2e/cli.test.js.map +0 -1
- package/dist/__tests__/e2e/config.js.map +0 -1
- package/dist/__tests__/e2e/funnel.test.js.map +0 -1
- package/dist/__tests__/e2e/mcp-tools.test.js.map +0 -1
- package/dist/__tests__/e2e/provisioning.test.js.map +0 -1
- package/dist/__tests__/handlers-unit.test.js.map +0 -1
- package/dist/__tests__/namespace.test.js.map +0 -1
- package/dist/auth.js.map +0 -1
- package/dist/ckg.js.map +0 -1
- package/dist/confidence.js.map +0 -1
- package/dist/embeddings.js.map +0 -1
- package/dist/handlers/advanced.js.map +0 -1
- package/dist/handlers/brain.js.map +0 -1
- package/dist/handlers/cache.js.map +0 -1
- package/dist/handlers/context.js.map +0 -1
- package/dist/handlers/fedbrain.js.map +0 -1
- package/dist/handlers/instances.js.map +0 -1
- package/dist/handlers/roadmap.js.map +0 -1
- package/dist/handlers/syndicate.js.map +0 -1
- package/dist/handlers/team.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/namespace.js.map +0 -1
- package/dist/search.js.map +0 -1
- package/dist/search.test.js.map +0 -1
- package/dist/tools.js.map +0 -1
- package/dist/utils.js.map +0 -1
- package/src/__tests__/brain-predict-failures.test.ts +0 -430
- /package/dist/{__tests__ → src/__tests__}/auth.test.d.ts +0 -0
- /package/dist/{__tests__ → src/__tests__}/auth.test.js +0 -0
- /package/dist/{__tests__ → src/__tests__}/brain-flow.test.d.ts +0 -0
- /package/dist/{__tests__ → src/__tests__}/confidence.test.d.ts +0 -0
- /package/dist/{__tests__ → src/__tests__}/confidence.test.js +0 -0
- /package/dist/{__tests__ → src/__tests__}/e2e/api-auth.test.d.ts +0 -0
- /package/dist/{__tests__ → src/__tests__}/e2e/api-auth.test.js +0 -0
- /package/dist/{__tests__ → src/__tests__}/e2e/api-health.test.d.ts +0 -0
- /package/dist/{__tests__ → src/__tests__}/e2e/api-health.test.js +0 -0
- /package/dist/{__tests__ → src/__tests__}/e2e/cli.test.d.ts +0 -0
- /package/dist/{__tests__ → src/__tests__}/e2e/cli.test.js +0 -0
- /package/dist/{__tests__ → src/__tests__}/e2e/config.d.ts +0 -0
- /package/dist/{__tests__ → src/__tests__}/e2e/config.js +0 -0
- /package/dist/{__tests__ → src/__tests__}/e2e/funnel.test.d.ts +0 -0
- /package/dist/{__tests__ → src/__tests__}/e2e/funnel.test.js +0 -0
- /package/dist/{__tests__ → src/__tests__}/e2e/mcp-tools.test.d.ts +0 -0
- /package/dist/{__tests__ → src/__tests__}/e2e/mcp-tools.test.js +0 -0
- /package/dist/{__tests__ → src/__tests__}/e2e/provisioning.test.d.ts +0 -0
- /package/dist/{__tests__ → src/__tests__}/e2e/provisioning.test.js +0 -0
- /package/dist/{__tests__ → src/__tests__}/handlers-unit.test.d.ts +0 -0
- /package/dist/{__tests__ → src/__tests__}/namespace.test.d.ts +0 -0
- /package/dist/{__tests__ → src/__tests__}/namespace.test.js +0 -0
- /package/dist/{auth.d.ts → src/auth.d.ts} +0 -0
- /package/dist/{auth.js → src/auth.js} +0 -0
- /package/dist/{ckg.d.ts → src/ckg.d.ts} +0 -0
- /package/dist/{ckg.js → src/ckg.js} +0 -0
- /package/dist/{confidence.d.ts → src/confidence.d.ts} +0 -0
- /package/dist/{confidence.js → src/confidence.js} +0 -0
- /package/dist/{embeddings.d.ts → src/embeddings.d.ts} +0 -0
- /package/dist/{embeddings.js → src/embeddings.js} +0 -0
- /package/dist/{handlers → src/handlers}/advanced.d.ts +0 -0
- /package/dist/{handlers → src/handlers}/advanced.js +0 -0
- /package/dist/{handlers → src/handlers}/brain.d.ts +0 -0
- /package/dist/{handlers → src/handlers}/cache.d.ts +0 -0
- /package/dist/{handlers → src/handlers}/cache.js +0 -0
- /package/dist/{handlers → src/handlers}/context.d.ts +0 -0
- /package/dist/{handlers → src/handlers}/instances.d.ts +0 -0
- /package/dist/{handlers → src/handlers}/instances.js +0 -0
- /package/dist/{handlers → src/handlers}/roadmap.d.ts +0 -0
- /package/dist/{handlers → src/handlers}/syndicate.d.ts +0 -0
- /package/dist/{handlers → src/handlers}/syndicate.js +0 -0
- /package/dist/{handlers → src/handlers}/team.d.ts +0 -0
- /package/dist/{index.d.ts → src/index.d.ts} +0 -0
- /package/dist/{namespace.d.ts → src/namespace.d.ts} +0 -0
- /package/dist/{namespace.js → src/namespace.js} +0 -0
- /package/dist/{search.d.ts → src/search.d.ts} +0 -0
- /package/dist/{search.test.d.ts → src/search.test.d.ts} +0 -0
- /package/dist/{search.test.js → src/search.test.js} +0 -0
- /package/dist/{utils.d.ts → src/utils.d.ts} +0 -0
- /package/dist/{utils.js → src/utils.js} +0 -0
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
#!/bin/sh
|
|
2
|
+
# pg_dump backup script — run via: docker compose --profile backup run --rm backup
|
|
3
|
+
set -e
|
|
4
|
+
|
|
5
|
+
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
|
|
6
|
+
DEST="/backups/tco_${TIMESTAMP}.sql.gz"
|
|
7
|
+
|
|
8
|
+
echo "Starting backup to $DEST ..."
|
|
9
|
+
pg_dump -h postgres -U tco -d tco | gzip > "$DEST"
|
|
10
|
+
echo "Backup complete: $DEST"
|
|
11
|
+
|
|
12
|
+
# Keep last 30 backups, delete older ones
|
|
13
|
+
cd /backups && ls -t tco_*.sql.gz | tail -n +31 | xargs -r rm --
|
|
14
|
+
echo "Old backups pruned. Done."
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Interactive wizard to configure .env for production.
|
|
3
|
+
set -euo pipefail
|
|
4
|
+
|
|
5
|
+
GREEN='\033[0;32m'; YELLOW='\033[1;33m'; CYAN='\033[0;36m'; NC='\033[0m'
|
|
6
|
+
ask() { echo -e "${CYAN}?${NC} $1"; }
|
|
7
|
+
info() { echo -e "${GREEN}✓${NC} $1"; }
|
|
8
|
+
warn() { echo -e "${YELLOW}!${NC} $1"; }
|
|
9
|
+
|
|
10
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
11
|
+
cd "$SCRIPT_DIR/.."
|
|
12
|
+
|
|
13
|
+
ENV_FILE=".env"
|
|
14
|
+
[[ -f "$ENV_FILE" ]] || cp .env.example "$ENV_FILE"
|
|
15
|
+
|
|
16
|
+
set_var() {
|
|
17
|
+
local key="$1" val="$2"
|
|
18
|
+
if grep -q "^${key}=" "$ENV_FILE" 2>/dev/null; then
|
|
19
|
+
sed -i "s|^${key}=.*|${key}=${val}|" "$ENV_FILE"
|
|
20
|
+
else
|
|
21
|
+
echo "${key}=${val}" >> "$ENV_FILE"
|
|
22
|
+
fi
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
echo ""
|
|
26
|
+
echo "╔══════════════════════════════════════╗"
|
|
27
|
+
echo "║ Travel Chaos Organizer — .env Setup ║"
|
|
28
|
+
echo "╚══════════════════════════════════════╝"
|
|
29
|
+
echo ""
|
|
30
|
+
|
|
31
|
+
ask "Domain (e.g. tco.example.com, or press Enter to skip):"; read -r DOMAIN
|
|
32
|
+
[[ -n "$DOMAIN" ]] && set_var "TCO_DOMAIN" "$DOMAIN" && info "Domain set."
|
|
33
|
+
|
|
34
|
+
ask "Admin username [admin]:"; read -r ADMIN_USER
|
|
35
|
+
ADMIN_USER="${ADMIN_USER:-admin}"
|
|
36
|
+
set_var "ADMIN_USER" "$ADMIN_USER"
|
|
37
|
+
|
|
38
|
+
ask "Admin password (min 16 chars):"; read -rsp "" ADMIN_PASS; echo
|
|
39
|
+
while [[ ${#ADMIN_PASS} -lt 16 ]]; do
|
|
40
|
+
warn "Too short. Min 16 characters."; read -rsp "" ADMIN_PASS; echo
|
|
41
|
+
done
|
|
42
|
+
set_var "ADMIN_PASSWORD" "$ADMIN_PASS"
|
|
43
|
+
info "Admin credentials set."
|
|
44
|
+
|
|
45
|
+
ask "Resend API key (Enter to skip):"; read -r RESEND_KEY
|
|
46
|
+
[[ -n "$RESEND_KEY" ]] && set_var "RESEND_API_KEY" "$RESEND_KEY" && info "Resend configured."
|
|
47
|
+
|
|
48
|
+
ask "Resend FROM address [noreply@tco.app]:"; read -r RESEND_FROM
|
|
49
|
+
RESEND_FROM="${RESEND_FROM:-noreply@tco.app}"
|
|
50
|
+
set_var "RESEND_FROM" "$RESEND_FROM"
|
|
51
|
+
|
|
52
|
+
ask "Sentry DSN (Enter to skip):"; read -r SENTRY_DSN
|
|
53
|
+
[[ -n "$SENTRY_DSN" ]] && set_var "SENTRY_DSN" "$SENTRY_DSN" && info "Sentry configured."
|
|
54
|
+
|
|
55
|
+
ask "Telegram Bot Token (Enter to skip):"; read -r TG_TOKEN
|
|
56
|
+
if [[ -n "$TG_TOKEN" ]]; then
|
|
57
|
+
set_var "TELEGRAM_BOT_TOKEN" "$TG_TOKEN"
|
|
58
|
+
ask "Telegram Chat ID for TCO events:"; read -r TG_CHAT
|
|
59
|
+
set_var "TCO_TELEGRAM_CHAT_ID" "$TG_CHAT"
|
|
60
|
+
info "Telegram configured."
|
|
61
|
+
fi
|
|
62
|
+
|
|
63
|
+
ask "Stripe Secret Key (Enter to skip):"; read -r STRIPE_SK
|
|
64
|
+
if [[ -n "$STRIPE_SK" ]]; then
|
|
65
|
+
set_var "STRIPE_SECRET_KEY" "$STRIPE_SK"
|
|
66
|
+
ask "Stripe Webhook Secret (whsec_...):"; read -r STRIPE_WH
|
|
67
|
+
set_var "STRIPE_WEBHOOK_SECRET" "$STRIPE_WH"
|
|
68
|
+
ask "Stripe Pro Price ID (price_...):"; read -r STRIPE_PRICE
|
|
69
|
+
set_var "STRIPE_PRO_PRICE_ID" "$STRIPE_PRICE"
|
|
70
|
+
info "Stripe configured."
|
|
71
|
+
fi
|
|
72
|
+
|
|
73
|
+
ask "Ollama URL [http://localhost:11434]:"; read -r OLLAMA_URL
|
|
74
|
+
OLLAMA_URL="${OLLAMA_URL:-http://localhost:11434}"
|
|
75
|
+
set_var "OLLAMA_URL" "$OLLAMA_URL"
|
|
76
|
+
|
|
77
|
+
set_var "ENVIRONMENT" "production"
|
|
78
|
+
set_var "DEBUG" "false"
|
|
79
|
+
|
|
80
|
+
echo ""
|
|
81
|
+
info "=== .env written to $ENV_FILE ==="
|
|
82
|
+
warn "Review it: cat $ENV_FILE"
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Deploy or update TCO. Safe to run multiple times.
|
|
3
|
+
set -euo pipefail
|
|
4
|
+
|
|
5
|
+
GREEN='\033[0;32m'; YELLOW='\033[1;33m'; RED='\033[0;31m'; NC='\033[0m'
|
|
6
|
+
info() { echo -e "${GREEN}[deploy]${NC} $*"; }
|
|
7
|
+
warn() { echo -e "${YELLOW}[deploy]${NC} $*"; }
|
|
8
|
+
die() { echo -e "${RED}[deploy]${NC} $*" >&2; exit 1; }
|
|
9
|
+
|
|
10
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
11
|
+
APP_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
|
|
12
|
+
cd "$APP_DIR"
|
|
13
|
+
|
|
14
|
+
[[ -f .env ]] || die ".env not found. Copy .env.example to .env and fill in values."
|
|
15
|
+
|
|
16
|
+
info "=== TCO Deploy ==="
|
|
17
|
+
info "Dir: $APP_DIR"
|
|
18
|
+
|
|
19
|
+
# Pull latest images
|
|
20
|
+
info "Pulling Docker images..."
|
|
21
|
+
docker compose pull --quiet
|
|
22
|
+
|
|
23
|
+
# Build backend
|
|
24
|
+
info "Building backend..."
|
|
25
|
+
docker compose build --quiet backend
|
|
26
|
+
|
|
27
|
+
# Start services (except backup profile)
|
|
28
|
+
info "Starting services..."
|
|
29
|
+
docker compose up -d --remove-orphans
|
|
30
|
+
|
|
31
|
+
# Wait for backend health
|
|
32
|
+
info "Waiting for backend to be healthy..."
|
|
33
|
+
for i in $(seq 1 30); do
|
|
34
|
+
if curl -sf http://localhost:8000/health > /dev/null 2>&1; then
|
|
35
|
+
info "Backend is healthy."
|
|
36
|
+
break
|
|
37
|
+
fi
|
|
38
|
+
if [[ $i -eq 30 ]]; then
|
|
39
|
+
die "Backend did not become healthy after 30 attempts."
|
|
40
|
+
fi
|
|
41
|
+
sleep 2
|
|
42
|
+
done
|
|
43
|
+
|
|
44
|
+
# Run Alembic migrations
|
|
45
|
+
info "Running database migrations..."
|
|
46
|
+
docker compose exec -T backend alembic upgrade head && info "Migrations applied." || warn "Alembic not available yet — run manually: docker compose exec backend alembic upgrade head"
|
|
47
|
+
|
|
48
|
+
# Show status
|
|
49
|
+
info ""
|
|
50
|
+
info "=== Deploy complete ==="
|
|
51
|
+
docker compose ps
|
|
52
|
+
info ""
|
|
53
|
+
info "Backend: http://localhost:8000/health"
|
|
54
|
+
info "Admin UI: http://localhost:8000/admin"
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
set -euo pipefail
|
|
3
|
+
BASE="${1:-http://localhost:8000}"
|
|
4
|
+
RED='\033[0;31m'; GREEN='\033[0;32m'; YELLOW='\033[1;33m'; NC='\033[0m'
|
|
5
|
+
|
|
6
|
+
ok() { echo -e "${GREEN}✓${NC} $1"; }
|
|
7
|
+
fail() { echo -e "${RED}✗${NC} $1"; FAILURES=$((FAILURES+1)); }
|
|
8
|
+
FAILURES=0
|
|
9
|
+
|
|
10
|
+
echo "=== TCO Health Check (${BASE}) ==="
|
|
11
|
+
|
|
12
|
+
# Backend health
|
|
13
|
+
resp=$(curl -sf "${BASE}/health" 2>/dev/null) && ok "Backend healthy: $resp" || fail "Backend /health failed"
|
|
14
|
+
|
|
15
|
+
# Postgres via backend
|
|
16
|
+
echo "$resp" | grep -q '"status":"ok"' && ok "DB connected" || fail "DB not connected"
|
|
17
|
+
|
|
18
|
+
# Cachly cache status
|
|
19
|
+
echo "$resp" | grep -q '"cachly_cache":"enabled"' && ok "Cachly cache enabled" \
|
|
20
|
+
|| echo -e "${YELLOW}!${NC} Cachly cache disabled (CACHLY_REDIS_URL not set)"
|
|
21
|
+
|
|
22
|
+
# Admin dashboard
|
|
23
|
+
curl -sf "${BASE}/admin" -o /dev/null && ok "Admin dashboard reachable" || fail "Admin dashboard unreachable"
|
|
24
|
+
|
|
25
|
+
# Waitlist endpoint
|
|
26
|
+
curl -sf -X POST "${BASE}/api/v1/waitlist" -H "Content-Type: application/json" \
|
|
27
|
+
-d '{"email":"healthcheck@tco.internal","source":"healthcheck"}' -o /dev/null 2>/dev/null \
|
|
28
|
+
&& ok "Waitlist endpoint responding" || fail "Waitlist endpoint failed"
|
|
29
|
+
|
|
30
|
+
echo ""
|
|
31
|
+
if [[ $FAILURES -eq 0 ]]; then
|
|
32
|
+
echo -e "${GREEN}All checks passed.${NC}"
|
|
33
|
+
else
|
|
34
|
+
echo -e "${RED}${FAILURES} check(s) failed.${NC}"
|
|
35
|
+
exit 1
|
|
36
|
+
fi
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# One-shot setup for a fresh Ubuntu 22.04/24.04 or Debian 12 server.
|
|
3
|
+
# Run as root or sudo: curl -sSL https://tco.app/setup | bash
|
|
4
|
+
set -euo pipefail
|
|
5
|
+
|
|
6
|
+
RED='\033[0;31m'; GREEN='\033[0;32m'; YELLOW='\033[1;33m'; NC='\033[0m'
|
|
7
|
+
info() { echo -e "${GREEN}[TCO]${NC} $*"; }
|
|
8
|
+
warn() { echo -e "${YELLOW}[TCO]${NC} $*"; }
|
|
9
|
+
die() { echo -e "${RED}[TCO ERROR]${NC} $*" >&2; exit 1; }
|
|
10
|
+
|
|
11
|
+
info "=== Travel Chaos Organizer — Server Setup ==="
|
|
12
|
+
[[ $EUID -eq 0 ]] || die "Run as root: sudo bash scripts/server-setup.sh"
|
|
13
|
+
|
|
14
|
+
# 1. Update & basics
|
|
15
|
+
info "Installing system packages..."
|
|
16
|
+
apt-get update -qq
|
|
17
|
+
apt-get install -y -qq curl wget git ufw unzip ca-certificates gnupg lsb-release
|
|
18
|
+
|
|
19
|
+
# 2. Docker
|
|
20
|
+
if ! command -v docker &>/dev/null; then
|
|
21
|
+
info "Installing Docker..."
|
|
22
|
+
install -m 0755 -d /etc/apt/keyrings
|
|
23
|
+
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg
|
|
24
|
+
chmod a+r /etc/apt/keyrings/docker.gpg
|
|
25
|
+
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" \
|
|
26
|
+
> /etc/apt/sources.list.d/docker.list
|
|
27
|
+
apt-get update -qq
|
|
28
|
+
apt-get install -y -qq docker-ce docker-ce-cli containerd.io docker-compose-plugin
|
|
29
|
+
systemctl enable docker
|
|
30
|
+
systemctl start docker
|
|
31
|
+
info "Docker installed."
|
|
32
|
+
else
|
|
33
|
+
info "Docker already installed."
|
|
34
|
+
fi
|
|
35
|
+
|
|
36
|
+
# 3. Firewall
|
|
37
|
+
info "Configuring UFW firewall..."
|
|
38
|
+
ufw --force reset
|
|
39
|
+
ufw default deny incoming
|
|
40
|
+
ufw default allow outgoing
|
|
41
|
+
ufw allow ssh
|
|
42
|
+
ufw allow 80/tcp
|
|
43
|
+
ufw allow 443/tcp
|
|
44
|
+
ufw --force enable
|
|
45
|
+
info "Firewall configured (ssh, 80, 443)."
|
|
46
|
+
|
|
47
|
+
# 4. Create app user
|
|
48
|
+
if ! id tco &>/dev/null; then
|
|
49
|
+
info "Creating 'tco' user..."
|
|
50
|
+
useradd -m -s /bin/bash tco
|
|
51
|
+
usermod -aG docker tco
|
|
52
|
+
fi
|
|
53
|
+
|
|
54
|
+
# 5. Clone / update repo
|
|
55
|
+
APP_DIR="/opt/tco"
|
|
56
|
+
if [[ -d "$APP_DIR/.git" ]]; then
|
|
57
|
+
info "Updating existing repo..."
|
|
58
|
+
git -C "$APP_DIR" pull --ff-only
|
|
59
|
+
else
|
|
60
|
+
info "Cloning repo..."
|
|
61
|
+
read -rp "Git repo URL (e.g. git@github.com:you/tco.git): " REPO_URL
|
|
62
|
+
git clone "$REPO_URL" "$APP_DIR"
|
|
63
|
+
fi
|
|
64
|
+
chown -R tco:tco "$APP_DIR"
|
|
65
|
+
|
|
66
|
+
# 6. .env setup
|
|
67
|
+
cd "$APP_DIR/apps/travel-chaos-organizer"
|
|
68
|
+
if [[ ! -f .env ]]; then
|
|
69
|
+
info "Creating .env from template..."
|
|
70
|
+
cp .env.example .env
|
|
71
|
+
warn "Edit /opt/tco/apps/travel-chaos-organizer/.env before running deploy!"
|
|
72
|
+
else
|
|
73
|
+
info ".env already exists — skipping."
|
|
74
|
+
fi
|
|
75
|
+
|
|
76
|
+
# 7. Backup cron
|
|
77
|
+
info "Installing backup cron..."
|
|
78
|
+
CRON_LINE="0 3 * * * cd $APP_DIR/apps/travel-chaos-organizer && docker compose --profile backup run --rm backup >> /var/log/tco-backup.log 2>&1"
|
|
79
|
+
(crontab -u tco -l 2>/dev/null | grep -v "tco-backup"; echo "$CRON_LINE") | crontab -u tco -
|
|
80
|
+
|
|
81
|
+
info ""
|
|
82
|
+
info "=== Setup complete! ==="
|
|
83
|
+
info "Next steps:"
|
|
84
|
+
info " 1. Edit /opt/tco/apps/travel-chaos-organizer/.env"
|
|
85
|
+
info " 2. Run: sudo -u tco bash $APP_DIR/apps/travel-chaos-organizer/scripts/deploy.sh"
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
set -euo pipefail
|
|
3
|
+
BASE="${1:-http://localhost:8000}"
|
|
4
|
+
GREEN='\033[0;32m'; RED='\033[0;31m'; NC='\033[0m'
|
|
5
|
+
ok() { echo -e "${GREEN}✓${NC} $1"; }
|
|
6
|
+
fail() { echo -e "${RED}✗${NC} $1"; exit 1; }
|
|
7
|
+
|
|
8
|
+
echo "=== TCO Smoke Test (${BASE}) ==="
|
|
9
|
+
|
|
10
|
+
# Health
|
|
11
|
+
curl -sf "${BASE}/health" | grep -q '"status":"ok"' && ok "Health OK" || fail "Health check failed"
|
|
12
|
+
|
|
13
|
+
# Waitlist
|
|
14
|
+
CODE=$(curl -s -o /dev/null -w "%{http_code}" -X POST "${BASE}/api/v1/waitlist" \
|
|
15
|
+
-H "Content-Type: application/json" -d '{"email":"smoke@tco.test","source":"smoke"}')
|
|
16
|
+
[[ "$CODE" =~ ^2 ]] && ok "Waitlist POST → HTTP $CODE" || fail "Waitlist POST failed: HTTP $CODE"
|
|
17
|
+
# Note: smoke@tco.test entry stays in waitlist — harmless, remove via admin dashboard
|
|
18
|
+
|
|
19
|
+
# Admin (unauthenticated → 401 for JSON endpoints, 200 for HTML page)
|
|
20
|
+
CODE=$(curl -s -o /dev/null -w "%{http_code}" "${BASE}/admin")
|
|
21
|
+
[[ "$CODE" == "200" ]] && ok "Admin dashboard → HTTP $CODE" || fail "Admin dashboard failed: HTTP $CODE"
|
|
22
|
+
|
|
23
|
+
# Docs hidden in production
|
|
24
|
+
CODE=$(curl -s -o /dev/null -w "%{http_code}" "${BASE}/docs")
|
|
25
|
+
[[ "$CODE" == "404" ]] && ok "Swagger docs hidden (production mode)" \
|
|
26
|
+
|| echo -e "\033[1;33m!\033[0m Swagger docs exposed at /docs (DEBUG=true?)"
|
|
27
|
+
|
|
28
|
+
echo ""
|
|
29
|
+
echo -e "${GREEN}Smoke test complete.${NC}"
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Verify that all telemetry/tracking systems are configured and reachable.
|
|
3
|
+
set -euo pipefail
|
|
4
|
+
|
|
5
|
+
BASE="${1:-http://localhost:8000}"
|
|
6
|
+
GREEN='\033[0;32m'; RED='\033[0;31m'; YELLOW='\033[1;33m'; NC='\033[0m'
|
|
7
|
+
ok() { echo -e "${GREEN}✓${NC} $1"; }
|
|
8
|
+
warn() { echo -e "${YELLOW}!${NC} $1 (optional but recommended)"; }
|
|
9
|
+
fail() { echo -e "${RED}✗${NC} $1"; }
|
|
10
|
+
|
|
11
|
+
echo "=== TCO Tracking Verification ==="
|
|
12
|
+
echo ""
|
|
13
|
+
|
|
14
|
+
# Load .env if present
|
|
15
|
+
[[ -f .env ]] && export $(grep -v '^#' .env | grep -v '^$' | xargs) 2>/dev/null || true
|
|
16
|
+
|
|
17
|
+
# 1. Backend telemetry (events table)
|
|
18
|
+
resp=$(curl -sf "${BASE}/health" 2>/dev/null || echo "{}")
|
|
19
|
+
echo "$resp" | grep -q '"status":"ok"' && ok "Backend events table: reachable" || fail "Backend unreachable — events not tracked"
|
|
20
|
+
|
|
21
|
+
# 2. Cachly Redis cache
|
|
22
|
+
echo "$resp" | grep -q '"cachly_cache":"enabled"' \
|
|
23
|
+
&& ok "Cachly Redis cache: enabled (parse deduplication active)" \
|
|
24
|
+
|| warn "Cachly Redis cache: disabled — set CACHLY_REDIS_URL for deduplication"
|
|
25
|
+
|
|
26
|
+
# 3. Sentry
|
|
27
|
+
[[ -n "${SENTRY_DSN:-}" ]] \
|
|
28
|
+
&& ok "Sentry DSN: configured (${SENTRY_DSN:0:30}...)" \
|
|
29
|
+
|| warn "Sentry DSN: not set — errors won't be tracked remotely"
|
|
30
|
+
|
|
31
|
+
# 4. Telegram
|
|
32
|
+
if [[ -n "${TELEGRAM_BOT_TOKEN:-}" && -n "${TCO_TELEGRAM_CHAT_ID:-}" ]]; then
|
|
33
|
+
tg_resp=$(curl -sf "https://api.telegram.org/bot${TELEGRAM_BOT_TOKEN}/getMe" 2>/dev/null || echo "{}")
|
|
34
|
+
echo "$tg_resp" | grep -q '"ok":true' \
|
|
35
|
+
&& ok "Telegram: bot token valid ($(echo "$tg_resp" | python3 -c "import sys,json; d=json.load(sys.stdin); print(d['result']['username'])" 2>/dev/null || echo '?'))" \
|
|
36
|
+
|| fail "Telegram: bot token invalid or unreachable"
|
|
37
|
+
else
|
|
38
|
+
warn "Telegram: not configured — set TELEGRAM_BOT_TOKEN + TCO_TELEGRAM_CHAT_ID"
|
|
39
|
+
fi
|
|
40
|
+
|
|
41
|
+
# 5. Resend email
|
|
42
|
+
[[ -n "${RESEND_API_KEY:-}" ]] \
|
|
43
|
+
&& ok "Resend: API key configured" \
|
|
44
|
+
|| warn "Resend: not configured — no transactional emails"
|
|
45
|
+
|
|
46
|
+
# 6. Stripe
|
|
47
|
+
[[ -n "${STRIPE_SECRET_KEY:-}" ]] \
|
|
48
|
+
&& ok "Stripe: secret key configured" \
|
|
49
|
+
|| warn "Stripe: not configured — no payment processing"
|
|
50
|
+
|
|
51
|
+
# 7. Ollama
|
|
52
|
+
OLLAMA_HOST="${OLLAMA_URL:-http://localhost:11434}"
|
|
53
|
+
curl -sf "${OLLAMA_HOST}/api/tags" -o /dev/null 2>/dev/null \
|
|
54
|
+
&& ok "Ollama: reachable at ${OLLAMA_HOST}" \
|
|
55
|
+
|| warn "Ollama: not reachable at ${OLLAMA_HOST} — AI parsing won't work"
|
|
56
|
+
|
|
57
|
+
# 8. Admin event summary (requires auth)
|
|
58
|
+
if [[ -n "${ADMIN_USER:-}" && -n "${ADMIN_PASSWORD:-}" ]]; then
|
|
59
|
+
ev_resp=$(curl -sf -u "${ADMIN_USER}:${ADMIN_PASSWORD}" "${BASE}/admin/events/summary" 2>/dev/null || echo "{}")
|
|
60
|
+
total=$(echo "$ev_resp" | python3 -c "import sys,json; d=json.load(sys.stdin); print(len(d.get('events',[])))" 2>/dev/null || echo "?")
|
|
61
|
+
ok "Admin events API: $total event types tracked"
|
|
62
|
+
fi
|
|
63
|
+
|
|
64
|
+
echo ""
|
|
65
|
+
echo "=== Tracking summary ==="
|
|
66
|
+
echo " Events DB: always on"
|
|
67
|
+
echo " Cachly cache: ${CACHLY_REDIS_URL:+enabled}${CACHLY_REDIS_URL:-disabled}"
|
|
68
|
+
echo " Sentry: ${SENTRY_DSN:+configured}${SENTRY_DSN:-not set}"
|
|
69
|
+
echo " Telegram: ${TELEGRAM_BOT_TOKEN:+configured}${TELEGRAM_BOT_TOKEN:-not set}"
|
|
70
|
+
echo " Resend: ${RESEND_API_KEY:+configured}${RESEND_API_KEY:-not set}"
|
|
71
|
+
echo " Stripe: ${STRIPE_SECRET_KEY:+configured}${STRIPE_SECRET_KEY:-not set}"
|