Este proyecto implementa una API REST utilizando FastAPI para gestionar contenedores Docker y registrar sus acciones en una blockchain. La comunicación entre contenedores se asegura mediante encriptación SHA-256, y la persistencia de la blockchain se logra mediante un volumen compartido en Docker.
- Características
- Arquitectura del Proyecto
- Requisitos
- Instalación y Configuración
- Uso de la Aplicación
- Persistencia y Volumen Compartido
- Consideraciones Adicionales
- Contribuir
- Licencia
-
Gestión de Contenedores:
Visualiza y administra contenedores Docker a través de la API. -
Creación de Imágenes:
Crea imágenes de contenedores y registra la acción en la blockchain. -
Blockchain Distribuida:
Cada transacción se agrega a una cadena de bloques, garantizando la integridad y trazabilidad de los cambios. -
Encriptación SHA-256:
Asegura la información intercambiada entre contenedores. -
Persistencia de Datos:
La blockchain se guarda en un archivo JSON compartido mediante un volumen Docker, de modo que todos los contenedores accedan a la misma información, incluso después de reinicios. -
Sincronización entre Contenedores:
Los contenedores se comunican y actualizan la blockchain entre sí a través de endpoints REST.
La estructura del proyecto es la siguiente:
project/
├── api/
│ ├── main.py # API REST con FastAPI y lógica de propagación de bloques
│ ├── blockchain.py # Implementación de la blockchain con persistencia en JSON
│ ├── security.py # Funciones de encriptación SHA-256
│ └── templates/
│ └── index.html # Interfaz web para interactuar con la API
├── Dockerfile # Construcción de la imagen basada en Ubuntu 20.04
├── docker-compose.yml # Orquestación de múltiples contenedores
└── requirements.txt # Dependencias del proyecto
- Docker y Docker Compose
- Python 3 (incluido en la imagen base de Ubuntu)
-
Clona el repositorio:
git clone https://tu-repositorio.git cd project -
Construye y levanta los contenedores:
-
Detén contenedores anteriores (si existen):
docker-compose down --volumes
-
Construye las imágenes sin caché:
docker-compose build --no-cache
-
Levanta los contenedores en modo background:
docker-compose up -d
-
-
Verifica que los contenedores estén en ejecución:
docker ps
Abre tu navegador y visita las siguientes direcciones para acceder a la interfaz web:
La interfaz web ofrece las siguientes funcionalidades mediante botones y formularios:
- Listar Contenedores: Muestra la lista de contenedores disponibles.
- Crear Imagen de Contenedor: Permite generar una imagen de un contenedor y registra la acción en la blockchain.
- Ver y Validar la Blockchain: Permite visualizar la cadena de bloques y comprobar su integridad.
- Agregar Transacción: Agrega una nueva transacción a la blockchain.
- Transacción Segura: Agrega una transacción segura, verificando que no se duplique la información.
Puedes probar la API utilizando cURL. Aquí algunos ejemplos:
-
Listar contenedores:
curl -X GET http://localhost:8001/containers
-
Crear imagen de contenedor y registrar en la blockchain:
curl -X POST "http://localhost:8001/create_image/<container_id>?image_name=nombre_imagen" -
Ver la blockchain:
curl -X GET http://localhost:8001/blockchain
-
Agregar una transacción:
curl -X POST http://localhost:8001/transaction -H 'Content-Type: application/json' -d '{"data": "Datos de transacción"}'
-
Transacción segura:
curl -X POST http://localhost:8001/secure_transaction -H 'Content-Type: application/json' -d '{"data": "Datos seguros"}'
-
Validar la blockchain:
curl -X GET http://localhost:8001/validate_blockchain
La blockchain se guarda en el archivo /app/data/blockchain.json. Todos los contenedores montan un volumen compartido denominado blockchain_data en la ruta /app/data, lo que garantiza que:
- Sincronización: Todos los cambios realizados en la blockchain desde cualquier contenedor se guardan en el mismo archivo compartido.
- Persistencia: Si un contenedor se reinicia, cargará la blockchain actualizada desde el volumen compartido.
El volumen se define en el archivo docker-compose.yml:
volumes:
blockchain_data:-
Sincronización en Tiempo Real:
La propagación de bloques se realiza mediante endpoints que actualizan la blockchain entre contenedores activos. Con la persistencia en un volumen compartido, se mantiene la información cuando se reinician los contenedores. -
Concurrencia:
En entornos de alta concurrencia, puede ser necesario implementar mecanismos de bloqueo o migrar la persistencia a una base de datos para evitar conflictos en el acceso concurrente al archivo. -
Personalización:
Puedes modificar la lógica de la blockchain, la dificultad del proof-of-work y los endpoints según tus necesidades.
Si deseas contribuir a este proyecto, sigue estos pasos:
-
Haz un fork del repositorio.
-
Crea una rama para tus cambios:
git checkout -b feature/nueva-funcionalidad
-
Realiza tus modificaciones y haz commit:
git commit -m "Agrega nueva funcionalidad"