Consolidate local images under data/images/, add docker migrate CLI, startup index sync with orphan cleanup, and remove upload folder UI/API.
78 lines
2.8 KiB
TypeScript
78 lines
2.8 KiB
TypeScript
import { getDataDir } from '../utils/data-dir'
|
||
import { runAutoDeleteCleanup } from '../utils/auto-delete'
|
||
import { migrateLocalImagesToIndex, purgeOrphanImageIndexRows, reconcileLegacyImageKeys, repairLocalImageIndexMetadata } from '../utils/image-index'
|
||
import { ensureDefaultBackends } from '../utils/storage-backends'
|
||
import { logException, logInfo } from '../utils/logger'
|
||
|
||
export default defineNitroPlugin(() => {
|
||
const port = process.env.NITRO_PORT || process.env.PORT || '6892'
|
||
logInfo('PicHost starting', {
|
||
port,
|
||
dataDir: getDataDir(),
|
||
nodeEnv: process.env.NODE_ENV || 'development',
|
||
imageBaseUrl: process.env.IMAGE_BASE_URL || '(request origin)',
|
||
storageBackend: process.env.STORAGE_BACKEND || 'db',
|
||
logLevel: process.env.LOG_LEVEL || 'info'
|
||
})
|
||
|
||
ensureDefaultBackends()
|
||
|
||
void (async () => {
|
||
const dataDir = getDataDir()
|
||
try {
|
||
logInfo('开始同步图片索引:扫描本地磁盘', { path: `${dataDir}/images/` })
|
||
|
||
const inserted = await migrateLocalImagesToIndex()
|
||
if (inserted > 0) {
|
||
logInfo('磁盘扫描完成:已补全缺失索引', { inserted })
|
||
} else {
|
||
logInfo('磁盘扫描完成:索引与磁盘一致,无需补全')
|
||
}
|
||
|
||
logInfo('开始归一化遗留图片路径(如 blog/ → images/blog/)')
|
||
const reconciled = await reconcileLegacyImageKeys()
|
||
if (reconciled.updated > 0 || reconciled.removed > 0) {
|
||
logInfo('遗留路径归一化完成', reconciled)
|
||
} else {
|
||
logInfo('遗留路径归一化完成:无需调整')
|
||
}
|
||
|
||
logInfo('开始校验索引与磁盘一致性,清理无文件的孤儿记录')
|
||
const purged = await purgeOrphanImageIndexRows()
|
||
if (purged > 0) {
|
||
logInfo('孤儿索引清理完成', { removed: purged })
|
||
} else {
|
||
logInfo('孤儿索引清理完成:未发现孤儿记录')
|
||
}
|
||
|
||
logInfo('开始修复存量 Content-Type 元数据')
|
||
const repaired = repairLocalImageIndexMetadata()
|
||
if (repaired > 0) {
|
||
logInfo('Content-Type 修复完成', { repaired })
|
||
} else {
|
||
logInfo('Content-Type 修复完成:无需修复')
|
||
}
|
||
|
||
logInfo('图片索引同步结束')
|
||
} catch (error) {
|
||
logException('图片索引同步失败', error)
|
||
}
|
||
})()
|
||
|
||
void (async () => {
|
||
try {
|
||
logInfo('开始执行启动时自动删除检查')
|
||
const result = await runAutoDeleteCleanup()
|
||
if (result.skipped) {
|
||
logInfo('自动删除检查完成:策略未启用')
|
||
} else if (result.deleted > 0 || result.failed > 0) {
|
||
logInfo('自动删除检查完成', { ...result })
|
||
} else {
|
||
logInfo('自动删除检查完成:无到期图片')
|
||
}
|
||
} catch (error) {
|
||
logException('启动时自动删除失败', error)
|
||
}
|
||
})()
|
||
})
|