diff --git a/docker-compose.prod.yml b/docker-compose.prod.yml index f7b91be..92ec878 100644 --- a/docker-compose.prod.yml +++ b/docker-compose.prod.yml @@ -32,13 +32,20 @@ services: - ./config:/app/config env_file: - .env + - .env.prod environment: - - MONGO_URL=mongodb://${MONGO_USER}:${MONGO_PASSWORD}@db:27017/${MONGO_DB} + - MONGO_URL=mongodb://${MONGO_USER}:${MONGO_PASS}@db:27017/${MONGO_DB} - DOCKER_NETWORK=linux-odyssey-players - SECRET_KEY=${SECRET_KEY} - TRUSTED_PROXIES=${TRUSTED_PROXIES} - BACKEND_URL=http://backend:3000 - BASE_URL=${BASE_URL} + - GOOGLE_CLIENT_ID=${GOOGLE_CLIENT_ID} + - GOOGLE_CLIENT_SECRET=${GOOGLE_CLIENT_SECRET} + - GITHUB_CLIENT_ID=${GITHUB_CLIENT_ID} + - GITHUB_CLIENT_SECRET=${GITHUB_CLIENT_SECRET} + - SURVEY_URL=${SURVEY_URL} + - BUG_REPORT_URL=${BUG_REPORT_URL} analytics: image: linuxodyssey/analytics @@ -53,8 +60,11 @@ services: - internal ports: - '3001:3001' + env_file: + - .env + - .env.prod environment: - - MONGO_URL=mongodb://${MONGO_USER}:${MONGO_PASSWORD}@db:27017/${MONGO_DB} + - MONGO_URL=mongodb://${MONGO_USER}:${MONGO_PASS}@db:27017/${MONGO_DB} - ADMIN_USERNAME=${ADMIN_USERNAME} - ADMIN_PASSWORD=${ADMIN_PASSWORD} @@ -73,14 +83,8 @@ services: - MONGO_INITDB_ROOT_USERNAME=admin - MONGO_INITDB_ROOT_PASSWORD=${MONGO_ROOT_PASSWORD} - MONGO_USER=${MONGO_USER} - - MONGO_PASS=${MONGO_PASSWORD} + - MONGO_PASS=${MONGO_PASS} - MONGO_DB=${MONGO_DB} - - GOOGLE_CLIENT_ID=${GOOGLE_CLIENT_ID} - - GOOGLE_CLIENT_SECRET=${GOOGLE_CLIENT_SECRET} - - GITHUB_CLIENT_ID=${GITHUB_CLIENT_ID} - - GITHUB_CLIENT_SECRET=${GITHUB_CLIENT_SECRET} - - SURVEY_URL=${SURVEY_URL} - - BUG_REPORT_URL=${BUG_REPORT_URL} base: image: linuxodyssey/quest-base diff --git a/docker-compose.yml b/docker-compose.yml index f92fea5..702c4df 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -13,15 +13,12 @@ services: base: image: linuxodyssey/quest-base networks: - - players + - players build: context: . dockerfile: ./quests/Dockerfile extra_hosts: - 'host.docker.internal:host-gateway' - volumes: - # - ./config/ssh_key.pub:/ssh_key.pub:ro - - ./quests/entrypoint.sh:/entrypoint.sh:ro networks: internal: diff --git a/quests/Dockerfile b/quests/Dockerfile index cffeadb..99bfbab 100644 --- a/quests/Dockerfile +++ b/quests/Dockerfile @@ -25,6 +25,7 @@ RUN rm -f /etc/motd /etc/issue /etc/issue.net /etc/update-motd.d/* RUN rm -rf /etc/skel && mkdir -p /etc/skel RUN mkdir -p /etc/ssh/authorized_keys && chmod 755 /etc/ssh/authorized_keys COPY ./quests/.includes/sshd_config /etc/ssh/sshd_config +COPY ./quests/entrypoint.sh /entrypoint.sh EXPOSE 22 diff --git a/quests/entrypoint.sh b/quests/entrypoint.sh index 0127e43..7951103 100644 --- a/quests/entrypoint.sh +++ b/quests/entrypoint.sh @@ -10,9 +10,10 @@ if ! id -u ${USERNAME} >/dev/null 2>&1; then find / -name ".gitkeep" -type f -exec rm -f {} + echo "Adding public key for $USERNAME" - PUB_KEY=/etc/ssh/authorized_keys/${USERNAME} - cp /ssh_key.pub ${PUB_KEY} - chmod 644 ${PUB_KEY} + echo "Public key: $PUB_KEY" + PUB_KEY_PATH=/etc/ssh/authorized_keys/${USERNAME} + echo $PUB_KEY > ${PUB_KEY_PATH} + chmod 644 ${PUB_KEY_PATH} fi mkdir -p /run/sshd diff --git a/server/src/containers/docker.ts b/server/src/containers/docker.ts index 2aac10a..1b45aac 100644 --- a/server/src/containers/docker.ts +++ b/server/src/containers/docker.ts @@ -24,6 +24,7 @@ const newContainerOptions = ( ExposedPorts: { '22/tcp': {}, }, + Env: [`PUB_KEY=${config.docker.keypair.publicKey}`], }) export async function createContainer( @@ -32,21 +33,23 @@ export async function createContainer( imageId: string ): Promise { let binds: string[] = [ - `${config.projectRoot}/config/ssh_key.pub:/ssh_key.pub:ro`, - `${config.projectRoot}/quests/entrypoint.sh:/entrypoint.sh:ro`, + // `${config.docker.hostProjectRoot}/config/ssh_key.pub:/ssh_key.pub:ro`, ] if (await questHomeExists(questId)) { logger.info('Mounting quest home', questId) - binds.push(`${config.projectRoot}/quests/${questId}/home:/etc/skel:ro`) + binds.push( + `${config.docker.hostProjectRoot}/quests/${questId}/home:/etc/skel:ro` + ) } if (!config.isProduction && config.docker.mountQuest && imageId !== 'base') { logger.info('Mounting quest folder', questId) binds = [ - `${config.projectRoot}/quests/${questId}/home:/home/commander`, - `${config.projectRoot}/packages/container:/usr/local/lib/container`, + `${config.docker.hostProjectRoot}/quests/${questId}/home:/home/commander`, + `${config.docker.hostProjectRoot}/packages/container:/usr/local/lib/container`, ] } const option = newContainerOptions(name, imageId, { binds }) + console.log('Creating container', option) await createNetworkIfNotExists(config.docker.network) return engine.createContainer(option) } @@ -65,7 +68,9 @@ async function createNetworkIfNotExists(network: string) { async function questHomeExists(imageId: string) { try { - const stat = await fs.stat(`${config.projectRoot}/quests/${imageId}/home`) + const stat = await fs.stat( + `${config.docker.hostProjectRoot}/quests/${imageId}/home` + ) return stat.isDirectory() } catch { return false @@ -99,7 +104,8 @@ export async function attachContainer( // eslint-disable-next-line no-await-in-loop const stream = await connectToSSH(containerIp, { token }) return stream - } catch { + } catch (err) { + logger.error('Failed to connect to SSH', err) // eslint-disable-next-line no-await-in-loop await new Promise((resolve) => { setTimeout(resolve, 1000)