Files
tiny-forge/web/src/lib/i18n/en.json
T
alexei.dolgolyov a9c7775bb7 feat: configuration backup management with manual and auto backup
Add backup/restore functionality for the SQLite database. Users can
trigger manual backups, configure automatic backups on an interval
with retention policies, list/download/delete backups, and restore
from any backup.

- Backup engine using VACUUM INTO (safe with WAL mode)
- Backup metadata tracked in DB, files stored in DATA_DIR/backups/
- Settings: backup_enabled, backup_interval_hours, backup_retention_count
- API: POST/GET/DELETE /api/backups, download, restore endpoints
- Autobackup via cron scheduler with configurable interval
- Retention: prune on startup, after each backup (manual and auto)
- Orphan cleanup: removes backup files without metadata on startup
- Restore: replaces DB and triggers graceful server shutdown
- Settings UI: /settings/backup with toggle, interval, retention config
- Backup list with download, delete, restore actions
- i18n: English and Russian translations
2026-04-02 15:32:15 +03:00

644 lines
23 KiB
JSON

{
"app": {
"name": "Docker Watcher",
"version": "v0.1"
},
"health": {
"connected": "connected",
"disconnected": "disconnected",
"rawError": "Technical details",
"retryNow": "Retry now"
},
"nav": {
"dashboard": "Dashboard",
"projects": "Projects",
"deploy": "Deploy",
"proxies": "Proxies",
"events": "Events",
"settings": "Settings",
"logout": "Log out",
"dns": "DNS Records"
},
"dashboard": {
"title": "Dashboard",
"quickDeploy": "Quick Deploy",
"totalProjects": "Total Projects",
"runningInstances": "Running Instances",
"failedInstances": "Failed Instances",
"projects": "Projects",
"retry": "Retry",
"noProjects": "No projects yet.",
"addFirst": "Add your first project",
"loadFailed": "Failed to load dashboard",
"staleContainers": "Stale Containers"
},
"projects": {
"title": "Projects",
"addProject": "Add Project",
"cancel": "Cancel",
"newProject": "New Project",
"name": "Name",
"image": "Image",
"port": "Port",
"registry": "Registry",
"created": "Created",
"view": "View",
"noProjects": "No projects configured yet.",
"getStarted": "Click \"Add Project\" to get started.",
"createProject": "Create Project",
"creating": "Creating...",
"healthcheck": "Healthcheck Path",
"nameRequired": "Name and image are required.",
"loadFailed": "Failed to load projects",
"createFailed": "Failed to create project",
"browseImages": "Browse Images",
"selectImage": "Select an image",
"noImages": "No images found",
"loadingImages": "Loading images...",
"imageLoadFailed": "Failed to load images"
},
"projectDetail": {
"deleteProject": "Delete Project",
"envVars": "Environment Variables",
"volumes": "Volume Mounts",
"stages": "Stages",
"noStages": "No stages configured for this project.",
"pattern": "Pattern",
"autoDeploy": "auto-deploy",
"requiresConfirm": "requires confirm",
"instances": "instances",
"deployNewVersion": "Deploy new version",
"selectTag": "Select tag to deploy",
"loadingTags": "Loading tags...",
"chooseTag": "Choose a tag...",
"enterTag": "Enter image tag (e.g., dev-abc123)",
"deploy": "Deploy",
"deploying": "Deploying...",
"recentDeploys": "Recent Deploys",
"noDeployHistory": "No deploy history for this project.",
"tag": "Tag",
"status": "Status",
"started": "Started",
"finished": "Finished",
"error": "Error",
"noInstancesRunning": "No instances running",
"deleteConfirmTitle": "Delete Project",
"deleteConfirmMessage": "This will permanently delete the project '{name}' and all its stages, instances, and deploy history. This cannot be undone.",
"loadFailed": "Failed to load project",
"deleteFailed": "Failed to delete project",
"deployFailed": "Deploy failed"
},
"envEditor": {
"title": "Environment Variables",
"description": "Manage per-stage environment variable overrides. Stage-level values override project-level defaults.",
"stage": "Stage",
"projectDefaults": "Project-Level Defaults",
"stageOverrides": "Stage Overrides",
"key": "Key",
"value": "Value",
"secret": "Secret",
"source": "Source",
"actions": "Actions",
"overridden": "overridden",
"inherited": "inherited",
"overridesProject": "overrides project",
"stageOnly": "stage only",
"edit": "Edit",
"change": "Change",
"delete": "Delete",
"save": "Save",
"add": "Add",
"adding": "Adding...",
"noStages": "No stages configured. Add stages to the project first.",
"loadFailed": "Failed to load project",
"envAdded": "Environment variable added",
"envUpdated": "Environment variable updated",
"envDeleted": "Environment variable deleted",
"addFailed": "Failed to add env var",
"updateFailed": "Failed to update env var",
"deleteFailed": "Failed to delete env var",
"loadEnvFailed": "Failed to load env vars"
},
"volumeEditor": {
"title": "Volume Mounts",
"description": "Configure volume mounts for containers. Choose a scope to control how volumes are shared between deploys.",
"sourceHost": "Source (Host)",
"targetContainer": "Target (Container)",
"scope": "Scope",
"nameColumn": "Name",
"namePlaceholder": "e.g. shared-db",
"requiresName": "requires name",
"noHostPath": "no host path",
"tmpfs": "tmpfs (in-memory)",
"actions": "Actions",
"edit": "Edit",
"delete": "Delete",
"save": "Save",
"add": "Add",
"adding": "Adding...",
"noVolumes": "No volumes configured yet. Add one above.",
"volumeAdded": "Volume added",
"volumeUpdated": "Volume updated",
"volumeDeleted": "Volume deleted",
"loadFailed": "Failed to load volumes",
"addFailed": "Failed to add volume",
"updateFailed": "Failed to update volume",
"deleteFailed": "Failed to delete volume"
},
"volumeBrowser": {
"title": "Volume Browser",
"loadFailed": "Failed to load directory",
"empty": "This directory is empty.",
"name": "Name",
"size": "Size",
"modified": "Modified",
"downloadAll": "Download volume as ZIP",
"downloadFolder": "Download folder as ZIP",
"upload": "Upload files",
"uploaded": "Uploaded",
"files": "file(s)",
"uploadFailed": "Failed to upload files",
"browse": "Browse",
"download": "Download"
},
"quickDeploy": {
"title": "Quick Deploy",
"description": "Deploy a container image with zero configuration. Paste an image URL, review the defaults, and deploy.",
"step1": "1. Enter Image URL",
"imageUrl": "Image URL",
"imageUrlHelp": "Full image URL including tag (e.g., git.example.com/user/app:dev-abc123)",
"inspect": "Inspect",
"inspecting": "Inspecting...",
"step2": "2. Review Configuration",
"reviewDesc": "These defaults were detected from the image. Adjust as needed before deploying.",
"projectName": "Project Name",
"port": "Port",
"portHelp": "Container port to expose (1-65535)",
"healthCheckPath": "Health Check Path",
"healthCheckHelp": "Optional HTTP path for health verification",
"stage": "Stage",
"development": "Development",
"release": "Release",
"production": "Production",
"stageHelp": "Deployment stage for this image",
"subdomainOverride": "Subdomain Override",
"subdomainHelp": "Leave empty to use the default subdomain pattern",
"envVars": "Environment Variables",
"envVarsHelp": "One per line, KEY=VALUE format",
"step3": "3. Deploy",
"deployDesc": "A new project will be created and the container will be deployed immediately.",
"deployBtn": "Deploy",
"inspectedSuccess": "Image inspected successfully",
"deployedSuccess": "Deployed {name} successfully!",
"inspectFailed": "Failed to inspect image",
"deployFailed": "Deployment failed",
"browseImages": "Browse",
"selectImage": "Select an image from a registry",
"noImages": "No images found",
"loadingImages": "Loading...",
"imageLoadFailed": "Failed to load images"
},
"settings": {
"title": "Settings",
"general": "General",
"registries": "Registries",
"credentials": "Credentials",
"authentication": "Authentication",
"backup": "Backups",
"appearance": "Appearance",
"staleThreshold": "Stale threshold (days)",
"staleThresholdHelp": "Containers inactive for longer than this will be flagged as stale."
},
"settingsGeneral": {
"title": "General Settings",
"globalConfig": "Global Configuration",
"domain": "Domain",
"domainHelp": "Base domain for subdomain routing",
"serverIp": "Server IP",
"serverIpHelp": "Public IP address of the server",
"dockerNetwork": "Docker Network",
"dockerNetworkHelp": "Docker network for deployed containers",
"subdomainPattern": "Subdomain Pattern",
"subdomainPatternHelp": "Pattern for auto-generated subdomains",
"pollingInterval": "Polling Interval (seconds)",
"pollingIntervalHelp": "How often to check registries for new tags (10-86400)",
"notificationUrl": "Notification URL",
"notificationUrlHelp": "Webhook URL for deploy notifications",
"saveSettings": "Save Settings",
"saving": "Saving...",
"saved": "Settings saved successfully",
"saveFailed": "Failed to save settings",
"loadFailed": "Failed to load settings",
"webhookUrl": "Webhook URL",
"webhookDesc": "This secret URL receives image push notifications from your CI pipeline.",
"noWebhookUrl": "No webhook URL configured",
"copy": "Copy",
"copied": "Webhook URL copied to clipboard",
"regenerateUrl": "Regenerate URL",
"regenerating": "Regenerating...",
"regenerated": "Webhook URL regenerated",
"regenerateFailed": "Failed to regenerate webhook URL",
"regenerateWarning": "Warning: regenerating will invalidate the current URL. Update your CI pipelines.",
"sslCertificate": "SSL Certificate",
"sslCertificateHelp": "Wildcard certificate from NPM for auto-SSL on proxy hosts",
"selectCertificate": "Select Certificate",
"noCertificate": "None (no SSL)",
"clearCertificate": "Clear",
"loadingCertificates": "Loading certificates...",
"noCertificatesFound": "No wildcard certificates found in NPM",
"dnsConfig": "DNS Configuration",
"wildcardDns": "Wildcard DNS is configured",
"wildcardDnsHelp": "When enabled, all subdomains resolve to your server via a wildcard DNS rule. Disable to manage DNS records per service.",
"dnsProvider": "DNS Provider",
"dnsProviderHelp": "Select a DNS provider for automatic record management",
"cloudflareApiToken": "Cloudflare API Token",
"cloudflareApiTokenHelp": "API token with DNS edit permissions for your zone",
"cloudflareApiTokenPlaceholder": "Enter Cloudflare API token",
"cloudflareApiTokenConfigured": "API token is configured",
"cloudflareZone": "Cloudflare Zone",
"cloudflareZoneHelp": "Select the DNS zone to manage records in",
"selectZone": "Select Zone",
"noZone": "No zone selected",
"loadingZones": "Loading zones...",
"noZonesFound": "No zones found for this token",
"testConnection": "Test Connection",
"testingConnection": "Testing...",
"connectionSuccess": "Connection successful",
"connectionFailed": "Connection failed"
},
"settingsRegistries": {
"title": "Container Registries",
"description": "Manage your container registries for image detection.",
"addRegistry": "Add Registry",
"editRegistry": "Edit Registry",
"addNewRegistry": "Add New Registry",
"name": "Name",
"nameHelp": "A friendly name for this registry",
"url": "URL",
"urlHelp": "Registry base URL",
"type": "Type",
"typeHelp": "Registry type for API compatibility",
"token": "Token",
"tokenHelpNew": "API token for authentication",
"tokenHelpEdit": "Leave empty to keep the existing token",
"owner": "Owner",
"ownerHelp": "Package owners, comma-separated (e.g., alexei,my-org)",
"save": "Save",
"saving": "Saving...",
"update": "Update",
"test": "Test",
"testing": "Testing...",
"edit": "Edit",
"delete": "Delete",
"noRegistries": "No registries configured yet.",
"addFirst": "Add your first registry",
"registryUpdated": "Registry updated",
"registryAdded": "Registry added",
"registryDeleted": "Registry \"{name}\" deleted",
"testSuccess": "Connection to \"{name}\" successful",
"saveFailed": "Failed to save registry",
"deleteFailed": "Failed to delete registry",
"testFailed": "Connection test failed",
"loadFailed": "Failed to load registries",
"deleteConfirm": "Delete registry \"{name}\"? This cannot be undone."
},
"settingsCredentials": {
"title": "Credentials",
"description": "Manage credentials for Nginx Proxy Manager and registry tokens. All values are encrypted at rest.",
"npm": "Nginx Proxy Manager",
"npmDesc": "Credentials for managing proxy hosts via NPM API",
"configured": "Configured",
"npmUrl": "NPM URL",
"npmUrlHelp": "Nginx Proxy Manager API URL",
"email": "Email",
"emailHelp": "NPM admin email",
"password": "Password",
"passwordHelpNew": "NPM admin password (will be encrypted)",
"passwordHelpEdit": "Enter the new password to replace the existing one",
"changeCredentials": "Change Credentials",
"save": "Save",
"saving": "Saving...",
"saved": "NPM credentials saved",
"saveFailed": "Failed to save NPM credentials",
"loadFailed": "Failed to load credentials",
"registryTokens": "Registry Tokens",
"registryTokensDesc": "Registry authentication tokens are managed per-registry in the",
"registriesLink": "Registries",
"registryTokensSuffix": "section. Each registry stores its token encrypted in the database."
},
"settingsBackup": {
"title": "Backup Management",
"description": "Manage database backups and configure automatic backup schedules.",
"autoBackup": "Automatic Backups",
"autoBackupHelp": "Automatically create backups at the configured interval.",
"interval": "Backup Interval",
"intervalHelp": "How often to create automatic backups.",
"intervalHours": "{hours} hours",
"retention": "Retention Count",
"retentionHelp": "Maximum number of backups to keep. Oldest are deleted first.",
"backupNow": "Backup Now",
"creatingBackup": "Creating...",
"backupCreated": "Backup created successfully",
"backupFailed": "Failed to create backup",
"backupList": "Backups",
"noBackups": "No backups yet. Create one manually or enable automatic backups.",
"columnFilename": "Filename",
"columnSize": "Size",
"columnType": "Type",
"columnDate": "Created",
"columnActions": "Actions",
"download": "Download",
"delete": "Delete",
"restore": "Restore",
"deleteConfirm": "Are you sure you want to delete this backup?",
"deleted": "Backup deleted",
"deleteFailed": "Failed to delete backup",
"restoreConfirm": "Are you sure you want to restore from this backup? This will replace the current database and restart the server. All current data will be lost.",
"restoreWarning": "This action cannot be undone!",
"restored": "Database restored. The server is restarting...",
"restoreFailed": "Failed to restore backup",
"typeManual": "Manual",
"typeAuto": "Auto",
"save": "Save",
"saving": "Saving...",
"saved": "Backup settings saved",
"saveFailed": "Failed to save backup settings"
},
"settingsAuth": {
"title": "Authentication Settings",
"description": "Configure authentication mode and manage users.",
"authMode": "Authentication Mode",
"local": "Local (username/password)",
"oidc": "OIDC (SSO)",
"oidcConfig": "OIDC Provider Configuration",
"issuerUrl": "Issuer URL",
"clientId": "Client ID",
"clientSecret": "Client Secret",
"redirectUrl": "Redirect URL",
"saveSettings": "Save Settings",
"saving": "Saving...",
"saved": "Settings saved",
"saveFailed": "Failed to save",
"loadFailed": "Failed to load settings",
"localUsers": "Local Users",
"username": "Username",
"email": "Email",
"role": "Role",
"created": "Created",
"noUsers": "No users found.",
"addUser": "Add User",
"viewer": "Viewer",
"admin": "Admin",
"userCreated": "User created",
"userDeleted": "User deleted",
"createFailed": "Failed to create user",
"deleteFailed": "Failed to delete user",
"deleteConfirm": "Are you sure you want to delete this user?",
"usernameRequired": "Username and password are required",
"password": "Password"
},
"login": {
"title": "Docker Watcher",
"subtitle": "Sign in to your account",
"username": "Username",
"password": "Password",
"signIn": "Sign in",
"signingIn": "Signing in...",
"or": "or",
"ssoButton": "Sign in with SSO (OIDC)",
"loginFailed": "Login failed",
"networkError": "Network error"
},
"proxies": {
"title": "Proxy Manager",
"create": "Create Proxy",
"standalone": "Standalone Proxies",
"managed": "Managed Proxies",
"noProxies": "No proxies found",
"noProxiesDesc": "Create a standalone proxy or deploy a project with proxy enabled.",
"filter": {
"search": "Search by domain or destination...",
"health": "Health",
"type": "Type",
"all": "All",
"clear": "Clear filters"
},
"health": {
"healthy": "Healthy",
"unhealthy": "Unhealthy",
"unknown": "Unknown"
},
"lastChecked": "Last checked"
},
"common": {
"cancel": "Cancel",
"confirm": "Confirm",
"delete": "Delete",
"edit": "Edit",
"save": "Save",
"retry": "Retry",
"loading": "Loading...",
"noData": "No data",
"project": "Project",
"back": "Back",
"actions": "Actions",
"stop": "Stop",
"start": "Start",
"restart": "Restart",
"remove": "Remove",
"instance": "instance",
"instances": "instances"
},
"instance": {
"stopConfirm": "This will stop the running container. The instance can be started again later.",
"restartConfirm": "This will restart the container, causing brief downtime.",
"removeConfirm": "This will permanently remove the container and its proxy configuration. This cannot be undone.",
"actionFailed": "Action failed"
},
"empty": {
"noProjects": "No projects yet",
"noProjectsDesc": "Get started by creating your first project or use Quick Deploy.",
"createProject": "Create Project",
"noInstances": "No instances",
"noInstancesDesc": "Deploy a new version to see instances here.",
"noDeploys": "No deploy history",
"noDeploysDesc": "Deploy history will appear here after your first deployment.",
"noRegistries": "No registries",
"noRegistriesDesc": "Add a container registry to enable image detection.",
"noVolumes": "No volumes",
"noVolumesDesc": "Configure volume mounts for persistent data.",
"noUsers": "No users",
"noUsersDesc": "Add local users to manage access."
},
"validation": {
"required": "{field} is required",
"invalidUrl": "Invalid URL format",
"invalidDomain": "Invalid domain format",
"invalidIp": "Invalid IP format",
"invalidEmail": "Invalid email format",
"invalidPort": "Port must be between 1 and 65535",
"invalidPollingInterval": "Polling interval must be between 10 and 86400 seconds",
"invalidProjectName": "Only lowercase letters, numbers, and hyphens allowed",
"requiredWhenUpdating": "{field} is required when updating credentials",
"requiredForNew": "{field} is required for new registries"
},
"confirm": {
"stopInstance": "Stop Instance",
"startInstance": "Start Instance",
"restartInstance": "Restart Instance",
"removeInstance": "Remove Instance"
},
"theme": {
"light": "Light",
"dark": "Dark",
"system": "System"
},
"entityPicker": {
"search": "Search...",
"noResults": "No results found"
},
"stale": {
"title": "Stale Containers",
"noStale": "No stale containers",
"noStaleDesc": "All containers are healthy and running.",
"cleanup": "Clean up",
"cleanupAll": "Clean up all",
"confirmCleanup": "This will stop and remove the container. Continue?",
"confirmBulkCleanup": "This will stop and remove all stale containers. Continue?",
"daysStale": "days stale",
"lastAlive": "Last alive",
"count": "Stale",
"cleanedUp": "Container cleaned up",
"bulkCleanedUp": "{count} containers cleaned up",
"cleanupFailed": "Cleanup failed",
"loadFailed": "Failed to load stale containers"
},
"proxies": {
"title": "Proxies",
"create": "Create Proxy",
"noProxies": "No proxies configured yet.",
"noProxiesDesc": "Create a standalone proxy or deploy a project to see proxies here.",
"standalone": "Standalone Proxies",
"managed": "Managed",
"lastChecked": "Last checked",
"health": {
"healthy": "Healthy",
"unhealthy": "Unhealthy",
"unknown": "Unknown"
},
"filter": {
"search": "Search proxies...",
"health": "Health",
"type": "Type",
"all": "All",
"clear": "Clear filters"
},
"form": {
"title": "Create Proxy",
"editTitle": "Edit Proxy",
"destination": "Destination URL / IP",
"port": "Port",
"domain": "Domain",
"domainHelp": "The public domain for this proxy.",
"validate": "Validate",
"validating": "Validating...",
"create": "Create Proxy",
"save": "Save Changes",
"cancel": "Cancel",
"delete": "Delete",
"deleteConfirm": "Delete this proxy? This cannot be undone."
},
"validation": {
"title": "Destination Validation",
"syntax": "URL syntax",
"dns": "DNS resolution",
"tcp": "TCP connection",
"http": "HTTP response",
"checking": "Checking...",
"skipped": "Skipped"
}
},
"events": {
"title": "Event Log",
"noEvents": "No events found",
"noEventsDesc": "Events will appear here as they occur.",
"loadMore": "Load more",
"newEvents": "new events",
"filter": {
"severity": "Severity",
"source": "Source",
"dateRange": "Date range",
"search": "Search events...",
"lastHour": "Last hour",
"last24h": "Last 24 hours",
"last7d": "Last 7 days",
"allTime": "All time",
"clear": "Clear filters"
},
"severity": {
"info": "Info",
"warn": "Warning",
"error": "Error"
},
"source": {
"deploy": "Deploy",
"container": "Container",
"proxy": "Proxy",
"system": "System"
},
"metadata": "Details"
},
"stats": {
"cpu": "CPU",
"mem": "MEM",
"unavailable": "Stats unavailable"
},
"systemHealth": {
"title": "System Health",
"containers": "Containers",
"proxies": "Proxies",
"recentErrors": "Recent Errors"
},
"dns": {
"title": "DNS Records",
"description": "View and manage DNS records created by Docker Watcher.",
"wildcardActive": "Wildcard DNS Mode Active",
"wildcardActiveDesc": "DNS records are managed externally via wildcard DNS. Disable wildcard DNS in Settings to manage records individually.",
"refresh": "Refresh",
"syncNow": "Sync Now",
"syncing": "Syncing...",
"syncComplete": "Sync complete: {created} created, {deleted} deleted, {synced} already synced",
"syncFailed": "DNS sync failed",
"searchPlaceholder": "Search by FQDN...",
"allConsumers": "All consumers",
"managed": "Managed (instances)",
"standalone": "Standalone proxies",
"orphaned": "Orphaned",
"allStatuses": "All statuses",
"statusSynced": "Synced",
"statusMissing": "Missing",
"statusOrphaned": "Orphaned",
"columnFqdn": "FQDN",
"columnType": "Type",
"columnValue": "Value",
"columnConsumer": "Consumer",
"columnStatus": "Status",
"columnActions": "Actions",
"noConsumer": "No consumer",
"noRecords": "No DNS records found. Records will appear here when services are deployed.",
"noMatchingRecords": "No records match the current filters.",
"deleteRecord": "Delete record",
"recordDeleted": "DNS record {fqdn} deleted",
"deleteFailed": "Failed to delete DNS record",
"loadFailed": "Failed to load DNS records",
"totalRecords": "Total: {count}",
"syncedCount": "Synced: {count}",
"missingCount": "Missing: {count}",
"orphanedCount": "Orphaned: {count}"
},
"language": {
"en": "English",
"ru": "Russian"
}
}