Execute complex Langfuse migrations including data migration and platform changes. Use when migrating from other observability platforms, moving between Langfuse instances, or performing major infrastructure migrations. Trigger with phrases like "langfuse migration", "migrate to langfuse", "langfuse data migration", "langfuse platform migration", "switch to langfuse".
Comprehensive guide for complex migrations to or between Langfuse instances.
| Scenario | Complexity | Downtime | Data Loss Risk |
|---|---|---|---|
| Cloud to Cloud (same) | Low | None | None |
| Self-hosted to Cloud | Medium | Minutes | Low |
| Cloud to Self-hosted | Medium | Minutes | Low |
| Other platform to Langfuse | High | Hours | Medium |
| SDK version upgrade | Low |
| None |
| None |
// scripts/export-cloud-data.ts
import { Langfuse } from "langfuse";
import fs from "fs/promises";
async function exportCloudData() {
const langfuse = new Langfuse({
publicKey: process.env.LANGFUSE_CLOUD_PUBLIC_KEY!,
secretKey: process.env.LANGFUSE_CLOUD_SECRET_KEY!,
baseUrl: "https://cloud.langfuse.com",
});
const exportDir = `export-${Date.now()}`;
await fs.mkdir(exportDir, { recursive: true });
// Export traces
console.log("Exporting traces...");
let page = 1;
let totalTraces = 0;
while (true) {
const traces = await langfuse.fetchTraces({
limit: 100,
page,
});
if (traces.data.length === 0) break;
await fs.writeFile(
`${exportDir}/traces-${page}.json`,
JSON.stringify(traces.data, null, 2)
);
totalTraces += traces.data.length;
page++;
// Rate limiting
await new Promise((r) => setTimeout(r, 200));
}
console.log(`Exported ${totalTraces} traces`);
// Export scores
console.log("Exporting scores...");
// Similar pagination for scores
// Export datasets
console.log("Exporting datasets...");
const datasets = await langfuse.fetchDatasets({});
await fs.writeFile(
`${exportDir}/datasets.json`,
JSON.stringify(datasets.data, null, 2)
);
return exportDir;
}
# docker-compose.self-hosted.yml