Merge pull request #284 from coollabsio/v2.3.1

v2.3.1
This commit is contained in:
Andras Bacsai 2022-04-04 14:00:28 +02:00 committed by GitHub
commit 201fa82efc
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 76 additions and 27 deletions

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": "2.3.0", "version": "2.3.1",
"license": "AGPL-3.0", "license": "AGPL-3.0",
"scripts": { "scripts": {
"dev": "docker-compose -f docker-compose-dev.yaml up -d && cross-env NODE_ENV=development & svelte-kit dev", "dev": "docker-compose -f docker-compose-dev.yaml up -d && cross-env NODE_ENV=development & svelte-kit dev",

View File

@ -102,12 +102,9 @@ export const setDefaultConfiguration = async (data) => {
else if (buildPack === 'php') port = 80; else if (buildPack === 'php') port = 80;
else if (buildPack === 'python') port = 8000; else if (buildPack === 'python') port = 8000;
} }
if (template) { if (!installCommand) installCommand = template?.installCommand || 'yarn install';
if (!installCommand) installCommand = template?.installCommand || 'yarn install'; if (!startCommand) startCommand = template?.startCommand || 'yarn start';
if (!startCommand) startCommand = template?.startCommand || 'yarn start'; if (!buildCommand) buildCommand = template?.buildCommand || null;
if (!buildCommand) buildCommand = template?.buildCommand || null;
}
if (!publishDirectory) publishDirectory = template?.publishDirectory || null; if (!publishDirectory) publishDirectory = template?.publishDirectory || null;
if (baseDirectory) { if (baseDirectory) {
if (!baseDirectory.startsWith('/')) baseDirectory = `/${baseDirectory}`; if (!baseDirectory.startsWith('/')) baseDirectory = `/${baseDirectory}`;

View File

@ -30,7 +30,7 @@
await Promise.all( await Promise.all(
batchSecretsPairs.map(({ name, value, isNew }) => batchSecretsPairs.map(({ name, value, isNew }) =>
limit(() => saveSecret({ name, value, applicationId: id, isNew, dispatch })) limit(() => saveSecret({ name, value, applicationId: id, isNew }))
) )
); );
batchSecrets = ''; batchSecrets = '';
@ -39,8 +39,8 @@
</script> </script>
<h2 class="title my-6 font-bold">Paste .env file</h2> <h2 class="title my-6 font-bold">Paste .env file</h2>
<form on:submit={getValues} class="mb-12 w-full"> <form on:submit|preventDefault={getValues} class="mb-12 w-full">
<textarea value={batchSecrets} on:change={setBatchValue} class="mb-2 min-h-[200px] w-full" /> <textarea bind:value={batchSecrets} class="mb-2 min-h-[200px] w-full" />
<button <button
class="bg-green-600 hover:bg-green-500 disabled:text-white disabled:opacity-40" class="bg-green-600 hover:bg-green-500 disabled:text-white disabled:opacity-40"
type="submit">Batch add secrets</button type="submit">Batch add secrets</button

View File

@ -12,6 +12,7 @@
import { del } from '$lib/api'; import { del } from '$lib/api';
import CopyPasswordField from '$lib/components/CopyPasswordField.svelte'; import CopyPasswordField from '$lib/components/CopyPasswordField.svelte';
import { errorNotification } from '$lib/form'; import { errorNotification } from '$lib/form';
import { toast } from '@zerodevx/svelte-toast';
import { createEventDispatcher } from 'svelte'; import { createEventDispatcher } from 'svelte';
import { saveSecret } from './utils'; import { saveSecret } from './utils';
@ -32,21 +33,39 @@
} }
async function createSecret(isNew) { async function createSecret(isNew) {
saveSecret({ await saveSecret({
isNew, isNew,
name, name,
value, value,
isBuildSecret, isBuildSecret,
isPRMRSecret, isPRMRSecret,
isNewSecret, isNewSecret,
applicationId: id, applicationId: id
dispatch
}); });
if (isNewSecret) {
name = '';
value = '';
isBuildSecret = false;
}
dispatch('refresh');
toast.push('Secret saved');
} }
function setSecretValue() { async function setSecretValue() {
if (isNewSecret) { if (!isPRMRSecret) {
isBuildSecret = !isBuildSecret; isBuildSecret = !isBuildSecret;
if (!isNewSecret) {
await saveSecret({
isNew: isNewSecret,
name,
value,
isBuildSecret,
isPRMRSecret,
isNewSecret,
applicationId: id
});
toast.push('Secret saved');
}
} }
} }
</script> </script>
@ -81,9 +100,9 @@
class="relative inline-flex h-6 w-11 flex-shrink-0 rounded-full border-2 border-transparent transition-colors duration-200 ease-in-out" class="relative inline-flex h-6 w-11 flex-shrink-0 rounded-full border-2 border-transparent transition-colors duration-200 ease-in-out"
class:bg-green-600={isBuildSecret} class:bg-green-600={isBuildSecret}
class:bg-stone-700={!isBuildSecret} class:bg-stone-700={!isBuildSecret}
class:opacity-50={!isNewSecret} class:opacity-50={isPRMRSecret}
class:cursor-not-allowed={!isNewSecret} class:cursor-not-allowed={isPRMRSecret}
class:cursor-pointer={isNewSecret} class:cursor-pointer={!isPRMRSecret}
> >
<span class="sr-only">Use isBuildSecret</span> <span class="sr-only">Use isBuildSecret</span>
<span <span

View File

@ -22,18 +22,48 @@
<script lang="ts"> <script lang="ts">
export let secrets; export let secrets;
export let application; export let application;
import pLimit from 'p-limit';
import Secret from './_Secret.svelte'; import Secret from './_Secret.svelte';
import { getDomain } from '$lib/components/common';
import { page } from '$app/stores'; import { page } from '$app/stores';
import { get } from '$lib/api'; import { get } from '$lib/api';
import BatchSecrets from './_BatchSecrets.svelte'; import { saveSecret } from './utils';
import { toast } from '@zerodevx/svelte-toast';
const limit = pLimit(1);
const { id } = $page.params; const { id } = $page.params;
let batchSecrets = '';
async function refreshSecrets() { async function refreshSecrets() {
const data = await get(`/applications/${id}/secrets.json`); const data = await get(`/applications/${id}/secrets.json`);
secrets = [...data.secrets]; secrets = [...data.secrets];
} }
async function getValues(e) {
e.preventDefault();
const eachValuePair = batchSecrets.split('\n');
const batchSecretsPairs = eachValuePair
.filter((secret) => !secret.startsWith('#') && secret)
.map((secret) => {
const [name, value] = secret.split('=');
const cleanValue = value?.replaceAll('"', '') || '';
return {
name,
value: cleanValue,
isNew: !secrets.find((secret) => name === secret.name)
};
});
await Promise.all(
batchSecretsPairs.map(({ name, value, isNew }) =>
limit(() => saveSecret({ name, value, applicationId: id, isNew }))
)
);
batchSecrets = '';
await refreshSecrets();
toast.push('Secrets saved');
}
function asd() {
console.log(secrets);
}
</script> </script>
<div class="flex items-center space-x-2 p-5 px-6 font-bold"> <div class="flex items-center space-x-2 p-5 px-6 font-bold">
@ -134,6 +164,13 @@
</tr> </tr>
</tbody> </tbody>
</table> </table>
<button on:click={asd}>Save</button>
<BatchSecrets {secrets} {id} {refreshSecrets} /> <h2 class="title my-6 font-bold">Paste .env file</h2>
<form on:submit|preventDefault={getValues} class="mb-12 w-full">
<textarea bind:value={batchSecrets} class="mb-2 min-h-[200px] w-full" />
<button
class="bg-green-600 hover:bg-green-500 disabled:text-white disabled:opacity-40"
type="submit">Batch add secrets</button
>
</form>
</div> </div>

View File

@ -10,7 +10,6 @@ type Props = {
isPRMRSecret?: boolean; isPRMRSecret?: boolean;
isNewSecret?: boolean; isNewSecret?: boolean;
applicationId: string; applicationId: string;
dispatch: (name: string) => void;
}; };
export async function saveSecret({ export async function saveSecret({
@ -20,8 +19,7 @@ export async function saveSecret({
isBuildSecret, isBuildSecret,
isPRMRSecret, isPRMRSecret,
isNewSecret, isNewSecret,
applicationId, applicationId
dispatch
}: Props): Promise<void> { }: Props): Promise<void> {
if (!name) return errorNotification('Name is required.'); if (!name) return errorNotification('Name is required.');
if (!value) return errorNotification('Value is required.'); if (!value) return errorNotification('Value is required.');
@ -33,13 +31,11 @@ export async function saveSecret({
isPRMRSecret, isPRMRSecret,
isNew: isNew || false isNew: isNew || false
}); });
dispatch('refresh');
if (isNewSecret) { if (isNewSecret) {
name = ''; name = '';
value = ''; value = '';
isBuildSecret = false; isBuildSecret = false;
} }
toast.push('Secret saved.');
} catch ({ error }) { } catch ({ error }) {
return errorNotification(error); return errorNotification(error);
} }