diff --git a/README.md b/README.md index c5cf7b022..6d9a56b2b 100644 --- a/README.md +++ b/README.md @@ -14,11 +14,15 @@ https://andrasbacsai.com/farewell-netlify-and-heroku-after-3-days-of-coding # FAQ -Q: What is a buildpack? +Q: What does Buildpack means? -A: It defines your application's final form. -`Static` means that it will be hosted as a static site. -`NodeJs` means that it will be started as a node application. +A: It defines your application's final form. Static means that it will be hosted as a static site in the end. (see next question below 👇) + +--- + +Q: How can I build a static site, like Next.js, Sapper (prerendered), etc ? + +A: Use `static` builder and set your `Build command`. # Screenshots diff --git a/api/libs/applications/cleanup/index.js b/api/libs/applications/cleanup/index.js index 8987eeb5b..f40c2fbd0 100644 --- a/api/libs/applications/cleanup/index.js +++ b/api/libs/applications/cleanup/index.js @@ -1,10 +1,9 @@ const { docker } = require('../../docker') -const { execShellAsync } = require('../../common') +const { execShellAsync, delay } = require('../../common') const Deployment = require('../../../models/Deployment') async function purgeOldThings () { try { - // TODO: Tweak this, because it deletes coolify-base, so the upgrade will be slow await docker.engine.pruneImages() await docker.engine.pruneContainers() } catch (error) { diff --git a/api/libs/applications/configuration.js b/api/libs/applications/configuration.js index e4cdfbc4a..127a2ca36 100644 --- a/api/libs/applications/configuration.js +++ b/api/libs/applications/configuration.js @@ -1,8 +1,7 @@ const { uniqueNamesGenerator, adjectives, colors, animals } = require('unique-names-generator') const cuid = require('cuid') -const crypto = require('crypto') - const { execShellAsync } = require('../common') +const crypto = require('crypto') function getUniq () { return uniqueNamesGenerator({ dictionaries: [adjectives, animals, colors], length: 2 }) @@ -16,24 +15,6 @@ function setDefaultConfiguration (configuration) { const shaBase = JSON.stringify({ repository: configuration.repository }) const sha256 = crypto.createHash('sha256').update(shaBase).digest('hex') - const baseServiceConfiguration = { - replicas: 1, - restart_policy: { - condition: 'any', - max_attempts: 3 - }, - update_config: { - parallelism: 1, - delay: '10s', - order: 'start-first' - }, - rollback_config: { - parallelism: 1, - delay: '10s', - order: 'start-first' - } - } - configuration.build.container.name = sha256.slice(0, 15) configuration.general.nickname = nickname @@ -53,9 +34,6 @@ function setDefaultConfiguration (configuration) { if (!configuration.build.directory) configuration.build.directory = '/' } - configuration.build.container.baseSHA = crypto.createHash('sha256').update(JSON.stringify(baseServiceConfiguration)).digest('hex') - configuration.baseServiceConfiguration = baseServiceConfiguration - return configuration } catch (error) { throw { error, type: 'server' } diff --git a/api/libs/applications/deploy/deploy.js b/api/libs/applications/deploy/deploy.js index cd16c0014..15ebd193f 100644 --- a/api/libs/applications/deploy/deploy.js +++ b/api/libs/applications/deploy/deploy.js @@ -1,9 +1,9 @@ const yaml = require('js-yaml') -const fs = require('fs').promises const { execShellAsync } = require('../../common') const { docker } = require('../../docker') const { saveAppLog } = require('../../logging') const { deleteSameDeployments } = require('../cleanup') +const fs = require('fs').promises module.exports = async function (configuration, configChanged, imageChanged) { try { @@ -12,11 +12,6 @@ module.exports = async function (configuration, configChanged, imageChanged) { generateEnvs[secret.name] = secret.value } const containerName = configuration.build.container.name - - // Only save SHA256 of it in the configuration label - const baseServiceConfiguration = configuration.baseServiceConfiguration - delete configuration.baseServiceConfiguration - const stack = { version: '3.8', services: { @@ -25,7 +20,23 @@ module.exports = async function (configuration, configChanged, imageChanged) { networks: [`${docker.network}`], environment: generateEnvs, deploy: { - ...baseServiceConfiguration, + replicas: 1, + restart_policy: { + condition: 'on-failure', + delay: '5s', + max_attempts: 1, + window: '120s' + }, + update_config: { + parallelism: 1, + delay: '10s', + order: 'start-first' + }, + rollback_config: { + parallelism: 1, + delay: '10s', + order: 'start-first' + }, labels: [ 'managedBy=coolify', 'type=application', @@ -60,10 +71,8 @@ module.exports = async function (configuration, configChanged, imageChanged) { } } } - console.log(stack) await saveAppLog('### Publishing.', configuration) await fs.writeFile(`${configuration.general.workdir}/stack.yml`, yaml.dump(stack)) - // TODO: Compare stack.yml with the currently running one to upgrade if something changes, like restart_policy if (configChanged) { // console.log('configuration changed') await execShellAsync( @@ -82,7 +91,6 @@ module.exports = async function (configuration, configChanged, imageChanged) { await saveAppLog('### Published done!', configuration) } catch (error) { - console.log(error) await saveAppLog(`Error occured during deployment: ${error.message}`, configuration) throw { error, type: 'server' } } diff --git a/api/routes/v1/application/deploy/index.js b/api/routes/v1/application/deploy/index.js index 1322f3d6c..dbefa6b8f 100644 --- a/api/routes/v1/application/deploy/index.js +++ b/api/routes/v1/application/deploy/index.js @@ -60,10 +60,6 @@ module.exports = async function (fastify) { foundDomain = true } if (running.repository.id === configuration.repository.id && running.repository.branch === configuration.repository.branch) { - // Base service configuration changed - if (!running.build.container.baseSHA || running.build.container.baseSHA !== configuration.build.container.baseSHA) { - configChanged = true - } const state = await execShellAsync(`docker stack ps ${running.build.container.name} --format '{{ json . }}'`) const isError = state.split('\n').filter(n => n).map(s => JSON.parse(s)).filter(n => n.DesiredState !== 'Running') if (isError.length > 0) forceUpdate = true diff --git a/api/routes/v1/upgrade/index.js b/api/routes/v1/upgrade/index.js index fd86f3b43..7adfae051 100644 --- a/api/routes/v1/upgrade/index.js +++ b/api/routes/v1/upgrade/index.js @@ -3,10 +3,10 @@ const { saveServerLog } = require('../../../libs/logging') module.exports = async function (fastify) { fastify.get('/', async (request, reply) => { - const upgradeP1 = await execShellAsync('bash ./upgrade.sh upgrade-p1') + const upgradeP1 = await execShellAsync('bash ./install.sh upgrade-phase-1') await saveServerLog({ event: upgradeP1, type: 'UPGRADE-P-1' }) reply.code(200).send('I\'m trying, okay?') - const upgradeP2 = await execShellAsync('bash ./upgrade.sh upgrade-p2') + const upgradeP2 = await execShellAsync('bash ./install.sh upgrade-phase-2') await saveServerLog({ event: upgradeP2, type: 'UPGRADE-P-2' }) }) } diff --git a/install.sh b/install.sh index 59df1bb81..50cd4fa67 100644 --- a/install.sh +++ b/install.sh @@ -1,68 +1,43 @@ #!/bin/bash -echo ' -############################## -#### Pulling Git Updates ##### -##############################' GIT_SSH_COMMAND="ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no" git pull - +echo "#### Building base image." +docker build -t coolify-base -f install/Dockerfile-base . if [ $? -ne 0 ]; then - echo ' -#################################### -#### Ooops something not okay! ##### -####################################' + echo '#### Ooops something not okay!' exit 1 fi -echo ' -############################## -#### Building Base Image ##### -##############################' -docker build --label coolify-reserve=true -t coolify-base -f install/Dockerfile-base . - -if [ $? -ne 0 ]; then - echo ' -#################################### -#### Ooops something not okay! ##### -####################################' - exit 1 -fi - -echo ' -################################## -#### Checking configuration. ##### -##################################' +echo "#### Checking configuration." docker run --rm -w /usr/src/app coolify-base node install/install.js --check if [ $? -ne 0 ]; then - echo ' -################################## -#### Missing configuration ! ##### -##################################' + echo '#### Missing configuration.' exit 1 fi case "$1" in "all") - echo ' -################################# -#### Rebuilding everything. ##### -#################################' + echo "#### Rebuild everything." docker run --rm -v /var/run/docker.sock:/var/run/docker.sock -v /data/coolify:/data/coolify -u root -w /usr/src/app coolify-base node install/install.js --type all ;; "coolify") - echo ' -############################## -#### Rebuilding Coolify. ##### -##############################' + echo "#### Rebuild coolify." docker run --rm -v /var/run/docker.sock:/var/run/docker.sock -v /data/coolify:/data/coolify -u root -w /usr/src/app coolify-base node install/install.js --type coolify ;; "proxy") - echo ' -############################ -#### Rebuilding Proxy. ##### -############################' + echo "#### Rebuild proxy." docker run --rm -v /var/run/docker.sock:/var/run/docker.sock -v /data/coolify:/data/coolify -u root -w /usr/src/app coolify-base node install/install.js --type proxy ;; + "upgrade-phase-1") + echo "#### Rebuild coolify from frontend request phase 1." + docker run --rm -v /var/run/docker.sock:/var/run/docker.sock -v /data/coolify:/data/coolify -u root -w /usr/src/app coolify-base node install/install.js --type upgrade + ;; + "upgrade-phase-2") + echo "#### Rebuild coolify from frontend request phase 2." + docker run --rm -v /var/run/docker.sock:/var/run/docker.sock -v /data/coolify:/data/coolify -u root -w /usr/src/app coolify-base node install/update.js --type upgrade + ;; + *) + echo "Use 'all' to build & deploy proxy+coolify, 'coolify' to build & deploy only coolify, 'proxy' to build & deploy only proxy." exit 1 ;; esac diff --git a/install/install.js b/install/install.js index 95dfe477a..2fd22201f 100644 --- a/install/install.js +++ b/install/install.js @@ -35,7 +35,7 @@ if (program.check) { } else if (program.type === 'proxy') { shell.exec('docker service rm coollabs-coolify_proxy') } - shell.exec('set -a && source .env && set +a && envsubst < install/coolify-template.yml | docker stack deploy -c - coollabs-coolify', { silent: !program.debug, shell: '/bin/bash' }) + if (program.type !== 'upgrade') shell.exec('set -a && source .env && set +a && envsubst < install/coolify-template.yml | docker stack deploy -c - coollabs-coolify', { silent: !program.debug, shell: '/bin/bash' }) } function checkConfig () { diff --git a/install/upgrade.js b/install/update.js similarity index 74% rename from install/upgrade.js rename to install/update.js index 28e72bd56..47beeb026 100644 --- a/install/upgrade.js +++ b/install/update.js @@ -15,12 +15,7 @@ if (user !== 'root') { console.error(`Please run as root! Current user: ${user}`) process.exit(1) } -if (program.type === 'upgrade-p1') { - shell.exec(`docker network create ${process.env.DOCKER_NETWORK} --driver overlay`, { silent: !program.debug }) - shell.exec('docker build -t coolify -f install/Dockerfile .') -} - -if (program.type === 'upgrade-p2') { +if (program.type === 'upgrade') { shell.exec('docker service rm coollabs-coolify_coolify') shell.exec('set -a && source .env && set +a && envsubst < install/coolify-template.yml | docker stack deploy -c - coollabs-coolify', { silent: !program.debug, shell: '/bin/bash' }) } diff --git a/package.json b/package.json index 012d05a9b..0031023cc 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,6 @@ "@zerodevx/svelte-toast": "^0.1.4", "axios": "^0.21.0", "commander": "^6.2.1", - "compare-versions": "^3.6.0", "cuid": "^2.1.8", "dayjs": "^1.10.4", "deepmerge": "^4.2.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c1565216b..87ac153fc 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -3,7 +3,6 @@ dependencies: '@zerodevx/svelte-toast': 0.1.4 axios: 0.21.1 commander: 6.2.1 - compare-versions: 3.6.0 cuid: 2.1.8 dayjs: 1.10.4 deepmerge: 4.2.2 @@ -1189,10 +1188,6 @@ packages: dev: true resolution: integrity: sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= - /compare-versions/3.6.0: - dev: false - resolution: - integrity: sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA== /concat-map/0.0.1: resolution: integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= @@ -6754,7 +6749,6 @@ specifiers: '@zerodevx/svelte-toast': ^0.1.4 axios: ^0.21.0 commander: ^6.2.1 - compare-versions: ^3.6.0 cuid: ^2.1.8 dayjs: ^1.10.4 deepmerge: ^4.2.2 diff --git a/src/components/Application/Configuration/ActiveTab/General.svelte b/src/components/Application/Configuration/ActiveTab/General.svelte index e0bcbcadf..d48584fad 100644 --- a/src/components/Application/Configuration/ActiveTab/General.svelte +++ b/src/components/Application/Configuration/ActiveTab/General.svelte @@ -8,8 +8,8 @@ >
{/if} + \ No newline at end of file diff --git a/src/components/Application/Configuration/Branches.svelte b/src/components/Application/Configuration/Branches.svelte index a10a0c083..c111e215c 100644 --- a/src/components/Application/Configuration/Branches.svelte +++ b/src/components/Application/Configuration/Branches.svelte @@ -17,7 +17,7 @@ diff --git a/src/components/Application/Configuration/Repositories.svelte b/src/components/Application/Configuration/Repositories.svelte index c62bfc445..c69685e71 100644 --- a/src/components/Application/Configuration/Repositories.svelte +++ b/src/components/Application/Configuration/Repositories.svelte @@ -23,7 +23,7 @@ > {#each repositories as repo} -