backups: remove noop backend
the noop backend is migrated into 0 sites config. when the updater code sees that there is no site to backup, it will just fail. user has to manually update with skipBackup flag.
This commit is contained in:
@@ -2964,3 +2964,5 @@
|
|||||||
* backups: store integrity information and perform validation
|
* backups: store integrity information and perform validation
|
||||||
* reverse proxy: remove OCSP support. this is being deprecated in favor of CRLs
|
* reverse proxy: remove OCSP support. this is being deprecated in favor of CRLs
|
||||||
* sqlite: fix issue where dump was also logged when backing up
|
* sqlite: fix issue where dump was also logged when backing up
|
||||||
|
* backups: remove noop backend
|
||||||
|
|
||||||
|
|||||||
@@ -281,7 +281,6 @@
|
|||||||
"failed": "Følgende brugere blev ikke importeret:",
|
"failed": "Følgende brugere blev ikke importeret:",
|
||||||
"sendInviteCheckbox": "Send en e-mail med invitation til importerede brugere"
|
"sendInviteCheckbox": "Send en e-mail med invitation til importerede brugere"
|
||||||
},
|
},
|
||||||
"newUserAction": "Ny bruger",
|
|
||||||
"users": {
|
"users": {
|
||||||
"user": "Bruger",
|
"user": "Bruger",
|
||||||
"groups": "Grupper",
|
"groups": "Grupper",
|
||||||
@@ -302,7 +301,6 @@
|
|||||||
},
|
},
|
||||||
"groups": {
|
"groups": {
|
||||||
"title": "Grupper",
|
"title": "Grupper",
|
||||||
"newGroupAction": "Ny gruppe",
|
|
||||||
"name": "Navn",
|
"name": "Navn",
|
||||||
"users": "Brugere",
|
"users": "Brugere",
|
||||||
"externalLdapTooltip": "Fra ekstern LDAP-mappe"
|
"externalLdapTooltip": "Fra ekstern LDAP-mappe"
|
||||||
@@ -578,7 +576,6 @@
|
|||||||
"cifsSealSupport": "Brug kryptering af segl. Kræver mindst SMB v3",
|
"cifsSealSupport": "Brug kryptering af segl. Kræver mindst SMB v3",
|
||||||
"title": "Konfigurere backuplagring",
|
"title": "Konfigurere backuplagring",
|
||||||
"provider": "Udbyder af lagerplads",
|
"provider": "Udbyder af lagerplads",
|
||||||
"noopNote": "Denne indstilling ødelægger Cloudrons backup- og gendannelsesfunktionalitet og bør kun bruges til testformål. Sørg for, at serveren er sikkerhedskopieret fuldstændigt ved hjælp af alternative midler.",
|
|
||||||
"mountPoint": "Monteringspunkt",
|
"mountPoint": "Monteringspunkt",
|
||||||
"mountPointDescription": "Mountpunktet skal oprettes manuelt. Se <a href=\"{{ providerDocsLink }}\" target=\"_blank\">docs</a>.",
|
"mountPointDescription": "Mountpunktet skal oprettes manuelt. Se <a href=\"{{ providerDocsLink }}\" target=\"_blank\">docs</a>.",
|
||||||
"localDirectory": "Lokal backup-mappe",
|
"localDirectory": "Lokal backup-mappe",
|
||||||
@@ -1051,7 +1048,6 @@
|
|||||||
"ovhAppSecret": "Application Secret"
|
"ovhAppSecret": "Application Secret"
|
||||||
},
|
},
|
||||||
"title": "Domæner og certs",
|
"title": "Domæner og certs",
|
||||||
"addDomain": "Tilføj domæne",
|
|
||||||
"domain": "Domæne",
|
"domain": "Domæne",
|
||||||
"provider": "Udbyder",
|
"provider": "Udbyder",
|
||||||
"tooltipEdit": "Rediger domæne",
|
"tooltipEdit": "Rediger domæne",
|
||||||
@@ -1836,7 +1832,6 @@
|
|||||||
"title": "Fjern virkelig {{ volume }} ?",
|
"title": "Fjern virkelig {{ volume }} ?",
|
||||||
"removeAction": "Fjern"
|
"removeAction": "Fjern"
|
||||||
},
|
},
|
||||||
"addVolumeAction": "Tilfoj Volume",
|
|
||||||
"hostPath": "Target",
|
"hostPath": "Target",
|
||||||
"name": "Navn",
|
"name": "Navn",
|
||||||
"openFileManagerActionTooltip": "Åbn FileManager",
|
"openFileManagerActionTooltip": "Åbn FileManager",
|
||||||
|
|||||||
@@ -256,7 +256,6 @@
|
|||||||
"externalLdapTooltip": "Aus externem LDAP Verzeichnis",
|
"externalLdapTooltip": "Aus externem LDAP Verzeichnis",
|
||||||
"users": "User",
|
"users": "User",
|
||||||
"name": "Name",
|
"name": "Name",
|
||||||
"newGroupAction": "Neue Gruppe",
|
|
||||||
"title": "Gruppen",
|
"title": "Gruppen",
|
||||||
"emptyPlaceholder": "Noch keine Gruppen"
|
"emptyPlaceholder": "Noch keine Gruppen"
|
||||||
},
|
},
|
||||||
@@ -278,7 +277,6 @@
|
|||||||
"mailmanagerTooltip": "Dieser User kann Benutzer und Postfächer verwalten.",
|
"mailmanagerTooltip": "Dieser User kann Benutzer und Postfächer verwalten.",
|
||||||
"setGhostTooltip": "Als anderer User ausgeben"
|
"setGhostTooltip": "Als anderer User ausgeben"
|
||||||
},
|
},
|
||||||
"newUserAction": "Neuer User",
|
|
||||||
"role": {
|
"role": {
|
||||||
"owner": "Superadmin",
|
"owner": "Superadmin",
|
||||||
"admin": "Administrationsrolle",
|
"admin": "Administrationsrolle",
|
||||||
@@ -798,7 +796,6 @@
|
|||||||
"cancelAction": "Abbrechen"
|
"cancelAction": "Abbrechen"
|
||||||
},
|
},
|
||||||
"domain": "Domäne",
|
"domain": "Domäne",
|
||||||
"addDomain": "Domäne hinzufügen",
|
|
||||||
"provider": "Anbieter",
|
"provider": "Anbieter",
|
||||||
"tooltipEdit": "Domäne bearbeiten",
|
"tooltipEdit": "Domäne bearbeiten",
|
||||||
"tooltipRemove": "Domäne entfernen",
|
"tooltipRemove": "Domäne entfernen",
|
||||||
@@ -909,7 +906,6 @@
|
|||||||
"localDirectory": "Lokales Backup-Verzeichnis",
|
"localDirectory": "Lokales Backup-Verzeichnis",
|
||||||
"mountPointDescription": "Der Mount-Point muss manuell gesetzt werden. Weitere Informationen in der <a href=\"{{ providerDocsLink }}\" target=\"_blank\">Anleitung</a>.",
|
"mountPointDescription": "Der Mount-Point muss manuell gesetzt werden. Weitere Informationen in der <a href=\"{{ providerDocsLink }}\" target=\"_blank\">Anleitung</a>.",
|
||||||
"mountPoint": "Mount-Point",
|
"mountPoint": "Mount-Point",
|
||||||
"noopNote": "Diese Option unterbricht die Sicherungs- und Wiederherstellungsfunktionalität von Cloudron und sollte nur zu Testzwecken verwendet werden. Der Server muss in dieser Betriebsart vollständig mit alternativen Mitteln gesichert werden.",
|
|
||||||
"provider": "Speicher-Anbieter",
|
"provider": "Speicher-Anbieter",
|
||||||
"title": "Backup-Speicher konfigurieren",
|
"title": "Backup-Speicher konfigurieren",
|
||||||
"encryptionPasswordRepeat": "Password wiederholen",
|
"encryptionPasswordRepeat": "Password wiederholen",
|
||||||
@@ -1965,7 +1961,6 @@
|
|||||||
"openFileManagerActionTooltip": "File-Manager öffnen",
|
"openFileManagerActionTooltip": "File-Manager öffnen",
|
||||||
"name": "Name",
|
"name": "Name",
|
||||||
"hostPath": "Ziel",
|
"hostPath": "Ziel",
|
||||||
"addVolumeAction": "Datenträger hinzufügen",
|
|
||||||
"title": "Datenträger",
|
"title": "Datenträger",
|
||||||
"mountType": "Einhängepunkttyp",
|
"mountType": "Einhängepunkttyp",
|
||||||
"updateVolumeDialog": {
|
"updateVolumeDialog": {
|
||||||
|
|||||||
@@ -194,7 +194,6 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"users": {
|
"users": {
|
||||||
"newUserAction": "New User",
|
|
||||||
"users": {
|
"users": {
|
||||||
"user": "User",
|
"user": "User",
|
||||||
"groups": "Groups",
|
"groups": "Groups",
|
||||||
@@ -215,7 +214,6 @@
|
|||||||
},
|
},
|
||||||
"groups": {
|
"groups": {
|
||||||
"title": "Groups",
|
"title": "Groups",
|
||||||
"newGroupAction": "New Group",
|
|
||||||
"name": "Name",
|
"name": "Name",
|
||||||
"users": "Users",
|
"users": "Users",
|
||||||
"externalLdapTooltip": "From external LDAP directory",
|
"externalLdapTooltip": "From external LDAP directory",
|
||||||
@@ -601,7 +599,6 @@
|
|||||||
"configureBackupStorage": {
|
"configureBackupStorage": {
|
||||||
"title": "Configure Backup Storage",
|
"title": "Configure Backup Storage",
|
||||||
"provider": "Storage provider",
|
"provider": "Storage provider",
|
||||||
"noopNote": "This option breaks the backup and restore functionality of Cloudron and should only be used for testing. Please make sure the server is completely backed up using alternate means.",
|
|
||||||
"mountPoint": "Mount point",
|
"mountPoint": "Mount point",
|
||||||
"mountPointDescription": "The mount point has to be set up manually. See <a href=\"{{ providerDocsLink }}\" target=\"_blank\">docs</a>.",
|
"mountPointDescription": "The mount point has to be set up manually. See <a href=\"{{ providerDocsLink }}\" target=\"_blank\">docs</a>.",
|
||||||
"localDirectory": "Local backup directory",
|
"localDirectory": "Local backup directory",
|
||||||
@@ -1056,7 +1053,6 @@
|
|||||||
},
|
},
|
||||||
"domains": {
|
"domains": {
|
||||||
"title": "Domains & Certs",
|
"title": "Domains & Certs",
|
||||||
"addDomain": "Add Domain",
|
|
||||||
"domain": "Domain",
|
"domain": "Domain",
|
||||||
"provider": "Provider",
|
"provider": "Provider",
|
||||||
"tooltipEdit": "Edit Domain",
|
"tooltipEdit": "Edit Domain",
|
||||||
@@ -1980,7 +1976,6 @@
|
|||||||
},
|
},
|
||||||
"volumes": {
|
"volumes": {
|
||||||
"title": "Volumes",
|
"title": "Volumes",
|
||||||
"addVolumeAction": "Add Volume",
|
|
||||||
"hostPath": "Target",
|
"hostPath": "Target",
|
||||||
"name": "Name",
|
"name": "Name",
|
||||||
"openFileManagerActionTooltip": "File Manager",
|
"openFileManagerActionTooltip": "File Manager",
|
||||||
@@ -2067,7 +2062,6 @@
|
|||||||
},
|
},
|
||||||
"clients": {
|
"clients": {
|
||||||
"title": "OpenID Clients",
|
"title": "OpenID Clients",
|
||||||
"newClient": "New Client",
|
|
||||||
"empty": "No OpenID Clients"
|
"empty": "No OpenID Clients"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -237,7 +237,6 @@
|
|||||||
"externalLdapTooltip": "Desde un directorio LDAP externo",
|
"externalLdapTooltip": "Desde un directorio LDAP externo",
|
||||||
"users": "Usuarios",
|
"users": "Usuarios",
|
||||||
"name": "Nombre",
|
"name": "Nombre",
|
||||||
"newGroupAction": "Nuevo Grupo",
|
|
||||||
"title": "Grupos",
|
"title": "Grupos",
|
||||||
"emptyPlaceholder": "No hay grupos aún"
|
"emptyPlaceholder": "No hay grupos aún"
|
||||||
},
|
},
|
||||||
@@ -259,7 +258,6 @@
|
|||||||
"invitationTooltip": "Invitar Usuario",
|
"invitationTooltip": "Invitar Usuario",
|
||||||
"mailmanagerTooltip": "Este usuario puede administrar usuarios y buzones de correo"
|
"mailmanagerTooltip": "Este usuario puede administrar usuarios y buzones de correo"
|
||||||
},
|
},
|
||||||
"newUserAction": "Nuevo Usuario",
|
|
||||||
"transferOwnershipDialog": {
|
"transferOwnershipDialog": {
|
||||||
"description": "Esto hará que el usuario seleccionado sea el propietario y administrador de este Cloudron y eliminará los derechos de administrador del propietario actual.",
|
"description": "Esto hará que el usuario seleccionado sea el propietario y administrador de este Cloudron y eliminará los derechos de administrador del propietario actual.",
|
||||||
"title": "¿Realmente quieres transferir la propiedad?",
|
"title": "¿Realmente quieres transferir la propiedad?",
|
||||||
@@ -475,7 +473,6 @@
|
|||||||
"localDirectory": "Directorio local para copias de seguridad",
|
"localDirectory": "Directorio local para copias de seguridad",
|
||||||
"mountPointDescription": "El punto de montaje debe configurarse manualmente. Consulta esta <a href=\"{{ providerDocsLink }}\" target=\"_blank\"> documentación </a>.",
|
"mountPointDescription": "El punto de montaje debe configurarse manualmente. Consulta esta <a href=\"{{ providerDocsLink }}\" target=\"_blank\"> documentación </a>.",
|
||||||
"mountPoint": "Punto de montaje",
|
"mountPoint": "Punto de montaje",
|
||||||
"noopNote": "Esta opción rompe la funcionalidad de copia de seguridad y restauración de Cloudron y solo debe usarse para realizar pruebas. Asegúrese de que se haya realizado una copia de seguridad completa del servidor utilizando medios alternativos.",
|
|
||||||
"provider": "Proveedor de almacenamiento",
|
"provider": "Proveedor de almacenamiento",
|
||||||
"title": "Configurar el almacenamiento de la Copia de Seguridad",
|
"title": "Configurar el almacenamiento de la Copia de Seguridad",
|
||||||
"password": "Contraseña",
|
"password": "Contraseña",
|
||||||
@@ -1031,7 +1028,6 @@
|
|||||||
"tooltipEdit": "Editar Dominio",
|
"tooltipEdit": "Editar Dominio",
|
||||||
"provider": "Proveedor",
|
"provider": "Proveedor",
|
||||||
"domain": "Dominio",
|
"domain": "Dominio",
|
||||||
"addDomain": "Añadir Dominio",
|
|
||||||
"syncDns": {
|
"syncDns": {
|
||||||
"showLogsAction": "Mostrar Registros",
|
"showLogsAction": "Mostrar Registros",
|
||||||
"title": "Sincronizar DNS",
|
"title": "Sincronizar DNS",
|
||||||
@@ -1535,7 +1531,6 @@
|
|||||||
"openFileManagerActionTooltip": "Abrir Gestor de Archivos",
|
"openFileManagerActionTooltip": "Abrir Gestor de Archivos",
|
||||||
"name": "Nombre",
|
"name": "Nombre",
|
||||||
"hostPath": "Objetivo",
|
"hostPath": "Objetivo",
|
||||||
"addVolumeAction": "Añade un Volumen",
|
|
||||||
"title": "Volúmenes",
|
"title": "Volúmenes",
|
||||||
"description": "Los volúmenes son sistemas de archivos locales o remotos. Se pueden usar como el almacenamiento de datos principal de una aplicación o como una ubicación de almacenamiento compartida entre aplicaciones.",
|
"description": "Los volúmenes son sistemas de archivos locales o remotos. Se pueden usar como el almacenamiento de datos principal de una aplicación o como una ubicación de almacenamiento compartida entre aplicaciones.",
|
||||||
"localDirectory": "Directorio Local",
|
"localDirectory": "Directorio Local",
|
||||||
|
|||||||
@@ -113,12 +113,10 @@
|
|||||||
"invitationTooltip": "Envoyer une invitation à l'utilisateur",
|
"invitationTooltip": "Envoyer une invitation à l'utilisateur",
|
||||||
"mailmanagerTooltip": "Cet utilisateur peut gérer les utilisateurs et les boîtes mail"
|
"mailmanagerTooltip": "Cet utilisateur peut gérer les utilisateurs et les boîtes mail"
|
||||||
},
|
},
|
||||||
"newUserAction": "Nouvel utilisateur",
|
|
||||||
"groups": {
|
"groups": {
|
||||||
"name": "Nom",
|
"name": "Nom",
|
||||||
"title": "Groupes",
|
"title": "Groupes",
|
||||||
"users": "Utilisateurs",
|
"users": "Utilisateurs",
|
||||||
"newGroupAction": "Nouveau groupe",
|
|
||||||
"externalLdapTooltip": "Depuis un annuaire LDAP externe"
|
"externalLdapTooltip": "Depuis un annuaire LDAP externe"
|
||||||
},
|
},
|
||||||
"settings": {
|
"settings": {
|
||||||
@@ -468,7 +466,6 @@
|
|||||||
"uploadConcurrencyDescription": "Nombre de fichiers pouvant être envoyés simultanément au cours d'une sauvegarde",
|
"uploadConcurrencyDescription": "Nombre de fichiers pouvant être envoyés simultanément au cours d'une sauvegarde",
|
||||||
"downloadConcurrencyDescription": "Nombre de fichiers pouvant être reçus simultanément au cours d'une restauration",
|
"downloadConcurrencyDescription": "Nombre de fichiers pouvant être reçus simultanément au cours d'une restauration",
|
||||||
"copyConcurrencyDescription": "Nombre de fichiers à distance pouvant être copiés au cours d'une sauvegarde",
|
"copyConcurrencyDescription": "Nombre de fichiers à distance pouvant être copiés au cours d'une sauvegarde",
|
||||||
"noopNote": "Cette option neutralise les fonctionnalités de sauvegarde et de restauration de Cloudron et ne doit être utilisée qu'à des fins de test. Veuillez vous assurer qu'une sauvegarde complète du système a été effectuée par d'autres moyens.",
|
|
||||||
"prefix": "Préfixe",
|
"prefix": "Préfixe",
|
||||||
"region": "Région",
|
"region": "Région",
|
||||||
"s3AccessKeyId": "ID de clé d'accès",
|
"s3AccessKeyId": "ID de clé d'accès",
|
||||||
@@ -1287,7 +1284,6 @@
|
|||||||
"openFileManagerActionTooltip": "Ouvrir le gestionnaire de fichiers",
|
"openFileManagerActionTooltip": "Ouvrir le gestionnaire de fichiers",
|
||||||
"removeVolumeActionTooltip": "Supprimer le volume",
|
"removeVolumeActionTooltip": "Supprimer le volume",
|
||||||
"hostPath": "Point de montage",
|
"hostPath": "Point de montage",
|
||||||
"addVolumeAction": "Ajouter un volume",
|
|
||||||
"title": "Volumes",
|
"title": "Volumes",
|
||||||
"localDirectory": "Répertoire local",
|
"localDirectory": "Répertoire local",
|
||||||
"tooltipEdit": "Modifier le Volume",
|
"tooltipEdit": "Modifier le Volume",
|
||||||
@@ -1591,7 +1587,6 @@
|
|||||||
"tooltipEdit": "Modifier le domaine",
|
"tooltipEdit": "Modifier le domaine",
|
||||||
"provider": "Fournisseur",
|
"provider": "Fournisseur",
|
||||||
"domain": "Domaine",
|
"domain": "Domaine",
|
||||||
"addDomain": "Ajouter un domaine",
|
|
||||||
"title": "Domaines et Certificats",
|
"title": "Domaines et Certificats",
|
||||||
"domainWellKnown": {
|
"domainWellKnown": {
|
||||||
"title": "Emplacements Well-Known de {{ domain }}"
|
"title": "Emplacements Well-Known de {{ domain }}"
|
||||||
|
|||||||
@@ -73,7 +73,6 @@
|
|||||||
"openFileManagerActionTooltip": "Apri il File Manager",
|
"openFileManagerActionTooltip": "Apri il File Manager",
|
||||||
"name": "Nome",
|
"name": "Nome",
|
||||||
"hostPath": "Percorso Host",
|
"hostPath": "Percorso Host",
|
||||||
"addVolumeAction": "Aggiungi Volume",
|
|
||||||
"title": "Volumi"
|
"title": "Volumi"
|
||||||
},
|
},
|
||||||
"lang": {
|
"lang": {
|
||||||
@@ -676,7 +675,6 @@
|
|||||||
"localDirectory": "Directory di backup locale",
|
"localDirectory": "Directory di backup locale",
|
||||||
"mountPointDescription": "Il punto di montaggio deve essere impostato manualmente. Consulta i <a href=\"{{ providerDocsLink }}\" target=\"_blank\"> documenti </a>.",
|
"mountPointDescription": "Il punto di montaggio deve essere impostato manualmente. Consulta i <a href=\"{{ providerDocsLink }}\" target=\"_blank\"> documenti </a>.",
|
||||||
"mountPoint": "Punto di montaggio",
|
"mountPoint": "Punto di montaggio",
|
||||||
"noopNote": "Questa opzione interrompe la funzionalità di backup e ripristino di Cloudron e deve essere utilizzata solo per i test. Assicurati di aver eseguito il backup completo del server utilizzando metodi alternativi.",
|
|
||||||
"provider": "Provider archiviazione",
|
"provider": "Provider archiviazione",
|
||||||
"title": "Configura archiviazione backup",
|
"title": "Configura archiviazione backup",
|
||||||
"uploadPartSizeDescription": "Dimensioni del singolo file nel caricamento multiplo. Fino a 3 parti vengono caricate in parallelo e richiedono maggiore memoria.",
|
"uploadPartSizeDescription": "Dimensioni del singolo file nel caricamento multiplo. Fino a 3 parti vengono caricate in parallelo e richiedono maggiore memoria.",
|
||||||
@@ -951,7 +949,6 @@
|
|||||||
"externalLdapTooltip": "Dalla directory LDAP esterna",
|
"externalLdapTooltip": "Dalla directory LDAP esterna",
|
||||||
"users": "Utenti",
|
"users": "Utenti",
|
||||||
"name": "Nome",
|
"name": "Nome",
|
||||||
"newGroupAction": "Nuovo Gruppo",
|
|
||||||
"title": "Gruppi"
|
"title": "Gruppi"
|
||||||
},
|
},
|
||||||
"users": {
|
"users": {
|
||||||
@@ -969,7 +966,6 @@
|
|||||||
"user": "Utente",
|
"user": "Utente",
|
||||||
"transferOwnershipTooltip": "Trasferisci Proprietà"
|
"transferOwnershipTooltip": "Trasferisci Proprietà"
|
||||||
},
|
},
|
||||||
"newUserAction": "Nuovo Utente",
|
|
||||||
"transferOwnershipDialog": {
|
"transferOwnershipDialog": {
|
||||||
"transferAction": "Trasferisci la proprietà",
|
"transferAction": "Trasferisci la proprietà",
|
||||||
"description": "L'utente selezionato e l'amministratore di questo Cloudron acquisiranno i permessi di ammministrazione, mentre l'attuale proprietario li perderà.",
|
"description": "L'utente selezionato e l'amministratore di questo Cloudron acquisiranno i permessi di ammministrazione, mentre l'attuale proprietario li perderà.",
|
||||||
@@ -1410,7 +1406,6 @@
|
|||||||
"tooltipEdit": "Modifica Dominio",
|
"tooltipEdit": "Modifica Dominio",
|
||||||
"provider": "Provider",
|
"provider": "Provider",
|
||||||
"domain": "Dominio",
|
"domain": "Dominio",
|
||||||
"addDomain": "Aggiungi dominio",
|
|
||||||
"title": "Domini e Certificati"
|
"title": "Domini e Certificati"
|
||||||
},
|
},
|
||||||
"eventlog": {
|
"eventlog": {
|
||||||
|
|||||||
@@ -194,7 +194,6 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"users": {
|
"users": {
|
||||||
"newUserAction": "Nieuwe gebruiker",
|
|
||||||
"users": {
|
"users": {
|
||||||
"user": "Gebruiker",
|
"user": "Gebruiker",
|
||||||
"groups": "Groepen",
|
"groups": "Groepen",
|
||||||
@@ -218,7 +217,6 @@
|
|||||||
"name": "Naam",
|
"name": "Naam",
|
||||||
"users": "Gebruikers",
|
"users": "Gebruikers",
|
||||||
"externalLdapTooltip": "Van extern LDAP adresboek",
|
"externalLdapTooltip": "Van extern LDAP adresboek",
|
||||||
"newGroupAction": "Nieuwe groep",
|
|
||||||
"emptyPlaceholder": "Geen groepen beschikbaar"
|
"emptyPlaceholder": "Geen groepen beschikbaar"
|
||||||
},
|
},
|
||||||
"settings": {
|
"settings": {
|
||||||
@@ -623,7 +621,6 @@
|
|||||||
"copyConcurrencyDescription": "Aantal externe bestandskopieën, die parallel bij het maken van een back-up gebruikt worden.",
|
"copyConcurrencyDescription": "Aantal externe bestandskopieën, die parallel bij het maken van een back-up gebruikt worden.",
|
||||||
"copyConcurrencyDigitalOceanNote": "Het limiet van DigitalOcean Spaces ligt op 20.",
|
"copyConcurrencyDigitalOceanNote": "Het limiet van DigitalOcean Spaces ligt op 20.",
|
||||||
"encryptionPasswordPlaceholder": "Wachtwoord wat gebruikt is om backups te versleutelen",
|
"encryptionPasswordPlaceholder": "Wachtwoord wat gebruikt is om backups te versleutelen",
|
||||||
"noopNote": "Deze optie onderbreekt de backup en herstel functionaliteit van Cloudron en dient alleen gebruikt te worden voor testen. Zorg ervoor dat van deze server op een andere wijze een backup wordt gemaakt.",
|
|
||||||
"s3AccessKeyId": "Toegangssleutel id",
|
"s3AccessKeyId": "Toegangssleutel id",
|
||||||
"s3SecretAccessKey": "Geheime toegangssleutel",
|
"s3SecretAccessKey": "Geheime toegangssleutel",
|
||||||
"formatChangeNote": "Voorgaande backups, die een ander opslagformaat gebruikten, dienen handmatig verwijderd te worden.",
|
"formatChangeNote": "Voorgaande backups, die een ander opslagformaat gebruikten, dienen handmatig verwijderd te worden.",
|
||||||
@@ -894,7 +891,6 @@
|
|||||||
"customNameservers": "Domein maakt gebruik van aangepaste (eigen) nameservers"
|
"customNameservers": "Domein maakt gebruik van aangepaste (eigen) nameservers"
|
||||||
},
|
},
|
||||||
"title": "Domeinen & Certificaten",
|
"title": "Domeinen & Certificaten",
|
||||||
"addDomain": "Domein toevoegen",
|
|
||||||
"domain": "Domein",
|
"domain": "Domein",
|
||||||
"provider": "Aanbieder",
|
"provider": "Aanbieder",
|
||||||
"tooltipEdit": "Bewerk domein",
|
"tooltipEdit": "Bewerk domein",
|
||||||
@@ -1944,7 +1940,6 @@
|
|||||||
"removeVolumeActionTooltip": "Verwijder Volume",
|
"removeVolumeActionTooltip": "Verwijder Volume",
|
||||||
"openFileManagerActionTooltip": "Bestandsbeheer",
|
"openFileManagerActionTooltip": "Bestandsbeheer",
|
||||||
"name": "Naam",
|
"name": "Naam",
|
||||||
"addVolumeAction": "Volume toevoegen",
|
|
||||||
"title": "Volumes",
|
"title": "Volumes",
|
||||||
"mountType": "Koppeltype",
|
"mountType": "Koppeltype",
|
||||||
"updateVolumeDialog": {
|
"updateVolumeDialog": {
|
||||||
@@ -2067,7 +2062,6 @@
|
|||||||
},
|
},
|
||||||
"clients": {
|
"clients": {
|
||||||
"title": "OpenID Clients",
|
"title": "OpenID Clients",
|
||||||
"newClient": "Nieuwe Client",
|
|
||||||
"empty": "Geen OpenID Clients"
|
"empty": "Geen OpenID Clients"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -351,7 +351,6 @@
|
|||||||
"groups": {
|
"groups": {
|
||||||
"emptyPlaceholder": "Não há grupos disponíveis",
|
"emptyPlaceholder": "Não há grupos disponíveis",
|
||||||
"title": "Grupos",
|
"title": "Grupos",
|
||||||
"newGroupAction": "Novo Grupo",
|
|
||||||
"name": "Nome",
|
"name": "Nome",
|
||||||
"users": "Utilizadores",
|
"users": "Utilizadores",
|
||||||
"externalLdapTooltip": "Da diretoria LDAP externa"
|
"externalLdapTooltip": "Da diretoria LDAP externa"
|
||||||
@@ -491,7 +490,6 @@
|
|||||||
"active": "Utilizadores Ativos",
|
"active": "Utilizadores Ativos",
|
||||||
"inactive": "Utilizadores Inativos"
|
"inactive": "Utilizadores Inativos"
|
||||||
},
|
},
|
||||||
"newUserAction": "Novo Utilizador",
|
|
||||||
"settings": {
|
"settings": {
|
||||||
"title": "Definições do Utilizador",
|
"title": "Definições do Utilizador",
|
||||||
"subscriptionRequiredAction": "Configurar Subscrição Agora",
|
"subscriptionRequiredAction": "Configurar Subscrição Agora",
|
||||||
@@ -1009,7 +1007,6 @@
|
|||||||
"description": "Para adicionar mais domínios, por favor, configure um plano pago.",
|
"description": "Para adicionar mais domínios, por favor, configure um plano pago.",
|
||||||
"setupAction": "Configurar Subscrição"
|
"setupAction": "Configurar Subscrição"
|
||||||
},
|
},
|
||||||
"addDomain": "Adicionar Domínio",
|
|
||||||
"domain": "Domínio",
|
"domain": "Domínio",
|
||||||
"provider": "Provedor",
|
"provider": "Provedor",
|
||||||
"tooltipEdit": "Editar Domínio",
|
"tooltipEdit": "Editar Domínio",
|
||||||
@@ -1262,7 +1259,6 @@
|
|||||||
"name": "Nome",
|
"name": "Nome",
|
||||||
"openFileManagerActionTooltip": "Gestor de Ficheiros",
|
"openFileManagerActionTooltip": "Gestor de Ficheiros",
|
||||||
"title": "Volumes",
|
"title": "Volumes",
|
||||||
"addVolumeAction": "Adicionar Volume",
|
|
||||||
"removeVolumeActionTooltip": "Remover Volume",
|
"removeVolumeActionTooltip": "Remover Volume",
|
||||||
"removeVolumeDialog": {
|
"removeVolumeDialog": {
|
||||||
"title": "Deseja remover {{ volume }} ?",
|
"title": "Deseja remover {{ volume }} ?",
|
||||||
|
|||||||
@@ -212,10 +212,8 @@
|
|||||||
"setGhostTooltip": "Обезличить",
|
"setGhostTooltip": "Обезличить",
|
||||||
"mailmanagerTooltip": "Этот пользователь может управлять другими пользователями и почтовыми ящиками"
|
"mailmanagerTooltip": "Этот пользователь может управлять другими пользователями и почтовыми ящиками"
|
||||||
},
|
},
|
||||||
"newUserAction": "Новый пользователь",
|
|
||||||
"groups": {
|
"groups": {
|
||||||
"title": "Группы",
|
"title": "Группы",
|
||||||
"newGroupAction": "Новая группа",
|
|
||||||
"name": "Имя",
|
"name": "Имя",
|
||||||
"users": "Пользователи",
|
"users": "Пользователи",
|
||||||
"externalLdapTooltip": "Из внешнего LDAP каталога",
|
"externalLdapTooltip": "Из внешнего LDAP каталога",
|
||||||
@@ -959,7 +957,6 @@
|
|||||||
"title": "Настроить расписание и хранение резервных копий"
|
"title": "Настроить расписание и хранение резервных копий"
|
||||||
},
|
},
|
||||||
"configureBackupStorage": {
|
"configureBackupStorage": {
|
||||||
"noopNote": "Этот параметр полностью отключает функцию резервного копирования и восстановления. Используйте её только в тестовых целях. Предварительно убедитесь, что Вы настроили альтернативные способы резервного копирования на Вашем сервере.",
|
|
||||||
"formatChangeNote": "Резервные копии, хранящиеся в старом хранилище, должны быть удалены вручную.",
|
"formatChangeNote": "Резервные копии, хранящиеся в старом хранилище, должны быть удалены вручную.",
|
||||||
"encryptionPassword": "Пароль шифрования",
|
"encryptionPassword": "Пароль шифрования",
|
||||||
"title": "Настроить хранилище резервных копий",
|
"title": "Настроить хранилище резервных копий",
|
||||||
@@ -1516,7 +1513,6 @@
|
|||||||
"inwxPassword": "Пароль",
|
"inwxPassword": "Пароль",
|
||||||
"customNameservers": "Домен использует пользовательские серверы имён"
|
"customNameservers": "Домен использует пользовательские серверы имён"
|
||||||
},
|
},
|
||||||
"addDomain": "Добавить домен",
|
|
||||||
"removeDialog": {
|
"removeDialog": {
|
||||||
"title": "Действительно удалить {{ domain }}?",
|
"title": "Действительно удалить {{ domain }}?",
|
||||||
"description": "Данное действие удалит домен <code>{{ domain }}</code>.",
|
"description": "Данное действие удалит домен <code>{{ domain }}</code>.",
|
||||||
@@ -1920,7 +1916,6 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"volumes": {
|
"volumes": {
|
||||||
"addVolumeAction": "Добавить том",
|
|
||||||
"name": "Имя",
|
"name": "Имя",
|
||||||
"openFileManagerActionTooltip": "Файловый менеджер",
|
"openFileManagerActionTooltip": "Файловый менеджер",
|
||||||
"removeVolumeActionTooltip": "Удалить том",
|
"removeVolumeActionTooltip": "Удалить том",
|
||||||
@@ -2067,7 +2062,6 @@
|
|||||||
},
|
},
|
||||||
"clients": {
|
"clients": {
|
||||||
"title": "Клиенты OpenID",
|
"title": "Клиенты OpenID",
|
||||||
"newClient": "Новый клиент",
|
|
||||||
"empty": "Клиенты OpenID не добавлены"
|
"empty": "Клиенты OpenID не добавлены"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -286,11 +286,9 @@
|
|||||||
"externalLdapTooltip": "Từ thư mục LDAP ngoài",
|
"externalLdapTooltip": "Từ thư mục LDAP ngoài",
|
||||||
"users": "Người dùng",
|
"users": "Người dùng",
|
||||||
"name": "Tên",
|
"name": "Tên",
|
||||||
"newGroupAction": "Nhóm mới",
|
|
||||||
"title": "Nhóm",
|
"title": "Nhóm",
|
||||||
"emptyPlaceholder": "Chưa có nhóm nào cả"
|
"emptyPlaceholder": "Chưa có nhóm nào cả"
|
||||||
},
|
},
|
||||||
"newUserAction": "Người dùng mới",
|
|
||||||
"editGroupDialog": {
|
"editGroupDialog": {
|
||||||
"title": "Chỉnh sửa nhóm {{ name }}",
|
"title": "Chỉnh sửa nhóm {{ name }}",
|
||||||
"externalLdapWarning": "Nhóm này được đồng bộ từ thư mục LDAP ngoài."
|
"externalLdapWarning": "Nhóm này được đồng bộ từ thư mục LDAP ngoài."
|
||||||
@@ -573,7 +571,6 @@
|
|||||||
"mountPointDescription": "Điểm mount cần được cài đặt thủ công. Xem <a href=\"{{ providerDocsLink }}\" target=\"_blank\">hướng dẫn</a>.",
|
"mountPointDescription": "Điểm mount cần được cài đặt thủ công. Xem <a href=\"{{ providerDocsLink }}\" target=\"_blank\">hướng dẫn</a>.",
|
||||||
"title": "Cấu hình nơi lưu trữ bản sao lưu",
|
"title": "Cấu hình nơi lưu trữ bản sao lưu",
|
||||||
"mountPoint": "Điểm mount",
|
"mountPoint": "Điểm mount",
|
||||||
"noopNote": "Lựa chọn này sẽ làm hỏng tính năng sao lưu và khôi phục của Cloudron và chỉ nên dùng khi test hệ thống. Xin đảm bảo rằng server được sao lưu toàn bộ bằng những phương tiện khác.",
|
|
||||||
"format": "Định dạng lưu trữ",
|
"format": "Định dạng lưu trữ",
|
||||||
"encryptedFilenames": "Tên tập tin đã mã hoá",
|
"encryptedFilenames": "Tên tập tin đã mã hoá",
|
||||||
"chown": "Hệ thống tập tin bên ngoài có hỗ trợ chown",
|
"chown": "Hệ thống tập tin bên ngoài có hỗ trợ chown",
|
||||||
@@ -1506,7 +1503,6 @@
|
|||||||
"tooltipEdit": "Chỉnh tên miền",
|
"tooltipEdit": "Chỉnh tên miền",
|
||||||
"provider": "Nhà cung cấp",
|
"provider": "Nhà cung cấp",
|
||||||
"domain": "Tên miền",
|
"domain": "Tên miền",
|
||||||
"addDomain": "Thêm tên miền",
|
|
||||||
"syncDns": {
|
"syncDns": {
|
||||||
"title": "Đồng bộ DNS",
|
"title": "Đồng bộ DNS",
|
||||||
"description": "Lựa chọn này sẽ cấp lại các bản ghi DNS cho app và email cho tất cả tên miền.",
|
"description": "Lựa chọn này sẽ cấp lại các bản ghi DNS cho app và email cho tất cả tên miền.",
|
||||||
@@ -1916,7 +1912,6 @@
|
|||||||
"removeVolumeActionTooltip": "Xoá volume",
|
"removeVolumeActionTooltip": "Xoá volume",
|
||||||
"openFileManagerActionTooltip": "Mở Quản lý tập tin",
|
"openFileManagerActionTooltip": "Mở Quản lý tập tin",
|
||||||
"hostPath": "Điểm đến",
|
"hostPath": "Điểm đến",
|
||||||
"addVolumeAction": "Thêm volume",
|
|
||||||
"updateVolumeDialog": {
|
"updateVolumeDialog": {
|
||||||
"title": "Cập nhật Volume {{ volume }}"
|
"title": "Cập nhật Volume {{ volume }}"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -208,7 +208,6 @@
|
|||||||
"s3SecretAccessKey": "Secret access key",
|
"s3SecretAccessKey": "Secret access key",
|
||||||
"gcsServiceKey": "Service Account Key",
|
"gcsServiceKey": "Service Account Key",
|
||||||
"format": "存储格式",
|
"format": "存储格式",
|
||||||
"noopNote": "这个选项会停用 Cloudron 的备份和恢复功能,仅应该被用于测试。请确保这台服务器已经使用其它方式备份。",
|
|
||||||
"formatChangeNote": "使用旧存储格式的备份需要被手动删除。",
|
"formatChangeNote": "使用旧存储格式的备份需要被手动删除。",
|
||||||
"encryptionPassword": "加密密码(可选)",
|
"encryptionPassword": "加密密码(可选)",
|
||||||
"advancedSettings": "高级设置…",
|
"advancedSettings": "高级设置…",
|
||||||
@@ -389,7 +388,6 @@
|
|||||||
"searchPlaceholder": "使用应用名称如 Github, Dropbox, Slack, Trello, ... 来搜索替代品"
|
"searchPlaceholder": "使用应用名称如 Github, Dropbox, Slack, Trello, ... 来搜索替代品"
|
||||||
},
|
},
|
||||||
"users": {
|
"users": {
|
||||||
"newUserAction": "新用户",
|
|
||||||
"users": {
|
"users": {
|
||||||
"user": "用户",
|
"user": "用户",
|
||||||
"groups": "用户组",
|
"groups": "用户组",
|
||||||
@@ -410,7 +408,6 @@
|
|||||||
},
|
},
|
||||||
"groups": {
|
"groups": {
|
||||||
"title": "用户组",
|
"title": "用户组",
|
||||||
"newGroupAction": "新用户组",
|
|
||||||
"name": "名称",
|
"name": "名称",
|
||||||
"users": "用户",
|
"users": "用户",
|
||||||
"externalLdapTooltip": "使用外部 LDAP 目录"
|
"externalLdapTooltip": "使用外部 LDAP 目录"
|
||||||
@@ -893,7 +890,6 @@
|
|||||||
},
|
},
|
||||||
"domains": {
|
"domains": {
|
||||||
"title": "域名和证书",
|
"title": "域名和证书",
|
||||||
"addDomain": "添加域名",
|
|
||||||
"domain": "域名",
|
"domain": "域名",
|
||||||
"provider": "提供商",
|
"provider": "提供商",
|
||||||
"tooltipEdit": "编辑域名",
|
"tooltipEdit": "编辑域名",
|
||||||
@@ -1589,7 +1585,6 @@
|
|||||||
"addAction": "添加",
|
"addAction": "添加",
|
||||||
"title": "添加磁盘卷"
|
"title": "添加磁盘卷"
|
||||||
},
|
},
|
||||||
"addVolumeAction": "添加卷",
|
|
||||||
"name": "名称",
|
"name": "名称",
|
||||||
"hostPath": "主机路径",
|
"hostPath": "主机路径",
|
||||||
"removeVolumeDialog": {
|
"removeVolumeDialog": {
|
||||||
|
|||||||
@@ -26,10 +26,7 @@ const props = defineProps({
|
|||||||
const systemModel = SystemModel.create();
|
const systemModel = SystemModel.create();
|
||||||
const provisionModel = ProvisionModel.create();
|
const provisionModel = ProvisionModel.create();
|
||||||
|
|
||||||
const storageProviders = STORAGE_PROVIDERS.concat([
|
const storageProviders = Array.from(STORAGE_PROVIDERS);
|
||||||
{ name: 'No-op (Only for testing)', value: 'noop' }
|
|
||||||
]);
|
|
||||||
|
|
||||||
const blockDevices = ref([]);
|
const blockDevices = ref([]);
|
||||||
const disk = ref('');
|
const disk = ref('');
|
||||||
const gcsKeyFileName = ref('');
|
const gcsKeyFileName = ref('');
|
||||||
@@ -120,9 +117,6 @@ onMounted(async () => {
|
|||||||
<SingleSelect id="providerInput" v-model="provider" :options="storageProviders" option-key="value" option-label="name" />
|
<SingleSelect id="providerInput" v-model="provider" :options="storageProviders" option-key="value" option-label="name" />
|
||||||
</FormGroup>
|
</FormGroup>
|
||||||
|
|
||||||
<!-- Noop -->
|
|
||||||
<div class="warning-label" v-show="provider === 'noop'">{{ $t('backups.configureBackupStorage.noopNote') }}</div>
|
|
||||||
|
|
||||||
<!-- mountpoint -->
|
<!-- mountpoint -->
|
||||||
<FormGroup v-if="provider === 'mountpoint'">
|
<FormGroup v-if="provider === 'mountpoint'">
|
||||||
<label for="mountPointInput">{{ $t('backups.configureBackupStorage.mountPoint') }}</label>
|
<label for="mountPointInput">{{ $t('backups.configureBackupStorage.mountPoint') }}</label>
|
||||||
@@ -206,7 +200,7 @@ onMounted(async () => {
|
|||||||
<TextInput id="bucketInput" v-model="providerConfig.bucket" required />
|
<TextInput id="bucketInput" v-model="providerConfig.bucket" required />
|
||||||
</FormGroup>
|
</FormGroup>
|
||||||
|
|
||||||
<FormGroup v-if="(provider !== 'filesystem' && provider !== 'noop') && !importOnly">
|
<FormGroup v-if="provider !== 'filesystem' && !importOnly">
|
||||||
<label for="prefixInput">{{ $t('backups.configureBackupStorage.prefix') }}</label>
|
<label for="prefixInput">{{ $t('backups.configureBackupStorage.prefix') }}</label>
|
||||||
<TextInput id="prefixInput" v-model="providerConfig.prefix" placeholder="Prefix for backup file names" />
|
<TextInput id="prefixInput" v-model="providerConfig.prefix" placeholder="Prefix for backup file names" />
|
||||||
</FormGroup>
|
</FormGroup>
|
||||||
@@ -265,7 +259,7 @@ onMounted(async () => {
|
|||||||
<div class="error-label" v-show="gcsFileParseError">{{ gcsFileParseError }}</div>
|
<div class="error-label" v-show="gcsFileParseError">{{ gcsFileParseError }}</div>
|
||||||
</FormGroup>
|
</FormGroup>
|
||||||
|
|
||||||
<FormGroup v-if="provider !== 'noop'">
|
<FormGroup>
|
||||||
<label for="formatInput">{{ $t('backups.configureBackupStorage.format') }} <sup><a href="https://docs.cloudron.io/backups/#backup-formats" class="help" target="_blank"><i class="fa fa-question-circle"></i></a></sup></label>
|
<label for="formatInput">{{ $t('backups.configureBackupStorage.format') }} <sup><a href="https://docs.cloudron.io/backups/#backup-formats" class="help" target="_blank"><i class="fa fa-question-circle"></i></a></sup></label>
|
||||||
<SingleSelect id="formatInput" v-model="format" :options="BACKUP_FORMATS" option-label="name" option-key="value" required />
|
<SingleSelect id="formatInput" v-model="format" :options="BACKUP_FORMATS" option-label="name" option-key="value" required />
|
||||||
<div class="warning-label" v-show="format === 'rsync' && (s3like(provider) || provider === 'gcs') && !importOnly">{{ $t('backups.configureBackupStorage.s3LikeNote') }} <sup><a href="https://docs.cloudron.io/backups/#amazon-s3" class="help" target="_blank"><i class="fa fa-question-circle"></i></a></sup></div>
|
<div class="warning-label" v-show="format === 'rsync' && (s3like(provider) || provider === 'gcs') && !importOnly">{{ $t('backups.configureBackupStorage.s3LikeNote') }} <sup><a href="https://docs.cloudron.io/backups/#amazon-s3" class="help" target="_blank"><i class="fa fa-question-circle"></i></a></sup></div>
|
||||||
|
|||||||
@@ -6,6 +6,10 @@ const child_process = require('node:child_process'),
|
|||||||
path = require('node:path'),
|
path = require('node:path'),
|
||||||
paths = require('../src/paths.js');
|
paths = require('../src/paths.js');
|
||||||
|
|
||||||
|
async function deleteOldSettings(db) {
|
||||||
|
await db.runSql('DELETE FROM settings WHERE name=? OR name=? OR name=?', [ 'backup_storage', 'backup_limits', 'backup_policy' ]);
|
||||||
|
}
|
||||||
|
|
||||||
exports.up = async function (db) {
|
exports.up = async function (db) {
|
||||||
const cmd = 'CREATE TABLE IF NOT EXISTS backupSites(' +
|
const cmd = 'CREATE TABLE IF NOT EXISTS backupSites(' +
|
||||||
'id VARCHAR(128) NOT NULL UNIQUE,' +
|
'id VARCHAR(128) NOT NULL UNIQUE,' +
|
||||||
@@ -31,7 +35,7 @@ exports.up = async function (db) {
|
|||||||
const domainCountResults = await db.runSql('SELECT COUNT(*) AS total FROM domains');
|
const domainCountResults = await db.runSql('SELECT COUNT(*) AS total FROM domains');
|
||||||
if (domainCountResults[0].total === 0) {
|
if (domainCountResults[0].total === 0) {
|
||||||
console.log('This cloudron is not activated. Deleting the default backup config from 20171205124434-settings-default-backupConfig.js'); // will be added at provision time
|
console.log('This cloudron is not activated. Deleting the default backup config from 20171205124434-settings-default-backupConfig.js'); // will be added at provision time
|
||||||
await db.runSql('DELETE FROM settings WHERE name=? OR name=? OR name=?', [ 'backup_storage', 'backup_limits', 'backup_policy']);
|
await deleteOldSettings(db);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -53,8 +57,10 @@ exports.up = async function (db) {
|
|||||||
// provider is top level
|
// provider is top level
|
||||||
provider = tmp.provider;
|
provider = tmp.provider;
|
||||||
|
|
||||||
|
if (provider === 'noop') return await deleteOldSettings(db); // noop is migrated as 0 sites. user has to manually update with skipBackup
|
||||||
|
|
||||||
// the s3 and filesystem backend use the _provider internal property
|
// the s3 and filesystem backend use the _provider internal property
|
||||||
if (provider !== 'gcs' && provider !== 'noop') tmp._provider = tmp.provider;
|
if (provider !== 'gcs') tmp._provider = tmp.provider;
|
||||||
delete tmp.provider;
|
delete tmp.provider;
|
||||||
|
|
||||||
// backupFolder is now backupDir
|
// backupFolder is now backupDir
|
||||||
@@ -96,7 +102,7 @@ exports.up = async function (db) {
|
|||||||
await db.runSql('START TRANSACTION');
|
await db.runSql('START TRANSACTION');
|
||||||
await db.runSql('INSERT INTO backupSites (id, name, provider, configJson, limitsJson, integrityKeyPairJson, retentionJson, schedule, encryptionJson, format, main) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)',
|
await db.runSql('INSERT INTO backupSites (id, name, provider, configJson, limitsJson, integrityKeyPairJson, retentionJson, schedule, encryptionJson, format, main) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)',
|
||||||
[ id, name, provider, JSON.stringify(config), JSON.stringify(limits), JSON.stringify(integrityKeyPair), JSON.stringify(retention), schedule, JSON.stringify(encryption), format, main ]);
|
[ id, name, provider, JSON.stringify(config), JSON.stringify(limits), JSON.stringify(integrityKeyPair), JSON.stringify(retention), schedule, JSON.stringify(encryption), format, main ]);
|
||||||
await db.runSql('DELETE FROM settings WHERE name=? OR name=? OR name=?', [ 'backup_storage', 'backup_limits', 'backup_policy' ]);
|
await deleteOldSettings(db);
|
||||||
await db.runSql('COMMIT');
|
await db.runSql('COMMIT');
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -19,12 +19,9 @@ function api(format) {
|
|||||||
throw new BoxError(BoxError.INTERNAL_ERROR, `Undefined format ${format}`);
|
throw new BoxError(BoxError.INTERNAL_ERROR, `Undefined format ${format}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
function validateFormat(provider, format) {
|
function validateFormat(format) {
|
||||||
assert.strictEqual(typeof provider, 'string');
|
|
||||||
assert.strictEqual(typeof format, 'string');
|
assert.strictEqual(typeof format, 'string');
|
||||||
|
|
||||||
if (provider === 'noop') return null;
|
|
||||||
|
|
||||||
if (format === 'tgz' || format == 'rsync') return null;
|
if (format === 'tgz' || format == 'rsync') return null;
|
||||||
|
|
||||||
return new BoxError(BoxError.BAD_FIELD, 'Invalid backup format');
|
return new BoxError(BoxError.BAD_FIELD, 'Invalid backup format');
|
||||||
|
|||||||
+2
-3
@@ -93,7 +93,6 @@ function storageApi(backupSite) {
|
|||||||
case 'upcloud-objectstorage': return require('./storage/s3.js');
|
case 'upcloud-objectstorage': return require('./storage/s3.js');
|
||||||
case 'contabo-objectstorage': return require('./storage/s3.js');
|
case 'contabo-objectstorage': return require('./storage/s3.js');
|
||||||
case 'hetzner-objectstorage': return require('./storage/s3.js');
|
case 'hetzner-objectstorage': return require('./storage/s3.js');
|
||||||
case 'noop': return require('./storage/noop.js');
|
|
||||||
default: throw new BoxError(BoxError.BAD_FIELD, `Unknown provider: ${backupSite.provider}`);
|
default: throw new BoxError(BoxError.BAD_FIELD, `Unknown provider: ${backupSite.provider}`);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -517,7 +516,7 @@ async function add(data, auditSource) {
|
|||||||
encryptedFilenames = data.encryptedFilenames || false,
|
encryptedFilenames = data.encryptedFilenames || false,
|
||||||
encryptionPasswordHint = data.encryptionPasswordHint || null;
|
encryptionPasswordHint = data.encryptionPasswordHint || null;
|
||||||
|
|
||||||
const formatError = backupFormats.validateFormat(provider, format);
|
const formatError = backupFormats.validateFormat(format);
|
||||||
if (formatError) throw formatError;
|
if (formatError) throw formatError;
|
||||||
|
|
||||||
const nameError = validateName(name);
|
const nameError = validateName(name);
|
||||||
@@ -581,7 +580,7 @@ async function createPseudo(data) {
|
|||||||
const encryptionPassword = data.encryptionPassword ?? null,
|
const encryptionPassword = data.encryptionPassword ?? null,
|
||||||
encryptedFilenames = !!data.encryptedFilenames;
|
encryptedFilenames = !!data.encryptedFilenames;
|
||||||
|
|
||||||
const formatError = backupFormats.validateFormat(provider, format);
|
const formatError = backupFormats.validateFormat(format);
|
||||||
if (formatError) throw formatError;
|
if (formatError) throw formatError;
|
||||||
|
|
||||||
let encryption = null;
|
let encryption = null;
|
||||||
|
|||||||
@@ -1,135 +0,0 @@
|
|||||||
'use strict';
|
|
||||||
|
|
||||||
exports = module.exports = {
|
|
||||||
getAvailableSize,
|
|
||||||
getStatus,
|
|
||||||
|
|
||||||
upload,
|
|
||||||
exists,
|
|
||||||
download,
|
|
||||||
copy,
|
|
||||||
|
|
||||||
listDir,
|
|
||||||
|
|
||||||
remove,
|
|
||||||
removeDir,
|
|
||||||
|
|
||||||
setup,
|
|
||||||
teardown,
|
|
||||||
cleanup,
|
|
||||||
|
|
||||||
verifyConfig,
|
|
||||||
removePrivateFields,
|
|
||||||
injectPrivateFields
|
|
||||||
};
|
|
||||||
|
|
||||||
const assert = require('node:assert'),
|
|
||||||
BoxError = require('../boxerror.js'),
|
|
||||||
debug = require('debug')('box:storage/noop'),
|
|
||||||
fs = require('node:fs');
|
|
||||||
|
|
||||||
async function getAvailableSize(apiConfig) {
|
|
||||||
assert.strictEqual(typeof apiConfig, 'object');
|
|
||||||
|
|
||||||
return Number.POSITIVE_INFINITY;
|
|
||||||
}
|
|
||||||
|
|
||||||
async function getStatus(apiConfig) {
|
|
||||||
assert.strictEqual(typeof apiConfig, 'object');
|
|
||||||
|
|
||||||
return { state: 'active' };
|
|
||||||
}
|
|
||||||
|
|
||||||
async function upload(apiConfig, remotePath) {
|
|
||||||
assert.strictEqual(typeof apiConfig, 'object');
|
|
||||||
assert.strictEqual(typeof remotePath, 'string');
|
|
||||||
|
|
||||||
debug(`upload: ${remotePath}`);
|
|
||||||
|
|
||||||
const uploadStream = fs.createWriteStream('/dev/null');
|
|
||||||
|
|
||||||
return {
|
|
||||||
stream: uploadStream,
|
|
||||||
async finish() {}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
async function exists(apiConfig, remotePath) {
|
|
||||||
assert.strictEqual(typeof apiConfig, 'object');
|
|
||||||
assert.strictEqual(typeof remotePath, 'string');
|
|
||||||
|
|
||||||
debug(`exists: ${remotePath}`);
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
async function download(apiConfig, remotePath) {
|
|
||||||
assert.strictEqual(typeof apiConfig, 'object');
|
|
||||||
assert.strictEqual(typeof remotePath, 'string');
|
|
||||||
|
|
||||||
debug('download: %s', remotePath);
|
|
||||||
|
|
||||||
throw new BoxError(BoxError.NOT_IMPLEMENTED, 'Cannot download from noop backend');
|
|
||||||
}
|
|
||||||
|
|
||||||
async function listDir(apiConfig, remotePath, batchSize, marker) {
|
|
||||||
assert.strictEqual(typeof apiConfig, 'object');
|
|
||||||
assert.strictEqual(typeof remotePath, 'string');
|
|
||||||
assert.strictEqual(typeof batchSize, 'number');
|
|
||||||
assert(typeof marker !== 'undefined');
|
|
||||||
|
|
||||||
return { entries: [], marker: null };
|
|
||||||
}
|
|
||||||
|
|
||||||
async function copy(apiConfig, fromRemotePath, toRemotePath, progressCallback) {
|
|
||||||
assert.strictEqual(typeof apiConfig, 'object');
|
|
||||||
assert.strictEqual(typeof fromRemotePath, 'string');
|
|
||||||
assert.strictEqual(typeof toRemotePath, 'string');
|
|
||||||
assert.strictEqual(typeof progressCallback, 'function');
|
|
||||||
|
|
||||||
debug(`copy: ${fromRemotePath} -> ${toRemotePath}`);
|
|
||||||
}
|
|
||||||
|
|
||||||
async function remove(apiConfig, filename) {
|
|
||||||
assert.strictEqual(typeof apiConfig, 'object');
|
|
||||||
assert.strictEqual(typeof filename, 'string');
|
|
||||||
|
|
||||||
debug(`remove: ${filename}`);
|
|
||||||
}
|
|
||||||
|
|
||||||
async function removeDir(apiConfig, remotePathPrefix, progressCallback) {
|
|
||||||
assert.strictEqual(typeof apiConfig, 'object');
|
|
||||||
assert.strictEqual(typeof remotePathPrefix, 'string');
|
|
||||||
assert.strictEqual(typeof progressCallback, 'function');
|
|
||||||
|
|
||||||
debug(`removeDir: ${remotePathPrefix}`);
|
|
||||||
}
|
|
||||||
|
|
||||||
async function cleanup(apiConfig, progressCallback) {
|
|
||||||
assert.strictEqual(typeof apiConfig, 'object');
|
|
||||||
assert.strictEqual(typeof progressCallback, 'function');
|
|
||||||
}
|
|
||||||
|
|
||||||
async function verifyConfig({ id, provider, config }) {
|
|
||||||
assert.strictEqual(typeof id, 'string');
|
|
||||||
assert.strictEqual(typeof provider, 'string');
|
|
||||||
assert.strictEqual(typeof config, 'object');
|
|
||||||
|
|
||||||
return {};
|
|
||||||
}
|
|
||||||
|
|
||||||
async function setup(apiConfig) {
|
|
||||||
assert.strictEqual(typeof apiConfig, 'object');
|
|
||||||
}
|
|
||||||
|
|
||||||
async function teardown(apiConfig) {
|
|
||||||
assert.strictEqual(typeof apiConfig, 'object');
|
|
||||||
}
|
|
||||||
|
|
||||||
function removePrivateFields(apiConfig) {
|
|
||||||
return apiConfig;
|
|
||||||
}
|
|
||||||
|
|
||||||
// eslint-disable-next-line no-unused-vars
|
|
||||||
function injectPrivateFields(newConfig, currentConfig) {
|
|
||||||
}
|
|
||||||
@@ -15,7 +15,6 @@ const backupSites = require('../backupsites.js'),
|
|||||||
filesystem = require('../storage/filesystem.js'),
|
filesystem = require('../storage/filesystem.js'),
|
||||||
fs = require('node:fs'),
|
fs = require('node:fs'),
|
||||||
gcs = require('../storage/gcs.js'),
|
gcs = require('../storage/gcs.js'),
|
||||||
noop = require('../storage/noop.js'),
|
|
||||||
os = require('node:os'),
|
os = require('node:os'),
|
||||||
path = require('node:path'),
|
path = require('node:path'),
|
||||||
s3 = require('../storage/s3.js'),
|
s3 = require('../storage/s3.js'),
|
||||||
@@ -150,40 +149,6 @@ describe('Storage', function () {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('noop', function () {
|
|
||||||
const gBackupConfig = {
|
|
||||||
provider: 'noop',
|
|
||||||
format: 'tgz'
|
|
||||||
};
|
|
||||||
|
|
||||||
it('upload works', async function () {
|
|
||||||
await noop.upload(gBackupConfig, 'file', {});
|
|
||||||
});
|
|
||||||
|
|
||||||
it('can download file', async function () {
|
|
||||||
const [error] = await safe(noop.download(gBackupConfig, 'file'));
|
|
||||||
expect(error).to.be.an(Error);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('list dir contents of source dir', async function () {
|
|
||||||
const result = await noop.listDir(gBackupConfig, 'sourceDir', 1000, null /* marker */);
|
|
||||||
expect(result.marker).to.be(null);
|
|
||||||
expect(result.entries).to.eql([]);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('can copy', async function () {
|
|
||||||
await noop.copy(gBackupConfig, 'sourceFile', 'destFile', () => {});
|
|
||||||
});
|
|
||||||
|
|
||||||
it('can remove file', async function () {
|
|
||||||
await noop.remove(gBackupConfig, 'sourceFile');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('can remove empty dir', async function () {
|
|
||||||
await noop.remove(gBackupConfig, 'sourceDir');
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('s3', function () {
|
describe('s3', function () {
|
||||||
const basePath = path.join(os.tmpdir(), 's3-backup-test-buckets');
|
const basePath = path.join(os.tmpdir(), 's3-backup-test-buckets');
|
||||||
const backupConfig = {
|
const backupConfig = {
|
||||||
|
|||||||
Reference in New Issue
Block a user