diff --git a/docker-compose.local.yaml b/docker-compose.local.yaml index e86e131..db603e6 100644 --- a/docker-compose.local.yaml +++ b/docker-compose.local.yaml @@ -18,6 +18,8 @@ services: container_name: backend ports: - "3000:3000" + volumes: + - /var/run/docker.sock:/var/run/docker.sock environment: PORT: 3000 MONGO_URI: "mongodb://mongo:27017/evaluetonsavoir" diff --git a/server/controllers/rooms.js b/server/controllers/rooms.js index af65b39..30aca60 100644 --- a/server/controllers/rooms.js +++ b/server/controllers/rooms.js @@ -52,7 +52,7 @@ class RoomsController { roomIdValid = !(await this.provider.getRoomInfo(roomId)); } - return await this.roomRepository.create(new Room(roomId, roomId, DEFAULT_HOST, 0)); + return await this.provider.createRoom(roomId,options); } async updateRoom(roomId, info) { diff --git a/server/roomsProviders/docker-provider.js b/server/roomsProviders/docker-provider.js index 7cdf7a2..9ab8c01 100644 --- a/server/roomsProviders/docker-provider.js +++ b/server/roomsProviders/docker-provider.js @@ -9,27 +9,48 @@ class DockerRoomProvider extends BaseRoomProvider { } async createRoom(roomId, options) { - const host = "localhost:4500"; - const id = await this.roomRepository.create( - new Room(roomId, roomId, host, 0) - ); - return roomRepository.get(id); + const container_name = `room_${roomId}`; + + const containerConfig = { + Image: 'evaluetonsavoir-quizroom', // Your local Docker image name + name: container_name, + ExposedPorts: { + "4500/tcp": {} + }, + HostConfig: { + PortBindings: { + "4500/tcp": [ + { + HostPort: "" + } + ] + } + }, + Env: options.env || [] + }; + + // Use `this.docker` instead of `docker` + const container = await this.docker.createContainer(containerConfig); + await container.start(); + + const containerInfo = await container.inspect(); + const containerIP = containerInfo.NetworkSettings.IPAddress; + const host = `${containerIP}:4500`; + + return await this.roomRepository.create(new Room(roomId, container_name, host, 0)); } async deleteRoom(roomId) { - return await this.roomRepository.delete(roomId); // shortcircuit -- not implemented yet + return await this.roomRepository.delete(roomId); // Short-circuit -- not implemented yet try { const container = this.docker.getContainer(roomId); await container.stop(); await container.remove(); - await roomRepository.delete(roomId); + await this.roomRepository.delete(roomId); console.log(`Conteneur pour la salle ${roomId} supprimé.`); } catch (error) { - console.error( - `Erreur lors de la suppression du conteneur pour la salle ${roomId}:`, - error - ); + console.error(`Erreur lors de la suppression du conteneur pour la salle ${roomId}:`, error); throw new Error("Failed to delete room"); } } @@ -38,7 +59,7 @@ class DockerRoomProvider extends BaseRoomProvider { const room = await this.roomRepository.get(roomId); if (!room) return null; - return room; // shortcircuit -- not implemented yet + return room; // Short-circuit -- not implemented yet try { const container = this.docker.getContainer(room.containerId); @@ -58,10 +79,7 @@ class DockerRoomProvider extends BaseRoomProvider { await this.roomRepository.update(updatedRoomInfo); return updatedRoomInfo; } catch (error) { - console.error( - `Erreur lors de la récupération du statut du conteneur pour la salle ${roomId}:`, - error - ); + console.error(`Erreur lors de la récupération du statut du conteneur pour la salle ${roomId}:`, error); return null; } } diff --git a/server/routers/rooms.js b/server/routers/rooms.js index df63a91..2e1bd81 100644 --- a/server/routers/rooms.js +++ b/server/routers/rooms.js @@ -19,7 +19,8 @@ router.post("/", async (req, res) => { const data = await roomsController.createRoom(); res.json(data); } catch (error) { - res.status(500).json({ error: "Failed to create room" }); + console.log(error); + res.status(500).json({ error: "Failed to create room :" + error }); } });