Nectere Amphora
Amphora copies, moves and syncs data between object stores. Add a store once (S3, Azure Blob, Google Cloud Storage, B2, SFTP, WebDAV or a local path), then browse it, upload and download files, or build transfers to another store. A transfer takes a whole path or only the files that match its filters. Dry-run it first and schedule it when it's right.
Nectere Array › Menu › Deploy › Nectere Amphora01The app
The mock is clickable. Sidebar items open each panel with sample data, and most dialog buttons (+ Add Store, Log, Edit) open their dialogs. Dialogs close only from × or Cancel.
Users is admin-only. Array sign-on removes it and Sign Out, since Array handles accounts.
02How the pieces fit
A store is where data lives. A transfer says what to take from one store and where to put it; each time it executes, that's a run, with its own log. A schedule runs a transfer on a timer.
The usual order
- Object Stores: add source and destination. Test each one.
- Explore: find the source folder.
- Transfers: create the transfer, check its file list with Test criteria, save.
- Test the saved transfer, read the log, then press Transfer.
- Schedules: add one if the transfer recurs.
03Getting Amphora
Deployed from Nectere Array under Menu › Deploy › Nectere Amphora. The sign-in mode is picked at deploy time. Updates, restarts and logs are on the back of the tile once it shows Running.
Sign-in modes
04Sign-in and setup
Array sign-on skips this and opens on the dashboard. With Application sign-in, a new tile shows Initial Setup to create the admin account, and Sign In from then on.
| Rule | Value |
|---|---|
| Sign-in lasts | 8 hours, then the next click returns to Sign In |
| First account | Always admin |
| Wrong username or password | Invalid credentials. No lockout. |
| Password rules | Must not be empty. Nothing else is enforced. |
Array sign-on
An expired Array session can land you on Amphora's Sign In form. There are no local accounts to use there. Reopen the tile from Array.
05Sidebar and notifications
| Item | Who sees it |
|---|---|
| Dashboard, Object Stores, Explore, Transfers, Schedules, Logs | Everyone |
| Users | admin role only. Hidden with Array sign-on. |
| Sign Out | Application sign-in only |
Footer
Notifications stack above Sign Out. Green ones clear after 5 seconds, red after 8. Below them are the server clock, which schedules follow, and the version.
Opening a panel reloads its data. Refresh reloads it in place.
06Dashboard
Four counts and the ten most recent runs.
- 1Counts. Object stores, active transfers (running or pending), completed and failed runs. Run counts cover the last 100 runs.
- 2Recent Transfers. The ten newest runs, manual or scheduled.
- 3Name. Scheduled runs get
(scheduled)after the name. Test runs have(test)in it. - 4Log and Cancel. Cancel appears only while a run is going. A run that failed before starting shows the reason on a grey line below it.
| Run status | Badge | Means |
|---|---|---|
| pending | pending | Queued. Normally starts within a couple of seconds. |
| running | running | Moving files |
| completed | completed | Finished without errors |
| failed | failed | The log lists the failed files and why |
| cancelled | cancelled | Stopped with Cancel or Cancel run |
| interrupted | interrupted | Amphora restarted or was updated mid-run. Copied files stay; run the transfer again. |
07Object Stores
Each store has a name, a type and that type's connection settings. Search matches name, type, description and visible settings like endpoint or bucket, so minio and corp.lab both work.
An empty list reads No object stores yet. Click "+ Add Store" to start moving data. and hides the search box.
| Button | Does |
|---|---|
| + Add Store | Opens Add Object Store |
| Edit | Same dialog, prefilled. Secrets show as dots and are kept unless changed. |
| Test | Lists the store and reports Connection OK or Connection failed: … in the sidebar |
| Delete | Confirms with Delete this object store? Transfers referencing it will fail. Transfers still using the store don't block it. |
The store form
The form shows the fields for the selected type, and changing type clears it. Required fields have an orange *. Where there's an Authentication dropdown, only the chosen method's fields are saved: switching from account key to SAS URL drops the key.
Store types
| Type | Required | Optional |
|---|---|---|
| S3-Compatible (AWS / Wasabi / MinIO / R2 / etc.) | Access key ID, Secret access key | Provider (AWS, Wasabi, MinIO, Cloudflare R2, DigitalOcean Spaces, Ceph, Other S3-compatible), Region (needed for AWS), Endpoint URL (needed for everything except AWS), Bucket, Base path |
| Azure Blob Storage | Either Storage account name and Account key, or a SAS URL | Container, Base path |
| Google Cloud Storage | Service account JSON key (paste the whole file) | Project number (only to create buckets), Bucket, Base path |
| Backblaze B2 | Application key ID, Application key | Bucket, Base path |
| SFTP / SSH | Host, Username, and either a Password or a Private key PEM (unencrypted) | Port (22 if blank), Base path |
| WebDAV | URL | Username and Password (leave both blank for anonymous), Base path |
| Local / Mounted Volume | Root path, such as /data | None |
With Bucket (or Container) blank, Explore opens on every bucket the key can see and transfer paths start with the bucket name. Set it and the store is that one bucket. Base path pins the store to a folder inside it.
A Local / Mounted Volume root path has to be a folder made available to Amphora. Ask whoever runs the Array host which ones exist.
Saving and testing
Save checks required fields and shows Name is required or Required: … listing what's missing. Test in the dialog saves first, then tests, and leaves the dialog open for fixes, so a failed test still leaves a saved store. Test on a row checks the saved settings.
08Explore
Nothing loads until you pick a store and press Explore. Folder tools stay disabled until then, and switching stores clears the view.
The mock opens on Lab MinIO. Folders, breadcrumbs, the ↰ .. row and checkboxes all work, and buttons that raise a browser prompt show it.
Folder tools and row buttons
| Button | What happens |
|---|---|
| New Folder | Prompts New folder name: and creates it in the current folder. No slashes. |
| Upload | Opens the browser's file picker. Multiple files go into the current folder. |
| Refresh | Reloads the current folder |
| Download (row) | Files download as-is. Folders arrive zipped as <folder>.zip. |
| Rename (row) | Prompts Rename "name" to:. Stays in the same folder. |
| Delete (row) | Confirms with Delete file "name"? This cannot be undone. or Delete folder "name" and all its contents? This cannot be undone. |
Selections
Ticking items brings up a bar with the count. Download fetches each item separately, Delete removes them all after one confirmation, Clear unticks. Changing folder also clears the selection.
Move / Copy… opens New Transfer with the source store filled in. One ticked item becomes the source path. With several, the current folder is the source path and the items go into Include patterns, folders with /** appended.
| Message | When |
|---|---|
| Add an object store first. | No stores exist yet |
| Pick a store and click Explore. | No store open |
| This location is empty. Use New Folder or Upload to add something. | Store root is empty |
| Folder created / Renamed / Deleted / Deleted 4 item(s) | Success |
| Uploading 3 file(s)… then Uploaded 3 file(s) | Upload progress, then done |
| Preparing 2026-09.zip… | Folder download being zipped |
| Folder 'scratch' is empty - nothing to download | Downloaded folder has no files |
| 2 item(s) could not be deleted | Part of a multi-delete failed, usually permissions |
| List failed: … | Store can't be read. Replaces the listing. |
09Transfers
Nothing moves until a transfer runs. If one of its stores was deleted, the source → destination line shows the store's id instead of its name (see Old NAS sweep).
| Button | Does |
|---|---|
| Transfer | Runs it. Shows Transfer started and opens the log. |
| Test | Dry run. Logs what each file would get without copying or deleting. Shows Test run started (dry run) and opens the log. |
| Log | Opens the log. The Run dropdown lists every run of this transfer. |
| Edit | Opens the editor. Past runs keep the settings they ran with. |
| Delete | Confirms with Delete this saved transfer? Schedules pointing at it will stop firing. Past runs stay in history. |
The transfer editor
Source on the left, filters in the middle, destination on the right. A blank path means the top of the store. Unnamed transfers get the date and time, e.g. Transfer 2026-10-26 14:05.
| Mode | What it does | Watch out for |
|---|---|---|
| Copy — leave source intact | Copies new and changed files. Unchanged files are skipped. | Never deletes |
| Move — delete from source after copy | Copies each file, then deletes the source copy once it has arrived | Emptied folders stay at the source. Files that fail to copy aren't deleted. |
| Sync — make destination match source | Copies new and changed files, then deletes destination files that aren't in the source | Deletes at the destination. Run Test first and check what it removes. |
Criteria filters
Every filled-in filter must match. Blank ones are ignored, and Everything turns them all off.
| Filter | Takes | Example |
|---|---|---|
| Only items older than (days) | Last modified more than N days ago | 30: a month or older |
| Only items newer than (days) | Modified within N days | 7: this week |
| Min size (MB) / Max size (MB) | Size floor or ceiling | 100 skips small files |
| Include patterns | Comma-separated. Only matching files are taken. | *.log,backups/** |
| Exclude patterns | Comma-separated. Matching files are left out. | *.tmp,cache/** |
Patterns match the path relative to the source path. * stays inside one folder name and ** crosses folders, so *.log only matches top-level logs and **/*.log matches at any depth. Check include and exclude combinations with Test criteria.
Test criteria
Scans the source with the editor's current filters, saved or not, and lists matches without copying anything. Only the first 1,000 are listed; the transfer still handles all of them.
| Message | When |
|---|---|
| Source and destination stores are required | Saved without both stores |
| Pick a source store first | Test criteria with no source store |
| Preview failed: … | Source can't be read, often a wrong source path |
| Transfer saved | Saved, editor closed |
10Runs
The log updates live and follows the tail while scrolled to the bottom. Scroll up and it holds still. The Run dropdown lists every run of the transfer, newest first, as run or test with status and start time. Cancel run shows while the selected run is active.
Reading the log
- The first
===line gives the run, mode, dry-run flag and criteria. - Then one line per file:
Copied (new),Copied (replaced existing),Deleted(move and sync), orSkipped copy as --dry-run is setin a test.ERRORlines name the file and the reason the store gave. - Progress every 5 seconds: amount moved, percent, speed, time left.
- The last
===line has the result,OKorFAILED (exit n), with counts like(212 copied, 212 deleted, 3 failed).
The window holds the last 500 lines. The audit trail under Logs has every file.
| Message | When |
|---|---|
| (no runs recorded yet) | Never run |
| (no output yet) | Run just started |
| Cancel this run? | Confirms Cancel run |
| Destination store 9f04c3b2 not found | Under the run on the dashboard. One of the transfer's stores was deleted. |
11Schedules
Each schedule runs one saved transfer. Its runs show in the transfer's log like any other.
A schedule whose transfer was deleted reads (deleted transfer) and skips every time it comes due. Delete it or point it at another transfer.
The schedule editor
Set either Every N minutes (5 or more) or …or daily at. If both are set, minutes win. The day buttons in the mock toggle.
Schedules table shows:
| Setting | How it behaves |
|---|---|
| Every N minutes | Counted from the last run, or from save time if it hasn't run |
| Daily at | Server time (the sidebar clock) |
| Days of week | None selected means every day. An interval run that lands on an off day waits for midnight of the next allowed one. |
| Enabled | Untick to pause and keep the settings |
A run can start up to a minute after its time. Saving with neither field set shows Set an interval or a daily time. With no transfers to choose from it shows Pick a saved transfer - create one on the Transfers panel first.
12Logs
Application log records what users and schedules did. Audit trail (per-file) has a line for every file a transfer copied, deleted, skipped or failed on, tagged with the run id. Both show today's entries, last 400 lines. Auto-refresh reloads every 5 seconds.
| Tag | Covers |
|---|---|
| Setup, Auth | First account, sign-ins, users added or removed |
| Stores | Stores saved or deleted, and by whom |
| Explore | New folders, uploads, downloads, renames, deletes |
| Transfers | Transfers saved or deleted, run starts, Test criteria scans |
| Jobs | How each run ended, cancels included |
| Schedules | Schedules saved, fired or skipped |
| AUDIT | RUN START, one line per file (COPIED, MOVED, RENAMED, DELETED, SKIPPED, FAILED), then RUN END with the result |
Empty views read (empty), or (no audit entries today - run a transfer) for the audit trail. Both reset at midnight server time. The tile's Logs button in Array shows the same entries.
13Users
Application sign-in only. An admin can do everything. A user can do everything but this panel, which still includes adding stores, running transfers and deleting files.
- Create needs both fields and shows
User created. - Delete confirms with
Delete user "mreyes"?and signs the user out immediately. You can't delete yourself. - There's no Edit. To change a password or role, delete the account and add it again.
14Things to know
- Test before Sync and Move. Sync deletes at the destination, Move at the source.
- Runs are snapshots. Editing a transfer doesn't change what past runs show.
- Re-running is safe. Unchanged files already at the destination are skipped, so a re-run after a failure or cancel only moves what's missing.
- Deleting a store doesn't check its transfers. They fail on their next run with
Destination store … not foundorSource store not found. - Folders in buckets. Object stores have no real folders, so New Folder writes a hidden
.amphora_keepfile to hold one open. Amphora hides it. Other tools may not. - Renaming a big folder is slow. Each object is copied to the new name and the old one deleted.
- Upload and Download go through the browser. Use a transfer for anything large.
- Two clocks. Daily times follow the server clock in the sidebar, usually UTC. Next run and Last run are shown in browser time and can look a few hours off.
15Troubleshooting
| You see | Do this |
|---|---|
Connection failed: directory not found | Bucket, container or base path is wrong. Check it in Edit, or clear the bucket and browse in Explore to see what the key can reach. |
AccessDenied or 403 in a test or log | Key lacks permission. Listing needs read. Transfers need write at the destination, plus delete for move and sync. |
no such host or a timeout | Endpoint unreachable. Check the Endpoint URL and port, and that the host is reachable from Amphora. |
| S3 store against AWS fails, MinIO works | AWS needs Region set and Endpoint URL blank. Other S3 providers need the endpoint. |
| A run finished OK but copied nothing | Run Test criteria with the same settings. Usually the source path is a level off, or *.log was used where **/*.log was meant. |
Run is interrupted | Amphora restarted mid-run. Run it again; files that arrived are skipped. |
Run stays pending | Wait a few seconds and Refresh. Still pending after a minute: restart the tile from Array, then start the transfer again once the run shows interrupted. |
| A schedule didn't fire | Check it's enabled, today is one of its days, and the time is server time. (deleted transfer) rows never fire. |
Server error (HTTP 408) or Download failed (HTTP 408) | Timed out, usually a large folder download or Test criteria over a huge bucket. Narrow the source path, and use a transfer for big folders. |
| Sign In form appears while using Array sign-on | Array session expired. Reopen the tile from Array. |
| Users panel is missing | Your role is user, or the tile uses Array sign-on. |