Aller au contenu principal

Sauvegarde et migration

Système de sauvegarde et migration (/admin/backup L'exportation et le téléchargement de sauvegardes complètes, la restauration de l'importation de bibliothèques complètes, l'exportation / l'importation de configurations de site légères et l'inspection et la reconstruction de la bibliothèque vectorielle Qdrant. La sauvegarde complète est un fichier logique neutre du moteur, le même zip peut être importé entre SQLite et les déploiements PostgreSQL, la migration transversale, la migration transversale, la récupération des catastrophes sont tous sur cette voie, sans avoir à toucher pg_dump ou des documents de base de données.

Exportation de sauvegarde complète

Quoi dans les archives ?

Le produit d'exportation est un seul zip, la structure interne:

aivory-docker-backup-20260711-153000-xxxxxxxxxx.zip
├── manifest.json # 格式版本、源引擎方言、各表行数、是否含文件
├── db/
│ ├── users.jsonl # 每表一个 JSONL,每行一个 JSON 对象
│ ├── conversations.jsonl # 按外键安全顺序排列,引擎中立
│ ├── messages.jsonl
│ └── ... # 全部数据表
├── files/ # 可选:勾选「包含上传文件与生成产物」时才有
│ ├── uploads/... # 用户上传的文件
│ └── artifacts/... # 模型生成的产物(图片、文档等)
└── qdrant/ # 可选:部署配置了 QDRANT_URL 时自动包含
└── collections/
└── aivory_c1536.jsonl # 逐 collection 的向量点位导出

Les lignes de données sont logique JSONL plutôt que de base de données de transfert: la colonne binaire Base64 codé, grand nombre intégral sécurisé précision, c'est la raison pour laquelle il peut traverser SQLite / PostgreSQL. aivory_c<维度> Nom (par exemple, 1536 modèle dimensionnel correspondant aivory_c1536)。

Exporter les options

OptionsDéfinitivementExpliquer
Contient des documents téléchargés et des produits générésL’archivage des uploads et des répertoires d’artefacts est nettement plus grand ; il n’y a pas que les lignes de base de données.
Qdrant vecteurautomatiqueDéploiement prévu. QDRANT_URL C'est-à-dire qu'il n'y a pas besoin d'inclure et de sélectionner; le déploiement non configuré de Qdrant n'a pas naturellement ce paragraphe.

Liste des tâches asynchrones et des archives

Allez sur la page « Exporter sauvegarde ». ** Les missions asymétriques **: Après avoir cliqué sur la tâche est générée en arrière-plan, la page affiche le progrès (en cours de préparation, de lecture de la base de données, d'écriture à l'archivage), pendant lequel vous pouvez quitter la page.

  • Une seule tâche d'exportation est en cours d'exécution en même temps; l'exportation est en contradiction avec la tâche maintenance des vecteurs en cours d'exécution, et l'autre partie refuse de démarrer.
  • L'exportation est basée sur les transactions de lecture uniquement, le temps est cohérent et l'utilisation normale de l'utilisateur pendant la période n'est pas affectée.
  • Une fois l'archivage terminé, il apparaît dans la liste des "archives générées", puis le point "Télécharger" est enregistré localement. BACKUP_DIR Catégorie (par défaut ./data/backups Le déploiement de composition est cartographié dans les volumes de données), la liste est inversée en fonction du temps de génération.

Un autre endpoint de flux de synchronisation est adapté aux sauvegardes périodiques de script: GET /api/admin/backup/export Rechercher les paramètres files=1 contenant des documents, qdrant=0 Il est possible d'exclure le vecteur), la réponse est directement le flux zip. La petite bibliothèque l'utilise étape par étape, la grande bibliothèque suggère de faire des tâches asynchrones sur la page et d'éviter de télécharger la connexion pendant une longue période.

Les fichiers ne sont pas nettoyés automatiquement.

Les archives générées par l'exportation asynchrone resteront toujours sur le serveur. BACKUP_DIR Dans ce cas, le système ne fait pas de rotation automatique. Chaque volume d'archivage peut être assez grand (en particulier avec des fichiers et des vecteurs), puis téléchargez le stockage hors ligne, rappelez-vous régulièrement à ce répertoire pour supprimer l'archivage ancien, afin d'éviter que le volume de données soit occupé par la sauvegarde.

Différence parallèle: l'utilisateur ordinaire dans les "Réglages > Confidentialité" a également un "Exporter toutes les données", c'est-à-dire l'exportation de JSON de type GDPR de l'utilisateur individuel, avec la sauvegarde de l'administrateur complet ici est deux choses, voir Partage et gestion des données

Remplacement (Remplacement de l’intégralité du contenu)

Étapes opérationnelles

  1. Dans la zone Importation et restauration, sélectionnez une archive zip exportée.
  2. Saisissez le mot de confirmation dans la fenêtre de confirmation. REPLACE (Il doit être totalement cohérent)
  3. Cliquez sur « Importer et remplacer les données » et attendez que cela soit fait.
  4. Une fois l'importation réussie, la session actuelle est immédiatement invalide et se déconnecte automatiquement. ** Le code du compte en réserve. ** Enregistrer à nouveau.

Remplacer la langue

L’introduction est ** Remplacement de la caisse ** Pas de fusion :

  • Vider toutes les tables dans une transaction de base de données, puis appuyer sur l'ordre de sécurité de la touche extérieure pour les recharger de JSONL à la table; les colonnes qui sont présentes dans l'archive et qui ne sont pas dans la version actuelle sont oubliées (compatible à l'avant). ** Aucune étape échouée n'est soumise, la base de données reste dans l'état avant l'importation **。
  • Récupération de fichiers: le préfixe du chemin de stockage enregistré dans l'archivage sera réécrit comme un carnet de téléchargement / produit natif, et le changement de chemin de machine ne nécessitera pas de traitement manuel.
  • Récupération vectorielle : l'archivage contient des sections Qdrant pour recréer les points de collection; les alertes de récupération vectorielle n'interrompent pas l'importation et peuvent être complétées par maintenance des vecteurs.
  • La bibliothèque cible PostgreSQL rétablit automatiquement la séquence d'augmentation automatique ; la bibliothèque cible SQLite ferme temporairement la vérification des clés extérieures pendant la récupération. ** Entrez le moteur dans la boîte. ** Les sauvegardes SQLite peuvent être importées dans le déploiement Postgres et vice versa.
  • Une fois l'importation terminée, la mise en cache des paramètres est immédiatement invalide et la configuration du site dans la sauvegarde prend effet immédiatement.
Règles de dégradation des administrateurs (re-migration obligatoire)

Une fois la mise en place terminée, ** En plus de l'exécution de la boîte aux lettres d'administrateur importée, tous les comptes d'administrateur apportés par la sauvegarde sont automatiquement réduits à des utilisateurs ordinaires. ** C’est un design anti-retrait : sinon, quiconque obtient une sauvegarde structurée peut s’insérer dans un compte d’administrateur.

Impact réel : ** La boîte aux lettres d'administrateur créée lors du lancement de la nouvelle instance doit correspondre à la boîte aux lettres d'administrateur de l'ancienne instance ** Si ce n'est pas le cas, les administrateurs qui ont importé l'ancienne instance deviennent tous des utilisateurs ordinaires et l'exécution des comptes importés (dont la boîte aux lettres n'existe peut-être pas dans la sauvegarde d'utilisateurs ordinaires) n'est pas nécessairement connecté à la console d'administration, il est nécessaire de réparer manuellement la base de données.

Les limites de taille avec Cloudflare

Importation du plafond dur téléchargé par les variables environnementales MAX_BACKUP_BYTES Contrôle par défaut 20 GiB (voir Variables environnementales clés Si le site se trouve derrière Cloudflare, notez que Cloudflare a un plafond de paquets de niveau de 100 Mo pour l'objet de la requête et que le grand archive doit contourner l'importation de la station source d'agence directement connectée. Configuration de Cloudflare Un proxy inverse (en anglais) client_max_body_size Il est également nécessaire d'ajouter un déploiement, voir Proxy inverse

Insérer des erreurs fréquentes

phénomèneCauses et traitement
400, le mot de confirmation ne correspond pasREPLACE Les caractères doivent être cohérents (en gros et sans espace).
413 / La demande est trop grandePlus d’archives MAX_BACKUP_BYTES, ou intercepté par Cloudflare / Re-Generated Request Body Upper Limit; agrandissement de la limite ou un canal de connexion directe
Manifest échec des examensLe téléchargement n'est pas un zip de sauvegarde exporté par le système, ou le téléchargement / transfert est coupé; réexporter et vérifier la taille du fichier
restore failed (no changes committed)Récupération de l'erreur d'intermédiaire, la transaction a été complètement retournée, la base de données est toujours dans l'état avant l'importation; Regardez le journal de service de positionnement des tables spécifiques et essayez à nouveau après.
Importation réussie mais la base de connaissances ne trouve pas de contenuLes sauvegardes ne contiennent pas de vecteur (les anciennes instances ne sont pas équipées de Qdrant) ou la récupération du vecteur est avertie; la récupération peut être effectuée une fois à l'aide de la fonction « Vector Check »

Configuration de l’exportation / de l’importation (pathes légères)

Il y a une autre voie plus légère sous la sauvegarde complète: le déplacement uniquement. ** Positionnement du site ** Il est idéal pour copier un ensemble de configurations de la machine de développement pour la production, la configuration unifiée sur le déploiement ou la préparation aux catastrophes.

Directioncomportement
Exportation de configuration ZIPConfiguration de site, canal, modèle, compétences, fournisseur OAuth, style d'image, groupe d'utilisateurs, cotes de modèle, et fichiers d'actifs d'icônes et de compétences
Importer le fichierpar ID ** La fusion UPSERT ** La barre de configuration de l'ID est couverte, la configuration est conservée localement et ne touche jamais les utilisateurs, les conversations, les messages, les fichiers de téléchargement, les sessions et les journaux.

Importation de configuration non destructive et sécurisée pour les sessions: pas de perte nécessaire REPLACE Il n'est pas nécessaire de se connecter à nouveau après l'importation, une seule case de confirmation peut être exécutée.

Contient une clé explicite.

Mise en place du zip. ** explicite ** Le canal API Key, OAuth Client Secret, le mot de passe SMTP, le stockage d'objet et les clés de recherche (sauf si cela ne fonctionne pas immédiatement après l'importation).

Migration entre les moteurs : SQLite à PostgreSQL

Prenez l’exemple le plus courant de « démarrage de SQLite à machine unique, migration à Postgres après avoir grandi » :

  1. ** Anciens exemples **: accédez à Sauvegarde et migration et sélectionnez « Contient des fichiers téléchargés et des produits générés » pour exporter la sauvegarde complète et télécharger (le vecteur de mots configuré avec Qdrant est automatiquement dans le paquet).
  2. ** Nouveaux exemples **: selon Déploiement de Docker Compose Tirez le service complet du mode Postgres et accédez au site /setup Configuration initiale. ** La boîte aux lettres d’un administrateur doit être identique à celle de l’ancien administrateur. ** (Le mot de passe peut être défini à votre guise, à condition que le mot de passe dans la sauvegarde soit importé.)
  3. Connectez-vous avec cet administrateur, accédez à Système > Sauvegarde et migration, sélectionnez l'archivage, entrez REPLACE La séquence, les boutons extérieurs, la réécriture du chemin sont tous traités automatiquement.
  4. L'importation se termine automatiquement et vous connectez à nouveau avec le mot de passe du compte de l'ancienne instance.
  5. Vérification : nombre de listes d’utilisateurs, sortie de plusieurs conversations et téléchargement de fichiers, récupération de base de connaissances. Si la sauvegarde ne contient pas de vecteur (les anciennes instances ne sont pas compatibles avec Qdrant) ou si la récupération est anormale, reconstruire avec maintenance des vecteurs.

Les étapes de l'inversion (Postgres migration vers SQLite) sont identiques, voir Modèle SQLite

Liste des migrations aériennes

Lors du changement de serveur (moteur inchangé), vérifiez dans l'ordre suivant :

  1. Exporter les sauvegardes complètes (y compris les fichiers, les vecteurs) et les télécharger localement.
  2. Nouveau déploiement ** Versions identiques ou mises à jour ** L'image miroir (l'importation de nouvelles sauvegardes dans les anciennes versions n'est pas garantie).
  3. Nouveau lancement /setup ** Créer un numéro de boîte aux lettres de l'ancien administrateur d'instances ** (Règles de dégradation, voir avertissement rouge ci-dessus).
  4. Archives supérieures à 100 Mo et Cloudflare sur la nouvelle machine: Prêt pour un canal de connexion directe (native) 127.0.0.1:8787 Dans les nuages gris, voir Configuration de Cloudflare
  5. Importation, réinscription, vérification (utilisateur / conversation / fichier / base de connaissances récupération / clé canal fonctionne).
  6. Le DNS passe à la nouvelle machine ; les données de la vieille machine sont conservées jusqu'à ce que la vérification soit complètement terminée.

Maintenance des vecteurs

La zone de vérification vectorielle gère la cohérence de la bibliothèque vectorielle Qdrant avec la base de données, des scénarios d'utilisation courante : une ** Pas de vecteur ** Des sauvegardes, des migrations d’archives de marque ancienne, des volumes de données Qdrant perdus ou des instances Qdrant remplacées.

opérationnelcomportementcoûts
Vérifier le vecteurVérifiez un par un si les tranches de document dans la base de données contiennent des vecteurs non vides dans Qdrant, produisez un rapport d'audit: devrait / normal / manquant / vecteur vide / saut, et énumérez des exemples de problèmesGratuit, lisible uniquement, sans appel à l'interface embarquée
Reconstruction du vecteur manquantPour les défaillances et les défaillances, utilisez ** Les blocs de texte stockés dans la base de données ** Réappelez le modèle d'embedding pour écrire le vecteur correspondant. aivory_c<维度> collection; exécution par division de modèle d'embedding, reconstruction / nombre d'échecs après l'achèvement du rapport** Consommation d'appels API intégrés ** La reconstruction d'une base de connaissances générera un coût d'incorporation réel, en tenant compte de la facture d'incorporation du canal avant d'être exécutée

Le point :

  • Reconstruire ** Pas besoin de documents originaux. ** Le texte de coupe était à l'origine dans la base de données, de sorte que "la sauvegarde sans vecteur" ne perd pas de données, il suffit de dépenser une fois le coût d'incorporation pour récupérer.
  • Les deux tâches sont des tâches d'arrière-plan asynchrones, le progrès des requêtes de page; il n'y en a qu'une à exécuter en même temps et l'exportation de sauvegarde est réciproque.
  • À condition de déployer l'arrière-plan du vecteur Qdrant configuré ; le bouton non configuré indique directement "l'arrière-plan du vecteur n'est pas configuré".

Mise à niveau et habitudes de sauvegarde quotidiennes

Mise à jour vers la mise à jour :

cd /opt/aivory # 你的 compose 目录
docker compose pull
docker compose up -d

La structure de base de données lorsque la nouvelle version est lancée pour la première fois ** Migration automatique ** (augmentation de la colonne, création de tableaux), pas besoin d'exécuter manuellement SQL. Même si c'est le cas, adoptez deux habitudes :

  • ** Exporter une sauvegarde complète avant la mise à niveau ** La migration automatique est prospective, le retour à l'ancienne version n'est pas garanti; l'archivage est à portée de main, tout incident de mise à niveau peut être importé une fois avant la mise à niveau.
  • ** Exporter et conserver régulièrement **。BACKUP_DIR L'archivage et la base de données sont perdus sur la même machine, le disque échoue ; le téléchargement de l'archivage dans le stockage d'objet ou sur une autre machine est un véritable désastre.La configuration ZIP est également recommandée pour laisser une copie après chaque changement de configuration.
Fréquence de référence

Les petites équipes se déploient toutes les semaines (y compris les fichiers) + chaque mise à niveau est suffisante pour contrôler les pertes dans le pire des cas en quelques jours. L'archivage est un zip ordinaire, et il est possible de faire des rotations de réserve directement avec les stratégies de cycle de vie stockées par n'importe quel objet.