Sistema de gestiΓ³n de archivos basado en etiquetas con interfaz web moderna y API REST.
- β Subir archivos con drag & drop
- π BΓΊsqueda inteligente por mΓΊltiples tags (operador AND)
- π·οΈ GestiΓ³n de etiquetas flexible (aΓ±adir, eliminar, editar)
- π EstadΓsticas en tiempo real (archivos, tags, espacio usado)
- π¨ Interfaz moderna tipo Google Drive/Pinterest
- π API REST completa con documentaciΓ³n automΓ‘tica
- πΎ Persistencia local con JSON y sistema de archivos
# 1. Construir imΓ‘genes
docker-compose build
# 2. Iniciar servicios
docker-compose up -d
# 3. Verificar estado
docker-compose psLa aplicaciΓ³n estarΓ‘ disponible en:
- π Frontend: http://localhost
- π‘ Backend API: http://localhost:8000
- π API Docs: http://localhost:8000/docs
Para detener:
docker-compose downVer DOCKER_SWARM_GUIDE.md para instrucciones completas.
# Construir imΓ‘genes
./build-images.sh # Linux/Mac
# o
.\build-images.ps1 # Windows
# Desplegar en Swarm
docker stack deploy -c docker-stack.yml tagfs# 1. Instalar dependencias (solo la primera vez)
pip install -r requirements.txt
# 2. Ejecutar todo con un solo comando
.\start.ps1Β‘Eso es todo! El script:
- β Inicia la API en una nueva ventana
- β Espera a que estΓ© lista
- β Abre el frontend automΓ‘ticamente
# 1. Instalar dependencias (solo la primera vez)
pip install -r requirements.txt
# 2. Iniciar servidor API
python run_api.py
# Β‘NO CIERRES ESTA TERMINAL!La API estarΓ‘ disponible en:
- π API: http://localhost:8000
- π DocumentaciΓ³n interactiva: http://localhost:8000/docs
- π DocumentaciΓ³n alternativa: http://localhost:8000/redoc
# En una NUEVA terminal de PowerShell
start frontend\index.htmlπ‘ Tip: Usa VS Code y abre 2 terminales integradas (botΓ³n "+" en el panel de terminales)
Tag-based-file-system/
βββ π¨ frontend/
β βββ index.html # Interfaz web completa (single-page)
β
βββ π§ api/
β βββ __init__.py
β βββ main.py # API REST con FastAPI
β
βββ π¦ tags/
β βββ cli/
β β βββ __init__.py
β β βββ app.py # CLI original (legacy)
β βββ core/
β β βββ __init__.py
β β βββ tag_service.py # LΓ³gica de negocio
β βββ data/
β β βββ __init__.py
β β βββ file_store.py # Capa de persistencia
β βββ utils/
β β βββ __init__.py
β β βββ helpers.py # Utilidades
β βββ config.py # ConfiguraciΓ³n
β
βββ π tags_data/
β βββ files/
β βββ files.json # Metadata (tags por archivo)
β βββ [archivos subidos] # Archivos binarios
β
βββ π§ͺ tests/
β βββ test_db.py # Tests unitarios
β
βββ main.py # CLI legacy
βββ run_api.py # Script para ejecutar la API
βββ requirements.txt # Dependencias
βββ README.md # Este archivo
POST /files
Content-Type: multipart/form-data
file: <archivo>
tags: "trabajo,importante,pdf"GET /files
GET /files?tags=trabajo,importante # Filtrar por tagsGET /files/{filename}DELETE /files/{filename}PATCH /files/{filename}/tags
Content-Type: application/json
{
"tags": ["nuevo", "tags"]
}POST /files/{filename}/tags
Content-Type: application/json
{
"tags": ["extra", "tags"]
}DELETE /files/{filename}/tags
Content-Type: application/json
{
"tags": ["tag_a_eliminar"]
}GET /tags
# Respuesta:
{
"tags": [
{"name": "trabajo", "count": 5},
{"name": "importante", "count": 3}
],
"total": 2
}GET /stats
# Respuesta:
{
"total_files": 10,
"total_tags": 15,
"total_size_bytes": 2048000,
"total_size_mb": 2.05
}- π― Barra de BΓΊsqueda: Filtra archivos por tags mΓΊltiples
- π€ Upload Zone: Drag & drop o click para subir
- π·οΈ Tags Populares: Click para filtrar rΓ‘pidamente
- π EstadΓsticas: Vista en tiempo real del sistema
- ποΈ Grid de Archivos: Tarjetas con preview, tags y acciones
- βοΈ EdiciΓ³n Inline: Modifica tags sin recargar
- π¨ DiseΓ±o Responsive: Funciona en mΓ³vil, tablet y desktop
βββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β π·οΈ Tag-Based File System β
β Organiza tus archivos con etiquetas inteligentes β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β π 10 Archivos β π·οΈ 15 Tags β πΎ 2.05 MB β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β π [Buscar por tags...] [π€ Subir archivo] β
β Tags: [trabajo (5)] [importante (3)] [pdf (2)] β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β π documento.pdf πΌοΈ foto.jpg π datos.xlsx β
β [trabajo] [pdf] [personal] [trabajo] β
β β¬οΈ βοΈ ποΈ β¬οΈ βοΈ ποΈ β¬οΈ βοΈ ποΈ β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββ
# Ejecutar todos los tests
pytest tests
# Con verbose
pytest tests -v
# Con cobertura
pytest tests --cov=tagsEl proyecto mantiene la CLI original para compatibilidad:
# Modo interactivo
python main.py
# Modo no interactivo
python main.py add "C:\path\archivo.txt" "importante,proyecto"Comandos CLI: add, delete, list, add-tags, delete-tags, show, exit
- Python 3.10+
- FastAPI - Framework web moderno y rΓ‘pido
- Uvicorn - Servidor ASGI
- Pydantic - ValidaciΓ³n de datos
- Python-multipart - Para upload de archivos
- HTML5 + CSS3 + Vanilla JavaScript
- Sin frameworks - Ligero y rΓ‘pido
- Responsive Design
- Drag & Drop API
- Fetch API para comunicaciΓ³n con backend
- Sistema de archivos para binarios
- JSON para metadata (tags)
import requests
url = "http://localhost:8000/files"
files = {"file": open("documento.pdf", "rb")}
data = {"tags": "trabajo,importante,pdf"}
response = requests.post(url, files=files, data=data)
print(response.json())# Todos los archivos
curl http://localhost:8000/files
# Filtrar por tags
curl "http://localhost:8000/files?tags=trabajo,importante"
# EstadΓsticas
curl http://localhost:8000/statsconst response = await fetch('http://localhost:8000/files/documento.pdf/tags', {
method: 'PATCH',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ tags: ['nuevo', 'actualizado'] })
});Puedes modificar el directorio de datos editando tags/config.py:
from pathlib import Path
DATA_DIR = Path("./tags_data") # Directorio base
FILES_DIRNAME = "files" # Carpeta de archivos
META_FILENAME = "files.json" # Archivo de metadataO pasar un directorio personalizado:
from tags.core.tag_service import TagService
service = TagService(data_dir="./mi_directorio")- π AutenticaciΓ³n y usuarios mΓΊltiples
- βοΈ IntegraciΓ³n con cloud storage (S3, Google Drive)
- π SincronizaciΓ³n en tiempo real (WebSockets)
- π€ Auto-tagging con ML (reconocimiento de imΓ‘genes/texto)
- π± App mΓ³vil (React Native)
- π BΓΊsqueda full-text en contenido de archivos
- π¨ Temas personalizables (dark mode)
- π¦ Versionado de archivos
- π Compartir archivos con links pΓΊblicos
- π Dashboard de analytics avanzado
Este proyecto estΓ‘ bajo la licencia que se encuentra en el archivo LICENSE.
GAlonso46
- GitHub: @GAlonso46 mcampver
- GitHub: @mcampver
Proyecto desarrollado para la materia de Sistemas Distribuidos (4to aΓ±o).
Β‘Disfruta organizando tus archivos con tags! π