Initial commit

This commit is contained in:
Rafael Dias Martins
2026-08-31 14:10:20 -03:00
commit 8fcb5aac66
454 changed files with 60207 additions and 0 deletions
+4
View File
@@ -0,0 +1,4 @@
# MinIO Credentials
MINIO_ROOT_USER=admin
MINIO_ROOT_PASSWORD=change-this-password-please
MINIO_BUCKET=course-plat
+157
View File
@@ -0,0 +1,157 @@
# MinIO + Backup Setup
Setup completo do MinIO com scripts de backup para VPS e download local.
## 📁 Estrutura
```
docker/minio/
├── docker-compose.yml # Serviço MinIO
├── backup-minio.sh # Script de backup (roda no servidor)
├── pull-backup.sh # Script para baixar backup (roda no seu PC)
└── .env.example # Variáveis de ambiente
```
## 🔒 Segurança
**Bucket é PRIVADO** por padrão. Arquivos são servidos via proxy da aplicação (`/api/files/...`), o que permite:
- Controle de autenticação
- Verificação de permissões
- Logs de acesso
## 🚀 Setup Inicial
### 1. Criar arquivo .env
```bash
cd docker/minio
cat > .env << 'EOF'
MINIO_ROOT_USER=admin
MINIO_ROOT_PASSWORD=sua-senha-forte-aqui
MINIO_BUCKET=course-plat
EOF
```
### 2. Iniciar MinIO
```bash
docker compose up -d
```
### 3. Acessar
- **Console (UI)**: http://seu-servidor:9001
- **API**: http://seu-servidor:9000
## 💾 Backup Automático
### No Servidor (VPS)
1. Copiar o script para o servidor:
```bash
chmod +x backup-minio.sh
sudo cp backup-minio.sh /usr/local/bin/
```
2. Testar manualmente:
```bash
/usr/local/bin/backup-minio.sh
```
3. Adicionar ao crontab (backup todo dia às 2h da manhã):
```bash
crontab -e
# Adicionar linha:
0 2 * * * /usr/local/bin/backup-minio.sh >> /var/log/minio-backup.log 2>&1
```
### No Seu PC
1. Editar `pull-backup.sh` com seus dados:
```bash
SERVER_USER="seu-usuario"
SERVER_HOST="seu-servidor.com"
```
2. Dar permissão e testar:
```bash
chmod +x pull-backup.sh
./pull-backup.sh
```
3. Agendar no crontab do SEU PC (todo dia às 3h):
```bash
crontab -e
# Adicionar linha:
0 3 * * * /caminho/para/pull-backup.sh
```
## 🔄 Como Funciona
```
┌─────────────────┐ 02:00 ┌──────────────────┐
│ Servidor VPS │ ────────────────▶│ Backup Local │
│ (MinIO) │ backup-minio.sh│ (/var/backups/) │
└─────────────────┘ └──────────────────┘
│ 03:00
│ pull-backup.sh
┌──────────────────┐
│ Seu PC │
│ (Backup final) │
└──────────────────┘
```
## 📦 Restaurar Backup
### No servidor:
```bash
# Parar MinIO
docker compose down
# Restaurar volume
docker run --rm \
-v course-plat_minio_data:/data \
-v /var/backups/minio:/backup \
alpine tar xzf /backup/minio-backup-YYYYMMDD-HHMMSS.tar.gz -C /data
# Reiniciar
docker compose up -d
```
## ⚠️ Considerações
| Aspecto | Nota |
|---------|------|
| **Segurança** | Use chaves SSH para o rsync |
| **Backup external** | Considere também mandar para S3/Backblaze |
| **Teste** | Teste restaurar pelo menos uma vez |
| **Logs** | Verifique `/var/log/minio-backup.log` regularmente |
## 🔧 Variáveis do backup-minio.sh
```bash
BACKUP_DIR="/var/backups/minio" # Onde salvar no servidor
RETENTION_DAYS=7 # Dias para manter backup
VOLUME_NAME="course-plat_minio_data" # Nome do volume
```
## 🔧 Variáveis do pull-backup.sh
```bash
SERVER_USER="usuario" # Usuário SSH
SERVER_HOST="seu-servidor.com" # Host do servidor
SERVER_BACKUP_DIR="/var/backups/minio"
LOCAL_BACKUP_DIR="$HOME/backups/minio"
KEEP_LOCAL_DAYS=30 # Dias para manter localmente
```
## 🔗 URLs de Arquivos
| Onde | Formato |
|------|---------|
| **Banco de dados** | `proxy://iciv/ClassTypes/arquivo.pdf` |
| **Front-end** | `/api/files/iciv/ClassTypes/arquivo.pdf` |
Use `getFileUrl(url)` do `@/app/lib/utils/storage/fileUrl` para converter.
+61
View File
@@ -0,0 +1,61 @@
#!/bin/bash
# backup-minio.sh - Script de backup do MinIO no servidor
# Uso: ./backup-minio.sh
# Agendar no crontab: 0 2 * * * /caminho/para/backup-minio.sh
set -e
# ============ CONFIGURAÇÃO ============
BACKUP_DIR="/var/backups/minio" # Onde salvar os backups no servidor
RETENTION_DAYS=7 # Quantos dias manter
VOLUME_NAME="course-plat_minio_data" # Nome do volume Docker
COMPRESSION="gzip" # gzip ou none
# Criar diretório de backup se não existir
mkdir -p "$BACKUP_DIR"
# Data atual para o nome do arquivo
DATE=$(date +%Y%m%d-%H%M%S)
BACKUP_FILE="$BACKUP_DIR/minio-backup-$DATE.tar.gz"
echo "=========================================="
echo "Backup MinIO iniciado em: $(date)"
echo "=========================================="
# ============ FAZER BACKUP ============
echo "Criando backup do volume $VOLUME_NAME..."
if [ "$COMPRESSION" = "gzip" ]; then
docker run --rm \
-v "$VOLUME_NAME:/data:ro" \
-v "$BACKUP_DIR:/backup" \
alpine tar czf "/backup/$(basename "$BACKUP_FILE")" -C /data .
else
docker run --rm \
-v "$VOLUME_NAME:/data:ro" \
-v "$BACKUP_DIR:/backup" \
alpine tar cf "/backup/$(basename "$BACKUP_FILE")" -C /data .
fi
# ============ VERIFICAR ============
if [ -f "$BACKUP_FILE" ]; then
SIZE=$(du -h "$BACKUP_FILE" | cut -f1)
echo "✓ Backup criado: $BACKUP_FILE ($SIZE)"
else
echo "✗ ERRO: Backup não foi criado!"
exit 1
fi
# ============ LIMPAR BACKUPS ANTIGOS ============
echo "Limpando backups com mais de $RETENTION_DAYS dias..."
find "$BACKUP_DIR" -name "minio-backup-*.tar.gz" -mtime +$RETENTION_DAYS -delete
# ============ LISTAR BACKUPS RESTANTES ============
echo ""
echo "Backups disponíveis:"
ls -lh "$BACKUP_DIR"/minio-backup-*.tar.gz 2>/dev/null || echo "Nenhum backup encontrado."
echo ""
echo "=========================================="
echo "Backup concluído em: $(date)"
echo "=========================================="
+39
View File
@@ -0,0 +1,39 @@
services:
minio:
image: minio/minio:latest
container_name: course-plat-minio
restart: unless-stopped
ports:
- "9000:9000" # API
- "9001:9001" # Console (UI)
environment:
MINIO_ROOT_USER: ${MINIO_ROOT_USER:-minioadmin}
MINIO_ROOT_PASSWORD: ${MINIO_ROOT_PASSWORD:-minioadmin}
volumes:
- minio_data:/data
command: server /data --console-address ":9001"
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
interval: 30s
timeout: 20s
retries: 3
# Opcional: cria bucket automaticamente ao iniciar
minio-init:
image: minio/mc:latest
container_name: course-plat-minio-init
depends_on:
- minio
entrypoint: >
sh -c "
sleep 5 &&
mc alias set myminio http://minio:9000 ${MINIO_ROOT_USER:-minioadmin} ${MINIO_ROOT_PASSWORD:-minioadmin} &&
mc mb myminio/${MINIO_BUCKET:-course-plat} --ignore-existing &&
mc anonymous set none myminio/${MINIO_BUCKET:-course-plat} &&
echo 'MinIO initialized! Bucket is private.'
"
restart: "no"
volumes:
minio_data:
driver: local
+54
View File
@@ -0,0 +1,54 @@
#!/bin/bash
# pull-backup.sh - Script para baixar backups do servidor para seu PC
# Uso: ./pull-backup.sh
# Agendar no crontab do SEU PC: 0 3 * * * /caminho/para/pull-backup.sh
set -e
# ============ CONFIGURAÇÃO ============
# Preencha com seus dados
SERVER_USER="usuario" # Usuário SSH no servidor
SERVER_HOST="seu-servidor.com" # IP ou domínio do servidor
SERVER_BACKUP_DIR="/var/backups/minio" # Mesmo diretório do backup-minio.sh
LOCAL_BACKUP_DIR="$HOME/backups/minio" # Onde salvar no seu PC
KEEP_LOCAL_DAYS=30 # Quanto tempo manter no seu PC
# ============ CÓDIGO ============
mkdir -p "$LOCAL_BACKUP_DIR"
echo "=========================================="
echo "Baixando backups do MinIO"
echo "De: $SERVER_USER@$SERVER_HOST:$SERVER_BACKUP_DIR"
echo "Para: $LOCAL_BACKUP_DIR"
echo "Iniciado em: $(date)"
echo "=========================================="
# Baixar backups (somente os que ainda não temos)
echo "Sincronizando arquivos..."
rsync -avz --progress \
-e "ssh -o StrictHostKeyChecking=no" \
"$SERVER_USER@$SERVER_HOST:$SERVER_BACKUP_DIR/" \
"$LOCAL_BACKUP_DIR/"
# ============ LIMPAR BACKUPS ANTIGOS (LOCAL) ============
echo ""
echo "Limpando backups locais com mais de $KEEP_LOCAL_DAYS dias..."
find "$LOCAL_BACKUP_DIR" -name "minio-backup-*.tar.gz" -mtime +$KEEP_LOCAL_DAYS -delete
# ============ RESUMO ============
echo ""
echo "=========================================="
echo "Backups locais:"
ls -lh "$LOCAL_BACKUP_DIR"/minio-backup-*.tar.gz 2>/dev/null | tail -5
echo ""
echo "Espaço usado:"
du -sh "$LOCAL_BACKUP_DIR"
echo ""
echo "Concluído em: $(date)"
echo "=========================================="
# ============ ALERTAS ============
BACKUP_COUNT=$(ls -1 "$LOCAL_BACKUP_DIR"/minio-backup-*.tar.gz 2>/dev/null | wc -l)
if [ "$BACKUP_COUNT" -eq 0 ]; then
echo "⚠️ ATENÇÃO: Nenhum backup encontrado localmente!"
fi