📸 Demostración • ✨ Características • 🚀 Guía de Despliegue • 🔧 Tecnologías • 💻 Desarrollo • 📄 Licencia
![]() | ![]() |
![]() | ![]() |
![]() | ![]() |
![]() | ![]() |
Antes de comenzar el despliegue, asegúrate de tener preparado lo siguiente:
S3_ACCESS_KEY_ID
S3_SECRET_ACCESS_KEY
S3_BUCKET_NAME
S3_ENDPOINT
Usando GitHub Actions se habilita el despliegue automático de la aplicación después de enviar código.
Nombre del Secret | Requerido | Propósito |
---|---|---|
CLOUDFLARE_API_TOKEN | ✅ | Token API de Cloudflare (requiere permisos Workers, D1 y Pages) |
CLOUDFLARE_ACCOUNT_ID | ✅ | ID de cuenta Cloudflare |
ENCRYPTION_SECRET | ❌ | Clave para encriptar datos sensibles (si no se provee, se generará automáticamente) |
Visita Cloudflare Dashboard
Crea un nuevo token API
Selecciona la plantilla "Edit Cloudflare Workers", y añade permiso de edición para base de datos D1
Haz fork del repositorio, rellena los secrets, y luego ejecuta el workflow!!!
El despliegue se activa automáticamente cuando se cambian archivos en el directorio backend
y se envían a la rama main
o master
. El workflow procede así:
⚠️ Recuerda tu nombre de dominio del backend
Haz fork del repositorio, rellena los secrets, y luego ejecuta el workflow.
El despliegue se activa automáticamente cuando se cambian archivos en el directorio frontend
y se envían a la rama main
o master
. Después del despliegue, necesitas configurar variables de entorno en el panel de control de Cloudflare Pages:
Inicia sesión en Cloudflare Dashboard
Navega a Pages → Tu proyecto (ej. "cloudpaste-frontend")
Haz clic en "Settings" → "Environment variables"
Añade variable de entorno:
Nombre: VITE_BACKEND_URL
Valor: Tu URL del Worker backend (ej. https://cloudpaste-backend.your-username.workers.dev
) sin "/" al final. Se recomienda usar un dominio personalizado para el worker backend.
Asegúrate de ingresar el nombre de dominio completo del backend en formato "https://xxxx.com"
Paso importante: Luego ejecuta el workflow del frontend nuevamente para completar la carga del dominio del backend!!!
Sigue los pasos estrictamente, de lo contrario fallará la carga del dominio del backend
Para Vercel, se recomienda desplegar así:
Framework Preset: Vite
Build Command: npm run build
Output Directory: dist
Install Command: npm install
☝️ Elige uno de los métodos anteriores
git clone https://github.com/ling-drag0n/CloudPaste.git
cd CloudPaste/backend
Instala dependencias
npm install
Inicia sesión en Cloudflare
npx wrangler login
Crea base de datos D1
npx wrangler d1 create cloudpaste-db
Anota el ID de la base de datos de la salida.
Modifica configuración wrangler.toml
[[d1_databases]]
binding = "DB"
database_name = "cloudpaste-db"
database_id = "YOUR_DATABASE_ID"
Despliega Worker
npx wrangler deploy
Anota la URL de la salida; esta es la dirección API de tu backend.
Inicializa base de datos (automático) Visita tu URL del Worker para activar inicialización:
https://cloudpaste-backend.your-username.workers.dev
⚠️ Recordatorio de seguridad: Cambia la contraseña predeterminada del administrador inmediatamente después de la inicialización del sistema (Usuario: admin, Contraseña: admin123).
Prepara código frontend
cd CloudPaste/frontend
npm install
Configura variables de entorno
Crea o modifica el archivo .env.production
:
VITE_BACKEND_URL=https://cloudpaste-backend.your-username.workers.dev
VITE_APP_ENV=production
VITE_ENABLE_DEVTOOLS=false
Construye proyecto frontend
npm run build
Despliega en Cloudflare Pages
Método 1: Mediante CLI Wrangler
npx wrangler pages deploy dist --project-name=cloudpaste-frontend
Método 2: Mediante Cloudflare Dashboard
dist
Prepara código frontend
cd CloudPaste/frontend
npm install
Instala e inicia sesión en CLI Vercel
npm install -g vercel
vercel login
Configura variables de entorno, igual que para Cloudflare Pages
Construye y despliega
vercel --prod
Sigue las instrucciones para configurar el proyecto.
Enlace de registro: Claw Cloud (sin #AFF) No requiere tarjeta de crédito, si tu registro en GitHub tiene más de 180 días, obtienes $5 de crédito cada mes.
Después de registrarte, haz clic en APP Launchpad en la página principal, luego haz clic en crear app en la esquina superior derecha
Primero despliega el backend, como se muestra en la figura (solo como referencia):
El almacenamiento de datos del backend está aquí:
Luego el frontend, como se muestra en la figura (solo como referencia):
El backend de CloudPaste puede desplegarse rápidamente usando la imagen Docker oficial.
Crea directorio de almacenamiento de datos
mkdir -p sql_data
Ejecuta el contenedor 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
Anota la URL de despliegue (ej. http://your-server-ip:8787
), que se necesitará para el despliegue del frontend.
⚠️ Consejo de seguridad: Asegúrate de personalizar ENCRYPTION_SECRET y mantenerlo seguro, ya que esta clave se usa para encriptar datos sensibles.
El frontend usa Nginx para servir y configura la dirección API del backend al iniciar.
docker run -d --name cloudpaste-frontend \
-p 80:80 \
-e BACKEND_URL=http://your-server-ip:8787 \
dragon730/cloudpaste-frontend:latest
⚠️ Nota: BACKEND_URL debe incluir la URL completa (incluyendo protocolo http:// o https://) ⚠️ Recordatorio de seguridad: Cambia la contraseña predeterminada del administrador inmediatamente después de la inicialización del sistema (Usuario: admin, Contraseña: admin123).
Cuando se lance una nueva versión del proyecto, puedes actualizar tu despliegue Docker siguiendo estos pasos:
Descarga las imágenes más recientes
docker pull dragon730/cloudpaste-backend:latest
docker pull dragon730/cloudpaste-frontend:latest
Detén y elimina los contenedores antiguos
docker stop cloudpaste-backend cloudpaste-frontend
docker rm cloudpaste-backend cloudpaste-frontend
Inicia nuevos contenedores usando los mismos comandos run que arriba (preservando directorio de datos y configuración)
Usando Docker Compose puedes desplegar tanto los servicios frontend como backend con un solo comando, que es el método más simple recomendado.
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
⚠️ Recordatorio de seguridad: Cambia la contraseña predeterminada del administrador inmediatamente después de la inicialización del sistema (Usuario: admin, Contraseña: admin123).
Frontend: http://your-server-ip:80
Backend: http://your-server-ip:8787
Cuando necesites actualizar a una nueva versión:
Descarga las imágenes más recientes
docker-compose pull
Recrea los contenedores usando las nuevas imágenes (preservando volúmenes de datos)
docker-compose up -d --force-recreate
💡 Consejo: Si hay cambios de configuración, puede que necesites hacer backup de datos y modificar el archivo 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;
}
}
⚠️ Consejo de seguridad: Se recomienda configurar HTTPS y un proxy inverso (como Nginx) para mejorar la seguridad.
Inicia sesión en el panel de control de Cloudflare
Haz clic en R2 Storage y crea un bucket.
Crea un token de API
Guarda todos los datos después de la creación; los necesitarás más tarde
Configura las reglas de cross-origin: haz clic en el bucket correspondiente, haz clic en Configuración, edita la política CORS como se muestra a continuación:
[
{
"AllowedOrigins": ["http://localhost:3000", "https://replace-with-your-frontend-domain"],
"AllowedMethods": ["GET", "PUT", "POST", "DELETE", "HEAD"],
"AllowedHeaders": ["*"],
"ExposeHeaders": ["ETag"],
"MaxAgeSeconds": 3600
}
]
Si no tienes una cuenta B2, regístrate primero, luego crea un bucket.
Haz clic en Application Key en la barra lateral, haz clic en Create Key y sigue la ilustración.
Configura el cross-origin de B2; la configuración de cross-origin de B2 es más compleja, tenlo en cuenta
Puedes probar primero las opciones 1 o 2, ve a la página de carga y comprueba si puedes subir archivos. Si la consola F12 muestra errores de cross-origin, usa la opción 3. Para una solución permanente, usa directamente la opción 3.
En cuanto a la configuración de la opción 3, dado que el panel no puede configurarla, debes hacerlo manualmente descargando la herramienta B2 CLI. Para más detalles, consulta: "https://docs.cloudreve.org/zh/usage/storage/b2".
Después de descargar, en el directorio de descarga correspondiente CMD, introduce los siguientes comandos:
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
Configuración en Windows, usa ".\b2-windows.exe xxx", La CLI de Python sería similar:
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}]"
Reemplaza con el nombre de tu bucket. Para allowedOrigins en la configuración de cross-origin, puedes configurarlo según tus necesidades; aquí permite todos.
Despliegue del Servidor MinIO
Usa la siguiente configuración de Docker Compose (referencia) para desplegar MinIO rápidamente:
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 # Nombre de usuario del administrador
- MINIO_ROOT_PASSWORD=minioadmin # Contraseña del administrador
- MINIO_BROWSER=on
- MINIO_SERVER_URL=https://minio.example.com # URL de acceso a la API S3
- MINIO_BROWSER_REDIRECT_URL=https://console.example.com # URL de acceso a la consola
ports:
- "9000:9000" # Puerto de la API S3
- "9001:9001" # Puerto de la consola
volumes:
- ./data:/data
- ./certs:/root/.minio/certs # Certificados SSL (si es necesario)
restart: always
Ejecuta docker-compose up -d
para iniciar el servicio.
Configuración del Proxy Inverso (Referencia)
Para asegurar que MinIO funcione correctamente, especialmente las vistas previas de archivos, configura el proxy inverso adecuadamente. Configuraciones recomendadas para OpenResty/Nginx:
Proxy Inverso para la API S3 de 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;
# Optimización HTTP
proxy_http_version 1.1;
proxy_set_header Connection ""; # Habilita keepalive HTTP/1.1
# Crítico: Resuelve errores 403 y problemas de vista previa
proxy_cache off;
proxy_buffering off;
proxy_request_buffering off;
# Sin límite de tamaño de archivo
client_max_body_size 0;
}
Proxy Inverso para la Consola de 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;
# Soporte para WebSocket
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
# Configuraciones críticas
proxy_cache off;
proxy_buffering off;
# Sin límite de tamaño de archivo
client_max_body_size 0;
}
Accede a la Consola para Crear Buckets y Claves de Acceso
Para una configuración detallada, consulta la documentación oficial:
https://min.io/docs/minio/container/index.html
CN: https://min-io.cn/docs/minio/container/index.html
Configuración Adicional (Opcional)
Los orígenes permitidos deben incluir tu dominio frontend.
Configura MinIO en CloudPaste
https://minio.example.com
)Solución de Problemas
proxy_set_header Accept-Encoding "identity"
, y hay problemas de caché a considerar. Se recomienda usar solo resolución DNS.proxy_cache off
y proxy_buffering off
MINIO_SERVER_URL
y MINIO_BROWSER_REDIRECT_URL
estén configurados correctamenteConnection "upgrade"
CloudPaste proporciona soporte simple para el protocolo WebDAV, permitiéndote montar espacios de almacenamiento como unidades de red para acceder y gestionar archivos directamente a través de gestores de archivos.
https://your-backend-domain/dav
Usa el nombre de usuario y contraseña del administrador para acceder directamente al servicio WebDAV:
Para un método de acceso más seguro, se recomienda crear una clave API dedicada:
Si usas NGINX como proxy inverso, se necesita una configuración específica de WebDAV para asegurar que todos los métodos WebDAV funcionen correctamente:
# 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;
}
Problemas de Conexión:
Errores de Permisos:
⚠️⚠️ Problemas de Carga en WebDAV:
Documentación de la API de Carga Directa de Archivos del Servidor - Descripción detallada de la interfaz de carga directa de archivos del servidor
Clona el repositorio del proyecto
git clone https://github.com/ling-drag0n/cloudpaste.git
cd cloudpaste
Configuración del Backend
cd backend
npm install
# Inicializa la base de datos D1
wrangler d1 create cloudpaste-db
wrangler d1 execute cloudpaste-db --file=./schema.sql
Configuración del Frontend
cd frontend
npm install
Configura las variables de entorno
backend
, crea un archivo wrangler.toml
para establecer las variables de entorno de desarrollofrontend
, configura el archivo .env.development
para establecer las variables de entorno del frontendInicia los servidores de desarrollo
# Backend
cd backend
npm run dev
# Frontend (en otra 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 deseas personalizar imágenes Docker o depurar durante el desarrollo, puedes seguir estos pasos para construir manualmente:
Construye la imagen del backend
# Ejecuta en el directorio raíz del proyecto
docker build -t cloudpaste-backend:custom -f docker/backend/Dockerfile .
# Ejecuta la imagen construida personalizada
docker run -d --name cloudpaste-backend \
-p 8787:8787 \
-v $(pwd)/sql_data:/data \
-e ENCRYPTION_SECRET=development-test-key \
cloudpaste-backend:custom
Construye la imagen del frontend
# Ejecuta en el directorio raíz del proyecto
docker build -t cloudpaste-frontend:custom -f docker/frontend/Dockerfile .
# Ejecuta la imagen construida personalizada
docker run -d --name cloudpaste-frontend \
-p 80:80 \
-e BACKEND_URL=http://localhost:8787 \
cloudpaste-frontend:custom
Docker Compose para Entorno de Desarrollo
Crea un archivo 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"
Inicia el entorno de desarrollo:
docker-compose -f docker-compose.yml up --build
Licencia Apache 2.0
Este proyecto está licenciado bajo la Licencia Apache 2.0 - consulta el archivo LICENSE para más detalles.
Patrocinio: Mantener un proyecto no es fácil. Si te gusta este proyecto, considera darle un pequeño aliento al autor. Cada poco de tu apoyo es mi motivación para seguir adelante~
Si crees que el proyecto es bueno, espero que puedas dar una estrella gratis✨✨, ¡Muchas gracias!