Déploiement rapide
Cette page vous permet d'utiliser Docker Compose pour tirer en 5 minutes une pile complète d'Aivory : PostgreSQL, Redis, Qdrant, code intégré bac à sable, et un SPA front-end de serveur simultané. /api Derrière le app Containers (les deux provenant de la même source, sans nom de domaine ni configuration CORS).
L’ensemble du stack est décrit par un fichier compose qui comprend les services suivants :
| service | Miroir | Rôle |
|---|---|---|
postgres | postgres:16-alpine | Stockage relationnel : utilisateur, conversation, base de connaissances, usage, etc. |
redis | redis:7-alpine | Cache, compteur de flux limité, pub/sub de sortie de flux inter-processeurs |
qdrant | qdrant/qdrant:v1.12.4 | Recherche de RAG |
sandbox | ghcr.io/hjxwz123/aivory-sandbox-sidecar | Exécution du code intégré bac à sable, accessible uniquement en interne |
app | ghcr.io/hjxwz123/aivory-app | Un seul conteneur pour le serveur SPA et /api |
Le backend d'Aivory est automatiquement sélectionné en fonction des variables de l'environnement : SQLite intégré sans PostgreSQL, cache interne sans Redis et retour RAG intégré sans Qdrant. Modèle SQLite Cette page décrit les déploiements de production complets recommandés.
Exigences préalables
| Projets | Requête |
|---|---|
| Docker Engine | Il est installé et fonctionne normalement (docker info Pas d’erreur) |
| Docker Compose | v2(docker compose Le livre, pas l’ancienne version. docker-compose) |
| Spécifications de la machine | 2 CPU de base + 4 GB de mémoire |
| Porte | L’hébergeur 80 ports libres (modifiable, voir ci-dessous) |
| Le disque | Les bases de données, les vecteurs et les fichiers de téléchargement sont permanents sur la machine, réservés en fonction de l'utilisation |
Code intégré bac à sable par pendu /var/run/docker.sock Les conteneurs isolés sont dérivés de chaque session sur l'hôte, de sorte que l'hôte doit pouvoir exécuter directement Docker (pas pour les plates-formes de conteneurs hébergés sans processus de conservation de Docker). app de visite.
Étape 1 : Obtenir le code
git clone https://github.com/hjxwz123/Aivory.git
cd Aivory/deploy
Tous les documents relatifs au déploiement sont deploy/ Dans le catalogue : docker-compose.prod.yml 和 .env.example。
Étape 2 : Créer et éditer .env
cp .env.example .env
.env 中** Il faut modifier ** Il n'y a que trois paramètres, et tous les autres peuvent être conservés par défaut. Les trois paramètres conservés peuvent entraîner une défaillance de démarrage ou des problèmes de sécurité graves:
# 生成三个强随机值
openssl rand -hex 24 # 用作 POSTGRES_PASSWORD
openssl rand -hex 24 # 用作 REDIS_PASSWORD
openssl rand -hex 32 # 用作 JWT_SECRET
| Variable | Requête | Expliquer |
|---|---|---|
POSTGRES_PASSWORD | obligatoire | Password PostgreSQL. compose refuse directement le démarrage lorsqu'il n'est pas configuré |
REDIS_PASSWORD | obligatoire | Parole Redis. compose refuse directement le démarrage lorsqu'il n'est pas configuré |
JWT_SECRET | La longueur doit être d'au moins 32 caractères | Émettre des clés pour les jetons de connexion. Dans un environnement de production, Aivory détecte des clés de positionnement ou trop courtes ** Refus de démarrer ** |
Veuillez utiliser openssl rand -hex 32 Générer, ne pas utiliser de chaînes de caractères prévisibles. Attention en même temps: remplacer JWT_SECRET Toutes les sessions enregistrées seront annulées.
La clé API du fournisseur modèle (Anthropic / OpenAI / Gemini, etc.)** n'est pas disponible .env Dans la configuration**, ils sont présents dans le tableau canal de la base de données, ajoutés dans la console d'administration après le déploiement, voir Première mise en service。
Étape 3 : Démarrer
La première méthode consiste à extraire un miroir pré-construit (recommandé à partir du Registre des conteneurs de GitHub):
docker compose -f docker-compose.prod.yml pull
docker compose -f docker-compose.prod.yml up -d
Méthode 2, localement construit à partir du code source (lorsque le code a été modifié, ou lorsque l'image réfléchie officielle ne couvre pas votre architecture CPU):
docker compose -f docker-compose.prod.yml up -d --build
app Le service est indiqué en même temps. image: 和 build:: Lorsque les miroirs de pré-construction sont présents localement, Compose privilégie les miroirs, sinon il retourne à la construction locale. Les schémas de base de données sont créés par une migration automatique lors du démarrage de l'application et ne nécessitent aucune exécution manuelle de SQL.
Étape 4 : Vérification
docker compose -f docker-compose.prod.yml ps
Cinq services sont attendus : postgres、redisÊtre en healthy, qdrant、appÊtre en running, sandbox La première fois que vous démarrez, vous devez d'abord tirer l'image du temps d'exécution de bac à sable, l'inspection de santé a réservé une fenêtre de démarrage de 120 secondes, vous pouvez attendre un peu healthy。
Demander la première page. appÉcouter à l’intérieur du conteneur 8787 Le port, composé par défaut, est cartographié sur l'hôte. 80 Le Port :
curl -sI http://localhost
retourner HTTP/1.1 200 Le contenu de la page SPA est déployé avec succès si vous modifiez la cartographie des ports (par exemple, 8080:8787 Remplacer les ports dans la commande.
Les ports ne sont pas modifiés par les variables environnementales. docker-compose.prod.yml 中 app du service ports Le paragraphe, le "80:8787" Changer la gauche, par exemple "8080:8787"à droite, 8787 Surveillez les ports dans le récipient, ne changez pas.
Étape 5 : Ouvrir le site et accéder à la configuration initiale
Visite du navigateur http://<你的服务器 IP 或域名> Le nouveau déploiement n'a pas d'utilisateur et la page passe automatiquement à configuration initiale : le premier compte que vous créez devient immédiatement administrateur. Première mise en service。
Un ordre de dragon
Les blocs de commande suivants sont terminés à partir de zéro : cloner, générer des clés, écrire .env Tirez le miroir, démarrez. Convient à appliquer directement sur une nouvelle machine :
git clone https://github.com/hjxwz123/Aivory.git \
&& cd Aivory/deploy \
&& cp .env.example .env \
&& sed -i "s|^POSTGRES_PASSWORD=.*|POSTGRES_PASSWORD=$(openssl rand -hex 24)|" .env \
&& sed -i "s|^REDIS_PASSWORD=.*|REDIS_PASSWORD=$(openssl rand -hex 24)|" .env \
&& sed -i "s|^JWT_SECRET=.*|JWT_SECRET=$(openssl rand -hex 32)|" .env \
&& docker compose -f docker-compose.prod.yml pull \
&& docker compose -f docker-compose.prod.yml up -d \
&& docker compose -f docker-compose.prod.yml ps
Les commandes ci-dessus sont écrites directement sur la clé aléatoire. deploy/.env Ce fichier est identique à la chaîne de clés que vous déployez, veuillez inclure une sauvegarde et ne pas soumettre à un entrepôt public.
.env.example Variables spécifiques
Appuyez ci-dessous .env.example Chaque variable ne doit pas être modifiée.
Source du miroir
| Variable | Valeur par défaut | Il ne faut pas changer |
|---|---|---|
IMAGE_OWNER | hjxwz123 | Généralement inchangé.Vous ne modifiez votre compte que lorsque vous forcez votre entrepôt et publiez un miroir avec votre espace de dénomination GHCR |
IMAGE_TAG | latest | Généralement inchangé. si vous voulez verrouiller la version, remplacez l'étiquette miroir correspondante, évitez latest Navigation |
Réseaux et transnationaux
| Variable | Valeur par défaut | Il ne faut pas changer |
|---|---|---|
ALLOWED_ORIGINS | Non configuré (état de la note) | ** Rester inexistant ** Le déploiement d’un seul conteneur en SPA /api Il n'y a pas d'interdomaine, il n'est nécessaire que lorsque vous décomposez le front-end vers un origine différent de l'API. voir nom de domaine et HTTPS Proxy inverse |
Attention : pas WEB_PORT 或 PUBLIC_ORIGIN Les ports hôte sont modifiés dans le fichier compose ; le nom de domaine n'a pas besoin d'être configuré, le conteneur est accessible par l'hôte, l'hôte peut être utilisé et plusieurs noms de domaine peuvent être indiqués simultanément.
PostgreSQL
| Variable | Valeur par défaut | Il ne faut pas changer |
|---|---|---|
POSTGRES_USER | aivory | Pas besoin de changer |
POSTGRES_DB | aivory | Pas besoin de changer |
POSTGRES_PASSWORD | Valeur de positionnement | ** Il faut changer **, openssl rand -hex 24 |
Redis
| Variable | Valeur par défaut | Il ne faut pas changer |
|---|---|---|
REDIS_PASSWORD | Valeur de positionnement | ** Il faut changer **, openssl rand -hex 24 |
Qdrant
| Variable | Valeur par défaut | Il ne faut pas changer |
|---|---|---|
QDRANT_URL | http://qdrant:6333 | Aucune modification n'est nécessaire. La couverture n'est valable que lorsque le cluster Qdrant externe est |
QDRANT_API_KEY | 空 | Il n’y a pas de changement pendant le temps libre. qdrant Services et app Partagez la même clé interne intégrée et ouvrez la boîte; Qdrant ne publie pas de port d'hôte, il n'y a que le réseau interne. openssl rand -hex 24 Couverture |
certifié
| Variable | Valeur par défaut | Il ne faut pas changer |
|---|---|---|
JWT_SECRET | Valeur de positionnement | ** Il faut changer **, openssl rand -hex 32 au moins 32 caractères, sinon l'environnement de production refusera de démarrer |
Catalogue et sauvegarde des données
| Variable | Valeur par défaut | Il ne faut pas changer |
|---|---|---|
DATA_DIR | ./data | En fonction de la planification du disque. chemin de l'hôte, le lien est accroché au conteneur /app/data l’utilisateur pour stocker les fichiers et les produits, ** Il faut inclure la sauvegarde ** |
BACKUP_DIR | /app/data/backups | Aucune modification n'est nécessaire.Path in-container, console d'administration généré de manière asynchrone pour la migration complète du stockage ZIP, correspondant à l'hôte DATA_DIR/backups |
MAX_BACKUP_BYTES | 21474836480(20 GiB) | Généralement inchangé console d'administration ** Introduction ** La taille maximale de la sauvegarde, la quantité totale de paquets contenant des données vectorielles peut être grande, le dépassement du délai peut être augmenté. |
Les données de base de données, Redis et Qdrant sont respectivement nommées dans le volume pgdata、redisdata、qdrantdata Voir stratégie de sauvegarde. Sauvegarde et migration。
Modèle de démonstration
| Variable | Valeur par défaut | Il ne faut pas changer |
|---|---|---|
ENABLE_MOCK_PROVIDER | false | Possibilité de choisir. true Un canal de démonstration intégré est injecté, et aucune clé API réelle n'est nécessaire pour lancer la conversation à l'extrémité, ce qui permet de vérifier le déploiement avant d'ajouter un canal réel à la console d'administration. false |
Recherche en ligne (facultatif)
| Variable | Valeur par défaut | Il ne faut pas changer |
|---|---|---|
SEARCH_PROVIDER | 空 | Optionnel. Type de recherche à l'arrière: serper / brave Besoins SEARCH_API_KEY; searxng Besoins SEARCH_BASE_URL Pas besoin de clé |
SEARCH_API_KEY | 空 | 随 SEARCH_PROVIDER déterminé |
SEARCH_BASE_URL | 空 | 仅 searxng Les besoins en arrière-plan |
Ces trois fonctionnalités peuvent également être déployées et configurées en console d'administration en ligne. .env Il n'y a que le début de la période, on peut tout laisser vide.
modèle d'embedding (facultatif, base de connaissances en lien avec la qualité)
| Variable | Valeur par défaut | Il ne faut pas changer |
|---|---|---|
EMBEDDING_BASE_URL | 空 | Configuration de production recommandée. Utilisation d'un embedder local 256D intégré, disponible, mais la qualité de récupération n'est pas adaptée à la production; référence à tout format OpenAI /v1/embeddings Le point final. |
EMBEDDING_API_KEY | 空 | En fonction du service intégré. |
EMBEDDING_MODEL | text-embedding-3-small | Modifier selon vos services. |
EMBEDDING_DIM | 1536 | ** Il doit être conforme aux dimensions de sortie du modèle d'embedding ** Qdrant utilise une collection indépendante par dimension, et la non-conciliation des dimensions renvoie l'embedder local 256D. |
Analyse de documents MinerU (facultatif)
| Variable | Valeur par défaut | Il ne faut pas changer |
|---|---|---|
MINERU_API_URL | https://mineru.net | Généralement inchangé |
MINERU_API_KEY | 空 | Optionnel. résolution OCR pour les fichiers PDF numérisés/images; ces fichiers peuvent toujours être téléchargés dans la base de connaissances lorsqu'ils ne sont pas configurés, mais ne contiennent qu'une seule ligne de texte. |
Code bac à sable (l'état des notes, généralement rien)
Le service bac à sable démarre avec ce stack. app Lorsque vous y accédez via un réseau privé, les deux parties partagent la même clé par défaut intégrée pour l'ouverture de la boîte. Annuler les commentaires uniquement lorsque la limite par défaut est nécessaire:
| Variable | Valeur par défaut | Expliquer |
|---|---|---|
SANDBOX_API_KEY | Valeur partagée intégrée | Pour configurer une clé personnalisée, app 与 sandbox Lire en même temps. |
SANDBOX_MEMORY | 2g | Limite de mémoire pour chaque conteneur de session |
SANDBOX_CPUS | 1 | Quota de CPU pour chaque conteneur de session |
SANDBOX_MAX_SESSIONS | 16 | Limiter le nombre de sessions de bac à sable |
SANDBOX_WORKSPACE_SIZE | 512m | Chaque séance /workspace taille |
SANDBOX_NETWORK | none | bac à sable code par défaut ** Pas de réseau ** Il faut changer quand on est connecté. bridge |
bac à sable Architecture et frontières de sécuritéDéploiement du code bac à sable Restez dans les paramètres de la console d'administration. sandbox_base_url / sandbox_api_key Les deux champs sont vides, de sorte que le bac à sable intégré ne prendra effet.
Prochaine étape
- Première mise en service Créer un administrateur, ajouter un canal et un modèle, envoyer le premier message
- Proxy inverse et HTTPS Déploiement de réseau public obligatoire, HTTP explicite pour 80 ports plus la couche de résiliation TLS
- Accès Cloudflare Remarques lors de l’utilisation de Cloudflare
- Variables environnementales clés Référence complète de toutes les variables au niveau de déploiement