Web interface for managing file replication powered by rclone.
Full documentation : sixmon.github.io/rclone-replication-webui
Version franΓ§aise : README.fr.md
| Tasks list | Task detail & logs |
|---|---|
![]() |
![]() |
| Remote storages | New remote form |
|---|---|
![]() |
![]() |
- Remote storage β Manage rclone remotes with guided forms for the most common types (S3, SFTP, FTP, SMB, Azure Blob Storage, SharePoint, local), and key/value editor for advanced types
- Replication tasks β Cron scheduling (5 or 6 fields, macros like
@daily), live cron parser with next-run preview, manual trigger, restore mode (decrypt + write to a chosen target) - End-to-end encryption β Optional asymmetric encryption of the destination (age / X25519). The server only holds the public key (it encrypts, even on cron); the private key is never stored and is entered only at restore time. Browser-side key generation, incremental encrypted backups
- Auto-retry β Automatic retry on failure with configurable linear backoff
- Real-time monitoring β SSE progress and live logs during execution, global SSE for cross-tab state updates
- History β Last 100 runs per task with rclone statistics (transfers, volume, checks, deletes, errors), expandable inline logs
- Notifications β Markdown-formatted alerts via apprise-go (Slack, Mattermost, email, webhooks) on error, success, or skipped tasks
- Overlap protection β A running task cannot be started again; cron triggers during a running task are logged as "skipped"
- Secret Manager β Optional integration with multiple providers to store sensitive credentials outside the database: Scaleway, AWS, Azure Key Vault, Google Cloud, HashiCorp Vault, Infisical, Doppler
| Component | Technology |
|---|---|
| Backend | Rust (Axum 0.8) |
| ORM | SeaORM 1.x |
| Frontend | React 19 + TypeScript + Vite 8 + Tailwind CSS 4 |
| Database | PostgreSQL (external or bundled via docker-compose.postgres.yml) |
| Scheduling | tokio-cron-scheduler |
| Replication | rclone |
| Notifications | apprise-go |
| Secret storage (optional) | Scaleway / AWS / Azure / GCP / Vault / Infisical / Doppler |
βββββββββββββββββββββββββββββββββββββββ
β Frontend container β
β nginx β static files β
β β proxy /api/* to backend β
βββββββββββββββββββββββββββββββββββββββ
β HTTP/REST + SSE
βββββββββββββββββββββββββββββββββββββββ
β Backend container (FROM scratch) β
β Rust (Axum) + rclone + apprise-go β
βββββββββββββββββββββββββββββββββββββββ
β SQL β HTTPS (optional)
ββββββββββββββββββββ ββββββββββββββββββββββββββββββ
β PostgreSQL β β Secret Manager (pluggable)β
β β β Scaleway / AWS / Azure / β
β β β GCP / Vault / Infisical / β
β β β Doppler β
ββββββββββββββββββββ ββββββββββββββββββββββββββββββ
- Docker + Docker Compose
- PostgreSQL (or use the bundled compose file)
- Rust 1.75+
- Node.js 24+ (see
frontend/.node-version) - PostgreSQL 14+
- rclone
- apprise-go (optional, for notifications)
No external database needed β everything runs in Docker:
docker compose -f docker-compose.postgres.yml up --buildOpen the interface: http://localhost
- Create a
.envfile at the project root:
DATABASE_URL=postgresql://user:password@host.docker.internal:5432/rclone_ui- Start the containers:
docker compose up --build- Open the interface: http://localhost
cd backend
export DATABASE_URL="postgresql://user:password@localhost:5432/rclone_ui"
cargo runThe server starts on http://localhost:3000. Migrations run automatically on startup.
cd frontend
npm install
npm run devThe Vite dev server starts on http://localhost:5173 and proxies /api/* to the backend.
| Variable | Description | Default |
|---|---|---|
DATABASE_URL |
PostgreSQL connection URL | Required |
BIND_ADDR |
Backend listen address | 0.0.0.0:3000 |
RCLONE_BIN |
Path to rclone binary | rclone |
APPRISE_BIN |
Path to apprise binary | apprise |
RUST_LOG |
Log levels | info,rclone_replication_ui=debug,sea_orm=warn,sqlx=warn |
When enabled, sensitive credentials (passwords, API secrets, keys) are stored in an external Secret Manager instead of the database. Existing credentials are migrated automatically on startup.
The provider is selected via SECRET_MANAGER_PROVIDER. Supported values:
| Provider | Value | Auth |
|---|---|---|
| Scaleway Secret Manager | scaleway |
API key |
| AWS Secrets Manager | aws |
Standard AWS credentials chain |
| Azure Key Vault | azure |
Service Principal |
| Google Cloud Secret Manager | gcp |
Application Default Credentials |
| HashiCorp Vault | vault |
Token (KV v2) |
| Infisical | infisical |
Universal Auth |
| Doppler | doppler |
Service Token |
Set SECRET_MANAGER_PROVIDER=none (default) to keep credentials in the database.
| Variable | Default |
|---|---|
SCW_SECRET_KEY |
β |
SCW_PROJECT_ID |
β |
SCW_DEFAULT_REGION |
fr-par |
SCW_SECRET_PATH |
/rclone-ui |
Uses the standard AWS credentials provider chain (AWS_ACCESS_KEY_ID / AWS_SECRET_ACCESS_KEY, IAM roles on EC2/ECS/EKS, IRSA, etc.).
| Variable | Default |
|---|---|
AWS_REGION |
eu-west-1 |
AWS_SECRET_PREFIX |
rclone-ui/ |
Requires a Service Principal with Get, Set, Delete permissions on the vault.
| Variable | Default |
|---|---|
AZURE_TENANT_ID |
β |
AZURE_CLIENT_ID |
β |
AZURE_CLIENT_SECRET |
β |
AZURE_VAULT_URL (e.g. https://myvault.vault.azure.net) |
β |
Uses Application Default Credentials. Set GOOGLE_APPLICATION_CREDENTIALS to a service account JSON file, or rely on the GCE/GKE metadata server.
| Variable | Default |
|---|---|
GCP_PROJECT_ID |
β |
Uses the KV v2 secrets engine.
| Variable | Default |
|---|---|
VAULT_ADDR (e.g. http://vault.local:8200) |
β |
VAULT_TOKEN |
β |
VAULT_MOUNT_PATH |
secret |
VAULT_PATH_PREFIX |
rclone-ui |
Uses Universal Auth (machine identity).
| Variable | Default |
|---|---|
INFISICAL_HOST |
https://app.infisical.com |
INFISICAL_CLIENT_ID |
β |
INFISICAL_CLIENT_SECRET |
β |
INFISICAL_PROJECT_ID |
β |
INFISICAL_ENVIRONMENT |
prod |
INFISICAL_SECRET_PATH |
/rclone-ui |
| Variable | Default |
|---|---|
DOPPLER_TOKEN (Service Token) |
β |
DOPPLER_PROJECT |
β |
DOPPLER_CONFIG |
prd |
rclone-replication-ui/
βββ backend/
β βββ src/
β β βββ entities/ # SeaORM entities
β β βββ migration/ # Database migrations
β β βββ models/ # Request/response DTOs
β β βββ routes/ # API handlers
β β βββ services/ # Business logic
β β β βββ secrets/ # SecretStore abstraction (Scaleway / no-op)
β β βββ sse/ # Server-Sent Events
β βββ Cargo.toml
β βββ Dockerfile # FROM scratch image
βββ frontend/
β βββ src/
β β βββ pages/ # React pages
β β βββ components/ # UI components
β β βββ hooks/ # React hooks
β β βββ api/ # API calls
β β βββ types/ # TypeScript types
β β βββ config/ # Configuration schemas
β βββ nginx.conf
β βββ package.json
β βββ Dockerfile
βββ docker-compose.yml # External PostgreSQL
βββ docker-compose.postgres.yml # Bundled PostgreSQL 18
# Backend
cd backend && cargo build # Build
cd backend && cargo clippy # Lint
cd backend && cargo fmt # Format
# Frontend
cd frontend && npm run build # Production build
cd frontend && npm run dev # Dev server
cd frontend && npm run lint # Lint
# Docker
docker compose up --build # External PostgreSQL
docker compose -f docker-compose.postgres.yml up --build # Bundled PostgreSQL
docker compose down # Stop
docker compose logs -f backend # Backend logsMIT



