diff --git a/docker-compose.yml b/docker-compose.yml index f7065bd..3a3be60 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -12,12 +12,16 @@ services: base: image: linuxodyssey/quest-base + # networks: + # - players build: context: . dockerfile: ./quests/Dockerfile + extra_hosts: + - 'host.docker.internal:host-gateway' networks: internal: players: name: linux-odyssey-players - internal: true + internal: false diff --git a/quests/Dockerfile b/quests/Dockerfile index c9f98ed..aed6ec0 100644 --- a/quests/Dockerfile +++ b/quests/Dockerfile @@ -30,6 +30,8 @@ RUN chmod 600 /home/${USERNAME}/.ssh/authorized_keys \ && chmod 700 /home/${USERNAME}/.ssh \ && chown -R ${USERNAME}:${USERNAME} /home/${USERNAME}/.ssh +RUN apt-get install -y net-tools + RUN service ssh start EXPOSE 22 diff --git a/server/src/api/socket.ts b/server/src/api/socket.ts index 5395370..9ad524b 100644 --- a/server/src/api/socket.ts +++ b/server/src/api/socket.ts @@ -77,7 +77,8 @@ async function connectContainer(socket: Socket, next: (err?: Error) => void) { stream, } next() - } catch { + } catch (err) { + console.error(err) next(new Error('Failed to start container.')) } } diff --git a/server/src/config.ts b/server/src/config.ts index 63af4dd..e1b89dc 100644 --- a/server/src/config.ts +++ b/server/src/config.ts @@ -31,7 +31,7 @@ function getUrl(key: string): string { function createConfig() { const isProduction = process.env.NODE_ENV === 'production' - const host = get('HOST', 'localhost') + const host = get('HOST', '0.0.0.0') const port = Number(get('PORT', 3000)) const baseUrl = get('BASE_URL', `http://${host}:${port}`) const url = new URL(baseUrl) diff --git a/server/src/containers/docker.ts b/server/src/containers/docker.ts index da9e2a2..2b8a653 100644 --- a/server/src/containers/docker.ts +++ b/server/src/containers/docker.ts @@ -4,45 +4,52 @@ import logger from '../utils/logger.js' const engine = new Docker() -const containerOptions = { +const newContainerOptions = ( + name: string, + imageId: string, + options: { + binds?: string[] + } = {} +): Docker.ContainerCreateOptions => ({ // AttachStdin: true, // AttachStdout: true, // AttachStderr: true, // Tty: true, // OpenStdin: true, // StdinOnce: false, + name, + Image: getQuestImage(imageId), HostConfig: { - NetworkMode: config.docker.network, - PortBindings: { - '22/tcp': [ - { - HostPort: '11122', // random port - }, - ], - }, + NetworkMode: 'linux-odyssey-players', // config.docker.network, + // PortBindings: { + // '22/tcp': [ + // { + // HostIP: '0.0.0.0', + // HostPort: '11122', // random port + // }, + // ], + // }, + Binds: options.binds, + ExtraHosts: ['host.docker.internal:host-gateway'], }, ExposedPorts: { - '22/tcp': {}, + // '22/tcp': {}, }, -} as Docker.ContainerCreateOptions +}) export function createContainer( name: string, imageId: string ): Promise { - const option = { - ...containerOptions, - name, - Image: getQuestImage(imageId), - } - + let binds: string[] = [] if (!config.isProduction && config.docker.mountQuest && imageId !== 'base') { logger.info('Mounting quest folder', imageId) - option.HostConfig!.Binds = [ + binds = [ `${config.projectRoot}/quests/${imageId}/home:/home/commander`, `${config.projectRoot}/packages/container:/usr/local/lib/container`, ] } + const option = newContainerOptions(name, imageId, { binds }) return engine.createContainer(option) } diff --git a/server/src/index.ts b/server/src/index.ts index 3ed074d..22916d8 100644 --- a/server/src/index.ts +++ b/server/src/index.ts @@ -72,7 +72,7 @@ async function main() { app.use('/api/v1', apiRouter) app.use(errorHandler) - server.listen(config.port, config.host, () => { + server.listen(config.port, '0.0.0.0', () => { logger.info(`Server listening at ${config.baseUrl}`) }) }