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