📸 Démonstration • ✨ Fonctionnalités • 🚀 Guide de déploiement • 🔧 Stack technique • 💻 Développement • 📄 Licence
![]() | ![]() |
![]() | ![]() |
![]() | ![]() |
![]() | ![]() |
Avant de commencer, assurez-vous d'avoir préparé :
S3_ACCESS_KEY_ID
S3_SECRET_ACCESS_KEY
S3_BUCKET_NAME
S3_ENDPOINT
Utilisez GitHub Actions pour déployer automatiquement l'application après un push de code.
Nom du Secret | Requis | Usage |
---|---|---|
CLOUDFLARE_API_TOKEN | ✅ | Token API Cloudflare (nécessite permissions Workers, D1 et Pages) |
CLOUDFLARE_ACCOUNT_ID | ✅ | ID de compte Cloudflare |
ENCRYPTION_SECRET | ❌ | Clé de chiffrement des données sensibles (générée automatiquement si absente) |
Visiter Cloudflare Dashboard
Créer un nouveau token API
Sélectionner le template "Edit Cloudflare Workers" et ajouter la permission d'édition de base de données D1
Forker le dépôt, remplir les secrets, puis exécuter le workflow !!!
Le déploiement se déclenche automatiquement lors des modifications dans le dossier backend
poussées sur les branches main
ou master
. Étapes :
⚠️ Notez votre nom de domaine backend
Forker le dépôt, remplir les secrets, puis exécuter le workflow.
Le déploiement se déclenche automatiquement lors des modifications dans le dossier frontend
. Après déploiement, configurer les variables d'environnement dans le panneau Cloudflare Pages :
Se connecter à Cloudflare Dashboard
Naviguer vers Pages → Votre projet (ex: "cloudpaste-frontend")
Cliquer "Settings" → "Environment variables"
Ajouter variable :
Nom : VITE_BACKEND_URL
Valeur : URL de votre Worker backend (ex: https://cloudpaste-backend.your-username.workers.dev
) sans "/" final. Recommandé : utiliser un domaine personnalisé.
Entrer le domaine backend complet au format "https://xxxx.com"
Étape cruciale : Relancer le workflow frontend pour charger le domaine backend !!!
Suivez strictement les étapes, sinon le chargement du domaine backend échouera
Pour Vercel, procéder comme suit :
Framework Preset: Vite
Build Command: npm run build
Output Directory: dist
Install Command: npm install
☝️ Choisir une des méthodes ci-dessus
git clone https://github.com/ling-drag0n/CloudPaste.git
cd CloudPaste/backend
Installer les dépendances
npm install
Se connecter à Cloudflare
npx wrangler login
Créer base D1
npx wrangler d1 create cloudpaste-db
Noter l'ID de base de données.
Modifier wrangler.toml
[[d1_databases]]
binding = "DB"
database_name = "cloudpaste-db"
database_id = "YOUR_DATABASE_ID"
Déployer Worker
npx wrangler deploy
Noter l'URL de sortie ; c'est l'adresse API backend.
Initialiser la base (automatique) Visiter l'URL du Worker pour déclencher l'initialisation :
https://cloudpaste-backend.your-username.workers.dev
⚠️ Sécurité : Changer immédiatement le mot de passe administrateur par défaut après initialisation (Identifiant : admin, Mot de passe : admin123).
Préparer le code frontend
cd CloudPaste/frontend
npm install
Configurer variables d'environnement
Créer/modifier .env.production
:
VITE_BACKEND_URL=https://cloudpaste-backend.your-username.workers.dev
VITE_APP_ENV=production
VITE_ENABLE_DEVTOOLS=false
Builder le projet frontend
npm run build
Déployer sur Cloudflare Pages
Méthode 1 : Via CLI Wrangler
npx wrangler pages deploy dist --project-name=cloudpaste-frontend
Méthode 2 : Via Dashboard Cloudflare
dist
Préparer le code frontend
cd CloudPaste/frontend
npm install
Installer et se connecter à Vercel CLI
npm install -g vercel
vercel login
Configurer variables, identique à Cloudflare Pages
Builder et déployer
vercel --prod
Suivre les instructions pour configurer le projet.
Lien d'inscription : Claw Cloud (sans #AFF) Aucune carte de crédit requise, si votre compte GitHub a plus de 180 jours, vous obtenez $5 de crédit mensuel.
Après inscription, cliquer APP Launchpad sur la page d'accueil, puis créer une app en haut à droite
D'abord déployer le backend, comme montré (exemple seulement) :
Stockage des données backend ici :
Puis le frontend, comme montré (exemple seulement) :
Le backend CloudPaste peut être déployé rapidement via l'image Docker officielle.
Créer répertoire de données
mkdir -p sql_data
Lancer le conteneur backend
docker run -d --name cloudpaste-backend \
-p 8787:8787 \
-v $(pwd)/sql_data:/data \
-e ENCRYPTION_SECRET=your-encryption-key \
-e NODE_ENV=production \
-e RUNTIME_ENV=docker \
dragon730/cloudpaste-backend:latest
Noter l'URL (ex: http://your-server-ip:8787
), nécessaire pour le frontend.
⚠️ Sécurité : Personnaliser ENCRYPTION_SECRET et le garder secret, utilisé pour chiffrer les données sensibles.
Le frontend utilise Nginx et configure l'URL de l'API backend au démarrage.
docker run -d --name cloudpaste-frontend \
-p 80:80 \
-e BACKEND_URL=http://your-server-ip:8787 \
dragon730/cloudpaste-frontend:latest
⚠️ Note : BACKEND_URL doit inclure l'URL complète (protocole http:// ou https://) ⚠️ Sécurité : Changer immédiatement le mot de passe administrateur par défaut (Identifiant : admin, Mot de passe : admin123).
Pour mettre à jour vers une nouvelle version :
Télécharger les dernières images
docker pull dragon730/cloudpaste-backend:latest
docker pull dragon730/cloudpaste-frontend:latest
Arrêter et supprimer les anciens conteneurs
docker stop cloudpaste-backend cloudpaste-frontend
docker rm cloudpaste-backend cloudpaste-frontend
Relancer avec les mêmes commandes (en conservant données et configuration)
La méthode la plus simple recommandée pour déployer frontend et backend ensemble.
docker-compose.yml
version: "3.8"
services:
frontend:
image: dragon730/cloudpaste-frontend:latest
environment:
- BACKEND_URL=https://xxx.com # Fill in the backend service address
ports:
- "8080:80" #"127.0.0.1:8080:80"
depends_on:
- backend # Depends on backend service
networks:
- cloudpaste-network
restart: unless-stopped
backend:
image: dragon730/cloudpaste-backend:latest
environment:
- NODE_ENV=production
- RUNTIME_ENV=docker
- PORT=8787
- ENCRYPTION_SECRET=custom-key # Please modify this to your own security key
volumes:
- ./sql_data:/data # Data persistence
ports:
- "8787:8787" #"127.0.0.1:8787:8787"
networks:
- cloudpaste-network
restart: unless-stopped
networks:
cloudpaste-network:
driver: bridge
docker-compose up -d
⚠️ Sécurité : Changer immédiatement le mot de passe administrateur par défaut (Identifiant : admin, Mot de passe : admin123).
Frontend : http://your-server-ip:80
Backend : http://your-server-ip:8787
Pour mettre à jour :
Télécharger les dernières images
docker-compose pull
Recréer les conteneurs (en conservant les volumes)
docker-compose up -d --force-recreate
💡 Astuce : En cas de changements de configuration, sauvegarder les données et modifier docker-compose.yml
server {
listen 443 ssl;
server_name paste.yourdomain.com; # Replace with your domain name
# SSL certificate configuration
ssl_certificate /path/to/cert.pem; # Replace with certificate path
ssl_certificate_key /path/to/key.pem; # Replace with key path
# Frontend proxy configuration
location / {
proxy_pass http://localhost:80; # Docker frontend service address
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
# Backend API proxy configuration
location /api {
proxy_pass http://localhost:8787; # Docker backend service address
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
client_max_body_size 0;
# WebSocket support (if needed)
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
# WebDAV Configuration
location /dav {
proxy_pass http://localhost:8787/dav; # Points to your backend service
# WebDAV necessary headers
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# WebDAV method support
proxy_pass_request_headers on;
# Support all WebDAV methods
proxy_method $request_method;
# Necessary header processing
proxy_set_header Destination $http_destination;
proxy_set_header Overwrite $http_overwrite;
# Handle large files
client_max_body_size 0;
# Timeout settings
proxy_connect_timeout 3600s;
proxy_send_timeout 3600s;
proxy_read_timeout 3600s;
}
}
⚠️ Sécurité : Configurer HTTPS et un proxy inverse (comme Nginx) pour renforcer la sécurité.
Connectez-vous au tableau de bord Cloudflare
Cliquez sur R2 Storage et créez un bucket.
Créez un jeton API
Sauvegardez toutes les données après création ; vous en aurez besoin plus tard
Configurez les règles cross-origin : cliquez sur le bucket correspondant, puis sur Settings, éditez la politique CORS comme indiqué ci-dessous :
[
{
"AllowedOrigins": ["http://localhost:3000", "https://replace-with-your-frontend-domain"],
"AllowedMethods": ["GET", "PUT", "POST", "DELETE", "HEAD"],
"AllowedHeaders": ["*"],
"ExposeHeaders": ["ETag"],
"MaxAgeSeconds": 3600
}
]
Si vous n'avez pas de compte B2, inscrivez-vous d'abord, puis créez un bucket.
Cliquez sur Application Key dans la barre latérale, puis sur Create Key, et suivez les instructions.
Configurez le cross-origin B2 ; cette configuration est plus complexe, prenez-en note
Vous pouvez d'abord essayer les options 1 ou 2, allez sur la page de téléchargement et vérifiez si vous pouvez uploader. Si la console F12 affiche des erreurs cross-origin, utilisez l'option 3. Pour une solution permanente, utilisez directement l'option 3.
Concernant la configuration de l'option 3, comme le panneau ne peut pas la configurer, vous devez le faire manuellement en téléchargeant l'outil B2 CLI. Pour plus de détails, référez-vous à : "https://docs.cloudreve.org/zh/usage/storage/b2".
Après le téléchargement, dans le répertoire de téléchargement correspondant CMD, entrez les commandes suivantes :
b2-windows.exe account authorize //Log in to your account, following prompts to enter your keyID and applicationKey
b2-windows.exe bucket get <bucketName> //You can execute to get bucket information, replace <bucketName> with your bucket name
Configuration Windows, utilisez ".\b2-windows.exe xxx", Python CLI serait similaire :
b2-windows.exe bucket update <bucketName> allPrivate --cors-rules "[{\"corsRuleName\":\"CloudPaste\",\"allowedOrigins\":[\"*\"],\"allowedHeaders\":[\"*\"],\"allowedOperations\":[\"b2_upload_file\",\"b2_download_file_by_name\",\"b2_download_file_by_id\",\"s3_head\",\"s3_get\",\"s3_put\",\"s3_post\",\"s3_delete\"],\"exposeHeaders\":[\"Etag\",\"content-length\",\"content-type\",\"x-bz-content-sha1\"],\"maxAgeSeconds\":3600}]"
Remplacez par le nom de votre bucket. Pour allowedOrigins dans l'autorisation cross-origin, vous pouvez configurer selon vos besoins ; ici, tout est autorisé.
Déployer le serveur MinIO
Utilisez la configuration Docker Compose suivante (référence) pour déployer rapidement MinIO :
version: "3"
services:
minio:
image: minio/minio:RELEASE.2025-02-18T16-25-55Z
container_name: minio-server
command: server /data --console-address :9001 --address :9000
environment:
- MINIO_ROOT_USER=minioadmin # Nom d'utilisateur admin
- MINIO_ROOT_PASSWORD=minioadmin # Mot de passe admin
- MINIO_BROWSER=on
- MINIO_SERVER_URL=https://minio.example.com # URL d'accès API S3
- MINIO_BROWSER_REDIRECT_URL=https://console.example.com # URL d'accès console
ports:
- "9000:9000" # Port API S3
- "9001:9001" # Port console
volumes:
- ./data:/data
- ./certs:/root/.minio/certs # Certificats SSL (si nécessaire)
restart: always
Exécutez docker-compose up -d
pour démarrer le service.
Configurer le reverse proxy (Référence)
Pour garantir le bon fonctionnement de MinIO, en particulier les prévisualisations de fichiers, configurez correctement le reverse proxy. Paramètres recommandés pour OpenResty/Nginx :
Reverse proxy API S3 MinIO (minio.example.com) :
location / {
proxy_pass http://127.0.0.1:9000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# Optimisation HTTP
proxy_http_version 1.1;
proxy_set_header Connection ""; # Activer keepalive HTTP/1.1
# Critique : Résoudre les erreurs 403 & problèmes de prévisualisation
proxy_cache off;
proxy_buffering off;
proxy_request_buffering off;
# Pas de limite de taille de fichier
client_max_body_size 0;
}
Reverse proxy console MinIO (console.example.com) :
location / {
proxy_pass http://127.0.0.1:9001;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# Support WebSocket
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
# Paramètres critiques
proxy_cache off;
proxy_buffering off;
# Pas de limite de taille de fichier
client_max_body_size 0;
}
Accéder à la console pour créer des buckets & clés d'accès
Pour une configuration détaillée, référez-vous à la documentation officielle :
https://min.io/docs/minio/container/index.html
CN: https://min-io.cn/docs/minio/container/index.html
Configuration supplémentaire (Optionnelle)
Les origines autorisées doivent inclure votre domaine frontend.
Configurer MinIO dans CloudPaste
https://minio.example.com
)Dépannage
proxy_set_header Accept-Encoding "identity"
, et il y a des problèmes de cache à considérer. Il est recommandé de n'utiliser que la résolution DNS.proxy_cache off
& proxy_buffering off
MINIO_SERVER_URL
& MINIO_BROWSER_REDIRECT_URL
sont correctement configurésConnection "upgrade"
CloudPaste fournit un support simple du protocole WebDAV, vous permettant de monter des espaces de stockage comme des lecteurs réseau pour un accès et une gestion pratiques des fichiers directement via des gestionnaires de fichiers.
https://your-backend-domain/dav
Utilisez le nom d'utilisateur et le mot de passe administrateur pour accéder directement au service WebDAV :
Pour une méthode d'accès plus sécurisée, il est recommandé de créer une clé API dédiée :
Si vous utilisez NGINX comme reverse proxy, une configuration WebDAV spécifique doit être ajoutée pour garantir que toutes les méthodes WebDAV fonctionnent correctement :
# WebDAV Configuration
location /dav {
proxy_pass http://localhost:8787; # Points to your backend service
# WebDAV necessary headers
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# WebDAV method support
proxy_pass_request_headers on;
# Support all WebDAV methods
proxy_method $request_method;
# Necessary header processing
proxy_set_header Destination $http_destination;
proxy_set_header Overwrite $http_overwrite;
# Handle large files
client_max_body_size 0;
# Timeout settings
proxy_connect_timeout 3600s;
proxy_send_timeout 3600s;
proxy_read_timeout 3600s;
}
Problèmes de connexion :
Erreurs de permissions :
⚠️⚠️ Problèmes de téléchargement WebDAV :
Documentation API de téléchargement direct de fichiers serveur - Description détaillée de l'interface de téléchargement direct de fichiers serveur
Cloner le dépôt du projet
git clone https://github.com/ling-drag0n/cloudpaste.git
cd cloudpaste
Configuration backend
cd backend
npm install
# Initialiser la base de données D1
wrangler d1 create cloudpaste-db
wrangler d1 execute cloudpaste-db --file=./schema.sql
Configuration frontend
cd frontend
npm install
Configurer les variables d'environnement
backend
, créez un fichier wrangler.toml
pour définir les variables d'environnement de développementfrontend
, configurez le fichier .env.development
pour définir les variables d'environnement frontendDémarrer les serveurs de développement
# Backend
cd backend
npm run dev
# Frontend (dans un autre terminal)
cd frontend
npm run dev
CloudPaste/
├── frontend/ # Frontend Vue.js application
│ ├── src/ # Source code
│ │ ├── components/ # Vue components
│ │ ├── api/ # API clients and services
│ │ ├── i18n/ # Internationalization resource files
│ │ ├── utils/ # Utility functions
│ │ └── assets/ # Static assets
│ └── ...
└── backend/ # Cloudflare Workers backend
├── worker.js # Main Worker file
├── schema.sql # D1 database schema
└── ...
Si vous souhaitez personnaliser les images Docker ou déboguer pendant le développement, vous pouvez suivre ces étapes pour construire manuellement :
Construire l'image backend
# Exécuter dans le répertoire racine du projet
docker build -t cloudpaste-backend:custom -f docker/backend/Dockerfile .
# Exécuter l'image construite
docker run -d --name cloudpaste-backend \
-p 8787:8787 \
-v $(pwd)/sql_data:/data \
-e ENCRYPTION_SECRET=development-test-key \
cloudpaste-backend:custom
Construire l'image frontend
# Exécuter dans le répertoire racine du projet
docker build -t cloudpaste-frontend:custom -f docker/frontend/Dockerfile .
# Exécuter l'image construite
docker run -d --name cloudpaste-frontend \
-p 80:80 \
-e BACKEND_URL=http://localhost:8787 \
cloudpaste-frontend:custom
Docker Compose pour l'environnement de développement
Créez un fichier docker-compose.dev.yml
:
version: "3.8"
services:
frontend:
build:
context: .
dockerfile: docker/frontend/Dockerfile
environment:
- BACKEND_URL=http://backend:8787
ports:
- "80:80"
depends_on:
- backend
backend:
build:
context: .
dockerfile: docker/backend/Dockerfile
environment:
- NODE_ENV=development
- RUNTIME_ENV=docker
- PORT=8787
- ENCRYPTION_SECRET=dev_secret_key
volumes:
- ./sql_data:/data
ports:
- "8787:8787"
Démarrer l'environnement de développement :
docker-compose -f docker-compose.yml up --build
Licence Apache 2.0
Ce projet est sous licence Apache 2.0 - voir le fichier LICENSE pour plus de détails.
Sponsorisation : Maintenir un projet n'est pas facile. Si vous aimez ce projet, envisagez d'encourager un peu l'auteur. Chaque petit soutien est ma motivation pour continuer~
Si vous pensez que le projet est bon, j'espère que vous pourrez donner une étoile gratuite✨✨, Merci beaucoup !