diff --git a/dev/deploy-to-container/refresh.js b/dev/deploy-to-container/refresh.js new file mode 100644 index 000000000..457cf1365 --- /dev/null +++ b/dev/deploy-to-container/refresh.js @@ -0,0 +1,80 @@ +#!/usr/bin/env node + +import Docker from 'dockerode' + +async function main () { + // Connect to Docker Engine API + console.info('Connecting to Docker Engine API...') + const dock = new Docker() + await dock.ping() + console.info('Connected to Docker Engine API.') + + // Pull latest DB image + console.info('Pulling latest DB docker image...') + const dbImagePullStream = await dock.pull('ghcr.io/ietf-tools/datatracker-db:latest') + await new Promise((resolve, reject) => { + dock.modem.followProgress(dbImagePullStream, (err, res) => err ? reject(err) : resolve(res)) + }) + console.info('Pulled latest DB docker image successfully.') + + // Terminate existing containers + console.info('Terminating DB containers and stopping app containers...') + const containers = await dock.listContainers({ all: true }) + const dbContainersToCreate = [] + const containersToRestart = [] + for (const container of containers) { + if ( + container.Names.some(n => n.startsWith('/dt-db-')) + ) { + console.info(`Terminating DB container ${container.Id}...`) + dbContainersToCreate.push(container.Names.find(n => n.startsWith('/dt-db-')).substring(1)) + const oldContainer = dock.getContainer(container.Id) + if (container.State === 'running') { + await oldContainer.stop({ t: 5 }) + } + await oldContainer.remove({ + force: true, + v: true + }) + } else if ( + container.Names.some(n => n.startsWith('/dt-app-')) || + container.Names.some(n => n.startsWith('/dt-celery-')) || + container.Names.some(n => n.startsWith('/dt-beat-')) + ) { + if (container.State === 'running') { + containersToRestart.push(container) + console.info(`Stopping app / celery container ${container.Id}...`) + await container.stop({ t: 5 }) + } + } + } + console.info('DB containers have been terminated.') + + // Create DB containers + for (const dbContainerName of dbContainersToCreate) { + console.info(`Recreating DB docker container... [${dbContainerName}]`) + const dbContainer = await dock.createContainer({ + Image: 'ghcr.io/ietf-tools/datatracker-db:latest', + name: dbContainerName, + Hostname: dbContainerName, + HostConfig: { + NetworkMode: 'shared', + RestartPolicy: { + Name: 'unless-stopped' + } + } + }) + await dbContainer.start() + } + console.info('Recreated and started DB docker containers successfully.') + + console.info('Restarting app / celery containers...') + for (const appContainer of containersToRestart) { + await appContainer.start() + } + console.info('Done.') + + process.exit(0) +} + +main()