Compare commits

...

15 Commits

Author SHA1 Message Date
Andras Bacsai
846185dd42 Merge pull request #635 from coollabsio/next
v3.10.8
2022-09-26 21:36:54 +02:00
Andras Bacsai
7bc2299a8e rename grafana dashboard to grafana 2022-09-26 19:24:13 +00:00
Andras Bacsai
d40e131bd8 fix: appwrite function network is not the default 2022-09-26 19:20:41 +00:00
Andras Bacsai
552c7297bf ui: service fixes 2022-09-26 19:00:36 +00:00
Andras Bacsai
3f5fd23955 ui: fix button 2022-09-26 18:57:24 +00:00
Andras Bacsai
8b8566251e chore: version++ 2022-09-26 18:49:05 +00:00
Andras Bacsai
6db47def8e fix: service logs 2022-09-26 18:48:22 +00:00
Andras Bacsai
1d0edc7b25 Merge pull request #634 from coollabsio/next
v3.10.7
2022-09-26 15:43:27 +02:00
Andras Bacsai
f9a417638a fix: seed 2022-09-26 13:42:19 +00:00
Andras Bacsai
984fe01551 Merge pull request #632 from coollabsio/next
v3.10.6
2022-09-26 13:43:49 +02:00
Andras Bacsai
d0cb350687 fix: error notification 2022-09-26 13:37:06 +02:00
Andras Bacsai
5f51011ce1 fix: empty preview value 2022-09-26 13:36:54 +02:00
Andras Bacsai
9ca125ac55 fix: error notification 2022-09-26 13:36:47 +02:00
Andras Bacsai
360f4f8c27 fix: seed new preview secret types 2022-09-26 13:36:15 +02:00
Andras Bacsai
6501f71bd6 chore: version++ 2022-09-26 13:24:02 +02:00
12 changed files with 46 additions and 86 deletions

View File

