| @@ -20,7 +20,8 @@ | |||||||
| 		"svelte.svelte-vscode", | 		"svelte.svelte-vscode", | ||||||
| 		"ardenivanov.svelte-intellisense", | 		"ardenivanov.svelte-intellisense", | ||||||
| 		"Prisma.prisma", | 		"Prisma.prisma", | ||||||
| 		"bradlc.vscode-tailwindcss" | 		"bradlc.vscode-tailwindcss", | ||||||
|  | 		"waderyan.gitblame" | ||||||
| 	], | 	], | ||||||
| 	// Use 'forwardPorts' to make a list of ports inside the container available locally. | 	// Use 'forwardPorts' to make a list of ports inside the container available locally. | ||||||
| 	"forwardPorts": [3000, 3001], | 	"forwardPorts": [3000, 3001], | ||||||
|   | |||||||
| @@ -17,7 +17,6 @@ const algorithm = 'aes-256-ctr'; | |||||||
|  |  | ||||||
| async function main() { | async function main() { | ||||||
| 	// Enable registration for the first user | 	// Enable registration for the first user | ||||||
| 	// Set initial HAProxy password |  | ||||||
| 	const settingsFound = await prisma.setting.findFirst({}); | 	const settingsFound = await prisma.setting.findFirst({}); | ||||||
| 	if (!settingsFound) { | 	if (!settingsFound) { | ||||||
| 		await prisma.setting.create({ | 		await prisma.setting.create({ | ||||||
| @@ -25,7 +24,8 @@ async function main() { | |||||||
| 				isRegistrationEnabled: true, | 				isRegistrationEnabled: true, | ||||||
| 				proxyPassword: encrypt(generatePassword()), | 				proxyPassword: encrypt(generatePassword()), | ||||||
| 				proxyUser: cuid(), | 				proxyUser: cuid(), | ||||||
| 				arch: process.arch | 				arch: process.arch, | ||||||
|  | 				DNSServers: '1.1.1.1,8.8.8.8' | ||||||
| 			} | 			} | ||||||
| 		}); | 		}); | ||||||
| 	} else { | 	} else { | ||||||
|   | |||||||
| @@ -89,6 +89,22 @@ export function setDefaultBaseImage(buildPack: string | null, deploymentType: st | |||||||
| 		} | 		} | ||||||
| 	]; | 	]; | ||||||
| 	const phpVersions = [ | 	const phpVersions = [ | ||||||
|  | 		{ | ||||||
|  | 			value: 'webdevops/php-apache:8.2', | ||||||
|  | 			label: 'webdevops/php-apache:8.2' | ||||||
|  | 		}, | ||||||
|  | 		{ | ||||||
|  | 			value: 'webdevops/php-nginx:8.2', | ||||||
|  | 			label: 'webdevops/php-nginx:8.2' | ||||||
|  | 		}, | ||||||
|  | 		{ | ||||||
|  | 			value: 'webdevops/php-apache:8.1', | ||||||
|  | 			label: 'webdevops/php-apache:8.1' | ||||||
|  | 		}, | ||||||
|  | 		{ | ||||||
|  | 			value: 'webdevops/php-nginx:8.1', | ||||||
|  | 			label: 'webdevops/php-nginx:8.1' | ||||||
|  | 		}, | ||||||
| 		{ | 		{ | ||||||
| 			value: 'webdevops/php-apache:8.0', | 			value: 'webdevops/php-apache:8.0', | ||||||
| 			label: 'webdevops/php-apache:8.0' | 			label: 'webdevops/php-apache:8.0' | ||||||
| @@ -145,6 +161,22 @@ export function setDefaultBaseImage(buildPack: string | null, deploymentType: st | |||||||
| 			value: 'webdevops/php-nginx:5.6', | 			value: 'webdevops/php-nginx:5.6', | ||||||
| 			label: 'webdevops/php-nginx:5.6' | 			label: 'webdevops/php-nginx:5.6' | ||||||
| 		}, | 		}, | ||||||
|  | 		{ | ||||||
|  | 			value: 'webdevops/php-apache:8.2-alpine', | ||||||
|  | 			label: 'webdevops/php-apache:8.2-alpine' | ||||||
|  | 		}, | ||||||
|  | 		{ | ||||||
|  | 			value: 'webdevops/php-nginx:8.2-alpine', | ||||||
|  | 			label: 'webdevops/php-nginx:8.2-alpine' | ||||||
|  | 		}, | ||||||
|  | 		{ | ||||||
|  | 			value: 'webdevops/php-apache:8.1-alpine', | ||||||
|  | 			label: 'webdevops/php-apache:8.1-alpine' | ||||||
|  | 		}, | ||||||
|  | 		{ | ||||||
|  | 			value: 'webdevops/php-nginx:8.1-alpine', | ||||||
|  | 			label: 'webdevops/php-nginx:8.1-alpine' | ||||||
|  | 		}, | ||||||
| 		{ | 		{ | ||||||
| 			value: 'webdevops/php-apache:8.0-alpine', | 			value: 'webdevops/php-apache:8.0-alpine', | ||||||
| 			label: 'webdevops/php-apache:8.0-alpine' | 			label: 'webdevops/php-apache:8.0-alpine' | ||||||
| @@ -305,11 +337,11 @@ export function setDefaultBaseImage(buildPack: string | null, deploymentType: st | |||||||
| 		payload.baseImage = 'denoland/deno:latest'; | 		payload.baseImage = 'denoland/deno:latest'; | ||||||
| 	} | 	} | ||||||
| 	if (buildPack === 'php') { | 	if (buildPack === 'php') { | ||||||
| 		payload.baseImage = 'webdevops/php-apache:8.0-alpine'; | 		payload.baseImage = 'webdevops/php-apache:8.2-alpine'; | ||||||
| 		payload.baseImages = phpVersions; | 		payload.baseImages = phpVersions; | ||||||
| 	} | 	} | ||||||
| 	if (buildPack === 'laravel') { | 	if (buildPack === 'laravel') { | ||||||
| 		payload.baseImage = 'webdevops/php-apache:8.0-alpine'; | 		payload.baseImage = 'webdevops/php-apache:8.2-alpine'; | ||||||
| 		payload.baseBuildImage = 'node:18'; | 		payload.baseBuildImage = 'node:18'; | ||||||
| 		payload.baseBuildImages = nodeVersions; | 		payload.baseBuildImages = nodeVersions; | ||||||
| 	} | 	} | ||||||
|   | |||||||
| @@ -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.9.1'; | export const version = '3.9.2'; | ||||||
| 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'; | ||||||
|   | |||||||
| @@ -198,7 +198,7 @@ COPY ./init-db.sh /docker-entrypoint-initdb.d/init-db.sh`; | |||||||
|  |  | ||||||
|         await fs.writeFile(`${workdir}/Dockerfile`, Dockerfile); |         await fs.writeFile(`${workdir}/Dockerfile`, Dockerfile); | ||||||
|  |  | ||||||
|         const { volumeMounts } = persistentVolumes(id, persistentStorage, config.plausibleAnalytics) |         const { volumeMounts } = persistentVolumes(id, persistentStorage, config) | ||||||
|  |  | ||||||
|         const composeFile: ComposeFile = { |         const composeFile: ComposeFile = { | ||||||
|             version: '3.8', |             version: '3.8', | ||||||
| @@ -333,6 +333,8 @@ async function startMinioService(request: FastifyRequest<ServiceStartStop>) { | |||||||
|                 image: `${image}:${version}`, |                 image: `${image}:${version}`, | ||||||
|                 volumes: [`${id}-minio-data:/data`], |                 volumes: [`${id}-minio-data:/data`], | ||||||
|                 environmentVariables: { |                 environmentVariables: { | ||||||
|  |                     MINIO_SERVER_URL: fqdn, | ||||||
|  |                     MINIO_DOMAIN: getDomain(fqdn), | ||||||
|                     MINIO_ROOT_USER: rootUser, |                     MINIO_ROOT_USER: rootUser, | ||||||
|                     MINIO_ROOT_PASSWORD: rootUserPassword, |                     MINIO_ROOT_PASSWORD: rootUserPassword, | ||||||
|                     MINIO_BROWSER_REDIRECT_URL: fqdn |                     MINIO_BROWSER_REDIRECT_URL: fqdn | ||||||
| @@ -852,7 +854,7 @@ async function startGhostService(request: FastifyRequest<ServiceStartStop>) { | |||||||
|             }); |             }); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         const { volumeMounts } = persistentVolumes(id, persistentStorage, config.ghost) |         const { volumeMounts } = persistentVolumes(id, persistentStorage, config) | ||||||
|         const composeFile: ComposeFile = { |         const composeFile: ComposeFile = { | ||||||
|             version: '3.8', |             version: '3.8', | ||||||
|             services: { |             services: { | ||||||
| @@ -1086,7 +1088,7 @@ async function startUmamiService(request: FastifyRequest<ServiceStartStop>) { | |||||||
| 	  FROM ${config.postgresql.image} | 	  FROM ${config.postgresql.image} | ||||||
| 	  COPY ./schema.postgresql.sql /docker-entrypoint-initdb.d/schema.postgresql.sql`; | 	  COPY ./schema.postgresql.sql /docker-entrypoint-initdb.d/schema.postgresql.sql`; | ||||||
|         await fs.writeFile(`${workdir}/Dockerfile`, Dockerfile); |         await fs.writeFile(`${workdir}/Dockerfile`, Dockerfile); | ||||||
|         const { volumeMounts } = persistentVolumes(id, persistentStorage, config.umami) |         const { volumeMounts } = persistentVolumes(id, persistentStorage, config) | ||||||
|         const composeFile: ComposeFile = { |         const composeFile: ComposeFile = { | ||||||
|             version: '3.8', |             version: '3.8', | ||||||
|             services: { |             services: { | ||||||
| @@ -1114,6 +1116,7 @@ async function startUmamiService(request: FastifyRequest<ServiceStartStop>) { | |||||||
|             }, |             }, | ||||||
|             volumes: volumeMounts |             volumes: volumeMounts | ||||||
|         }; |         }; | ||||||
|  |         console.log(composeFile) | ||||||
|         const composeFileDestination = `${workdir}/docker-compose.yaml`; |         const composeFileDestination = `${workdir}/docker-compose.yaml`; | ||||||
|         await fs.writeFile(composeFileDestination, yaml.dump(composeFile)); |         await fs.writeFile(composeFileDestination, yaml.dump(composeFile)); | ||||||
|         await startServiceContainers(destinationDocker.id, composeFileDestination) |         await startServiceContainers(destinationDocker.id, composeFileDestination) | ||||||
| @@ -1167,7 +1170,7 @@ async function startHasuraService(request: FastifyRequest<ServiceStartStop>) { | |||||||
|             }); |             }); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         const { volumeMounts } = persistentVolumes(id, persistentStorage, config.hasura) |         const { volumeMounts } = persistentVolumes(id, persistentStorage, config) | ||||||
|         const composeFile: ComposeFile = { |         const composeFile: ComposeFile = { | ||||||
|             version: '3.8', |             version: '3.8', | ||||||
|             services: { |             services: { | ||||||
| @@ -1272,7 +1275,7 @@ async function startFiderService(request: FastifyRequest<ServiceStartStop>) { | |||||||
|                 config.fider.environmentVariables[secret.name] = secret.value; |                 config.fider.environmentVariables[secret.name] = secret.value; | ||||||
|             }); |             }); | ||||||
|         } |         } | ||||||
|         const { volumeMounts } = persistentVolumes(id, persistentStorage, config.fider) |         const { volumeMounts } = persistentVolumes(id, persistentStorage, config) | ||||||
|         const composeFile: ComposeFile = { |         const composeFile: ComposeFile = { | ||||||
|             version: '3.8', |             version: '3.8', | ||||||
|             services: { |             services: { | ||||||
| @@ -1880,7 +1883,7 @@ async function startMoodleService(request: FastifyRequest<ServiceStartStop>) { | |||||||
|                 config.moodle.environmentVariables[secret.name] = secret.value; |                 config.moodle.environmentVariables[secret.name] = secret.value; | ||||||
|             }); |             }); | ||||||
|         } |         } | ||||||
|         const { volumeMounts } = persistentVolumes(id, persistentStorage, config.moodle) |         const { volumeMounts } = persistentVolumes(id, persistentStorage, config) | ||||||
|         const composeFile: ComposeFile = { |         const composeFile: ComposeFile = { | ||||||
|             version: '3.8', |             version: '3.8', | ||||||
|             services: { |             services: { | ||||||
| @@ -2006,7 +2009,7 @@ async function startGlitchTipService(request: FastifyRequest<ServiceStartStop>) | |||||||
|                 config.glitchTip.environmentVariables[secret.name] = secret.value; |                 config.glitchTip.environmentVariables[secret.name] = secret.value; | ||||||
|             }); |             }); | ||||||
|         } |         } | ||||||
|         const { volumeMounts } = persistentVolumes(id, persistentStorage, config.glitchTip) |         const { volumeMounts } = persistentVolumes(id, persistentStorage, config) | ||||||
|         const composeFile: ComposeFile = { |         const composeFile: ComposeFile = { | ||||||
|             version: '3.8', |             version: '3.8', | ||||||
|             services: { |             services: { | ||||||
|   | |||||||
| @@ -525,9 +525,7 @@ export async function checkDomain(request: FastifyRequest<CheckDomain>) { | |||||||
| } | } | ||||||
| export async function checkDNS(request: FastifyRequest<CheckDNS>) { | export async function checkDNS(request: FastifyRequest<CheckDNS>) { | ||||||
|     try { |     try { | ||||||
|  |  | ||||||
|         const { id } = request.params |         const { id } = request.params | ||||||
|  |  | ||||||
|         let { exposePort, fqdn, forceSave, dualCerts } = request.body |         let { exposePort, fqdn, forceSave, dualCerts } = request.body | ||||||
|         if (!fqdn) { |         if (!fqdn) { | ||||||
|             return {} |             return {} | ||||||
|   | |||||||
| @@ -133,7 +133,7 @@ export async function gitLabEvents(request: FastifyRequest<GitLabEvents>) { | |||||||
|                             await prisma.build.create({ |                             await prisma.build.create({ | ||||||
|                                 data: { |                                 data: { | ||||||
|                                     id: buildId, |                                     id: buildId, | ||||||
|                                     pullmergeRequestId, |                                     pullmergeRequestId: pullmergeRequestId.toString(), | ||||||
|                                     sourceBranch, |                                     sourceBranch, | ||||||
|                                     applicationId: application.id, |                                     applicationId: application.id, | ||||||
|                                     destinationDockerId: application.destinationDocker.id, |                                     destinationDockerId: application.destinationDocker.id, | ||||||
|   | |||||||
| @@ -244,7 +244,7 @@ | |||||||
| 	{/if} | 	{/if} | ||||||
| 	{#if $status.application.initialLoading} | 	{#if $status.application.initialLoading} | ||||||
| 		<button | 		<button | ||||||
| 			class="icons flex animate-spin items-center space-x-2 bg-transparent text-sm duration-500 ease-in-out" | 			class="icons flex animate-spin items-center space-x-2 bg-transparent text-sm duration-500 ease-in-out hover:bg-transparent" | ||||||
| 		> | 		> | ||||||
| 			<svg | 			<svg | ||||||
| 				xmlns="http://www.w3.org/2000/svg" | 				xmlns="http://www.w3.org/2000/svg" | ||||||
|   | |||||||
| @@ -218,7 +218,8 @@ | |||||||
| 		if (loading) return; | 		if (loading) return; | ||||||
| 		loading = true; | 		loading = true; | ||||||
| 		try { | 		try { | ||||||
| 			nonWWWDomain = application.fqdn != null && getDomain(application.fqdn).replace(/^www\./, ''); | 			nonWWWDomain = application.fqdn && getDomain(application.fqdn).replace(/^www\./, ''); | ||||||
|  | 			console.log({debug: nonWWWDomain}) | ||||||
| 			if (application.deploymentType) | 			if (application.deploymentType) | ||||||
| 				application.deploymentType = application.deploymentType.toLowerCase(); | 				application.deploymentType = application.deploymentType.toLowerCase(); | ||||||
| 			!isBot && | 			!isBot && | ||||||
|   | |||||||
| @@ -87,12 +87,15 @@ | |||||||
| 		const sure = confirm($t('database.confirm_stop', { name: database.name })); | 		const sure = confirm($t('database.confirm_stop', { name: database.name })); | ||||||
| 		if (sure) { | 		if (sure) { | ||||||
| 			$status.database.initialLoading = true; | 			$status.database.initialLoading = true; | ||||||
|  | 			$status.database.loading = true; | ||||||
| 			try { | 			try { | ||||||
| 				await post(`/databases/${database.id}/stop`, {}); | 				await post(`/databases/${database.id}/stop`, {}); | ||||||
| 			} catch (error) { | 			} catch (error) { | ||||||
| 				return errorNotification(error); | 				return errorNotification(error); | ||||||
| 			} finally { | 			} finally { | ||||||
| 				$status.database.initialLoading = false; | 				$status.database.initialLoading = false; | ||||||
|  | 				$status.database.loading = false; | ||||||
|  | 				await getStatus(); | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| @@ -175,7 +178,7 @@ | |||||||
| 			{/if} | 			{/if} | ||||||
| 			{#if $status.database.initialLoading} | 			{#if $status.database.initialLoading} | ||||||
| 				<button | 				<button | ||||||
| 					class="icons flex animate-spin items-center space-x-2 bg-transparent text-sm duration-500 ease-in-out" | 					class="icons flex animate-spin items-center space-x-2 bg-transparent text-sm duration-500 ease-in-out hover:bg-transparent" | ||||||
| 				> | 				> | ||||||
| 					<svg | 					<svg | ||||||
| 						xmlns="http://www.w3.org/2000/svg" | 						xmlns="http://www.w3.org/2000/svg" | ||||||
|   | |||||||
| @@ -70,7 +70,7 @@ | |||||||
| 					</div> | 					</div> | ||||||
| 				</div> | 				</div> | ||||||
| 				<div class="prose"> | 				<div class="prose"> | ||||||
| 					<h4>Coolify dashboard</h4> | 					<h4>Coolify</h4> | ||||||
| 				</div> | 				</div> | ||||||
| 			{/if} | 			{/if} | ||||||
| 		</div> | 		</div> | ||||||
|   | |||||||
| @@ -100,7 +100,7 @@ | |||||||
| 						</div> | 						</div> | ||||||
| 					</div> | 					</div> | ||||||
| 					<div class="prose"> | 					<div class="prose"> | ||||||
| 						<h4>Coolify dashboard</h4> | 						<h4>Coolify</h4> | ||||||
| 					</div> | 					</div> | ||||||
| 				{/if} | 				{/if} | ||||||
| 			</div> | 			</div> | ||||||
|   | |||||||
| @@ -12,7 +12,14 @@ | |||||||
| 	import { get, post } from '$lib/api'; | 	import { get, post } from '$lib/api'; | ||||||
| 	import { errorNotification, getDomain } from '$lib/common'; | 	import { errorNotification, getDomain } from '$lib/common'; | ||||||
| 	import { t } from '$lib/translations'; | 	import { t } from '$lib/translations'; | ||||||
| 	import { appSession, disabledButton, status, location, setLocation, addToast } from '$lib/store'; | 	import { | ||||||
|  | 		appSession, | ||||||
|  | 		status, | ||||||
|  | 		setLocation, | ||||||
|  | 		addToast, | ||||||
|  | 		checkIfDeploymentEnabledServices, | ||||||
|  | 		isDeploymentEnabled | ||||||
|  | 	} from '$lib/store'; | ||||||
| 	import CopyPasswordField from '$lib/components/CopyPasswordField.svelte'; | 	import CopyPasswordField from '$lib/components/CopyPasswordField.svelte'; | ||||||
| 	import Setting from '$lib/components/Setting.svelte'; | 	import Setting from '$lib/components/Setting.svelte'; | ||||||
|  |  | ||||||
| @@ -78,8 +85,8 @@ | |||||||
| 			}); | 			}); | ||||||
| 			await post(`/services/${id}`, { ...service }); | 			await post(`/services/${id}`, { ...service }); | ||||||
| 			setLocation(service); | 			setLocation(service); | ||||||
| 			$disabledButton = false; |  | ||||||
| 			forceSave = false; | 			forceSave = false; | ||||||
|  | 			$isDeploymentEnabled = checkIfDeploymentEnabledServices($appSession.isAdmin, service); | ||||||
| 			return addToast({ | 			return addToast({ | ||||||
| 				message: 'Configuration saved.', | 				message: 'Configuration saved.', | ||||||
| 				type: 'success' | 				type: 'success' | ||||||
|   | |||||||
| @@ -12,7 +12,7 @@ | |||||||
| 	export let readOnly: any; | 	export let readOnly: any; | ||||||
| 	export let settings: any; | 	export let settings: any; | ||||||
| 	const { id } = $page.params; | 	const { id } = $page.params; | ||||||
|  | 	const { ipv4, ipv6 } = settings; | ||||||
| 	let ftpUrl = generateUrl(service.wordpress.ftpPublicPort); | 	let ftpUrl = generateUrl(service.wordpress.ftpPublicPort); | ||||||
| 	let ftpUser = service.wordpress.ftpUser; | 	let ftpUser = service.wordpress.ftpUser; | ||||||
| 	let ftpPassword = service.wordpress.ftpPassword; | 	let ftpPassword = service.wordpress.ftpPassword; | ||||||
| @@ -22,7 +22,7 @@ | |||||||
| 	function generateUrl(publicPort: any) { | 	function generateUrl(publicPort: any) { | ||||||
| 		return browser | 		return browser | ||||||
| 			? `sftp://${ | 			? `sftp://${ | ||||||
| 					settings?.fqdn ? getDomain(settings.fqdn) : window.location.hostname | 					settings?.fqdn ? getDomain(settings.fqdn) : ipv4 || ipv6 | ||||||
| 			  }:${publicPort}` | 			  }:${publicPort}` | ||||||
| 			: 'Loading...'; | 			: 'Loading...'; | ||||||
| 	} | 	} | ||||||
|   | |||||||
| @@ -97,12 +97,15 @@ | |||||||
| 		const sure = confirm($t('database.confirm_stop', { name: service.name })); | 		const sure = confirm($t('database.confirm_stop', { name: service.name })); | ||||||
| 		if (sure) { | 		if (sure) { | ||||||
| 			$status.service.initialLoading = true; | 			$status.service.initialLoading = true; | ||||||
|  | 			$status.service.loading = true; | ||||||
| 			try { | 			try { | ||||||
| 				await post(`/services/${service.id}/${service.type}/stop`, {}); | 				await post(`/services/${service.id}/${service.type}/stop`, {}); | ||||||
| 			} catch (error) { | 			} catch (error) { | ||||||
| 				return errorNotification(error); | 				return errorNotification(error); | ||||||
| 			} finally { | 			} finally { | ||||||
| 				$status.service.initialLoading = false; | 				$status.service.initialLoading = false; | ||||||
|  | 				$status.service.loading = false; | ||||||
|  | 				await getStatus(); | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|   | |||||||
| @@ -362,7 +362,6 @@ | |||||||
| 							on:click={() => changeSettings('isAPIDebuggingEnabled')} | 							on:click={() => changeSettings('isAPIDebuggingEnabled')} | ||||||
| 						/> | 						/> | ||||||
| 					</div> | 					</div> | ||||||
| 					{#if browser && $features.beta} |  | ||||||
| 					<div class="grid grid-cols-2 items-center"> | 					<div class="grid grid-cols-2 items-center"> | ||||||
| 						<Setting | 						<Setting | ||||||
| 							id="isAutoUpdateEnabled" | 							id="isAutoUpdateEnabled" | ||||||
| @@ -372,7 +371,6 @@ | |||||||
| 							on:click={() => changeSettings('isAutoUpdateEnabled')} | 							on:click={() => changeSettings('isAutoUpdateEnabled')} | ||||||
| 						/> | 						/> | ||||||
| 					</div> | 					</div> | ||||||
| 					{/if} |  | ||||||
| 				</div> | 				</div> | ||||||
| 			</form> | 			</form> | ||||||
| 		</div> | 		</div> | ||||||
|   | |||||||
| @@ -46,8 +46,8 @@ | |||||||
| 				customPort: source.customPort | 				customPort: source.customPort | ||||||
| 			}); | 			}); | ||||||
| 			const { organization, htmlUrl } = source; | 			const { organization, htmlUrl } = source; | ||||||
| 			const { fqdn } = settings; | 			const { fqdn, ipv4, ipv6 } = settings; | ||||||
| 			const host = dev ? getAPIUrl() : fqdn ? fqdn : `http://${window.location.host}` || ''; | 			const host = dev ? getAPIUrl() : fqdn ? fqdn : `http://${ipv4 || ipv6}` || ''; | ||||||
| 			const domain = getDomain(fqdn); | 			const domain = getDomain(fqdn); | ||||||
|  |  | ||||||
| 			let url = 'settings/apps/new'; | 			let url = 'settings/apps/new'; | ||||||
|   | |||||||
| @@ -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.9.1", |   "version": "3.9.2", | ||||||
|   "license": "Apache-2.0", |   "license": "Apache-2.0", | ||||||
|   "repository": "github:coollabsio/coolify", |   "repository": "github:coollabsio/coolify", | ||||||
|   "scripts": { |   "scripts": { | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Andras Bacsai
					Andras Bacsai