mirror of
https://github.com/TryGhost/Ghost.git
synced 2025-02-17 23:44:39 -05:00
ref https://linear.app/ghost/issue/ENG-1959/extend-setupjs-to-modify-config-as-appropriate-for-full-docker-dev - When switching from local development to docker, there are a few configuration parameters that need to be updated to e.g. point to the right database host within the docker network. - Setting these values with environment variables doesn't work well because the configuration passed via environment overrides the configuration set in tests, and thus points tests to the wrong database. - This commit adds a yarn docker:setup command to the root of the repo, to make it easier to get started with a full docker compose based workflow. It edits you config.local.json file to update the necessary settings for running Ghost in docker compose. - It also updates the clean.js script such that it will run successfully regardless of whether it is run locally or in docker. - Finally, this commit also adds convenience commands for developing and running tests in docker compose
100 lines
2.5 KiB
JavaScript
100 lines
2.5 KiB
JavaScript
const path = require('path');
|
|
const fs = require('fs').promises;
|
|
const {spawn} = require('child_process');
|
|
|
|
/**
|
|
* Run a command and stream output to the console
|
|
*
|
|
* @param {string} command
|
|
* @param {string[]} args
|
|
* @param {object} options
|
|
*/
|
|
async function runAndStream(command, args, options) {
|
|
return new Promise((resolve, reject) => {
|
|
const child = spawn(command, args, {
|
|
stdio: 'inherit',
|
|
...options
|
|
});
|
|
|
|
child.on('close', (code) => {
|
|
if (code === 0) {
|
|
resolve(code);
|
|
} else {
|
|
reject(new Error(`'${command} ${args.join(' ')}' exited with code ${code}`));
|
|
}
|
|
});
|
|
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Removes node dependencies and cleans up local caches
|
|
*/
|
|
function clean() {
|
|
require('./clean');
|
|
}
|
|
|
|
/**
|
|
* Adjust config.local.json for Docker Compose setup
|
|
*/
|
|
async function adjustConfig() {
|
|
console.log('Adjusting configuration...');
|
|
const coreFolder = path.join(__dirname, '../../ghost/core');
|
|
const currentConfigPath = path.join(coreFolder, 'config.local.json');
|
|
let currentConfig;
|
|
try {
|
|
currentConfig = require(currentConfigPath);
|
|
} catch (err) {
|
|
currentConfig = {};
|
|
}
|
|
|
|
currentConfig.database = {
|
|
client: 'mysql',
|
|
docker: true,
|
|
connection: {
|
|
host: 'mysql',
|
|
user: 'root',
|
|
password: 'root',
|
|
database: 'ghost'
|
|
}
|
|
};
|
|
|
|
currentConfig.adapters = {
|
|
...currentConfig.adapters,
|
|
Redis: {
|
|
host: 'redis',
|
|
port: 6379
|
|
}
|
|
};
|
|
|
|
currentConfig.server = {
|
|
...currentConfig.server,
|
|
host: '0.0.0.0',
|
|
port: 2368
|
|
};
|
|
|
|
try {
|
|
await fs.writeFile(currentConfigPath, JSON.stringify(currentConfig, null, 4));
|
|
} catch (err) {
|
|
console.error('Failed to write config.local.json', err);
|
|
console.log(`Please add the following to config.local.json:\n`, JSON.stringify(currentConfig, null, 4));
|
|
process.exit(1);
|
|
}
|
|
}
|
|
|
|
async function buildContainer() {
|
|
console.log('Building container...');
|
|
await runAndStream('docker-compose', ['build'], {});
|
|
}
|
|
|
|
async function runMigrations() {
|
|
console.log('Running migrations...');
|
|
await runAndStream('docker-compose', ['run', '--rm', '-w', '/home/ghost/ghost/core', 'ghost', 'yarn', 'knex-migrator', 'init'], {cwd: path.join(__dirname, '../../')});
|
|
}
|
|
|
|
(async () => {
|
|
clean();
|
|
await adjustConfig();
|
|
await buildContainer();
|
|
await runMigrations();
|
|
})();
|