@@ -94,6 +94,16 @@ async function main() {
} }
}); });
} }
// Set new preview secrets
const secrets = await prisma.secret.findMany({ where: { isPRMRSecret: false } })
if (secrets.length > 0) {
for (const secret of secrets) {
const previewSecrets = await prisma.secret.findMany({ where: { applicationId: secret.applicationId, name: secret.name, isPRMRSecret: true } })
if (previewSecrets.length === 0) {
await prisma.secret.create({ data: { ...secret, id: undefined, isPRMRSecret: true } })
}
}
}
} }
main() main()
.catch((e) => { .catch((e) => {

View File

@@ -21,7 +21,7 @@ import { scheduler } from './scheduler';
import { supportedServiceTypesAndVersions } from './services/supportedVersions'; import { supportedServiceTypesAndVersions } from './services/supportedVersions';
import { includeServices } from './services/common'; import { includeServices } from './services/common';
export const version = '3.10.5'; export const version = '3.10.8';
export const isDev = process.env.NODE_ENV === 'development'; export const isDev = process.env.NODE_ENV === 'development';
const algorithm = 'aes-256-ctr'; const algorithm = 'aes-256-ctr';

View File

@@ -1430,6 +1430,7 @@ async function startAppWriteService(request: FastifyRequest<ServiceStartStop>) {
`_APP_EXECUTOR_HOST=http://${id}-executor/v1`, `_APP_EXECUTOR_HOST=http://${id}-executor/v1`,
`_APP_STATSD_HOST=${id}-telegraf`, `_APP_STATSD_HOST=${id}-telegraf`,
"_APP_STATSD_PORT=8125", "_APP_STATSD_PORT=8125",
`OPEN_RUNTIMES_NETWORK=${network}`,
...secrets ...secrets
], ],
...defaultComposeConfiguration(network), ...defaultComposeConfiguration(network),
@@ -1453,6 +1454,7 @@ async function startAppWriteService(request: FastifyRequest<ServiceStartStop>) {
`_APP_DB_SCHEMA=${mariadbDatabase}`, `_APP_DB_SCHEMA=${mariadbDatabase}`,
`_APP_DB_USER=${mariadbUser}`, `_APP_DB_USER=${mariadbUser}`,
`_APP_DB_PASS=${mariadbPassword}`, `_APP_DB_PASS=${mariadbPassword}`,
`OPEN_RUNTIMES_NETWORK=${network}`,
...secrets ...secrets
], ],
...defaultComposeConfiguration(network), ...defaultComposeConfiguration(network),
@@ -1476,6 +1478,7 @@ async function startAppWriteService(request: FastifyRequest<ServiceStartStop>) {
`_APP_DB_SCHEMA=${mariadbDatabase}`, `_APP_DB_SCHEMA=${mariadbDatabase}`,
`_APP_DB_USER=${mariadbUser}`, `_APP_DB_USER=${mariadbUser}`,
`_APP_DB_PASS=${mariadbPassword}`, `_APP_DB_PASS=${mariadbPassword}`,
`OPEN_RUNTIMES_NETWORK=${network}`,
...secrets ...secrets
], ],
...defaultComposeConfiguration(network), ...defaultComposeConfiguration(network),
@@ -1494,6 +1497,7 @@ async function startAppWriteService(request: FastifyRequest<ServiceStartStop>) {
`_APP_OPENSSL_KEY_V1=${opensslKeyV1}`, `_APP_OPENSSL_KEY_V1=${opensslKeyV1}`,
`_APP_REDIS_HOST=${id}-redis`, `_APP_REDIS_HOST=${id}-redis`,
"_APP_REDIS_PORT=6379", "_APP_REDIS_PORT=6379",
`OPEN_RUNTIMES_NETWORK=${network}`,
...secrets ...secrets
], ],
...defaultComposeConfiguration(network), ...defaultComposeConfiguration(network),
@@ -1527,6 +1531,7 @@ async function startAppWriteService(request: FastifyRequest<ServiceStartStop>) {
`_APP_DB_PASS=${mariadbPassword}`, `_APP_DB_PASS=${mariadbPassword}`,
`_APP_EXECUTOR_SECRET=${executorSecret}`, `_APP_EXECUTOR_SECRET=${executorSecret}`,
`_APP_EXECUTOR_HOST=http://${id}-executor/v1`, `_APP_EXECUTOR_HOST=http://${id}-executor/v1`,
`OPEN_RUNTIMES_NETWORK=${network}`,
...secrets ...secrets
], ],
...defaultComposeConfiguration(network), ...defaultComposeConfiguration(network),
@@ -1550,6 +1555,7 @@ async function startAppWriteService(request: FastifyRequest<ServiceStartStop>) {
`_APP_DB_SCHEMA=${mariadbDatabase}`, `_APP_DB_SCHEMA=${mariadbDatabase}`,
`_APP_DB_USER=${mariadbUser}`, `_APP_DB_USER=${mariadbUser}`,
`_APP_DB_PASS=${mariadbPassword}`, `_APP_DB_PASS=${mariadbPassword}`,
`OPEN_RUNTIMES_NETWORK=${network}`,
...secrets ...secrets
], ],
...defaultComposeConfiguration(network), ...defaultComposeConfiguration(network),
@@ -1575,6 +1581,7 @@ async function startAppWriteService(request: FastifyRequest<ServiceStartStop>) {
`_APP_DB_SCHEMA=${mariadbDatabase}`, `_APP_DB_SCHEMA=${mariadbDatabase}`,
`_APP_DB_USER=${mariadbUser}`, `_APP_DB_USER=${mariadbUser}`,
`_APP_DB_PASS=${mariadbPassword}`, `_APP_DB_PASS=${mariadbPassword}`,
`OPEN_RUNTIMES_NETWORK=${network}`,
...secrets ...secrets
], ],
...defaultComposeConfiguration(network), ...defaultComposeConfiguration(network),
@@ -1604,6 +1611,7 @@ async function startAppWriteService(request: FastifyRequest<ServiceStartStop>) {
`_APP_DB_SCHEMA=${mariadbDatabase}`, `_APP_DB_SCHEMA=${mariadbDatabase}`,
`_APP_DB_USER=${mariadbUser}`, `_APP_DB_USER=${mariadbUser}`,
`_APP_DB_PASS=${mariadbPassword}`, `_APP_DB_PASS=${mariadbPassword}`,
`OPEN_RUNTIMES_NETWORK=${network}`,
...secrets ...secrets
], ],
...defaultComposeConfiguration(network), ...defaultComposeConfiguration(network),
@@ -1630,6 +1638,7 @@ async function startAppWriteService(request: FastifyRequest<ServiceStartStop>) {
`_APP_DB_PASS=${mariadbPassword}`, `_APP_DB_PASS=${mariadbPassword}`,
`_APP_EXECUTOR_SECRET=${executorSecret}`, `_APP_EXECUTOR_SECRET=${executorSecret}`,
`_APP_EXECUTOR_HOST=http://${id}-executor/v1`, `_APP_EXECUTOR_HOST=http://${id}-executor/v1`,
`OPEN_RUNTIMES_NETWORK=${network}`,
...secrets ...secrets
], ],
...defaultComposeConfiguration(network), ...defaultComposeConfiguration(network),
@@ -1654,6 +1663,7 @@ async function startAppWriteService(request: FastifyRequest<ServiceStartStop>) {
environment: [ environment: [
"_APP_ENV=production", "_APP_ENV=production",
`_APP_EXECUTOR_SECRET=${executorSecret}`, `_APP_EXECUTOR_SECRET=${executorSecret}`,
`OPEN_RUNTIMES_NETWORK=${network}`,
...secrets ...secrets
], ],
...defaultComposeConfiguration(network), ...defaultComposeConfiguration(network),
@@ -1671,6 +1681,7 @@ async function startAppWriteService(request: FastifyRequest<ServiceStartStop>) {
`_APP_OPENSSL_KEY_V1=${opensslKeyV1}`, `_APP_OPENSSL_KEY_V1=${opensslKeyV1}`,
`_APP_REDIS_HOST=${id}-redis`, `_APP_REDIS_HOST=${id}-redis`,
"_APP_REDIS_PORT=6379", "_APP_REDIS_PORT=6379",
`OPEN_RUNTIMES_NETWORK=${network}`,
...secrets ...secrets
], ],
...defaultComposeConfiguration(network), ...defaultComposeConfiguration(network),
@@ -1687,6 +1698,7 @@ async function startAppWriteService(request: FastifyRequest<ServiceStartStop>) {
"_APP_ENV=production", "_APP_ENV=production",
`_APP_REDIS_HOST=${id}-redis`, `_APP_REDIS_HOST=${id}-redis`,
"_APP_REDIS_PORT=6379", "_APP_REDIS_PORT=6379",
`OPEN_RUNTIMES_NETWORK=${network}`,
...secrets ...secrets
], ],
...defaultComposeConfiguration(network), ...defaultComposeConfiguration(network),
@@ -1711,6 +1723,7 @@ async function startAppWriteService(request: FastifyRequest<ServiceStartStop>) {
`_APP_DB_SCHEMA=${mariadbDatabase}`, `_APP_DB_SCHEMA=${mariadbDatabase}`,
`_APP_DB_USER=${mariadbUser}`, `_APP_DB_USER=${mariadbUser}`,
`_APP_DB_PASS=${mariadbPassword}`, `_APP_DB_PASS=${mariadbPassword}`,
`OPEN_RUNTIMES_NETWORK=${network}`,
...secrets ...secrets
], ],
...defaultComposeConfiguration(network), ...defaultComposeConfiguration(network),
@@ -1727,6 +1740,7 @@ async function startAppWriteService(request: FastifyRequest<ServiceStartStop>) {
"_APP_ENV=production", "_APP_ENV=production",
`_APP_REDIS_HOST=${id}-redis`, `_APP_REDIS_HOST=${id}-redis`,
"_APP_REDIS_PORT=6379", "_APP_REDIS_PORT=6379",
`OPEN_RUNTIMES_NETWORK=${network}`,
...secrets ...secrets
], ],
...defaultComposeConfiguration(network), ...defaultComposeConfiguration(network),
@@ -1743,7 +1757,8 @@ async function startAppWriteService(request: FastifyRequest<ServiceStartStop>) {
`MYSQL_ROOT_PASSWORD=${mariadbRootUserPassword}`, `MYSQL_ROOT_PASSWORD=${mariadbRootUserPassword}`,
`MYSQL_USER=${mariadbUser}`, `MYSQL_USER=${mariadbUser}`,
`MYSQL_PASSWORD=${mariadbPassword}`, `MYSQL_PASSWORD=${mariadbPassword}`,
`MYSQL_DATABASE=${mariadbDatabase}` `MYSQL_DATABASE=${mariadbDatabase}`,
`OPEN_RUNTIMES_NETWORK=${network}`,
], ],
command: "mysqld --innodb-flush-method=fsync", command: "mysqld --innodb-flush-method=fsync",
...defaultComposeConfiguration(network), ...defaultComposeConfiguration(network),
@@ -1781,6 +1796,7 @@ async function startAppWriteService(request: FastifyRequest<ServiceStartStop>) {
"_APP_INFLUXDB_PORT=8086", "_APP_INFLUXDB_PORT=8086",
`_APP_REDIS_HOST=${id}-redis`, `_APP_REDIS_HOST=${id}-redis`,
"_APP_REDIS_PORT=6379", "_APP_REDIS_PORT=6379",
`OPEN_RUNTIMES_NETWORK=${network}`,
...secrets ...secrets
], ],
...defaultComposeConfiguration(network), ...defaultComposeConfiguration(network),
@@ -1799,6 +1815,7 @@ async function startAppWriteService(request: FastifyRequest<ServiceStartStop>) {
environment: [ environment: [
`_APP_INFLUXDB_HOST=${id}-influxdb`, `_APP_INFLUXDB_HOST=${id}-influxdb`,
"_APP_INFLUXDB_PORT=8086", "_APP_INFLUXDB_PORT=8086",
`OPEN_RUNTIMES_NETWORK=${network}`,
], ],
...defaultComposeConfiguration(network), ...defaultComposeConfiguration(network),
} }

