Backups
Schedule automatic backups of your server files to S3, without writing a single script.
Backups give you peace of mind. Set them up once, and CtrlOps will quietly copy your files to S3 on the schedule you pick. If something ever goes wrong on the server, you'll have a recent copy ready to go.
What you can do here
- Create backup jobs that copy a folder from your server to S3.
- Run a backup right now, or schedule it (daily, weekly, monthly, yearly, or a custom cron).
- Watch progress live, with speed, files transferred, and time remaining.
- Open the full log of any run to see exactly what happened.
- Edit, delete, or stop a backup that's already running.
Today CtrlOps backs up from your server to S3 (AWS, Cloudflare R2, Backblaze B2, Wasabi, MinIO, DigitalOcean Spaces). More destinations are on the way.
Before you start
You'll need a few things in place. Don't worry, CtrlOps shows you a banner whenever something is missing and gives you a one-click install.
| Requirement | Why you need it | What to do if it's missing |
|---|---|---|
| Active server connection | Backups run on the server you're connected to | Open the server from the Home page first |
| Rclone (on the server) | The tool that moves your files to S3 | Click Install Rclone in the yellow banner |
| Cron (only for scheduled jobs) | Triggers backups on a schedule | Click Install Cron, then Start Cron Service if it's stopped |
| S3 bucket and access keys | The destination for your files | Create them in your cloud provider's console |
If you only ever back up "right now" with one click, you can skip cron entirely. Cron is only required when you want backups to run on a schedule.
Set up your first backup job
Open the Backup tab
Open app → Click your server → Click the Backup tab
Open the create form
Click Create Job (top right of the Backup Configuration row)
Fill in the basics
In the Basic Information card, fill in these fields:
| Field | What to enter |
|---|---|
| Job Name | A name you'll recognise later, like daily-website or mysql-monthly. Letters, numbers, and underscores only. |
| Source Path | The folder on the server you want to back up, for example /var/www/html or /home/user/documents. |
| Destination Type | Select S3-Compatible Storage. |
| Transfer Type | Sync mirrors the source exactly (deletes anything at the destination that no longer exists at the source). Copy only adds files. |
Add your S3 details
In the Destination Configuration card, fill in your S3 settings:
| Field | What to enter |
|---|---|
| Provider | The service you use: AWS S3, MinIO, Wasabi, DigitalOcean Spaces, Backblaze B2, or Cloudflare R2. |
| Region | Required for AWS (e.g. us-east-1). Optional for most other providers. |
| Access Key | Your S3 access key. Stored encrypted. |
| Secret Key | Your S3 secret key. Stored encrypted. |
| Bucket Name | The bucket your files will go into. |
| Remote Path | Optional. A folder inside the bucket, like /server1/backups. |
| Custom Endpoint | Only for providers that need it (MinIO, R2, etc.). Leave empty for AWS. |
| Storage Class | Optional. Use Standard for fast access, or Glacier / Deep Archive for cheap long-term storage. |
| Use IAM Role | Toggle on if your server already has IAM permissions, so you can skip Access Key and Secret Key. |
Choose when it should run
In the Schedule Configuration card, pick one option:
| Option | When to pick it |
|---|---|
| Manual | Backups only run when you click Run Backup. No cron needed. |
| Interval | Recurring schedule. Pick how often (Daily, Weekly, Monthly, Yearly), the time of day, and the day if it applies. |
| Custom | Write your own cron expression (Minute, Hour, Day, Month, Weekday). Each field accepts a number, a range, or * for "every". |
Times use the server's timezone, not yours. Double-check the server time if a 2:00 AM backup needs to run at your 2 AM.
(Optional) Tune the advanced options
You can skip this. The defaults work for most setups.
| Field | What it does | Default |
|---|---|---|
| Transfers | How many files upload in parallel. Range 1 to 32. | 4 |
| Checkers | Threads used to verify files. Range 1 to 32. | 8 |
| Bandwidth Limit | Cap upload speed, e.g. 10M, 100M, 1G. Leave empty for full speed. | (none) |
Test the connection
Click Test Connection (bottom of the form)
CtrlOps tries to reach your bucket with the keys you entered. If something is wrong, you'll see the error right away. Fix it before saving.
Save the job
Click Create
Your new job appears in the table. It won't run yet unless you scheduled it or trigger it manually.
Run a backup right now
Find your job
Open the Backup tab → Locate the job in the table
Each job has three round buttons on the right: Run Backup (play icon), Edit (pencil icon), Delete (trash icon).
Trigger the run
Click Run Backup (play icon)
The status flips to RUNNING and a small progress bar appears. The job is now copying files in the background. You can switch tabs and come back.
(Optional) Watch progress
Click the row to expand it
A live panel slides open showing how much has been transferred, file count, current speed, and rough time remaining.
Watch a backup in progress
When you expand a running job, the Backup Progress panel updates in real time:
| Stat | What it shows |
|---|---|
| Size Transferred | How many MB or GB have moved so far |
| Files Transferred | Files done out of the total |
| Transfer Speed | Current rate, like 5.2 MB/s |
| ETA | Rough time until finish |
| Elapsed Time | How long the run has been going |
If anything goes wrong mid-run, like a permission error on a single file, you'll see a red alert with the list of errors. No need to dig through logs to spot them.
To abort a running backup: Expand the row → Click Kill This Process → Confirm. The current run stops, the job stays in the list, and you can re-run it later.
Open the log of a run
Expand the job row → Click View Log
A modal opens with the raw, terminal-style output from the backup engine. This is where to look when:
- A backup says it failed and you want to know why.
- You want to confirm a specific file was included.
- Something looks slow and you want to find the bottleneck.
The log is read-only. Scroll through it, and copy any text you need to share.
Manage existing jobs
| Action | How |
|---|---|
| Edit | Click the pencil icon on the job row. Useful for rotating credentials or moving the destination. |
| Delete | Click the trash icon and confirm. The job is removed. Existing backup files at the destination are not touched. |
| Refresh | Click Refresh at the top right of the table to re-pull the latest job statuses. |
You can't edit or delete a job while it's running. Stop it first with Kill This Process.
Tips
Name jobs by what they back up, not by the date. daily-mysql-prod ages well, backup-april-2026 does not.
Test the connection before you save. A two-second test now beats discovering at 3 AM that a typo in your bucket name broke a week of backups.
Store backups somewhere far from your server. A local folder on the same disk as your data won't help if the disk dies. Pick a different cloud region, or a different provider entirely.