mirror of
https://github.com/ershisan99/coolify.git
synced 2025-12-18 12:33:06 +00:00
3
.github/ISSUE_TEMPLATE/--bug-report.yaml
vendored
3
.github/ISSUE_TEMPLATE/--bug-report.yaml
vendored
@@ -2,9 +2,6 @@ name: 🐞 Bug report
|
|||||||
description: Create a bug report to help us improve coolify
|
description: Create a bug report to help us improve coolify
|
||||||
title: "[Bug]: "
|
title: "[Bug]: "
|
||||||
labels: [Bug]
|
labels: [Bug]
|
||||||
assignees:
|
|
||||||
- andrasbacsai
|
|
||||||
- vasani-arpit
|
|
||||||
body:
|
body:
|
||||||
- type: markdown
|
- type: markdown
|
||||||
attributes:
|
attributes:
|
||||||
|
|||||||
@@ -2,9 +2,6 @@ name: 🛠️ Feature request
|
|||||||
description: Suggest an idea to improve coolify
|
description: Suggest an idea to improve coolify
|
||||||
title: '[Feature]: '
|
title: '[Feature]: '
|
||||||
labels: [Enhancement]
|
labels: [Enhancement]
|
||||||
assignees:
|
|
||||||
- andrasbacsai
|
|
||||||
- vasani-arpit
|
|
||||||
body:
|
body:
|
||||||
- type: markdown
|
- type: markdown
|
||||||
attributes:
|
attributes:
|
||||||
|
|||||||
@@ -268,6 +268,13 @@
|
|||||||
- DISABLE_REGISTRATION=$$config_disable_registration
|
- DISABLE_REGISTRATION=$$config_disable_registration
|
||||||
- DATABASE_URL=$$secret_database_url
|
- DATABASE_URL=$$secret_database_url
|
||||||
- CLICKHOUSE_DATABASE_URL=$$secret_clickhouse_database_url
|
- CLICKHOUSE_DATABASE_URL=$$secret_clickhouse_database_url
|
||||||
|
- MAILER_EMAIL=$$config_mailer_email
|
||||||
|
- SMTP_HOST_ADDR=$$config_smtp_host_addr
|
||||||
|
- SMTP_HOST_PORT=$$config_smtp_host_port
|
||||||
|
- SMTP_USER_NAME=$$config_smtp_user_name
|
||||||
|
- SMTP_USER_PWD=$$config_smtp_user_pwd
|
||||||
|
- SMTP_HOST_SSL_ENABLED=$$config_smtp_host_ssl_enabled
|
||||||
|
- SMTP_HOST_RETRIES=$$config_smtp_host_retries
|
||||||
ports:
|
ports:
|
||||||
- "8000"
|
- "8000"
|
||||||
$$id-postgresql:
|
$$id-postgresql:
|
||||||
@@ -375,6 +382,49 @@
|
|||||||
label: PostgreSQL Database
|
label: PostgreSQL Database
|
||||||
defaultValue: plausible
|
defaultValue: plausible
|
||||||
description: ""
|
description: ""
|
||||||
|
- id: $$config_mailer_email
|
||||||
|
name: MAILER_EMAIL
|
||||||
|
label: Mailer Email
|
||||||
|
defaultValue: hello@plausible.local
|
||||||
|
description: >-
|
||||||
|
The email id to use for as from address of all communications from Plausible.
|
||||||
|
- id: $$config_smtp_host_addr
|
||||||
|
name: SMTP_HOST_ADDR
|
||||||
|
label: SMTP Host Address
|
||||||
|
defaultValue: localhost
|
||||||
|
description: >-
|
||||||
|
The host address of your smtp server.
|
||||||
|
- id: $$config_smtp_host_port
|
||||||
|
name: SMTP_HOST_PORT
|
||||||
|
label: SMTP Port
|
||||||
|
defaultValue: "25"
|
||||||
|
description: >-
|
||||||
|
The port of your smtp server.
|
||||||
|
- id: $$config_smtp_user_name
|
||||||
|
name: SMTP_USER_NAME
|
||||||
|
label: SMTP Username
|
||||||
|
defaultValue: ""
|
||||||
|
description: >-
|
||||||
|
The username/email in case SMTP auth is enabled.
|
||||||
|
- id: $$config_smtp_user_pwd
|
||||||
|
name: SMTP_USER_PWD
|
||||||
|
label: SMTP Password
|
||||||
|
defaultValue: ""
|
||||||
|
description: >-
|
||||||
|
The password in case SMTP auth is enabled.
|
||||||
|
showOnConfiguration: true
|
||||||
|
- id: $$config_smtp_host_ssl_enabled
|
||||||
|
name: SMTP_HOST_SSL_ENABLED
|
||||||
|
label: SMTP SSL
|
||||||
|
defaultValue: "false"
|
||||||
|
description: >-
|
||||||
|
If SSL is enabled for SMTP connection.
|
||||||
|
- id: $$config_smtp_host_retries
|
||||||
|
name: SMTP_HOST_RETRIES
|
||||||
|
label: SMTP Retries
|
||||||
|
defaultValue: "2"
|
||||||
|
description: >-
|
||||||
|
Number of retries to make until mailer gives up.
|
||||||
- id: $$config_scriptName
|
- id: $$config_scriptName
|
||||||
name: SCRIPT_NAME
|
name: SCRIPT_NAME
|
||||||
label: Custom Script Name
|
label: Custom Script Name
|
||||||
@@ -3389,6 +3439,13 @@
|
|||||||
- DISABLE_REGISTRATION=$$config_disable_registration
|
- DISABLE_REGISTRATION=$$config_disable_registration
|
||||||
- DATABASE_URL=$$secret_database_url
|
- DATABASE_URL=$$secret_database_url
|
||||||
- CLICKHOUSE_DATABASE_URL=$$secret_clickhouse_database_url
|
- CLICKHOUSE_DATABASE_URL=$$secret_clickhouse_database_url
|
||||||
|
- MAILER_EMAIL=$$config_mailer_email
|
||||||
|
- SMTP_HOST_ADDR=$$config_smtp_host_addr
|
||||||
|
- SMTP_HOST_PORT=$$config_smtp_host_port
|
||||||
|
- SMTP_USER_NAME=$$config_smtp_user_name
|
||||||
|
- SMTP_USER_PWD=$$config_smtp_user_pwd
|
||||||
|
- SMTP_HOST_SSL_ENABLED=$$config_smtp_host_ssl_enabled
|
||||||
|
- SMTP_HOST_RETRIES=$$config_smtp_host_retries
|
||||||
ports:
|
ports:
|
||||||
- "8000"
|
- "8000"
|
||||||
$$id-postgresql:
|
$$id-postgresql:
|
||||||
@@ -3496,6 +3553,49 @@
|
|||||||
label: PostgreSQL Database
|
label: PostgreSQL Database
|
||||||
defaultValue: plausible
|
defaultValue: plausible
|
||||||
description: ""
|
description: ""
|
||||||
|
- id: $$config_mailer_email
|
||||||
|
name: MAILER_EMAIL
|
||||||
|
label: Mailer Email
|
||||||
|
defaultValue: hello@plausible.local
|
||||||
|
description: >-
|
||||||
|
The email id to use for as from address of all communications from Plausible.
|
||||||
|
- id: $$config_smtp_host_addr
|
||||||
|
name: SMTP_HOST_ADDR
|
||||||
|
label: SMTP Host Address
|
||||||
|
defaultValue: localhost
|
||||||
|
description: >-
|
||||||
|
The host address of your smtp server.
|
||||||
|
- id: $$config_smtp_host_port
|
||||||
|
name: SMTP_HOST_PORT
|
||||||
|
label: SMTP Port
|
||||||
|
defaultValue: "25"
|
||||||
|
description: >-
|
||||||
|
The port of your smtp server.
|
||||||
|
- id: $$config_smtp_user_name
|
||||||
|
name: SMTP_USER_NAME
|
||||||
|
label: SMTP Username
|
||||||
|
defaultValue: ""
|
||||||
|
description: >-
|
||||||
|
The username/email in case SMTP auth is enabled.
|
||||||
|
- id: $$config_smtp_user_pwd
|
||||||
|
name: SMTP_USER_PWD
|
||||||
|
label: SMTP Password
|
||||||
|
defaultValue: ""
|
||||||
|
description: >-
|
||||||
|
The password in case SMTP auth is enabled.
|
||||||
|
showOnConfiguration: true
|
||||||
|
- id: $$config_smtp_host_ssl_enabled
|
||||||
|
name: SMTP_HOST_SSL_ENABLED
|
||||||
|
label: SMTP SSL
|
||||||
|
defaultValue: "false"
|
||||||
|
description: >-
|
||||||
|
If SSL is enabled for SMTP connection.
|
||||||
|
- id: $$config_smtp_host_retries
|
||||||
|
name: SMTP_HOST_RETRIES
|
||||||
|
label: SMTP Retries
|
||||||
|
defaultValue: "2"
|
||||||
|
description: >-
|
||||||
|
Number of retries to make until mailer gives up.
|
||||||
- id: $$config_scriptName
|
- id: $$config_scriptName
|
||||||
name: SCRIPT_NAME
|
name: SCRIPT_NAME
|
||||||
label: Custom Script Name
|
label: Custom Script Name
|
||||||
|
|||||||
@@ -69,7 +69,15 @@ import * as buildpacks from '../lib/buildPacks';
|
|||||||
teams: true
|
teams: true
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
if (!application) {
|
||||||
|
await prisma.build.update({
|
||||||
|
where: { id: queueBuild.id },
|
||||||
|
data: {
|
||||||
|
status: 'failed'
|
||||||
|
}
|
||||||
|
});
|
||||||
|
throw new Error('Application not found');
|
||||||
|
}
|
||||||
let {
|
let {
|
||||||
id: buildId,
|
id: buildId,
|
||||||
type,
|
type,
|
||||||
@@ -111,7 +119,7 @@ import * as buildpacks from '../lib/buildPacks';
|
|||||||
.replace('-app', '')}:${storage.path}`;
|
.replace('-app', '')}:${storage.path}`;
|
||||||
}
|
}
|
||||||
if (storage.hostPath) {
|
if (storage.hostPath) {
|
||||||
return `${storage.hostPath}:${storage.path}`
|
return `${storage.hostPath}:${storage.path}`;
|
||||||
}
|
}
|
||||||
return `${applicationId}${storage.path.replace(/\//gi, '-')}:${storage.path}`;
|
return `${applicationId}${storage.path.replace(/\//gi, '-')}:${storage.path}`;
|
||||||
}) || [];
|
}) || [];
|
||||||
@@ -163,17 +171,24 @@ import * as buildpacks from '../lib/buildPacks';
|
|||||||
port: exposePort ? `${exposePort}:${port}` : port
|
port: exposePort ? `${exposePort}:${port}` : port
|
||||||
});
|
});
|
||||||
try {
|
try {
|
||||||
const composeVolumes = volumes.filter(v => {
|
const composeVolumes = volumes
|
||||||
if (!v.startsWith('.') && !v.startsWith('..') && !v.startsWith('/') && !v.startsWith('~')) {
|
.filter((v) => {
|
||||||
return v;
|
if (
|
||||||
}
|
!v.startsWith('.') &&
|
||||||
}).map((volume) => {
|
!v.startsWith('..') &&
|
||||||
return {
|
!v.startsWith('/') &&
|
||||||
[`${volume.split(':')[0]}`]: {
|
!v.startsWith('~')
|
||||||
name: volume.split(':')[0]
|
) {
|
||||||
|
return v;
|
||||||
}
|
}
|
||||||
};
|
})
|
||||||
});
|
.map((volume) => {
|
||||||
|
return {
|
||||||
|
[`${volume.split(':')[0]}`]: {
|
||||||
|
name: volume.split(':')[0]
|
||||||
|
}
|
||||||
|
};
|
||||||
|
});
|
||||||
const composeFile = {
|
const composeFile = {
|
||||||
version: '3.8',
|
version: '3.8',
|
||||||
services: {
|
services: {
|
||||||
@@ -389,14 +404,14 @@ import * as buildpacks from '../lib/buildPacks';
|
|||||||
.replace('-app', '')}:${storage.path}`;
|
.replace('-app', '')}:${storage.path}`;
|
||||||
}
|
}
|
||||||
if (storage.hostPath) {
|
if (storage.hostPath) {
|
||||||
return `${storage.hostPath}:${storage.path}`
|
return `${storage.hostPath}:${storage.path}`;
|
||||||
}
|
}
|
||||||
return `${applicationId}${storage.path.replace(/\//gi, '-')}:${storage.path}`;
|
return `${applicationId}${storage.path.replace(/\//gi, '-')}:${storage.path}`;
|
||||||
}) || [];
|
}) || [];
|
||||||
|
|
||||||
try {
|
try {
|
||||||
dockerComposeConfiguration = JSON.parse(dockerComposeConfiguration);
|
dockerComposeConfiguration = JSON.parse(dockerComposeConfiguration);
|
||||||
} catch (error) { }
|
} catch (error) {}
|
||||||
let deployNeeded = true;
|
let deployNeeded = true;
|
||||||
let destinationType;
|
let destinationType;
|
||||||
|
|
||||||
@@ -463,7 +478,7 @@ import * as buildpacks from '../lib/buildPacks';
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
await prisma.build.update({ where: { id: buildId }, data: { commit } });
|
await prisma.build.update({ where: { id: buildId }, data: { commit } });
|
||||||
} catch (err) { }
|
} catch (err) {}
|
||||||
|
|
||||||
if (!pullmergeRequestId) {
|
if (!pullmergeRequestId) {
|
||||||
if (configHash !== currentHash) {
|
if (configHash !== currentHash) {
|
||||||
@@ -504,8 +519,9 @@ import * as buildpacks from '../lib/buildPacks';
|
|||||||
try {
|
try {
|
||||||
await executeCommand({
|
await executeCommand({
|
||||||
dockerId: destinationDocker.id,
|
dockerId: destinationDocker.id,
|
||||||
command: `docker ${location ? `--config ${location}` : ''
|
command: `docker ${
|
||||||
} pull ${imageName}:${customTag}`
|
location ? `--config ${location}` : ''
|
||||||
|
} pull ${imageName}:${customTag}`
|
||||||
});
|
});
|
||||||
imageFoundRemotely = true;
|
imageFoundRemotely = true;
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
@@ -668,8 +684,9 @@ import * as buildpacks from '../lib/buildPacks';
|
|||||||
try {
|
try {
|
||||||
const { stdout: containers } = await executeCommand({
|
const { stdout: containers } = await executeCommand({
|
||||||
dockerId: destinationDockerId,
|
dockerId: destinationDockerId,
|
||||||
command: `docker ps -a --filter 'label=com.docker.compose.service=${pullmergeRequestId ? imageId : applicationId
|
command: `docker ps -a --filter 'label=com.docker.compose.service=${
|
||||||
}' --format {{.ID}}`
|
pullmergeRequestId ? imageId : applicationId
|
||||||
|
}' --format {{.ID}}`
|
||||||
});
|
});
|
||||||
if (containers) {
|
if (containers) {
|
||||||
const containerArray = containers.split('\n');
|
const containerArray = containers.split('\n');
|
||||||
@@ -701,17 +718,24 @@ import * as buildpacks from '../lib/buildPacks';
|
|||||||
await saveDockerRegistryCredentials({ url, username, password, workdir });
|
await saveDockerRegistryCredentials({ url, username, password, workdir });
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
const composeVolumes = volumes.filter(v => {
|
const composeVolumes = volumes
|
||||||
if (!v.startsWith('.') && !v.startsWith('..') && !v.startsWith('/') && !v.startsWith('~')) {
|
.filter((v) => {
|
||||||
return v;
|
if (
|
||||||
}
|
!v.startsWith('.') &&
|
||||||
}).map((volume) => {
|
!v.startsWith('..') &&
|
||||||
return {
|
!v.startsWith('/') &&
|
||||||
[`${volume.split(':')[0]}`]: {
|
!v.startsWith('~')
|
||||||
name: volume.split(':')[0]
|
) {
|
||||||
|
return v;
|
||||||
}
|
}
|
||||||
};
|
})
|
||||||
});
|
.map((volume) => {
|
||||||
|
return {
|
||||||
|
[`${volume.split(':')[0]}`]: {
|
||||||
|
name: volume.split(':')[0]
|
||||||
|
}
|
||||||
|
};
|
||||||
|
});
|
||||||
const composeFile = {
|
const composeFile = {
|
||||||
version: '3.8',
|
version: '3.8',
|
||||||
services: {
|
services: {
|
||||||
|
|||||||
@@ -86,19 +86,20 @@ export async function migrateServicesToNewTemplate() {
|
|||||||
if (template.variables) {
|
if (template.variables) {
|
||||||
if (template.variables.length > 0) {
|
if (template.variables.length > 0) {
|
||||||
for (const variable of template.variables) {
|
for (const variable of template.variables) {
|
||||||
const { defaultValue } = variable;
|
let { defaultValue } = variable;
|
||||||
|
defaultValue = defaultValue.toString();
|
||||||
const regex = /^\$\$.*\((\d+)\)$/g;
|
const regex = /^\$\$.*\((\d+)\)$/g;
|
||||||
const length = Number(regex.exec(defaultValue)?.[1]) || undefined
|
const length = Number(regex.exec(defaultValue)?.[1]) || undefined
|
||||||
if (variable.defaultValue.startsWith('$$generate_password')) {
|
if (defaultValue.startsWith('$$generate_password')) {
|
||||||
variable.value = generatePassword({ length });
|
variable.value = generatePassword({ length });
|
||||||
} else if (variable.defaultValue.startsWith('$$generate_hex')) {
|
} else if (defaultValue.startsWith('$$generate_hex')) {
|
||||||
variable.value = generatePassword({ length, isHex: true });
|
variable.value = generatePassword({ length, isHex: true });
|
||||||
} else if (variable.defaultValue.startsWith('$$generate_username')) {
|
} else if (defaultValue.startsWith('$$generate_username')) {
|
||||||
variable.value = cuid();
|
variable.value = cuid();
|
||||||
} else if (variable.defaultValue.startsWith('$$generate_token')) {
|
} else if (defaultValue.startsWith('$$generate_token')) {
|
||||||
variable.value = generateToken()
|
variable.value = generateToken()
|
||||||
} else {
|
} else {
|
||||||
variable.value = variable.defaultValue || '';
|
variable.value = defaultValue || '';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -22,7 +22,6 @@ export default async function (data) {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
Dockerfile.push(`RUN rm -fr .git`);
|
|
||||||
await fs.writeFile(`${data.workdir}${dockerFileLocation}`, Dockerfile.join('\n'));
|
await fs.writeFile(`${data.workdir}${dockerFileLocation}`, Dockerfile.join('\n'));
|
||||||
await buildImage(data);
|
await buildImage(data);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ import { saveBuildLog } from './buildPacks/common';
|
|||||||
import { scheduler } from './scheduler';
|
import { scheduler } from './scheduler';
|
||||||
import type { ExecaChildProcess } from 'execa';
|
import type { ExecaChildProcess } from 'execa';
|
||||||
|
|
||||||
export const version = '3.12.30';
|
export const version = '3.12.31';
|
||||||
export const isDev = process.env.NODE_ENV === 'development';
|
export const isDev = process.env.NODE_ENV === 'development';
|
||||||
export const proxyPort = process.env.COOLIFY_PROXY_PORT;
|
export const proxyPort = process.env.COOLIFY_PROXY_PORT;
|
||||||
export const proxySecurePort = process.env.COOLIFY_PROXY_SECURE_PORT;
|
export const proxySecurePort = process.env.COOLIFY_PROXY_SECURE_PORT;
|
||||||
|
|||||||
@@ -412,22 +412,23 @@ export async function saveServiceType(
|
|||||||
if (foundTemplate.variables) {
|
if (foundTemplate.variables) {
|
||||||
if (foundTemplate.variables.length > 0) {
|
if (foundTemplate.variables.length > 0) {
|
||||||
for (const variable of foundTemplate.variables) {
|
for (const variable of foundTemplate.variables) {
|
||||||
const { defaultValue } = variable;
|
let { defaultValue } = variable;
|
||||||
|
defaultValue = defaultValue.toString();
|
||||||
const regex = /^\$\$.*\((\d+)\)$/g;
|
const regex = /^\$\$.*\((\d+)\)$/g;
|
||||||
const length = Number(regex.exec(defaultValue)?.[1]) || undefined;
|
const length = Number(regex.exec(defaultValue)?.[1]) || undefined;
|
||||||
if (variable.defaultValue.startsWith('$$generate_password')) {
|
if (defaultValue.startsWith('$$generate_password')) {
|
||||||
variable.value = generatePassword({ length });
|
variable.value = generatePassword({ length });
|
||||||
} else if (variable.defaultValue.startsWith('$$generate_hex')) {
|
} else if (defaultValue.startsWith('$$generate_hex')) {
|
||||||
variable.value = generatePassword({ length, isHex: true });
|
variable.value = generatePassword({ length, isHex: true });
|
||||||
} else if (variable.defaultValue.startsWith('$$generate_username')) {
|
} else if (defaultValue.startsWith('$$generate_username')) {
|
||||||
variable.value = cuid();
|
variable.value = cuid();
|
||||||
} else if (variable.defaultValue.startsWith('$$generate_token')) {
|
} else if (defaultValue.startsWith('$$generate_token')) {
|
||||||
variable.value = generateToken();
|
variable.value = generateToken();
|
||||||
} else {
|
} else {
|
||||||
variable.value = variable.defaultValue || '';
|
variable.value = defaultValue || '';
|
||||||
}
|
}
|
||||||
const foundVariableSomewhereElse = foundTemplate.variables.find((v) =>
|
const foundVariableSomewhereElse = foundTemplate.variables.find((v) =>
|
||||||
v.defaultValue.includes(variable.id)
|
v.defaultValue.toString().includes(variable.id)
|
||||||
);
|
);
|
||||||
if (foundVariableSomewhereElse) {
|
if (foundVariableSomewhereElse) {
|
||||||
foundVariableSomewhereElse.value = foundVariableSomewhereElse.value.replaceAll(
|
foundVariableSomewhereElse.value = foundVariableSomewhereElse.value.replaceAll(
|
||||||
@@ -746,7 +747,10 @@ export async function saveService(request: FastifyRequest<SaveService>, reply: F
|
|||||||
let { id: settingId, name, value, changed = false, isNew = false, variableName } = setting;
|
let { id: settingId, name, value, changed = false, isNew = false, variableName } = setting;
|
||||||
if (value) {
|
if (value) {
|
||||||
if (changed) {
|
if (changed) {
|
||||||
await prisma.serviceSetting.update({ where: { id: settingId }, data: { value: value.replace(/\n/, "\\n") } });
|
await prisma.serviceSetting.update({
|
||||||
|
where: { id: settingId },
|
||||||
|
data: { value: value.replace(/\n/, '\\n') }
|
||||||
|
});
|
||||||
}
|
}
|
||||||
if (isNew) {
|
if (isNew) {
|
||||||
if (!variableName) {
|
if (!variableName) {
|
||||||
@@ -1101,14 +1105,17 @@ export async function activateWordpressFtp(
|
|||||||
shell: true
|
shell: true
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
} catch (error) { }
|
} catch (error) {}
|
||||||
const volumes = [
|
const volumes = [
|
||||||
`${id}-wordpress-data:/home/${ftpUser}/wordpress`,
|
`${id}-wordpress-data:/home/${ftpUser}/wordpress`,
|
||||||
`${isDev ? hostkeyDir : '/var/lib/docker/volumes/coolify-ssl-certs/_data/hostkeys'
|
`${
|
||||||
|
isDev ? hostkeyDir : '/var/lib/docker/volumes/coolify-ssl-certs/_data/hostkeys'
|
||||||
}/${id}.ed25519:/etc/ssh/ssh_host_ed25519_key`,
|
}/${id}.ed25519:/etc/ssh/ssh_host_ed25519_key`,
|
||||||
`${isDev ? hostkeyDir : '/var/lib/docker/volumes/coolify-ssl-certs/_data/hostkeys'
|
`${
|
||||||
|
isDev ? hostkeyDir : '/var/lib/docker/volumes/coolify-ssl-certs/_data/hostkeys'
|
||||||
}/${id}.rsa:/etc/ssh/ssh_host_rsa_key`,
|
}/${id}.rsa:/etc/ssh/ssh_host_rsa_key`,
|
||||||
`${isDev ? hostkeyDir : '/var/lib/docker/volumes/coolify-ssl-certs/_data/hostkeys'
|
`${
|
||||||
|
isDev ? hostkeyDir : '/var/lib/docker/volumes/coolify-ssl-certs/_data/hostkeys'
|
||||||
}/${id}.sh:/etc/sftp.d/chmod.sh`
|
}/${id}.sh:/etc/sftp.d/chmod.sh`
|
||||||
];
|
];
|
||||||
|
|
||||||
@@ -1178,6 +1185,6 @@ export async function activateWordpressFtp(
|
|||||||
await executeCommand({
|
await executeCommand({
|
||||||
command: `rm -fr ${hostkeyDir}/${id}-docker-compose.yml ${hostkeyDir}/${id}.ed25519 ${hostkeyDir}/${id}.ed25519.pub ${hostkeyDir}/${id}.rsa ${hostkeyDir}/${id}.rsa.pub ${hostkeyDir}/${id}.sh`
|
command: `rm -fr ${hostkeyDir}/${id}-docker-compose.yml ${hostkeyDir}/${id}.ed25519 ${hostkeyDir}/${id}.ed25519.pub ${hostkeyDir}/${id}.rsa ${hostkeyDir}/${id}.rsa.pub ${hostkeyDir}/${id}.sh`
|
||||||
});
|
});
|
||||||
} catch (error) { }
|
} catch (error) {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@@ -51,16 +51,22 @@
|
|||||||
async function loadLogs() {
|
async function loadLogs() {
|
||||||
if (logsLoading) return;
|
if (logsLoading) return;
|
||||||
try {
|
try {
|
||||||
const newLogs: any = await get(
|
const since = lastLog?.split(' ')[0] || 0;
|
||||||
`/applications/${id}/logs/${selectedService}?since=${lastLog?.split(' ')[0] || 0}`
|
const newLogs: any = await get(`/applications/${id}/logs/${selectedService}?since=${since}`);
|
||||||
);
|
|
||||||
if (newLogs.noContainer) {
|
if (newLogs.noContainer) {
|
||||||
noContainer = true;
|
noContainer = true;
|
||||||
} else {
|
} else {
|
||||||
noContainer = false;
|
noContainer = false;
|
||||||
}
|
}
|
||||||
if (newLogs?.logs && newLogs.logs[newLogs.logs.length - 1] !== logs[logs.length - 1]) {
|
if (newLogs?.logs && newLogs.logs[newLogs.logs.length - 1] !== logs[logs.length - 1]) {
|
||||||
logs = logs.concat(newLogs.logs);
|
if (since === 0) {
|
||||||
|
logs = logs.concat(newLogs.logs);
|
||||||
|
} else {
|
||||||
|
const newParsedLogs = newLogs.logs.filter((log: any) => {
|
||||||
|
return log !== logs[logs.length - 1];
|
||||||
|
});
|
||||||
|
logs = logs.concat(newParsedLogs);
|
||||||
|
}
|
||||||
lastLog = newLogs.logs[newLogs.logs.length - 1];
|
lastLog = newLogs.logs[newLogs.logs.length - 1];
|
||||||
}
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
@@ -135,7 +141,7 @@
|
|||||||
{:else}
|
{:else}
|
||||||
<div class="relative w-full">
|
<div class="relative w-full">
|
||||||
<div class="flex justify-start sticky space-x-2 pb-2">
|
<div class="flex justify-start sticky space-x-2 pb-2">
|
||||||
<button on:click={followBuild} class="btn btn-sm " class:bg-coollabs={followingLogs}>
|
<button on:click={followBuild} class="btn btn-sm" class:bg-coollabs={followingLogs}>
|
||||||
<svg
|
<svg
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
class="w-6 h-6 mr-2"
|
class="w-6 h-6 mr-2"
|
||||||
|
|||||||
@@ -43,6 +43,7 @@
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
let customVersion: string;
|
||||||
$: isDisabled =
|
$: isDisabled =
|
||||||
!$appSession.isAdmin ||
|
!$appSession.isAdmin ||
|
||||||
$status.service.overallStatus === 'degraded' ||
|
$status.service.overallStatus === 'degraded' ||
|
||||||
@@ -111,6 +112,7 @@
|
|||||||
setLocation(service);
|
setLocation(service);
|
||||||
forceSave = false;
|
forceSave = false;
|
||||||
$isDeploymentEnabled = checkIfDeploymentEnabledServices(service);
|
$isDeploymentEnabled = checkIfDeploymentEnabledServices(service);
|
||||||
|
customVersion = null;
|
||||||
return addToast({
|
return addToast({
|
||||||
message: 'Configuration saved.',
|
message: 'Configuration saved.',
|
||||||
type: 'success'
|
type: 'success'
|
||||||
@@ -196,26 +198,12 @@
|
|||||||
async function selectTag(event: any) {
|
async function selectTag(event: any) {
|
||||||
service.version = event.detail.value;
|
service.version = event.detail.value;
|
||||||
}
|
}
|
||||||
|
async function setCustomVersion() {
|
||||||
|
service.version = customVersion;
|
||||||
|
}
|
||||||
onMount(async () => {
|
onMount(async () => {
|
||||||
if (browser && window.location.hostname === 'demo.coolify.io' && !service.fqdn) {
|
if (browser && window.location.hostname === 'demo.coolify.io' && !service.fqdn) {
|
||||||
service.fqdn = `http://${cuid()}.demo.coolify.io`;
|
service.fqdn = `http://${cuid()}.demo.coolify.io`;
|
||||||
// if (service.type === 'wordpress') {
|
|
||||||
// service.wordpress.mysqlDatabase = 'db';
|
|
||||||
// }
|
|
||||||
// if (service.type === 'plausibleanalytics') {
|
|
||||||
// service.plausibleAnalytics.email = 'noreply@demo.com';
|
|
||||||
// service.plausibleAnalytics.username = 'admin';
|
|
||||||
// }
|
|
||||||
// if (service.type === 'minio') {
|
|
||||||
// service.minio.apiFqdn = `http://${cuid()}.demo.coolify.io`;
|
|
||||||
// }
|
|
||||||
// if (service.type === 'ghost') {
|
|
||||||
// service.ghost.mariadbDatabase = 'db';
|
|
||||||
// }
|
|
||||||
// if (service.type === 'fider') {
|
|
||||||
// service.fider.emailNoreply = 'noreply@demo.com';
|
|
||||||
// }
|
|
||||||
// await handleSubmit();
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
@@ -224,7 +212,7 @@
|
|||||||
<form id="saveForm" on:submit|preventDefault={handleSubmit}>
|
<form id="saveForm" on:submit|preventDefault={handleSubmit}>
|
||||||
<div class="mx-auto w-full">
|
<div class="mx-auto w-full">
|
||||||
<div class="flex flex-row border-b border-coolgray-500 mb-6 space-x-2">
|
<div class="flex flex-row border-b border-coolgray-500 mb-6 space-x-2">
|
||||||
<div class="title font-bold pb-3 ">General</div>
|
<div class="title font-bold pb-3">General</div>
|
||||||
{#if $appSession.isAdmin}
|
{#if $appSession.isAdmin}
|
||||||
<button
|
<button
|
||||||
type="submit"
|
type="submit"
|
||||||
@@ -289,6 +277,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="grid grid-cols-2 items-center">
|
<div class="grid grid-cols-2 items-center">
|
||||||
<label for="version">Version / Tag</label>
|
<label for="version">Version / Tag</label>
|
||||||
|
<div class="flex gap-2">
|
||||||
{#if tags.tags?.length > 0}
|
{#if tags.tags?.length > 0}
|
||||||
<div class="custom-select-wrapper w-full">
|
<div class="custom-select-wrapper w-full">
|
||||||
<Select
|
<Select
|
||||||
@@ -303,9 +292,11 @@
|
|||||||
isClearable={false}
|
isClearable={false}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
{:else}
|
{:else}
|
||||||
<input class="w-full border-red-500" disabled placeholder="Error getting tags..." />
|
<input class="w-full border-red-500" disabled placeholder="Error getting tags..." />
|
||||||
{/if}
|
{/if}
|
||||||
|
<input class="w-full" placeholder="Custom version" on:change={setCustomVersion} bind:value={customVersion} />
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="grid grid-cols-2 items-center">
|
<div class="grid grid-cols-2 items-center">
|
||||||
|
|||||||
@@ -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": "3.12.30",
|
"version": "3.12.31",
|
||||||
"license": "Apache-2.0",
|
"license": "Apache-2.0",
|
||||||
"repository": "github:coollabsio/coolify",
|
"repository": "github:coollabsio/coolify",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
|
|||||||
2592
pnpm-lock.yaml
generated
2592
pnpm-lock.yaml
generated
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user