From 2ea7847d4f56549e7d23e517e712addd6323a9f9 Mon Sep 17 00:00:00 2001 From: Girish Ramakrishnan Date: Wed, 5 Nov 2025 15:43:16 +0100 Subject: [PATCH] Add explicit option to disable automatic backups Fixes #869 --- dashboard/public/translation/en.json | 8 +- dashboard/public/translation/ru.json | 103 ++++++++++-------- .../components/BackupSiteScheduleDialog.vue | 22 ++-- 3 files changed, 73 insertions(+), 60 deletions(-) diff --git a/dashboard/public/translation/en.json b/dashboard/public/translation/en.json index 852e0b1e9..f3e90b0b3 100644 --- a/dashboard/public/translation/en.json +++ b/dashboard/public/translation/en.json @@ -374,7 +374,9 @@ "scheduleDescription": "Set the days and times for backups. Make sure this schedule does not overlap with the update schedule.", "days": "Days", "hours": "Hours", - "retentionPolicy": "Retention Policy" + "retentionPolicy": "Retention Policy", + "disable": "Disable Automatic Backups", + "enable": "Enable Automatic Backups" }, "configureBackupStorage": { "title": "Configure Backup Site", @@ -388,8 +390,8 @@ "bucketName": "Bucket name", "prefix": "Prefix", "region": "Region", - "s3AccessKeyId": "Access key id", - "s3SecretAccessKey": "Secret access key", + "s3AccessKeyId": "Access Key ID", + "s3SecretAccessKey": "Secret Access Key", "gcsServiceKey": "Service Account Key", "format": "Storage Format", "s3LikeNote": "Please remove any object expiration lifecycle rules since it will corrupt rsync backups.", diff --git a/dashboard/public/translation/ru.json b/dashboard/public/translation/ru.json index 42d58bcbc..ccb050b87 100644 --- a/dashboard/public/translation/ru.json +++ b/dashboard/public/translation/ru.json @@ -124,7 +124,8 @@ "settings": { "allowProfileEditCheckbox": "Разрешить пользователям редактировать своё имя и адрес электронной почты", "require2FACheckbox": "Требовать от пользователей настройки 2FA", - "saveAction": "Сохранить" + "saveAction": "Сохранить", + "title": "Настройки" }, "externalLdap": { "description": "Эта настройка будет синхронизировать и аутентифицировать пользователей и группы с внешнего сервера LDAP или Active Directory. Синхронизация выполняется периодически, но также может быть запущена вручную.", @@ -143,7 +144,7 @@ "groupFilter": "Фильтр группы", "groupnameField": "Поле с именем группы", "auth": "Авторизоваться", - "autocreateUsersOnLogin": "Автоматически создавать пользователей после их входа", + "autocreateUsersOnLogin": "Автоматически создавать пользователей при входе", "syncAction": "Синхронизировать", "configureAction": "Настроить", "errorSelfSignedCert": "Сервер использует недействительный или самоподписанный сертификат.", @@ -152,7 +153,7 @@ "addUserDialog": { "sendInviteCheckbox": "Отправить приглашение на электронную почту", "title": "Добавить пользователя", - "addUserAction": "Добавить пользователя" + "addUserAction": "Добавить" }, "user": { "fullName": "Полное имя", @@ -164,7 +165,7 @@ "displayName": "Отображаемое имя", "primaryEmail": "Основной адрес электронной почты", "recoveryEmail": "Электронная почта для восстановления пароля", - "activeCheckbox": "Пользователь активен", + "activeCheckbox": "Активный пользователь", "fallbackEmailPlaceholder": "Если не указано, будет использоваться основной почтовый ящик", "displayNamePlaceholder": "Необязательно. Если не указано, пользователь может указать во время регистрации" }, @@ -206,7 +207,7 @@ }, "setGhostDialog": { "description": "Установите временный пароль для доступа к приложениям и панели управления от имени данного пользователя. Такой пароль будет действовать 6 часов.", - "title": "Создайте пароль для обезличивания {{ username }}", + "title": "Вотйти от имени {{ username }}", "password": "Временный Пароль", "setPassword": "Установить пароль", "generatePassword": "Сгенерировать пароль" @@ -221,7 +222,8 @@ "group": { "name": "Имя", "users": "Пользователи", - "addGroupAction": "Добавить группу" + "addGroupAction": "Добавить", + "allowedApps": "Разрешённые приложения" }, "externalLdapDialog": { "title": "Настроить LDAP" @@ -238,7 +240,7 @@ "description": "Сервер LDAP позволяет внешним приложениям аутентифицировать пользователей с использованием Каталога пользователей Cloudron.", "secret": { "label": "Привязать пароль", - "description": "Все запросы LDAP должны быть идентифицированы при помощи данного секрета и уникального имени пользователя (DN) {{ userDN }}", + "description": "Аутентифицируйте запросы с помощью данного секрета и уникального имени пользователя (DN) {{ userDN }}", "url": "URL сервера" }, "cloudflarePortWarning": "Для доступа к LDAP серверу через домен панели управления проксирование Cloudflare должно быть выключено", @@ -273,17 +275,17 @@ "title": "Пароли приложений", "app": "Приложение", "name": "Имя", - "noPasswordsPlaceholder": "Пароли приложений не созданы" + "noPasswordsPlaceholder": "Пароли приложений отсутствуют" }, "title": "Профиль", "primaryEmail": "Главный адрес электронной почты", - "passwordRecoveryEmail": "Адрес электронной почты для восстановления пароля", + "passwordRecoveryEmail": "Почта для восстановления пароля", "language": "Язык", "apiTokens": { "title": "API Токены", "name": "Имя", - "description": "Используйте эти персональные токены для аутентификации в Cloudron API", - "noTokensPlaceholder": "API Токены не созданы", + "description": "Используйте эти персональные токены для аутентификации в Cloudron API.", + "noTokensPlaceholder": "API Токены отсутствуют", "lastUsed": "Последний раз использован", "neverUsed": "никогда", "scope": "Область", @@ -300,7 +302,7 @@ "changeEmail": { "title": "Изменить главный адрес электронной почты", "email": "Новый адрес электронной почты", - "password": "Пароль для подтверждения" + "password": "Подтверждение паролем" }, "changeFallbackEmail": { "title": "Изменить пароль электронной почты восстановления" @@ -322,7 +324,7 @@ "access": "API доступ", "allowedIpRanges": "Разрешённые диапазоны IP" }, - "changePasswordAction": "Изменить Пароль", + "changePasswordAction": "Изменить пароль", "disable2FAAction": "Выключить 2FA", "enable2FAAction": "Включить 2FA", "passwordResetNotification": { @@ -355,7 +357,7 @@ "description": "Обновления приложения устанавливаются периодически в соответствии с Расписанием обновлений." }, "updates": { - "description": "Cloudron периодически проверяет Магазин приложенийна наличие обновлений." + "description": "Cloudron периодически проверяет Магазин приложений на наличие обновлений." } }, "backups": { @@ -363,7 +365,7 @@ "description": "Резервные копии - это полные снимки ваших приложений. Вы можете использовать резервные копии для восстановления работы приложения или для его клонирования.", "title": "Резервные копии", "time": "Создан", - "downloadConfigTooltip": "Скачать Конфигурацию", + "downloadConfigTooltip": "Скачать конфигурацию", "cloneTooltip": "Клонировать", "restoreTooltip": "Восстановить", "createBackupAction": "Создать резервную копию", @@ -538,12 +540,12 @@ "disableIndexingAction": "Отключить индексирование", "txtPlaceholder": "Оставьте пустым, чтобы позволить поисковым ботам индексировать приложение" }, - "hstsPreload": "Активировать предзагрузку HSTS для этого сайта и всех поддоменов" + "hstsPreload": "Активировать предзагрузку HSTS (в том числе для поддоменов)" }, "repair": { "recovery": { "title": "Режим восстановления", - "description": "Чтобы исправить сломанные плагины или неправильно внесённые изменения в конфигурацию, поместите приложение в Режим восстановления.", + "description": "Чтобы исправить сломанные плагины или неправильно внесённые изменения в конфигурацию, поместите приложение в Режим восстановления.", "restartAction": "Запустить повторно", "disableAction": "Деактивировать режим восстановления", "enableAction": "Активировать режим восстановления" @@ -634,7 +636,7 @@ }, "archive": { "action": "Архивировать", - "latestBackupInfo": "Последняя резервная копия создана {{date}}.", + "latestBackupInfo": "Последняя резервная копия в {{siteName}} создана {{date}}.", "title": "Архив", "description": "Последняя резервная копия будет добавлена в Архив. Приложение будет удалено, но его можно восстановить из интерфейса Резервного копирования. Другие резервные копии будут очищены в соответствии с политикой резервного копирования.", "noBackup": "Приложение не имеет резервных копий. Архивирование требует по крайней мере одну резервную копию." @@ -661,13 +663,13 @@ "appCount": "{{ appCount }} Приложений", "contents": "Содержит", "noApps": "Приложения отсутствуют", - "tooltipDownloadBackupConfig": "Скачать Конфигурацию", + "tooltipDownloadBackupConfig": "Скачать конфигурацию", "cleanupBackups": "Очистить резервные копии", "backupNow": "Создать копию", "tooltipPreservedBackup": "Резервная копия будет сохранена" }, "schedule": { - "title": "Расписание & Политика хранения", + "title": "Расписание & политика хранения", "schedule": "Расписание", "retentionPolicy": "Политика хранения" }, @@ -746,7 +748,9 @@ "id": "Id", "date": "Дата", "version": "Версия", - "list": "Ссылается на резервные копии {{ appCount }} приложений" + "list": "Ссылается на резервные копии {{ appCount }} приложений", + "size": "Размер", + "duration": "Продолжительность" }, "backupEdit": { "title": "Редактировать резервную копию", @@ -804,9 +808,10 @@ "domains": { "title": "Домены", "outbound": "Только исходящие письма", - "stats": "Количество: {{ mailboxCount }} / Используется: {{ usage }}", + "stats": "Почтовые ящики: {{ mailboxCount }} / Используется: {{ usage }}", "disabled": "Выключено", - "testEmailTooltip": "Отправить тестовое письмо" + "testEmailTooltip": "Отправить тестовое письмо", + "inbound": "Входящие & Исходящие" }, "settings": { "title": "Настройки", @@ -857,7 +862,7 @@ "customRules": "Пользовательские правила Spamassassin", "blacklisteAddressesPlaceholder": "Шаблоны адресов электронной почты, разделенные строками", "customRulesPlaceholder": "Пользовательские правила Spamassassin", - "blacklisteAddresses": "Адреса в листе блокировки", + "blacklisteAddresses": "Лист блокировки Email адресов", "blacklisteAddressesInfo": "Подходящие адреса будут попадать в папку Спам. Поддерживаются '*' и '?' шаблоны glob." }, "testMailDialog": { @@ -927,7 +932,7 @@ "trustedIps": { "summary": "{{ trustCount }} IP доверены", "title": "Настроить доверенные IP", - "description": "HTTP заголовки от совпадающих IP адресов будут доверены" + "description": "HTTP заголовки от совпадающих IP адресов будут доверены." }, "trustedIpRanges": "Доверенные IP и диапазоны " }, @@ -973,9 +978,10 @@ "checkForUpdatesAction": "Проверить обновления", "updateAvailableAction": "Доступно Обновление", "stopUpdateAction": "Остановить обновление", - "description": "Обновления платформы и приложений запускаются на основании расписания и в соответствии с системным часовым поясом.", + "description": "Обновления платформы и приложений запускаются на основании установленного здесь расписания и в соответствии с системным часовым поясом.", "schedule": "Расписание", - "disabled": "Выключено" + "disabled": "Выключено", + "onLatest": "последний" }, "updateScheduleDialog": { "title": "Настроить расписание автоматических обновлений", @@ -984,7 +990,7 @@ "selectOne": "Выберите по крайней мере один день и время", "days": "Дни", "hours": "Часы", - "description": "Установите дни и часы, в которые будет происходить автоматическое обновление платформы и приложений. Убедитесь, что установленное расписание не пересекается с расписанием резервного копирования." + "description": "Установите дни и часы, в которые будет происходить автоматическое обновление платформы и приложений. Убедитесь, что установленное расписание не пересекается с расписанием резервного копирования." }, "updateDialog": { "title": "Обновить Cloudron до", @@ -1054,7 +1060,7 @@ "renewCerts": { "title": "Обновление сертификатов", "description": "Сертификаты Let’s Encrypt перевыпускаются автоматически. Используйте данную опцию, чтобы запустить перевыпуск прямо сейчас.", - "renewAllAction": "Обновить сертификаты" + "renewAllAction": "Обновить все сертификаты" }, "changeDashboardDomain": { "title": "Домен панели управления", @@ -1080,12 +1086,12 @@ "nameComApiToken": "API Токен", "namecheapUsername": "Имя пользователя Namecheap", "namecheapApiKey": "API Ключ", - "manualInfo": "Все записи DNS должны быть прописаны вручную до установки любого приложения.", - "letsEncryptInfo": "Для Let’s Encrypt требуется, чтобы Ваш сервер был доступен через 80 порт", + "manualInfo": "Все записи DNS должны быть прописаны вручную до установки приложения", + "letsEncryptInfo": "Для Let’s Encrypt требуется, чтобы Ваш сервер был доступен через 80 порт.", "advancedAction": "Расширенные настройки…", "zoneName": "Имя зоны (Необязательно)", "addTitle": "Добавить домен", - "addDescription": "Добавление домена позволяет устанавливать приложения на его поддомены. Настроить электронную почту для выбранного домена можно разделе Электронная почта.", + "addDescription": "Добавление домена позволяет устанавливать приложения на его поддомены. Настроить электронную почту можно разделе Электронная почта.", "linodeToken": "Токен Linode", "namecheapInfo": "IP-адрес сервера должен быть внесён в список разрешённых ключей для этого ключа API", "wildcardInfo": "Вручную настройте A (IPv4) и AAAA (IPv6) DNS записи для *.{{ domain }}. и {{ domain }}. на IP-адрес данного сервера", @@ -1118,7 +1124,7 @@ "gandiTokenTypePAT": "Персональный токен доступа (PAT)", "inwxUsername": "Имя пользователя", "inwxPassword": "Пароль", - "customNameservers": "Домен использует пользовательские серверы имён" + "customNameservers": "Домен использует пользовательские (Vanity) серверы имён" }, "removeDialog": { "title": "Действительно удалить {{ domain }}?", @@ -1317,7 +1323,8 @@ "usage": "Использовано", "aliases": "Псевдонимы", "emptyPlaceholder": "Почтовые ящики отсутствуют", - "noMatchesPlaceholder": "Подходящие почтовые ящики отсутствуют" + "noMatchesPlaceholder": "Подходящие почтовые ящики отсутствуют", + "stats": "Количество: {{ mailboxCount }} / Используется: {{ usage }}" }, "title": "Входящие письма", "sieveServerInfo": "Сервис ManageSieve", @@ -1343,7 +1350,7 @@ "description": "Получать входящие письма для этого домена." }, "config": { - "title": "Конфигурация электронной почты {{ domain }}", + "title": "Конфигурация электронной почты {{ domain }}", "clientConfiguration": "Настройка почтовых клиентов", "sending": { "title": "Отправка" @@ -1357,7 +1364,7 @@ "description": "Маскировка позволяет пользователям и приложениям отправлять письма с произвольным именем отправителя в поле «ОТ»." }, "signature": { - "title": "Подпись", + "title": "Email подпись", "plainTextFormat": "Обычный текст", "htmlFormat": "Формат HTML", "description": "Данный текст будет прикреплён ко всем письмам, отправляемым с выбранного домена." @@ -1385,12 +1392,12 @@ "addAnotherAliasAction": "Добавить ещё один псевдоним", "aliases": "Псевдонимы", "noAliases": "Псевдонимы не настроены.", - "enableStorageQuota": "Включить квоту хранилища" + "enableStorageQuota": "Квота хранилища" }, "deleteMailboxDialog": { "title": "Удалить почтовый ящик {{ name }}@{{ domain }}", "deleteAction": "Удалить", - "purgeMailboxCheckbox": "Удалить все письма и фильтры внутри почтового ящика", + "purgeMailboxCheckbox": "Удалить все письма и фильтры внутри этого почтового ящика", "description": "После удаления, письма, отправленные на данный почтовый ящик, будут возвращаться отправителю с ошибкой. Вы можете не удалять содержимое почтовых ящиков в архивных целях. Они будут храниться на сервере по пути /home/yellowtent/boxdata/mail/vmail." }, "addMailinglistDialog": { @@ -1405,14 +1412,14 @@ "description": "Вы действительно хотите удалить список рассылки {{ name }}@{{ domain }}?" }, "updateMailboxDialog": { - "enablePop3": "Включить POP3", - "activeCheckbox": "Почтовый ящик активен" + "enablePop3": "Доступ по протоколу POP3", + "activeCheckbox": "Активный почтовый ящик" }, "editMailinglistDialog": { "title": "Редактировать список рассылки {{ name }}@{{ domain }}" }, "updateMailinglistDialog": { - "activeCheckbox": "Список рассылки активен" + "activeCheckbox": "Активный список рассылки" }, "howToConnectInfoModal": "Настройка почтовых клиентов" }, @@ -1423,7 +1430,8 @@ "2faToken": "2FA Токен", "errorIncorrectCredentials": "Неправильное имя пользователя или пароль", "errorIncorrect2FAToken": "Неверный 2FA токен", - "errorInternal": "Внутренняя ошибка, попробуйте позже" + "errorInternal": "Внутренняя ошибка, попробуйте позже", + "loginAction": "Войти" }, "passwordReset": { "title": "Сброс пароля", @@ -1522,7 +1530,7 @@ }, "storage": { "mounts": { - "description": "Смонтированные тома станут доступны в /media/(имя тома). Смонтированные данные не попадают в резервные копии приложений." + "description": "Смонтированные тома станут доступны в /media/(имя тома). Смонтированные данные не попадают в резервные копии приложений." } }, "oidc": { @@ -1535,7 +1543,7 @@ "id": "ID Клиента", "secret": "Секрет", "signingAlgorithm": "Метод подписи", - "loginRedirectUri": "URL обратного вызова (разделённые запятой)" + "loginRedirectUri": "URLs обратного вызова (разделённые запятой)" }, "description": "Провайдер OpenID может быть использован внешними приложениями для SSO аутентификации.", "editClientDialog": { @@ -1566,7 +1574,8 @@ "backup": { "target": { "label": "Локация резервных копий", - "size": "Размер" + "size": "Размер", + "fileCount": "Файлы" }, "sites": { "title": "Локации резервных копий", @@ -1585,7 +1594,7 @@ "provider": "Провайдер", "username": "Имя пользователя", "title": "Реестры Docker", - "description": "Cloudron может выполнять команду pull и установку сторонних приложений из частного реестра docker.", + "description": "Cloudron может выполнять команду pull и установку сторонних приложений из частного реестра Docker.", "removeDialog": { "title": "Удалить {{ serverAddress }}" }, @@ -1609,7 +1618,7 @@ }, "externallinks": { "label": "Внешние ссылки", - "description": "Добавляет ярлык на внешние сервисы в панель управления" + "description": "Добавляет ярлык на внешние сервисы в панель управления." }, "server": { "title": "Сервер" diff --git a/dashboard/src/components/BackupSiteScheduleDialog.vue b/dashboard/src/components/BackupSiteScheduleDialog.vue index 09a503b92..239880a09 100644 --- a/dashboard/src/components/BackupSiteScheduleDialog.vue +++ b/dashboard/src/components/BackupSiteScheduleDialog.vue @@ -1,7 +1,7 @@