Uniform Siphon - Sitecore data download
This guide walks you through the complete process of downloading content, media, and presentation details from Sitecore CMS for further migration to the Uniform platform.
Table of Contents#
Intro#
The full migration process is described in the detailed guide here.
This guide only touches the first phase.
Before you begin#
- Ensure sufficient disk space for downloaded content
- Be able to deploy a file to every Sitecore CD instance — that is where the migration service goes, and where item and media extraction runs
- Have administrator access to the Sitecore CM server —
download-presentationrenders the Experience Editor there
Always download en first#
Download `en` first — even if your content is not in English
Whatever languages your content lives in, the first download-items pass must be en, and it must cover at least:
/sitecore/templates— the templates Siphon turns into Uniform content types and components/sitecore/system/Languages— the language definition items Siphon turns into Uniform locales
en is also the default value of --defaultLanguage — the context language Siphon uses to fetch the Sitecore language list and to resolve media items — so a download without en fights the defaults everywhere.
See Download data for the recommended pass order.
Environment variables#
The wizard will create .env file with your settings that will be used by all Siphon commands.
Logging#
Siphon comes with a built-in serilog logger. It creates several log files in the current directory:
The log level is configured with SIPHON_LOGLEVEL (or --logLevel parameter) that takes these values:
- DEBUG
- INFO
- WARN
- ERROR
It is recommended to use the default INFO and switch to DEBUG only if something goes wrong.
Prepare work directory#
Create a work directory for all files will be downloaded and processed, for example: C:\migration\.
Open a new PowerShell session and navigate there:
Prepare Sitecore#
Before downloading data, you must deploy the migration service to your Sitecore instance.
Locate the Service File#
- Rename
C:\siphon\{ver}\UniformMigrationService.txttoUniformMigrationService.aspx - Open
UniformMigrationService.aspx - Set a secure secret and valid until on Lines 5-7:// the default secret will not work, you must change it const string Secret = "(your-complex-secret-phrase-here)"; const string ValidUntil = "(date-which-is-several-month-in-the-future)"
- Save changes
Deploy to Sitecore#
Deploy the service to your CD instances — that is where item and media extraction should run.
- Upload the modified file to a subfolder like
/layoutson your Sitecore CD instance - Deploy it to every load-balanced CD instance. The load balancer then spreads Siphon's
--threadsworkers across the whole farm instead of one box, which is the single biggest lever on extraction speed. A service reachable on only some instances is worse than useless: requests land on a node without the file and fail intermittently, so the run fails in a way that looks like a network problem - Verify the page works by accessing it via the browser — it is expected to see a SecurityException
CD for extraction, CM for the Experience Editor
The two halves of a download go to different roles, and it is worth being deliberate about which is which:
| command | instance | why |
|---|---|---|
download-items, download-media | CD | --uniformServiceUrl. These read the web database, which a CD serves, and they are throughput-bound — spreading them over the CD farm is what makes them fast, and it keeps the load off the box your editors are using |
download-presentation | CM | --host. Experience Editor markup (?sc_mode=edit) only renders on a Content Management instance — a CD has no editing pipelines and will return a server error for every page |
Two consequences:
- A run that pulls unpublished / draft content with
--database mastermust point--uniformServiceUrlat the CM, because a CD has nomasterdatabase. This is one more reason the recommended path is to publish everything before the content freeze and migrate fromwebonly. download-presentation's--productionHostis a CD host as well, but a different setting — it is the public site used for HTML comparison, not the service endpoint.
Important: Some folders may restrict
*.aspxexecution.Also, in rare cases the IIS configuration may prohibit runtime compilation of *.aspx files. To overcome this, it needs to be deployed alongside with the application during normal deployment phase.
Uploading the file
On a CD instance, deploy the file the way you deploy anything else to that farm — your normal release pipeline, a file copy to each node, or a web deploy package. This also settles the runtime-compilation caveat above, since the file arrives with the application.
If you are deploying to a CM instead (a master pass, or a single-instance setup where CM and CD are the same box), the quickest route is the Import Language dialog in the Control panel:
https://www.loom.com/share/5dc22bf86cc244d48f207291e9c72692
Configure Siphon#
In the current terminal window run configuration wizard and follow the instructions:
Here's example output:
The Languages prompt
Leaving Languages empty downloads all registered languages, which includes en — that is the safe answer. If you do list languages explicitly, en must be one of them, and it must be downloaded first. See Always download en first.
Download data#
First, download content items:
Verify the command returned no critical errors and exit code is 0. If the error code is not 0, halt and contact Uniform migration team.
All download commands support resuming downloading: if it failed after some time of running well, it won't try to re-download what's already there.
Watch the download while it runs#
Every ten seconds each download command — items, media and presentation alike — prints what it is achieving: what the last window transferred, what the run has averaged, and how many workers are busy:
If it is too slow, or the Sitecore instance is visibly struggling, you don't have to stop and restart with a different --threads. Put a settings-override.json in the folder you run Siphon from and the thread count changes within ten seconds:
Or add --autotune and let Siphon search for the number itself, keeping each step only when it actually made the download faster.
The same file can put the download on hold — useful when Sitecore needs to be restarted, or when a publish is running and you want to stop hammering it:
Workers finish what they are fetching and park; nothing new is requested until you take the key back out (checked every second), and the queue and everything already downloaded are kept. The log keeps saying still PAUSED every ten seconds while it holds, so a paused run never looks like a stuck one. All three are described in monitoring and tuning a running download.
Skipping page-local datasource folders#
Many Sitecore solutions keep the datasources that belong to a single page in a folder under that page — usually called _local, sometimes data. On a long-lived site those folders are often the majority of the item count, and much of what is in them is no longer pointed at by anything: datasources of components that were removed from the page, leftovers of old designs, experiment variants.
--skipLocalDatasources stops the crawl from walking into them:
Only a child of a page is skipped — an item that has a layout. That distinction matters: Data is also the usual name of a shared, site-wide data folder such as /sitecore/content/MySite/Data, and that one holds content the migration needs, so it keeps being downloaded. If your solution names its page-local folders something else, list them with --localDatasourceFolderNames (the value replaces _local and data rather than adding to them).
Each language pass reports what it left out, so a pruned download never looks like a download that lost items:
Pair it with `--downloadRenderingsDatasources`
A page-local datasource holds the text and images of a component on that page — dropping one silently empties that component after migration. The switch only prunes the tree walk, so with --downloadRenderingsDatasources --downloadFieldsReferences on (the recommended setting anyway) every datasource a live rendering or a reference field actually points at is still fetched by id, and what is left behind is the part of the folder nothing points at. Without those two switches, --skipLocalDatasources will lose page content.
Language pass order#
If you left the Languages prompt empty, every registered language — including en — is downloaded in one pass and you are done: skip to the media download.
If you restrict languages (with --languages or SIPHON_LANGUAGES), run en first and only then the other languages:
Note --skipClearingFolders on every pass after the first — without it each run clears the output folder and throws away what the previous pass downloaded.
The en pass must cover /sitecore/templates and /sitecore/system/Languages. Downloading from the all-content root 11111111-1111-1111-1111-111111111111 already includes them. If instead you download site by site starting at a Home item, add a dedicated en pass with --root for each of those two subtrees before the content passes — their standard Sitecore IDs are 3C1715FE-6A13-4FCF-845F-DE308BA9741D (/sitecore/templates) and 64C4F646-A3FA-4205-B98A-4405DD8C1743 (/sitecore/system/Languages), and you can confirm them in the Sitecore Content Editor.
Verify the `en` pass landed
After step 1, check that data\items\content\en\ and data\items\core\en\ exist — or data\items\en\ on an export that predates --itemFolders — and that data\items\_languages.json lists every language you expect to migrate. An empty or missing en means the later phases have no templates and no locales to work from — fix it before downloading anything else.
Remaining downloads#
Next, run two remaining commands.
download-media is a download-items pass before it is a binary fetch, and with --itemFolders it writes only the media folder and its index — it no longer rewrites the index the content download produced. So the content tree can be packaged or published while media is still downloading.
download-presentation is a different matter: it reads the item export to work out which items are pages, and it merges every folder's index to do so. Run it after download-media has finished, or give it a copy of the item export taken before the media download started (--inputDir).
When everything is complete, review the downloaded files:
Each item folder keeps its own index, so the commands that write different trees no longer contend over one file — see --itemFolders for the rules, and for how to read or convert an export that predates the split.
An export downloaded before --itemFolders existed has no {folder} level — items sit directly under items\{language}\ — and is still read exactly as it was. Nothing needs converting.
Troubleshooting#
Common Issues#
UniformMigrationService.aspx not accessible
- Check IIS configuration
- Verify file permissions
- Behind a load balancer, confirm the file is deployed to every CD node — if one is missing it, requests fail only when the balancer routes there, which looks like an intermittent network fault rather than a missing file
Download interruptions
- Use resume functionality
- Check network connectivity
- Run outside of peak hours of content editing
- Reduce thread count if experiencing timeouts — without restarting the run
download-presentationreturns a server error page for every page- Check
--hostpoints at the CM. Experience Editor markup does not render on a CD, so every page comes back as an error page and is reported as "has no placeholders and renderings detected" - Set
--siteNameto the Sitecore<site>name. Without it the site is resolved from the hostname, which on a multi-site solution may resolve to a site that does not contain your start path
- Check
Authentication failures in presentation download
- Verify Sitecore credentials
- Check login URL accessibility
- Ensure Playwright is properly installed
For additional support, contact Uniform migration team with DEBUG log file.
Next Steps#
When downloading is completed, provide the C:\migration\ directory to Uniform migration team.
Alternatively, you can complete migration yourself: