Files
aigen/server/utils/backupStudio.ts
T
TowstyandCursor f25e1bcc8a Spell out which Coolify backup vars belong on AIGen vs xAIGen.
A URL in BACKUP_INGEST_TOKEN was treated as a missing token. Errors now say to put the URL on AIGen and the same secret on both apps.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-01 19:14:34 -05:00

47 lines
1.6 KiB
TypeScript

function env(...keys: string[]) {
for (const key of keys) {
const value = String(process.env[key] || '').trim()
if (value) return value
}
return ''
}
function looksLikeUrl(value: string) {
return /^https?:\/\//i.test(value)
}
export function backupStudioTarget() {
const config = useRuntimeConfig()
const url = String(
config.backupStudioUrl
|| env('BACKUP_STUDIO_URL', 'NUXT_BACKUP_STUDIO_URL')
).replace(/\/$/, '')
const token = String(
config.backupStudioToken
|| env('BACKUP_STUDIO_TOKEN', 'NUXT_BACKUP_STUDIO_TOKEN')
).trim()
const misplaced = env('BACKUP_INGEST_TOKEN', 'NUXT_BACKUP_INGEST_TOKEN')
return { url, token, misplaced }
}
export function backupIngestSecret() {
const config = useRuntimeConfig()
return String(
config.backupIngestToken
|| env('BACKUP_INGEST_TOKEN', 'NUXT_BACKUP_INGEST_TOKEN', 'BACKUP_STUDIO_TOKEN', 'NUXT_BACKUP_STUDIO_TOKEN')
).trim()
}
export function backupStudioConfigError() {
const { url, token, misplaced } = backupStudioTarget()
if (url && token) return ''
if (!url && looksLikeUrl(misplaced)) {
return 'BACKUP_INGEST_TOKEN on AIGen is a URL. Put https://xaigen.carrgarage.com in BACKUP_STUDIO_URL, and put the same secret in BACKUP_STUDIO_TOKEN here and BACKUP_INGEST_TOKEN on xAIGen.'
}
if (!url && !token) {
return 'Set BACKUP_STUDIO_URL and BACKUP_STUDIO_TOKEN on AIGen. The token must match BACKUP_INGEST_TOKEN on xAIGen.'
}
if (!url) return 'Set BACKUP_STUDIO_URL on AIGen to https://xaigen.carrgarage.com'
return 'Set BACKUP_STUDIO_TOKEN on AIGen to the same secret as BACKUP_INGEST_TOKEN on xAIGen'
}