View File

@@ -235,7 +235,7 @@ export const supportedServiceTypesAndVersions = [
// }, // },
{ {
name: 'grafana', name: 'grafana',
fancyName: 'Grafana Dashboard', fancyName: 'Grafana',
baseImage: 'grafana/grafana', baseImage: 'grafana/grafana',
images: [], images: [],
versions: ['latest', '9.1.3', '9.1.2', '9.0.8', '8.3.11', '8.4.11', '8.5.11'], versions: ['latest', '9.1.3', '9.1.2', '9.0.8', '8.3.11', '8.4.11', '8.5.11'],

View File

@@ -15,7 +15,6 @@ import { checkContainer, formatLabelsOnDocker, isContainerExited, removeContaine
import type { FastifyRequest } from 'fastify'; import type { FastifyRequest } from 'fastify';
import type { GetImages, CancelDeployment, CheckDNS, CheckRepository, DeleteApplication, DeleteSecret, DeleteStorage, GetApplicationLogs, GetBuildIdLogs, SaveApplication, SaveApplicationSettings, SaveApplicationSource, SaveDeployKey, SaveDestination, SaveSecret, SaveStorage, DeployApplication, CheckDomain, StopPreviewApplication, RestartPreviewApplication, GetBuilds } from './types'; import type { GetImages, CancelDeployment, CheckDNS, CheckRepository, DeleteApplication, DeleteSecret, DeleteStorage, GetApplicationLogs, GetBuildIdLogs, SaveApplication, SaveApplicationSettings, SaveApplicationSource, SaveDeployKey, SaveDestination, SaveSecret, SaveStorage, DeployApplication, CheckDomain, StopPreviewApplication, RestartPreviewApplication, GetBuilds } from './types';
import { OnlyId } from '../../../../types'; import { OnlyId } from '../../../../types';
import path from 'node:path';
function filterObject(obj, callback) { function filterObject(obj, callback) {
return Object.fromEntries(Object.entries(obj). return Object.fromEntries(Object.entries(obj).
@@ -326,7 +325,7 @@ export async function saveApplicationSettings(request: FastifyRequest<SaveApplic
where: { id }, where: { id },
data: { fqdn: isBot ? null : undefined, settings: { update: { debug, previews, dualCerts, autodeploy, isBot, isDBBranching, isCustomSSL } } }, data: { fqdn: isBot ? null : undefined, settings: { update: { debug, previews, dualCerts, autodeploy, isBot, isDBBranching, isCustomSSL } } },
include: { destinationDocker: true } include: { destinationDocker: true }
}); });
return reply.code(201).send(); return reply.code(201).send();
} catch ({ status, message }) { } catch ({ status, message }) {
return errorHandler({ status, message }) return errorHandler({ status, message })
@@ -817,10 +816,15 @@ export async function getSecrets(request: FastifyRequest<OnlyId>) {
export async function updatePreviewSecret(request: FastifyRequest<SaveSecret>, reply: FastifyReply) { export async function updatePreviewSecret(request: FastifyRequest<SaveSecret>, reply: FastifyReply) {
try { try {
const { id } = request.params const { id } = request.params
const { name, value } = request.body let { name, value } = request.body
if (value) {
value = encrypt(value.trim())
} else {
value = ''
}
await prisma.secret.updateMany({ await prisma.secret.updateMany({
where: { applicationId: id, name, isPRMRSecret: true }, where: { applicationId: id, name, isPRMRSecret: true },
data: { value: encrypt(value.trim()) } data: { value }
}); });
return reply.code(201).send() return reply.code(201).send()
} catch ({ status, message }) { } catch ({ status, message }) {

View File

@@ -3,7 +3,7 @@ import { addToast } from '$lib/store';
export const asyncSleep = (delay: number) => export const asyncSleep = (delay: number) =>
new Promise((resolve) => setTimeout(resolve, delay)); new Promise((resolve) => setTimeout(resolve, delay));
export function errorNotification(error: any): void { export function errorNotification(error: any | { message: string }): void {
if (error.message) { if (error.message) {
if (error.message === 'Cannot read properties of undefined (reading \'postMessage\')') { if (error.message === 'Cannot read properties of undefined (reading \'postMessage\')') {
return addToast({ return addToast({

View File

@@ -39,8 +39,8 @@
async function addNewSecret() { async function addNewSecret() {
try { try {
if (!name) return errorNotification(`${t.get('forms.name')} ${t.get('forms.is_required')}`); if (!name) return errorNotification({ message: 'Name is required.' });
if (!value) return errorNotification(`${t.get('forms.value')} ${t.get('forms.is_required')}`); if (!value) return errorNotification({ message: 'Value is required.' });
await post(`/applications/${id}/secrets`, { await post(`/applications/${id}/secrets`, {
name, name,
value, value,
@@ -61,7 +61,7 @@
changeIsBuildSecret = false changeIsBuildSecret = false
}: { changeIsBuildSecret?: boolean } = {}) { }: { changeIsBuildSecret?: boolean } = {}) {
if (changeIsBuildSecret) isBuildSecret = !isBuildSecret; if (changeIsBuildSecret) isBuildSecret = !isBuildSecret;
if (isNewSecret) return if (isNewSecret) return;
try { try {
await put(`/applications/${id}/secrets`, { await put(`/applications/${id}/secrets`, {
name, name,

View File

@@ -84,37 +84,6 @@
} }
</script> </script>
<div class="flex h-20 items-center space-x-2 p-5 px-6 font-bold">
<div class="-mb-5 flex-col">
<div class="md:max-w-64 truncate text-base tracking-tight md:text-2xl lg:block">
Service Logs
</div>
<span class="text-xs">{service.name}</span>
</div>
{#if service.fqdn}
<a
href={service.fqdn}
target="_blank"
class="icons tooltip-bottom flex items-center bg-transparent text-sm"
><svg
xmlns="http://www.w3.org/2000/svg"
class="h-6 w-6"
viewBox="0 0 24 24"
stroke-width="1.5"
stroke="currentColor"
fill="none"
stroke-linecap="round"
stroke-linejoin="round"
>
<path stroke="none" d="M0 0h24v24H0z" fill="none" />
<path d="M11 7h-5a2 2 0 0 0 -2 2v9a2 2 0 0 0 2 2h9a2 2 0 0 0 2 -2v-5" />
<line x1="10" y1="14" x2="20" y2="4" />
<polyline points="15 4 20 4 20 9" />
</svg></a
>
{/if}
</div>
<div class="flex flex-row justify-center space-x-2 px-10 pt-6"> <div class="flex flex-row justify-center space-x-2 px-10 pt-6">
{#if logs.length === 0} {#if logs.length === 0}
<div class="text-xl font-bold tracking-tighter">{$t('application.build.waiting_logs')}</div> <div class="text-xl font-bold tracking-tighter">{$t('application.build.waiting_logs')}</div>
@@ -150,9 +119,9 @@
</button> </button>
<Tooltip triggeredBy="#follow">Follow Logs</Tooltip> <Tooltip triggeredBy="#follow">Follow Logs</Tooltip>
</div> </div>
<div class="font-mono w-full rounder bg-coolgray-200 p-5 overflow-x-auto overflox-y-auto max-h-[80vh] rounded-md mb-20 flex flex-col whitespace-nowrap -mt-12 scrollbar-thumb-coollabs scrollbar-track-coolgray-200 scrollbar-w-1"> <div class="font-mono w-full bg-coolgray-200 p-5 overflow-x-auto overflox-y-auto rounded mb-20 flex flex-col -mt-12 scrollbar-thumb-coollabs scrollbar-track-coolgray-200 scrollbar-w-1">
{#each logs as log} {#each logs as log}
<p>{log.line + '\n'}</p> <p>{log + '\n'}</p>
{/each} {/each}
</div> </div>
</div> </div>

View File

@@ -69,9 +69,6 @@
</script> </script>
<div class="mx-auto max-w-6xl rounded-xl px-6 pt-4"> <div class="mx-auto max-w-6xl rounded-xl px-6 pt-4">
<h1 class="md:max-w-64 truncate text-base tracking-tight md:text-2xl lg:block font-bold mb-4">
Secrets
</h1>
<div class="overflow-x-auto"> <div class="overflow-x-auto">
<table class="w-full border-separate text-left"> <table class="w-full border-separate text-left">
<thead> <thead>

View File

@@ -35,43 +35,6 @@
} }
</script> </script>
<div
class="flex items-center space-x-2 p-5 px-6 font-bold"
class:p-5={service.fqdn}
class:p-6={!service.fqdn}
>
<div class="-mb-5 flex-col">
<div class="md:max-w-64 truncate text-base tracking-tight md:text-2xl lg:block">
Persistent Storage
</div>
<span class="text-xs">{service.name}</span>
</div>
{#if service.fqdn}
<a
href={service.fqdn}
target="_blank"
class="icons tooltip-bottom flex items-center bg-transparent text-sm"
><svg
xmlns="http://www.w3.org/2000/svg"
class="h-6 w-6"
viewBox="0 0 24 24"
stroke-width="1.5"
stroke="currentColor"
fill="none"
stroke-linecap="round"
stroke-linejoin="round"
>
<path stroke="none" d="M0 0h24v24H0z" fill="none" />
<path d="M11 7h-5a2 2 0 0 0 -2 2v9a2 2 0 0 0 2 2h9a2 2 0 0 0 2 -2v-5" />
<line x1="10" y1="14" x2="20" y2="4" />
<polyline points="15 4 20 4 20 9" />
</svg></a
>
{/if}
<ServiceLinks {service} />
</div>
<div class="mx-auto max-w-6xl rounded-xl px-6 pt-4"> <div class="mx-auto max-w-6xl rounded-xl px-6 pt-4">
<div class="flex justify-center py-4 text-center"> <div class="flex justify-center py-4 text-center">
<SimpleExplainer <SimpleExplainer

View File

@@ -216,7 +216,7 @@
> >
{#if isFqdnSet} {#if isFqdnSet}
<button on:click|preventDefault={removeFqdn} disabled={loading.remove} class="btn" <button on:click|preventDefault={removeFqdn} disabled={loading.remove} class="btn btn-sm"
>{loading.remove ? $t('forms.removing') : $t('forms.remove_domain')}</button >{loading.remove ? $t('forms.removing') : $t('forms.remove_domain')}</button
> >
{/if} {/if}

View File

@@ -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.10.5", "version": "3.10.8",
"license": "Apache-2.0", "license": "Apache-2.0",
"repository": "github:coollabsio/coolify", "repository": "github:coollabsio/coolify",
"scripts": { "scripts": {