2022-02-10 15:47:44 +01:00
< script context = "module" lang = "ts" >
import type { Load } from '@sveltejs/kit';
export const load: Load = async ({ fetch } ) => {
const url = `/settings.json`;
const res = await fetch(url);
if (res.ok) {
return {
props: {
...(await res.json())
}
};
}
return {
status: res.status,
error: new Error(`Could not load ${ url } `)
};
};
< / script >
< script lang = "ts" >
import { session } from '$app/stores';
export let settings;
import Setting from '$lib/components/Setting.svelte';
import Explainer from '$lib/components/Explainer.svelte';
import { errorNotification } from '$lib/form';
import { del , post } from '$lib/api';
import CopyPasswordField from '$lib/components/CopyPasswordField.svelte';
import { browser } from '$app/env';
import { getDomain } from '$lib/components/common';
2022-02-17 22:14:06 +01:00
import { toast } from '@zerodevx/svelte-toast';
2022-02-10 15:47:44 +01:00
let isRegistrationEnabled = settings.isRegistrationEnabled;
2022-02-17 22:14:06 +01:00
let dualCerts = settings.dualCerts;
2022-02-22 10:35:39 +01:00
let minPort = settings.minPort;
let maxPort = settings.maxPort;
2022-02-10 15:47:44 +01:00
let fqdn = settings.fqdn;
2022-02-17 22:14:06 +01:00
let isFqdnSet = !!settings.fqdn;
2022-02-10 15:47:44 +01:00
let loading = {
save: false,
remove: false
};
async function removeFqdn() {
if (fqdn) {
loading.remove = true;
try {
2022-02-17 22:14:06 +01:00
const { redirect } = await del(`/settings.json`, { fqdn } );
return redirect ? window.location.replace(redirect) : window.location.reload();
2022-02-10 15:47:44 +01:00
} catch ({ error } ) {
return errorNotification(error);
} finally {
loading.remove = false;
}
}
}
async function changeSettings(name) {
try {
if (name === 'isRegistrationEnabled') {
isRegistrationEnabled = !isRegistrationEnabled;
}
2022-02-17 22:14:06 +01:00
if (name === 'dualCerts') {
dualCerts = !dualCerts;
}
await post(`/settings.json`, { isRegistrationEnabled , dualCerts } );
return toast.push('Settings saved.');
2022-02-10 15:47:44 +01:00
} catch ({ error } ) {
return errorNotification(error);
}
}
async function handleSubmit() {
try {
loading.save = true;
2022-02-23 10:26:29 +01:00
if (fqdn !== settings.fqdn) {
2022-02-10 15:47:44 +01:00
await post(`/settings/check.json`, { fqdn } );
await post(`/settings.json`, { fqdn } );
2022-03-01 13:07:34 +01:00
return window.location.reload();
2022-02-22 10:35:39 +01:00
}
if (minPort !== settings.minPort || maxPort !== settings.maxPort) {
await post(`/settings.json`, { minPort , maxPort } );
settings.minPort = minPort;
settings.maxPort = maxPort;
2022-02-10 15:47:44 +01:00
}
} catch ({ error } ) {
return errorNotification(error);
} finally {
loading.save = false;
}
}
< / script >
< div class = "flex space-x-1 p-6 font-bold" >
< div class = "mr-4 text-2xl tracking-tight" > Settings< / div >
< / div >
{ #if $session . teamId === '0' }
2022-02-17 22:14:06 +01:00
< div class = "mx-auto max-w-4xl px-6" >
2022-02-22 12:56:58 +01:00
< form on:submit | preventDefault = { handleSubmit } class="grid grid-flow-row gap-2 py-4 " >
2022-03-01 13:07:34 +01:00
< div class = "flex space-x-1 pb-6" >
2022-02-22 12:56:58 +01:00
< div class = "title font-bold" > Global Settings< / div >
2022-02-10 15:47:44 +01:00
< button
type="submit"
disabled={ loading . save }
2022-02-17 22:14:06 +01:00
class:bg-yellow-500={ ! loading . save }
class:hover:bg-yellow-400={ ! loading . save }
2022-02-10 15:47:44 +01:00
class="mx-2 ">{ loading . save ? 'Saving...' : 'Save' } < /button
>
{ #if isFqdnSet }
< button
on:click| preventDefault={ removeFqdn }
disabled={ loading . remove }
class:bg-red-600={ ! loading . remove }
class:hover:bg-red-500={ ! loading . remove }
>{ loading . remove ? 'Removing...' : 'Remove domain' } < /button
>
{ /if }
< / div >
2022-02-17 22:14:06 +01:00
< div class = "grid grid-flow-row gap-2 px-10" >
< div class = "grid grid-cols-2 items-start" >
2022-02-22 10:35:39 +01:00
< div class = "flex-col" >
2022-04-02 17:43:24 +02:00
< div class = "pt-2 text-base font-bold text-stone-100" > URL (FQDN)< / div >
2022-02-22 10:35:39 +01:00
< Explainer
text="If you specify < span class = 'text-yellow-500 font-bold' > https< / span > , Coolify will be accessible only over https. SSL certificate will be generated for you.< br > If you specify < span class = 'text-yellow-500 font-bold' > www< / span > , Coolify will be redirected (302) from non-www and vice versa."
/>
< / div >
2022-02-17 22:14:06 +01:00
< div class = "justify-start text-left" >
2022-02-10 15:47:44 +01:00
< input
bind:value={ fqdn }
readonly={ ! $session . isAdmin || isFqdnSet }
disabled={ ! $session . isAdmin || isFqdnSet }
name="fqdn"
id="fqdn"
pattern="^https?://([a-z0-9]+(-[a-z0-9]+)*\.)+[a-z]{ '{' } 2,{ '}' } $"
placeholder="eg: https://coolify.io"
/>
2022-02-22 10:35:39 +01:00
< / div >
< / div >
< div class = "grid grid-cols-2 items-start py-6" >
< div class = "flex-col" >
< div class = "pt-2 text-base font-bold text-stone-100" > Public Port Range< / div >
2022-02-10 15:47:44 +01:00
< Explainer
2022-02-22 10:35:39 +01:00
text="Ports used to expose databases/services/internal services.< br > Add them to your firewall (if applicable).< br > < br > You can specify a range of ports, eg: < span class = 'text-yellow-500 font-bold' > 9000-9100< / span > "
/>
< / div >
< div class = "mx-auto flex-row items-center justify-center space-y-2" >
< input
class="h-8 w-20 px-2"
type="number"
bind:value={ minPort }
min="1024"
max={ maxPort }
/>
-
< input
class="h-8 w-20 px-2"
type="number"
bind:value={ maxPort }
min={ minPort }
max="65543"
2022-02-10 15:47:44 +01:00
/>
< / div >
< / div >
2022-02-17 22:14:06 +01:00
< div class = "grid grid-cols-2 items-center" >
< Setting
2022-02-18 13:59:23 +01:00
dataTooltip="Must remove the domain before you can change this setting."
2022-02-17 22:14:06 +01:00
disabled={ isFqdnSet }
bind:setting={ dualCerts }
title="Generate SSL for www and non-www?"
2022-02-22 10:35:39 +01:00
description="It will generate certificates for both www and non-www. < br > You need to have < span class = 'font-bold text-yellow-500' > both DNS entries< / span > set in advance.< br > < br > Useful if you expect to have visitors on both."
2022-02-17 22:14:06 +01:00
on:click={() => ! isFqdnSet && changeSettings ( 'dualCerts' )}
/>
< / div >
< div class = "grid grid-cols-2 items-center" >
2022-02-10 15:47:44 +01:00
< Setting
bind:setting={ isRegistrationEnabled }
title="Registration allowed?"
description="Allow further registrations to the application. < br > It's turned off after the first registration. "
on:click={() => changeSettings ( 'isRegistrationEnabled' )}
/>
2022-02-17 22:14:06 +01:00
< / div >
2022-02-10 15:47:44 +01:00
< / div >
< / form >
2022-02-17 22:14:06 +01:00
< div class = "flex space-x-1 pt-6 font-bold" >
< div class = "title" > Coolify Proxy Settings< / div >
< / div >
< Explainer
text={ `Credentials for <a class="text-white font-bold" href=$ {
fqdn
2022-03-02 14:38:51 +01:00
? `http://${ settings . proxyUser } :${ settings . proxyPassword } @` + getDomain(fqdn) + ':8404'
: browser & &
`http://${ settings . proxyUser } :${ settings . proxyPassword } @` +
window.location.hostname +
':8404'
2022-02-17 22:14:06 +01:00
} target="_blank">stats< / a > page.`}
/>
2022-02-20 00:00:31 +01:00
< div class = "space-y-2 px-10 py-5" >
2022-02-17 22:14:06 +01:00
< div class = "grid grid-cols-2 items-center" >
2022-02-10 15:47:44 +01:00
< label for = "proxyUser" > User< / label >
2022-02-17 22:14:06 +01:00
< CopyPasswordField
readonly
disabled
id="proxyUser"
name="proxyUser"
value={ settings . proxyUser }
/>
2022-02-10 15:47:44 +01:00
< / div >
2022-02-17 22:14:06 +01:00
< div class = "grid grid-cols-2 items-center" >
2022-02-10 15:47:44 +01:00
< label for = "proxyPassword" > Password< / label >
2022-02-17 22:14:06 +01:00
< CopyPasswordField
readonly
disabled
id="proxyPassword"
name="proxyPassword"
isPasswordField
value={ settings . proxyPassword }
/>
2022-02-10 15:47:44 +01:00
< / div >
< / div >
< / div >
{ /if }