From b449d84c54ebe1cc7d208703bc61d2c65a09deea Mon Sep 17 00:00:00 2001 From: Justin Lin Date: Wed, 16 Oct 2024 14:13:41 +0800 Subject: [PATCH] feat: auto create config folder and player network --- README.md | 1 + docker-compose.yml | 4 ++-- quests/entrypoint.sh | 4 ++++ server/src/containers/docker.ts | 13 +++++++++++++ server/src/utils/crypto.ts | 5 +++++ 5 files changed, 25 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index e8d1dd1..ed1609f 100644 --- a/README.md +++ b/README.md @@ -67,6 +67,7 @@ This will start the db. it will automatically restarts by Docker. Building quest images: + docker compose build base yarn build:quests ### Build Quest Images in Details diff --git a/docker-compose.yml b/docker-compose.yml index c317f96..7be150e 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -12,8 +12,8 @@ services: base: image: linuxodyssey/quest-base - # networks: - # - players + networks: + - players build: context: . dockerfile: ./quests/Dockerfile diff --git a/quests/entrypoint.sh b/quests/entrypoint.sh index 78d14fc..0127e43 100644 --- a/quests/entrypoint.sh +++ b/quests/entrypoint.sh @@ -2,10 +2,14 @@ USERNAME=commander +echo "Initializing container for $USERNAME" + if ! id -u ${USERNAME} >/dev/null 2>&1; then + echo "Adding user $USERNAME" adduser --disabled-password --gecos '' --shell /bin/zsh ${USERNAME} && \ 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} diff --git a/server/src/containers/docker.ts b/server/src/containers/docker.ts index 92acd07..2aac10a 100644 --- a/server/src/containers/docker.ts +++ b/server/src/containers/docker.ts @@ -47,9 +47,22 @@ export async function createContainer( ] } const option = newContainerOptions(name, imageId, { binds }) + await createNetworkIfNotExists(config.docker.network) return engine.createContainer(option) } +async function createNetworkIfNotExists(network: string) { + const dockerNetworks = await engine.listNetworks({ + filters: { + name: [network], + }, + }) + if (dockerNetworks.length === 0) { + console.log('Creating player network', network) + await engine.createNetwork({ Name: network }) + } +} + async function questHomeExists(imageId: string) { try { const stat = await fs.stat(`${config.projectRoot}/quests/${imageId}/home`) diff --git a/server/src/utils/crypto.ts b/server/src/utils/crypto.ts index 4f27a03..7f6ed0f 100644 --- a/server/src/utils/crypto.ts +++ b/server/src/utils/crypto.ts @@ -1,4 +1,5 @@ import fs from 'fs' +import path from 'path' import ssh2 from 'ssh2' const { @@ -17,6 +18,10 @@ export function loadOrCreateKeyPair(privateKeyPath: string): KeyPair { const publicKey = fs.readFileSync(publicKeyPath, 'utf8') return { privateKey, publicKey } } + const dir = path.dirname(privateKeyPath) + if (!fs.existsSync(dir)) { + fs.mkdirSync(dir, { recursive: true }) + } const keyPair = generateKeyPair() fs.writeFileSync(privateKeyPath, keyPair.privateKey, { mode: 0o600,