📸 Demonstração • ✨ Recursos • 🚀 Guia de Implantação • 🔧 Stack Tecnológica • 💻 Desenvolvimento • 📄 Licença
![]() | ![]() |
![]() | ![]() |
![]() | ![]() |
![]() | ![]() |
Antes de começar a implantação, por favor certifique-se de ter preparado o seguinte:
S3_ACCESS_KEY_ID
S3_SECRET_ACCESS_KEY
S3_BUCKET_NAME
S3_ENDPOINT
Usando GitHub Actions permite implantação automática da aplicação após push do código.
Nome do Secret | Obrigatório | Propósito |
---|---|---|
CLOUDFLARE_API_TOKEN | ✅ | Token API Cloudflare (requer permissões Workers, D1 e Pages) |
CLOUDFLARE_ACCOUNT_ID | ✅ | ID da conta Cloudflare |
ENCRYPTION_SECRET | ❌ | Chave para criptografar dados sensíveis (se não fornecido, será gerado automaticamente) |
Visite Cloudflare Dashboard
Crie um novo token API
Selecione o template "Edit Cloudflare Workers", e adicione permissão de edição de banco de dados D1
Fork o repositório, preencha os secrets, e então execute o workflow!!!
A implantação é acionada automaticamente quando arquivos no diretório backend
são alterados e enviados para o branch main
ou master
. O workflow prossegue como segue:
⚠️ Lembre-se do nome de domínio do seu backend
Fork o repositório, preencha os secrets, e então execute o workflow.
A implantação é acionada automaticamente quando arquivos no diretório frontend
são alterados e enviados para o branch main
ou master
. Após implantação, você precisa definir variáveis de ambiente no painel de controle Cloudflare Pages:
Faça login em Cloudflare Dashboard
Navegue para Pages → Seu projeto (ex: "cloudpaste-frontend")
Clique "Settings" → "Environment variables"
Adicione variável de ambiente:
Nome: VITE_BACKEND_URL
Valor: Sua URL Worker backend (ex: https://cloudpaste-backend.your-username.workers.dev
) sem "/" no final. Recomenda-se usar um domínio customizado de backend worker.
Certifique-se de inserir o nome de domínio completo do backend no formato "https://xxxx.com"
Passo importante: Então execute o workflow frontend novamente para completar o carregamento do domínio backend!!!
Por favor siga os passos estritamente, caso contrário o carregamento do domínio backend falhará
Para Vercel, recomenda-se implantar como segue:
Framework Preset: Vite
Build Command: npm run build
Output Directory: dist
Install Command: npm install
☝️ Escolha um dos métodos acima
git clone https://github.com/ling-drag0n/CloudPaste.git
cd CloudPaste/backend
Instale dependências
npm install
Faça login no Cloudflare
npx wrangler login
Crie banco de dados D1
npx wrangler d1 create cloudpaste-db
Anote o ID do banco de dados da saída.
Modifique configuração wrangler.toml
[[d1_databases]]
binding = "DB"
database_name = "cloudpaste-db"
database_id = "YOUR_DATABASE_ID"
Implante Worker
npx wrangler deploy
Anote a URL da saída; este é o endereço API do seu backend.
Inicialize banco de dados (automático) Visite sua URL Worker para acionar inicialização:
https://cloudpaste-backend.your-username.workers.dev
⚠️ Lembrete de segurança: Por favor altere a senha padrão do administrador imediatamente após inicialização do sistema (Usuário: admin, Senha: admin123).
Prepare código frontend
cd CloudPaste/frontend
npm install
Configure variáveis de ambiente
Crie ou modifique arquivo .env.production
:
VITE_BACKEND_URL=https://cloudpaste-backend.your-username.workers.dev
VITE_APP_ENV=production
VITE_ENABLE_DEVTOOLS=false
Construa projeto frontend
npm run build
Implante no Cloudflare Pages
Método 1: Via CLI Wrangler
npx wrangler pages deploy dist --project-name=cloudpaste-frontend
Método 2: Via Cloudflare Dashboard
dist
Prepare código frontend
cd CloudPaste/frontend
npm install
Instale e faça login no CLI Vercel
npm install -g vercel
vercel login
Configure variáveis de ambiente, mesmo que para Cloudflare Pages
Construa e implante
vercel --prod
Siga os prompts para configurar o projeto.
Link de registro: Claw Cloud (sem #AFF) Sem necessidade de cartão de crédito, desde que sua data de registro no GitHub seja maior que 180 dias, você ganha $5 de crédito todo mês.
Após registro, clique em APP Launchpad na página inicial, então clique em criar app no canto superior direito
Primeiro implante o backend, como mostrado na figura (apenas para referência):
Armazenamento de dados backend está aqui:
Então o frontend, como mostrado na figura (apenas para referência):
Backend CloudPaste pode ser implantado rapidamente usando a imagem Docker oficial.
Crie diretório de armazenamento de dados
mkdir -p sql_data
Execute container 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
Anote a URL de implantação (ex: http://your-server-ip:8787
), que será necessária para implantação do frontend.
⚠️ Dica de segurança: Certifique-se de customizar ENCRYPTION_SECRET e mantê-lo seguro, pois esta chave é usada para criptografar dados sensíveis.
O frontend usa Nginx para servir e configura o endereço API backend na inicialização.
docker run -d --name cloudpaste-frontend \
-p 80:80 \
-e BACKEND_URL=http://your-server-ip:8787 \
dragon730/cloudpaste-frontend:latest
⚠️ Nota: BACKEND_URL deve incluir a URL completa (incluindo protocolo http:// ou https://) ⚠️ Lembrete de segurança: Por favor altere a senha padrão do administrador imediatamente após inicialização do sistema (Usuário: admin, Senha: admin123).
Quando uma nova versão do projeto é lançada, você pode atualizar sua implantação Docker seguindo estes passos:
Puxe as imagens mais recentes
docker pull dragon730/cloudpaste-backend:latest
docker pull dragon730/cloudpaste-frontend:latest
Pare e remova containers antigos
docker stop cloudpaste-backend cloudpaste-frontend
docker rm cloudpaste-backend cloudpaste-frontend
Inicie novos containers usando os mesmos comandos run acima (preservando diretório de dados e configuração)
Usando Docker Compose permite implantar ambos serviços frontend e backend com um clique, que é o método mais simples 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
⚠️ Lembrete de segurança: Por favor altere a senha padrão do administrador imediatamente após inicialização do sistema (Usuário: admin, Senha: admin123).
Frontend: http://your-server-ip:80
Backend: http://your-server-ip:8787
Quando precisar atualizar para uma nova versão:
Puxe as imagens mais recentes
docker-compose pull
Recrie containers usando novas imagens (preservando volumes de dados)
docker-compose up -d --force-recreate
💡 Dica: Se houver mudanças de configuração, você pode precisar fazer backup dos dados e modificar o arquivo 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;
}
}
⚠️ Dica de segurança: Recomenda-se configurar HTTPS e um proxy reverso (como Nginx) para melhorar segurança.
Faça login no Painel Cloudflare
Clique em R2 Storage e crie um bucket.
Crie um token de API
Salve todos os dados após a criação; você precisará deles posteriormente
Configure as regras de cross-origin: clique no bucket correspondente, clique em Configurações, edite a política CORS conforme mostrado abaixo:
[
{
"AllowedOrigins": ["http://localhost:3000", "https://replace-with-your-frontend-domain"],
"AllowedMethods": ["GET", "PUT", "POST", "DELETE", "HEAD"],
"AllowedHeaders": ["*"],
"ExposeHeaders": ["ETag"],
"MaxAgeSeconds": 3600
}
]
Se você não tem uma conta B2, registre uma primeiro, depois crie um bucket.
Clique em Application Key na barra lateral, clique em Create Key e siga a ilustração.
Configure o cross-origin do B2; a configuração de cross-origin do B2 é mais complexa, tome nota
Você pode tentar as opções 1 ou 2 primeiro, vá para a página de upload e veja se consegue enviar. Se o console F12 mostrar erros de cross-origin, use a opção 3. Para uma solução permanente, use a opção 3 diretamente.
Quanto à configuração da opção 3, como o painel não pode configurá-la, você precisa configurar manualmente baixando a ferramenta B2 CLI. Para mais detalhes, consulte: "https://docs.cloudreve.org/zh/usage/storage/b2".
Após o download, no diretório de download correspondente CMD, insira os seguintes 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
Configuração do Windows, Use ".\b2-windows.exe xxx", O CLI Python seria semelhante:
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}]"
Substitua pelo nome do seu bucket. Para allowedOrigins na permissão de cross-origin, você pode configurar conforme suas necessidades; aqui permite todos.
Implante o Servidor MinIO
Use a seguinte configuração Docker Compose (referência) para implantar rapidamente o 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 # Nome de usuário admin
- MINIO_ROOT_PASSWORD=minioadmin # Senha admin
- MINIO_BROWSER=on
- MINIO_SERVER_URL=https://minio.example.com # URL de acesso à API S3
- MINIO_BROWSER_REDIRECT_URL=https://console.example.com # URL de acesso ao console
ports:
- "9000:9000" # Porta da API S3
- "9001:9001" # Porta do console
volumes:
- ./data:/data
- ./certs:/root/.minio/certs # Certificados SSL (se necessário)
restart: always
Execute docker-compose up -d
para iniciar o serviço.
Configure o Proxy Reverso (Referência)
Para garantir que o MinIO funcione corretamente, especialmente as visualizações de arquivos, configure o proxy reverso adequadamente. Configurações recomendadas para OpenResty/Nginx:
Proxy Reverso da 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;
# Otimização HTTP
proxy_http_version 1.1;
proxy_set_header Connection ""; # Ativar keepalive HTTP/1.1
# Crítico: Resolver erros 403 e problemas de visualização
proxy_cache off;
proxy_buffering off;
proxy_request_buffering off;
# Sem limite de tamanho de arquivo
client_max_body_size 0;
}
Proxy Reverso do 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;
# Suporte a WebSocket
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
# Configurações críticas
proxy_cache off;
proxy_buffering off;
# Sem limite de tamanho de arquivo
client_max_body_size 0;
}
Acesse o Console para Criar Buckets e Chaves de Acesso
Para configuração detalhada, consulte a documentação oficial:
https://min.io/docs/minio/container/index.html
CN: https://min-io.cn/docs/minio/container/index.html
Configuração Adicional (Opcional)
As origens permitidas devem incluir o domínio do seu frontend.
Configure o MinIO no CloudPaste
https://minio.example.com
)Solução de Problemas
proxy_set_header Accept-Encoding "identity"
, e há problemas de cache a considerar. Recomenda-se usar apenas resolução DNS.proxy_cache off
e proxy_buffering off
MINIO_SERVER_URL
e MINIO_BROWSER_REDIRECT_URL
estão configurados corretamenteConnection "upgrade"
O CloudPaste fornece suporte simples ao protocolo WebDAV, permitindo que você monte espaços de armazenamento como unidades de rede para acesso conveniente e gerenciamento de arquivos diretamente através de gerenciadores de arquivos.
https://your-backend-domain/dav
Use o nome de usuário e senha do administrador para acessar diretamente o serviço WebDAV:
Para um método de acesso mais seguro, recomenda-se criar uma chave de API dedicada:
Se estiver usando o NGINX como proxy reverso, é necessário adicionar uma configuração WebDAV específica para garantir que todos os métodos WebDAV funcionem corretamente:
# 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 Conexão:
Erros de Permissão:
⚠️⚠️ Problemas de Upload no WebDAV:
Documentação da API de Upload Direto de Arquivos do Servidor - Descrição detalhada da interface de upload direto de arquivos do servidor
Clone o repositório do projeto
git clone https://github.com/ling-drag0n/cloudpaste.git
cd cloudpaste
Configuração do Backend
cd backend
npm install
# Inicialize o banco de dados D1
wrangler d1 create cloudpaste-db
wrangler d1 execute cloudpaste-db --file=./schema.sql
Configuração do Frontend
cd frontend
npm install
Configure as variáveis de ambiente
backend
, crie um arquivo wrangler.toml
para definir as variáveis de ambiente de desenvolvimentofrontend
, configure o arquivo .env.development
para definir as variáveis de ambiente do frontendInicie os servidores de desenvolvimento
# Backend
cd backend
npm run dev
# Frontend (em outro 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
└── ...
Se você quiser personalizar imagens Docker ou depurar durante o desenvolvimento, siga estas etapas para construir manualmente:
Construa a imagem do backend
# Execute no diretório raiz do projeto
docker build -t cloudpaste-backend:custom -f docker/backend/Dockerfile .
# Execute a imagem construída personalizada
docker run -d --name cloudpaste-backend \
-p 8787:8787 \
-v $(pwd)/sql_data:/data \
-e ENCRYPTION_SECRET=development-test-key \
cloudpaste-backend:custom
Construa a imagem do frontend
# Execute no diretório raiz do projeto
docker build -t cloudpaste-frontend:custom -f docker/frontend/Dockerfile .
# Execute a imagem construída personalizada
docker run -d --name cloudpaste-frontend \
-p 80:80 \
-e BACKEND_URL=http://localhost:8787 \
cloudpaste-frontend:custom
Docker Compose para Ambiente de Desenvolvimento
Crie um arquivo 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"
Inicie o ambiente de desenvolvimento:
docker-compose -f docker-compose.yml up --build
Licença Apache 2.0
Este projeto está licenciado sob a Licença Apache 2.0 - consulte o arquivo LICENSE para obter detalhes.
Patrocínio: Manter um projeto não é fácil. Se você gosta deste projeto, considere dar um pequeno incentivo ao autor. Cada pedaço do seu apoio é minha motivação para continuar~
Se você acha que o projeto é bom, espero que você possa dar uma estrela grátis✨✨, Muito obrigado!