@@ -2,7 +2,7 @@ version: '3.8'
|
|||||||
|
|
||||||
services:
|
services:
|
||||||
coolify:
|
coolify:
|
||||||
image: coollabsio/coolify:latest
|
image: coollabsio/coolify:${TAG}
|
||||||
restart: always
|
restart: always
|
||||||
container_name: coolify
|
container_name: coolify
|
||||||
ports:
|
ports:
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "coolify",
|
"name": "coolify",
|
||||||
"description": "An open-source & self-hostable Heroku / Netlify alternative.",
|
"description": "An open-source & self-hostable Heroku / Netlify alternative.",
|
||||||
"version": "2.0.3",
|
"version": "2.0.4",
|
||||||
"license": "AGPL-3.0",
|
"license": "AGPL-3.0",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "docker-compose -f docker-compose-dev.yaml up -d && NODE_ENV=development svelte-kit dev --host 0.0.0.0",
|
"dev": "docker-compose -f docker-compose-dev.yaml up -d && NODE_ENV=development svelte-kit dev --host 0.0.0.0",
|
||||||
@@ -16,6 +16,7 @@
|
|||||||
"db:generate": "prisma generate",
|
"db:generate": "prisma generate",
|
||||||
"db:push": "prisma db push && prisma generate",
|
"db:push": "prisma db push && prisma generate",
|
||||||
"db:seed": "prisma db seed",
|
"db:seed": "prisma db seed",
|
||||||
|
"stagrelease": "cross-var docker build -t coollabsio/coolify:$npm_package_version && docker push coollabsio/coolify:$npm_package_version",
|
||||||
"prerelease": "cross-var docker build -t coollabsio/coolify:$npm_package_version -t coollabsio/coolify:latest .",
|
"prerelease": "cross-var docker build -t coollabsio/coolify:$npm_package_version -t coollabsio/coolify:latest .",
|
||||||
"release:coolify": "cross-var yarn prerelease && docker push coollabsio/coolify:$npm_package_version && docker image push coollabsio/coolify:$npm_package_version && docker push coollabsio/coolify:latest",
|
"release:coolify": "cross-var yarn prerelease && docker push coollabsio/coolify:$npm_package_version && docker image push coollabsio/coolify:$npm_package_version && docker push coollabsio/coolify:latest",
|
||||||
"release:haproxy": "docker build -f haproxy.Dockerfile -t coollabsio/coolify-haproxy-alpine:1.0.0 -t coollabsio/coolify-haproxy-alpine:latest . && docker image push --all-tags coollabsio/coolify-haproxy-alpine",
|
"release:haproxy": "docker build -f haproxy.Dockerfile -t coollabsio/coolify-haproxy-alpine:1.0.0 -t coollabsio/coolify-haproxy-alpine:latest . && docker image push --all-tags coollabsio/coolify-haproxy-alpine",
|
||||||
|
@@ -481,8 +481,12 @@ export async function startTcpProxy(destinationDocker, id, publicPort, privatePo
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
if (foundDB && !found) {
|
if (foundDB && !found) {
|
||||||
|
const { stdout: Config } = await asyncExecShell(
|
||||||
|
`DOCKER_HOST="${host}" docker network inspect bridge --format '{{json .IPAM.Config }}'`
|
||||||
|
);
|
||||||
|
const ip = JSON.parse(Config)[0].Gateway;
|
||||||
return await asyncExecShell(
|
return await asyncExecShell(
|
||||||
`DOCKER_HOST=${host} docker run --restart always -e PORT=${publicPort} -e APP=${id} -e PRIVATE_PORT=${privatePort} --add-host 'host.docker.internal:host-gateway' --network ${network} -p ${publicPort}:${publicPort} --name ${containerName} -d coollabsio/${defaultProxyImageTcp}`
|
`DOCKER_HOST=${host} docker run --restart always -e PORT=${publicPort} -e APP=${id} -e PRIVATE_PORT=${privatePort} --add-host 'host.docker.internal:host-gateway' --add-host 'host.docker.internal:${ip}' --network ${network} -p ${publicPort}:${publicPort} --name ${containerName} -d coollabsio/${defaultProxyImageTcp}`
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
@@ -499,8 +503,12 @@ export async function startHttpProxy(destinationDocker, id, publicPort, privateP
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
if (foundDB && !found) {
|
if (foundDB && !found) {
|
||||||
|
const { stdout: Config } = await asyncExecShell(
|
||||||
|
`DOCKER_HOST="${host}" docker network inspect bridge --format '{{json .IPAM.Config }}'`
|
||||||
|
);
|
||||||
|
const ip = JSON.parse(Config)[0].Gateway;
|
||||||
return await asyncExecShell(
|
return await asyncExecShell(
|
||||||
`DOCKER_HOST=${host} docker run --restart always -e PORT=${publicPort} -e APP=${id} -e PRIVATE_PORT=${privatePort} --add-host 'host.docker.internal:host-gateway' --network ${network} -p ${publicPort}:${publicPort} --name ${containerName} -d coollabsio/${defaultProxyImageHttp}`
|
`DOCKER_HOST=${host} docker run --restart always -e PORT=${publicPort} -e APP=${id} -e PRIVATE_PORT=${privatePort} --add-host 'host.docker.internal:host-gateway' --add-host 'host.docker.internal:${ip}' --network ${network} -p ${publicPort}:${publicPort} --name ${containerName} -d coollabsio/${defaultProxyImageHttp}`
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
@@ -512,8 +520,12 @@ export async function startCoolifyProxy(engine) {
|
|||||||
const found = await checkContainer(engine, 'coolify-haproxy');
|
const found = await checkContainer(engine, 'coolify-haproxy');
|
||||||
const { proxyPassword, proxyUser } = await db.listSettings();
|
const { proxyPassword, proxyUser } = await db.listSettings();
|
||||||
if (!found) {
|
if (!found) {
|
||||||
|
const { stdout: Config } = await asyncExecShell(
|
||||||
|
`DOCKER_HOST="${host}" docker network inspect bridge --format '{{json .IPAM.Config }}'`
|
||||||
|
);
|
||||||
|
const ip = JSON.parse(Config)[0].Gateway;
|
||||||
await asyncExecShell(
|
await asyncExecShell(
|
||||||
`DOCKER_HOST="${host}" docker run -e HAPROXY_USERNAME=${proxyUser} -e HAPROXY_PASSWORD=${proxyPassword} --restart always --add-host 'host.docker.internal:host-gateway' -v coolify-ssl-certs:/usr/local/etc/haproxy/ssl --network coolify-infra -p "80:80" -p "443:443" -p "8404:8404" -p "5555:5555" -p "5000:5000" --name coolify-haproxy -d coollabsio/${defaultProxyImage}`
|
`DOCKER_HOST="${host}" docker run -e HAPROXY_USERNAME=${proxyUser} -e HAPROXY_PASSWORD=${proxyPassword} --restart always --add-host 'host.docker.internal:host-gateway' --add-host 'host.docker.internal:${ip}' -v coolify-ssl-certs:/usr/local/etc/haproxy/ssl --network coolify-infra -p "80:80" -p "443:443" -p "8404:8404" -p "5555:5555" -p "5000:5000" --name coolify-haproxy -d coollabsio/${defaultProxyImage}`
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
await configureNetworkCoolifyProxy(engine);
|
await configureNetworkCoolifyProxy(engine);
|
||||||
|
@@ -48,7 +48,7 @@
|
|||||||
checking: false,
|
checking: false,
|
||||||
success: null
|
success: null
|
||||||
};
|
};
|
||||||
|
let latestVersion = 'latest';
|
||||||
onMount(async () => {
|
onMount(async () => {
|
||||||
if ($session.uid) {
|
if ($session.uid) {
|
||||||
try {
|
try {
|
||||||
@@ -63,6 +63,7 @@
|
|||||||
try {
|
try {
|
||||||
const data = await get(`/update.json`);
|
const data = await get(`/update.json`);
|
||||||
if (data?.isUpdateAvailable) {
|
if (data?.isUpdateAvailable) {
|
||||||
|
latestVersion = data.latestVersion;
|
||||||
await post(`/update.json`, { type: 'pull' });
|
await post(`/update.json`, { type: 'pull' });
|
||||||
}
|
}
|
||||||
isUpdateAvailable = data?.isUpdateAvailable;
|
isUpdateAvailable = data?.isUpdateAvailable;
|
||||||
@@ -95,54 +96,53 @@
|
|||||||
|
|
||||||
async function update() {
|
async function update() {
|
||||||
updateStatus.loading = true;
|
updateStatus.loading = true;
|
||||||
if (!dev) {
|
// if (!dev) {
|
||||||
try {
|
try {
|
||||||
await post(`/update.json`, { type: 'update' });
|
await post(`/update.json`, { type: 'update', latestVersion });
|
||||||
toast.push('Update completed. Waiting for the new version to start...');
|
toast.push('Update completed. Waiting for the new version to start...');
|
||||||
let reachable = false;
|
|
||||||
let tries = 0;
|
|
||||||
do {
|
|
||||||
await asyncSleep(4000);
|
|
||||||
try {
|
|
||||||
await get(`/undead.json`);
|
|
||||||
reachable = true;
|
|
||||||
} catch (error) {
|
|
||||||
reachable = false;
|
|
||||||
}
|
|
||||||
if (reachable) break;
|
|
||||||
tries++;
|
|
||||||
} while (!reachable || tries < 120);
|
|
||||||
toast.push('New version reachable. Reloading...');
|
|
||||||
updateStatus.loading = false;
|
|
||||||
updateStatus.success = true;
|
|
||||||
await asyncSleep(3000);
|
|
||||||
return window.location.reload();
|
|
||||||
} catch ({ error }) {
|
|
||||||
return errorNotification(error);
|
|
||||||
} finally {
|
|
||||||
updateStatus.success = false;
|
|
||||||
updateStatus.loading = false;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
let reachable = false;
|
let reachable = false;
|
||||||
let tries = 0;
|
let tries = 0;
|
||||||
do {
|
do {
|
||||||
await asyncSleep(1000);
|
await asyncSleep(4000);
|
||||||
try {
|
try {
|
||||||
await get(`/undead.json`);
|
await get(`/undead.json`);
|
||||||
reachable = true;
|
reachable = true;
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.log(error);
|
|
||||||
reachable = false;
|
reachable = false;
|
||||||
}
|
}
|
||||||
console.log(reachable);
|
|
||||||
if (reachable) break;
|
if (reachable) break;
|
||||||
tries++;
|
tries++;
|
||||||
} while (!reachable || tries < 120);
|
} while (!reachable || tries < 120);
|
||||||
toast.push('New version reachable. Reloading...');
|
toast.push('New version reachable. Reloading...');
|
||||||
await asyncSleep(2000);
|
updateStatus.loading = false;
|
||||||
window.location.reload();
|
updateStatus.success = true;
|
||||||
|
await asyncSleep(3000);
|
||||||
|
return window.location.reload();
|
||||||
|
} catch ({ error }) {
|
||||||
|
return errorNotification(error);
|
||||||
|
} finally {
|
||||||
|
updateStatus.success = false;
|
||||||
|
updateStatus.loading = false;
|
||||||
}
|
}
|
||||||
|
// } else {
|
||||||
|
// let reachable = false;
|
||||||
|
// let tries = 0;
|
||||||
|
// do {
|
||||||
|
// await asyncSleep(1000);
|
||||||
|
// try {
|
||||||
|
// await get(`/undead.json`);
|
||||||
|
// reachable = true;
|
||||||
|
// } catch (error) {
|
||||||
|
// console.log(error);
|
||||||
|
// reachable = false;
|
||||||
|
// }
|
||||||
|
// if (reachable) break;
|
||||||
|
// tries++;
|
||||||
|
// } while (!reachable || tries < 120);
|
||||||
|
// toast.push('New version reachable. Reloading...');
|
||||||
|
// await asyncSleep(2000);
|
||||||
|
// window.location.reload();
|
||||||
|
// }
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
@@ -12,7 +12,7 @@ export const get: RequestHandler = async () => {
|
|||||||
const versions = await got
|
const versions = await got
|
||||||
.get(`https://get.coollabs.io/versions.json?appId=${process.env['COOLIFY_APP_ID']}`)
|
.get(`https://get.coollabs.io/versions.json?appId=${process.env['COOLIFY_APP_ID']}`)
|
||||||
.json();
|
.json();
|
||||||
const latestVersion = versions['coolify'].main.version;
|
const latestVersion = dev ? '10.0.0' : versions['coolify'].main.version;
|
||||||
const isUpdateAvailable = compare(latestVersion, currentVersion);
|
const isUpdateAvailable = compare(latestVersion, currentVersion);
|
||||||
return {
|
return {
|
||||||
body: {
|
body: {
|
||||||
@@ -26,7 +26,7 @@ export const get: RequestHandler = async () => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
export const post: RequestHandler = async (event) => {
|
export const post: RequestHandler = async (event) => {
|
||||||
const { type } = await event.request.json();
|
const { type, latestVersion } = await event.request.json();
|
||||||
if (type === 'pull') {
|
if (type === 'pull') {
|
||||||
try {
|
try {
|
||||||
if (!dev) {
|
if (!dev) {
|
||||||
@@ -50,13 +50,14 @@ export const post: RequestHandler = async (event) => {
|
|||||||
try {
|
try {
|
||||||
if (!dev) {
|
if (!dev) {
|
||||||
await asyncExecShell(
|
await asyncExecShell(
|
||||||
`docker run --rm -tid --env-file .env -v /var/run/docker.sock:/var/run/docker.sock -v coolify-db coollabsio/coolify:latest /bin/sh -c "env | grep COOLIFY > .env && docker stop -t 0 coolify && docker stop -t 0 coolify-redis && docker compose up -d --force-recreate"`
|
`docker run --rm -tid --env-file .env -v /var/run/docker.sock:/var/run/docker.sock -v coolify-db coollabsio/coolify:${latestVersion} /bin/sh -c "env | grep COOLIFY > .env && echo 'TAG=${latestVersion}' >> .env && docker stop -t 0 coolify && docker stop -t 0 coolify-redis && docker compose up -d --force-recreate"`
|
||||||
);
|
);
|
||||||
return {
|
return {
|
||||||
status: 200,
|
status: 200,
|
||||||
body: {}
|
body: {}
|
||||||
};
|
};
|
||||||
} else {
|
} else {
|
||||||
|
console.log(latestVersion);
|
||||||
await asyncSleep(2000);
|
await asyncSleep(2000);
|
||||||
return {
|
return {
|
||||||
status: 200,
|
status: 200,
|
||||||
|
Reference in New Issue
Block a user