Merge branch 'main' into main
This commit is contained in:
		@@ -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.4.0",
 | 
						"version": "2.4.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",
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -159,6 +159,7 @@ export function generateDatabaseConfiguration(database) {
 | 
				
			|||||||
			// url: `psql://${dbUser}:${dbUserPassword}@${id}:${isPublic ? port : 5432}/${defaultDatabase}`,
 | 
								// url: `psql://${dbUser}:${dbUserPassword}@${id}:${isPublic ? port : 5432}/${defaultDatabase}`,
 | 
				
			||||||
			privatePort: 5432,
 | 
								privatePort: 5432,
 | 
				
			||||||
			environmentVariables: {
 | 
								environmentVariables: {
 | 
				
			||||||
 | 
									POSTGRESQL_POSTGRES_PASSWORD: rootUserPassword,
 | 
				
			||||||
				POSTGRESQL_PASSWORD: dbUserPassword,
 | 
									POSTGRESQL_PASSWORD: dbUserPassword,
 | 
				
			||||||
				POSTGRESQL_USERNAME: dbUser,
 | 
									POSTGRESQL_USERNAME: dbUser,
 | 
				
			||||||
				POSTGRESQL_DATABASE: defaultDatabase
 | 
									POSTGRESQL_DATABASE: defaultDatabase
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -138,7 +138,7 @@ export async function stopDatabase(database) {
 | 
				
			|||||||
	return everStarted;
 | 
						return everStarted;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export async function updatePasswordInDb(database, user, newPassword) {
 | 
					export async function updatePasswordInDb(database, user, newPassword, isRoot) {
 | 
				
			||||||
	const {
 | 
						const {
 | 
				
			||||||
		id,
 | 
							id,
 | 
				
			||||||
		type,
 | 
							type,
 | 
				
			||||||
@@ -157,9 +157,15 @@ export async function updatePasswordInDb(database, user, newPassword) {
 | 
				
			|||||||
				`DOCKER_HOST=${host} docker exec ${id} mysql -u ${rootUser} -p${rootUserPassword} -e \"ALTER USER '${user}'@'%' IDENTIFIED WITH caching_sha2_password BY '${newPassword}';\"`
 | 
									`DOCKER_HOST=${host} docker exec ${id} mysql -u ${rootUser} -p${rootUserPassword} -e \"ALTER USER '${user}'@'%' IDENTIFIED WITH caching_sha2_password BY '${newPassword}';\"`
 | 
				
			||||||
			);
 | 
								);
 | 
				
			||||||
		} else if (type === 'postgresql') {
 | 
							} else if (type === 'postgresql') {
 | 
				
			||||||
			await asyncExecShell(
 | 
								if (isRoot) {
 | 
				
			||||||
				`DOCKER_HOST=${host} docker exec ${id} psql postgresql://${dbUser}:${dbUserPassword}@${id}:5432/${defaultDatabase} -c "ALTER role ${user} WITH PASSWORD '${newPassword}'"`
 | 
									await asyncExecShell(
 | 
				
			||||||
			);
 | 
										`DOCKER_HOST=${host} docker exec ${id} psql postgresql://postgres:${rootUserPassword}@${id}:5432/${defaultDatabase} -c "ALTER role postgres WITH PASSWORD '${newPassword}'"`
 | 
				
			||||||
 | 
									);
 | 
				
			||||||
 | 
								} else {
 | 
				
			||||||
 | 
									await asyncExecShell(
 | 
				
			||||||
 | 
										`DOCKER_HOST=${host} docker exec ${id} psql postgresql://${dbUser}:${dbUserPassword}@${id}:5432/${defaultDatabase} -c "ALTER role ${user} WITH PASSWORD '${newPassword}'"`
 | 
				
			||||||
 | 
									);
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
		} else if (type === 'mongodb') {
 | 
							} else if (type === 'mongodb') {
 | 
				
			||||||
			await asyncExecShell(
 | 
								await asyncExecShell(
 | 
				
			||||||
				`DOCKER_HOST=${host} docker exec ${id} mongo 'mongodb://${rootUser}:${rootUserPassword}@${id}:27017/admin?readPreference=primary&ssl=false' --eval "db.changeUserPassword('${user}','${newPassword}')"`
 | 
									`DOCKER_HOST=${host} docker exec ${id} mongo 'mongodb://${rootUser}:${rootUserPassword}@${id}:27017/admin?readPreference=primary&ssl=false' --eval "db.changeUserPassword('${user}','${newPassword}')"`
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -165,7 +165,7 @@ export async function configureServiceType({ id, type }) {
 | 
				
			|||||||
			}
 | 
								}
 | 
				
			||||||
		});
 | 
							});
 | 
				
			||||||
	} else if (type === 'ghost') {
 | 
						} else if (type === 'ghost') {
 | 
				
			||||||
		const defaultEmail = `${cuid()}@coolify.io`;
 | 
							const defaultEmail = `${cuid()}@example.com`;
 | 
				
			||||||
		const defaultPassword = encrypt(generatePassword());
 | 
							const defaultPassword = encrypt(generatePassword());
 | 
				
			||||||
		const mariadbUser = cuid();
 | 
							const mariadbUser = cuid();
 | 
				
			||||||
		const mariadbPassword = encrypt(generatePassword());
 | 
							const mariadbPassword = encrypt(generatePassword());
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -49,7 +49,7 @@
 | 
				
			|||||||
	$: databaseUrl = generateUrl();
 | 
						$: databaseUrl = generateUrl();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	function generateUrl() {
 | 
						function generateUrl() {
 | 
				
			||||||
		return browser
 | 
							return (databaseUrl = browser
 | 
				
			||||||
			? `${database.type}://${
 | 
								? `${database.type}://${
 | 
				
			||||||
					databaseDbUser ? databaseDbUser + ':' : ''
 | 
										databaseDbUser ? databaseDbUser + ':' : ''
 | 
				
			||||||
			  }${databaseDbUserPassword}@${
 | 
								  }${databaseDbUserPassword}@${
 | 
				
			||||||
@@ -59,7 +59,7 @@
 | 
				
			|||||||
							: window.location.hostname
 | 
												: window.location.hostname
 | 
				
			||||||
						: database.id
 | 
											: database.id
 | 
				
			||||||
			  }:${isPublic ? database.publicPort : privatePort}/${databaseDefault}`
 | 
								  }:${isPublic ? database.publicPort : privatePort}/${databaseDefault}`
 | 
				
			||||||
			: 'Loading...';
 | 
								: 'Loading...');
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	async function changeSettings(name) {
 | 
						async function changeSettings(name) {
 | 
				
			||||||
@@ -200,7 +200,7 @@
 | 
				
			|||||||
					name="url"
 | 
										name="url"
 | 
				
			||||||
					readonly
 | 
										readonly
 | 
				
			||||||
					disabled
 | 
										disabled
 | 
				
			||||||
					value={publicLoading || loading ? 'Loading...' : databaseUrl}
 | 
										value={publicLoading || loading ? 'Loading...' : generateUrl()}
 | 
				
			||||||
				/>
 | 
									/>
 | 
				
			||||||
			</div>
 | 
								</div>
 | 
				
			||||||
		</div>
 | 
							</div>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -21,6 +21,19 @@
 | 
				
			|||||||
			bind:value={database.defaultDatabase}
 | 
								bind:value={database.defaultDatabase}
 | 
				
			||||||
		/>
 | 
							/>
 | 
				
			||||||
	</div>
 | 
						</div>
 | 
				
			||||||
 | 
						<div class="grid grid-cols-2 items-center">
 | 
				
			||||||
 | 
							<label for="rootUser" class="text-base font-bold text-stone-100"
 | 
				
			||||||
 | 
								>Root (postgres) User Password</label
 | 
				
			||||||
 | 
							>
 | 
				
			||||||
 | 
							<CopyPasswordField
 | 
				
			||||||
 | 
								disabled={!isRunning}
 | 
				
			||||||
 | 
								readonly={!isRunning}
 | 
				
			||||||
 | 
								placeholder="Generated automatically after start"
 | 
				
			||||||
 | 
								id="rootUserPassword"
 | 
				
			||||||
 | 
								name="rootUserPassword"
 | 
				
			||||||
 | 
								bind:value={database.rootUserPassword}
 | 
				
			||||||
 | 
							/>
 | 
				
			||||||
 | 
						</div>
 | 
				
			||||||
	<div class="grid grid-cols-2 items-center">
 | 
						<div class="grid grid-cols-2 items-center">
 | 
				
			||||||
		<label for="dbUser" class="text-base font-bold text-stone-100">User</label>
 | 
							<label for="dbUser" class="text-base font-bold text-stone-100">User</label>
 | 
				
			||||||
		<CopyPasswordField
 | 
							<CopyPasswordField
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -68,9 +68,9 @@ export const post: RequestHandler = async (event) => {
 | 
				
			|||||||
		const database = await db.getDatabase({ id, teamId });
 | 
							const database = await db.getDatabase({ id, teamId });
 | 
				
			||||||
		if (isRunning) {
 | 
							if (isRunning) {
 | 
				
			||||||
			if (database.dbUserPassword !== dbUserPassword) {
 | 
								if (database.dbUserPassword !== dbUserPassword) {
 | 
				
			||||||
				await updatePasswordInDb(database, dbUser, dbUserPassword);
 | 
									await updatePasswordInDb(database, dbUser, dbUserPassword, false);
 | 
				
			||||||
			} else if (database.rootUserPassword !== rootUserPassword) {
 | 
								} else if (database.rootUserPassword !== rootUserPassword) {
 | 
				
			||||||
				await updatePasswordInDb(database, rootUser, rootUserPassword);
 | 
									await updatePasswordInDb(database, rootUser, rootUserPassword, true);
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		await db.updateDatabase({
 | 
							await db.updateDatabase({
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -44,12 +44,15 @@ export const post: RequestHandler = async (event) => {
 | 
				
			|||||||
		const { workdir } = await createDirectories({ repository: type, buildId: id });
 | 
							const { workdir } = await createDirectories({ repository: type, buildId: id });
 | 
				
			||||||
		const image = getServiceImage(type);
 | 
							const image = getServiceImage(type);
 | 
				
			||||||
		const domain = getDomain(fqdn);
 | 
							const domain = getDomain(fqdn);
 | 
				
			||||||
 | 
							const isHttps = fqdn.startsWith('https://');
 | 
				
			||||||
		const config = {
 | 
							const config = {
 | 
				
			||||||
			ghost: {
 | 
								ghost: {
 | 
				
			||||||
				image: `${image}:${version}`,
 | 
									image: `${image}:${version}`,
 | 
				
			||||||
				volume: `${id}-ghost:/bitnami/ghost`,
 | 
									volume: `${id}-ghost:/bitnami/ghost`,
 | 
				
			||||||
				environmentVariables: {
 | 
									environmentVariables: {
 | 
				
			||||||
 | 
										url: fqdn,
 | 
				
			||||||
					GHOST_HOST: domain,
 | 
										GHOST_HOST: domain,
 | 
				
			||||||
 | 
										GHOST_ENABLE_HTTPS: isHttps ? 'yes' : 'no',
 | 
				
			||||||
					GHOST_EMAIL: defaultEmail,
 | 
										GHOST_EMAIL: defaultEmail,
 | 
				
			||||||
					GHOST_PASSWORD: defaultPassword,
 | 
										GHOST_PASSWORD: defaultPassword,
 | 
				
			||||||
					GHOST_DATABASE_HOST: `${id}-mariadb`,
 | 
										GHOST_DATABASE_HOST: `${id}-mariadb`,
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user