?? Rebrand (2026-08-26): Este proyecto fue renombrado de FileVault a FileCage. Nuevo dominio: filecage.com
? PROYECTO COMPLETADO — 2026-08-26
- API: https://filecage.com
- Landing: https://filecage.com (neon cyberpunk dark — v2.5.0)
- CLI: FileCage CLI v2.5.0 con VIRO mascota ASCII
- Repo API: https://gitxub.neosolutions.com.ar/Cloe/FileCage
- Repo Landing: https://gitxub.neosolutions.com.ar/Cloe/filecage-landing
API REST minimalista para crear carpetas protegidas con contraseña, y subir/bajar/listar/borrar archivos.
npm init — inicializar proyecto Node.jsexpress, multer, bcryptjs, swagger-jsdoc, swagger-ui-expresssrc/utils/uid.js — generador de UID de 8 chars (charset A-Z sin O + 0-9)src/middleware/auth.js — validar X-Password contra bcrypt del .meta.json de la carpetaPOST /folders — crear carpeta + generar UID + guardar password hasheada en .meta.jsonPOST /folders/:uid/files — subir archivo (multer, limite 100MB, validar duplicados ? 409)GET /folders/:uid/files — listar archivos de la carpeta con nombre, tamaño y fechaGET /folders/:uid/files/:filename — descargar archivo como streamDELETE /folders/:uid/files/:filename — borrar archivo401 — password incorrecta o header ausente404 — carpeta o archivo no encontrado409 — archivo ya existe con ese nombre413 — archivo supera 100 MBsrc/swagger.js — configuracion de swagger-jsdoc/api-docs funcione correctamenteDockerfile (sin docker-compose).dockerignore configurado/health agregado (usado por HEALTHCHECK)/data/filevault verificado en host ?.gitignore (node_modules, storage/, logs/)/data/filevault en Contabofilevault:latest3301 (3300 ocupado por vault-front)-v /data/filevault:/app/storagedocker run -d \
--name filevault \
--restart unless-stopped \
-p 127.0.0.1:3300:3300 \
-v /data/filevault:/app/storage \
filevault:latest
filecage.com ? 127.0.0.1:3301proxy_set_header X-Password $http_x_password — cabecera custom forwardeadaclient_max_body_size 105M — para uploads de hasta 100MB401413https://filecage.com/api-docs/data/filevault/ del host ?npm corrompe archivos al instalar en
/mnt/e/(NTFS via WSL2).
Desarrollo activo en:/home/deivit/Projects/FileCage/(filesystem Linux)
Los fuentes se sincronizan aE:\Projects\FileCage\cuando sea necesario.
| Item | Decision |
|---|---|
| Runtime | Node.js |
| Framework | Express |
| Docs | Swagger (swagger-jsdoc + swagger-ui-express) |
| Almacenamiento | Filesystem local — volumen montado del host |
| Contenerizacion | Solo Dockerfile (sin docker-compose) |
| Repo | Gitea interno (gitxub.neosolutions.com.ar) |
| Deploy | Contabo (154.12.252.27) |
| Subdominio | filecage.com |
| Puerto interno | 3301 (host) ? 3300 (container) |
docker run -d \
--name filevault \
--restart unless-stopped \
-p 127.0.0.1:3300:3300 \
-v /data/filevault:/app/storage \
filevault:latest
X-Password: <contraseña>
Guardada con bcrypt en .meta.json dentro de cada carpeta.
A-Z (sin O) + 0-9 = 35 chars posiblesA3K9PX2M, 0BF7NT1Z| Metodo | Path | Descripcion |
|---|---|---|
| POST | /folders |
Crear carpeta protegida |
| POST | /folders/:uid/files |
Subir archivo (max 100MB) |
| GET | /folders/:uid/files |
Listar archivos |
| GET | /folders/:uid/files/:filename |
Descargar archivo |
| DELETE | /folders/:uid/files/:filename |
Borrar archivo |
filevault/
+-- Dockerfile
+-- package.json
+-- .gitignore
+-- src/
¦ +-- index.js
¦ +-- routes/
¦ ¦ +-- folders.js
¦ +-- middleware/
¦ ¦ +-- auth.js
¦ +-- utils/
¦ ¦ +-- uid.js
¦ +-- swagger.js
+-- storage/ ? solo en dev; en prod = volumen montado
/data/filevault/
+-- A3K9PX2M/
¦ +-- .meta.json ? { "password": "$2b$10$...", "created": "..." }
¦ +-- documento.pdf
+-- 0BF7NT1Z/
+-- .meta.json
+-- archivo.zip
| Código | Situacion |
|---|---|
| 401 | Password incorrecta o header ausente |
| 404 | Carpeta o archivo no encontrado |
| 409 | Archivo ya existe con ese nombre |
| 413 | Archivo supera los 100 MB |
{
"express": "^4.x",
"multer": "^1.x",
"bcrypt": "^5.x",
"swagger-jsdoc": "^6.x",
"swagger-ui-express": "^5.x"
}
Iniciado por Cloe — 2026-08-26
Base URL:
https://filecage.com
curl -X POST https://filecage.com/folders \
-H "X-Password: tu-contraseña"
Respuesta:
{ "uid": "A3K9PX2M" }
curl -X POST https://filecage.com/folders/A3K9PX2M/files \
-H "X-Password: tu-contraseña" \
-F "file=@/ruta/a/tu/archivo.pdf"
Respuesta:
{ "name": "archivo.pdf", "size": 204800 }
curl https://filecage.com/folders/A3K9PX2M/files \
-H "X-Password: tu-contraseña"
Respuesta:
{
"uid": "A3K9PX2M",
"files": [
{ "name": "archivo.pdf", "size": 204800, "uploaded": "2026-08-26T15:00:00.000Z" }
]
}
curl https://filecage.com/folders/A3K9PX2M/files/archivo.pdf \
-H "X-Password: tu-contraseña" \
-o archivo-descargado.pdf
curl -X DELETE https://filecage.com/folders/A3K9PX2M/files/archivo.pdf \
-H "X-Password: tu-contraseña"
Respuesta:
{ "deleted": "archivo.pdf" }
# 1. Crear carpeta
UID=$(curl -s -X POST https://filecage.com/folders \
-H "X-Password: mipass123" | python3 -c "import sys,json; print(json.load(sys.stdin)['uid'])")
echo "Carpeta creada: $UID"
# 2. Subir archivo
curl -s -X POST https://filecage.com/folders/$UID/files \
-H "X-Password: mipass123" \
-F "file=@documento.pdf"
# 3. Listar
curl -s https://filecage.com/folders/$UID/files \
-H "X-Password: mipass123"
# 4. Descargar
curl -s https://filecage.com/folders/$UID/files/documento.pdf \
-H "X-Password: mipass123" -o documento-descargado.pdf
# 5. Borrar
curl -s -X DELETE https://filecage.com/folders/$UID/files/documento.pdf \
-H "X-Password: mipass123"
| HTTP | Causa | Solucion |
|---|---|---|
401 |
Header X-Password ausente o incorrecto |
Verificar la contraseña |
404 |
Carpeta o archivo no encontrado | Verificar el UID y el nombre del archivo |
409 |
Ya existe un archivo con ese nombre | Borrar el existente o renombrar el nuevo |
413 |
Archivo supera 100MB | Comprimir o partir el archivo |
filecage list/upload/download/delete.