feat: Custom script path for Plausible
This commit is contained in:
		| @@ -329,7 +329,8 @@ export async function updatePlausibleAnalyticsService({ | ||||
| 	email, | ||||
| 	exposePort, | ||||
| 	username, | ||||
| 	name | ||||
| 	name, | ||||
| 	scriptName | ||||
| }: { | ||||
| 	id: string; | ||||
| 	fqdn: string; | ||||
| @@ -337,8 +338,12 @@ export async function updatePlausibleAnalyticsService({ | ||||
| 	name: string; | ||||
| 	email: string; | ||||
| 	username: string; | ||||
| 	scriptName: string; | ||||
| }): Promise<void> { | ||||
| 	await prisma.plausibleAnalytics.update({ where: { serviceId: id }, data: { email, username } }); | ||||
| 	await prisma.plausibleAnalytics.update({ | ||||
| 		where: { serviceId: id }, | ||||
| 		data: { email, username, scriptName } | ||||
| 	}); | ||||
| 	await prisma.service.update({ where: { id }, data: { name, fqdn, exposePort } }); | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -55,6 +55,9 @@ frontend http | ||||
|   http-request redirect location {{{redirectValue}}} code ${ | ||||
| 		dev ? 302 : 301 | ||||
| 	} if { req.hdr(host) -i {{redirectTo}} } | ||||
|   {{#scriptName}} | ||||
|     http-request set-path /js/plausible.js if { hdr(host) -i {{domain}} } { path_beg -i /js/{{scriptName}} } | ||||
|   {{/scriptName}} | ||||
|   {{/services}} | ||||
|  | ||||
|   {{#coolify}} | ||||
| @@ -218,7 +221,15 @@ export async function configureHAProxy(): Promise<void> { | ||||
| 	const services = await listServicesWithIncludes(); | ||||
|  | ||||
| 	for (const service of services) { | ||||
| 		const { fqdn, id, type, destinationDocker, destinationDockerId, updatedAt } = service; | ||||
| 		const { | ||||
| 			fqdn, | ||||
| 			id, | ||||
| 			type, | ||||
| 			destinationDocker, | ||||
| 			destinationDockerId, | ||||
| 			updatedAt, | ||||
| 			plausibleAnalytics | ||||
| 		} = service; | ||||
| 		if (destinationDockerId) { | ||||
| 			const { engine } = destinationDocker; | ||||
| 			const found = supportedServiceTypesAndVersions.find((a) => a.name === type); | ||||
| @@ -232,6 +243,12 @@ export async function configureHAProxy(): Promise<void> { | ||||
| 					const isWWW = fqdn.includes('www.'); | ||||
| 					const redirectValue = `${isHttps ? 'https://' : 'http://'}${domain}%[capture.req.uri]`; | ||||
| 					if (isRunning) { | ||||
| 						// Plausible Analytics custom script | ||||
| 						let scriptName = false; | ||||
| 						if (type === 'plausibleanalytics' && plausibleAnalytics.scriptName !== 'plausible.js') { | ||||
| 							scriptName = plausibleAnalytics.scriptName; | ||||
| 						} | ||||
|  | ||||
| 						data.services.push({ | ||||
| 							id, | ||||
| 							port, | ||||
| @@ -241,7 +258,8 @@ export async function configureHAProxy(): Promise<void> { | ||||
| 							isHttps, | ||||
| 							redirectValue, | ||||
| 							redirectTo: isWWW ? domain.replace('www.', '') : 'www.' + domain, | ||||
| 							updatedAt: updatedAt.getTime() | ||||
| 							updatedAt: updatedAt.getTime(), | ||||
| 							scriptName | ||||
| 						}); | ||||
| 					} | ||||
| 				} | ||||
|   | ||||
| @@ -1,13 +1,32 @@ | ||||
| <script lang="ts"> | ||||
| 	import { session } from '$app/stores'; | ||||
|  | ||||
| 	import CopyPasswordField from '$lib/components/CopyPasswordField.svelte'; | ||||
| 	import Explainer from '$lib/components/Explainer.svelte'; | ||||
| 	import { t } from '$lib/translations'; | ||||
| 	export let service; | ||||
| 	export let readOnly; | ||||
| 	export let isRunning; | ||||
| </script> | ||||
|  | ||||
| <div class="flex space-x-1 py-5 font-bold"> | ||||
| 	<div class="title">Plausible Analytics</div> | ||||
| </div> | ||||
| <div class="grid grid-cols-2 items-center px-10"> | ||||
| 	<label for="scriptName">Script Name</label> | ||||
| 	<input | ||||
| 		name="scriptName" | ||||
| 		id="scriptName" | ||||
| 		readonly={!$session.isAdmin && !isRunning} | ||||
| 		disabled={!$session.isAdmin || isRunning} | ||||
| 		placeholder="plausible.js" | ||||
| 		bind:value={service.plausibleAnalytics.scriptName} | ||||
| 		required | ||||
| 	/> | ||||
| 	<Explainer | ||||
| 		text="Useful if you would like to rename the collector script to prevent it blocked by AdBlockers." | ||||
| 	/> | ||||
| </div> | ||||
| <div class="grid grid-cols-2 items-center px-10"> | ||||
| 	<label for="email">{$t('forms.email')}</label> | ||||
| 	<input | ||||
|   | ||||
| @@ -188,7 +188,7 @@ | ||||
| 			{/if} | ||||
|  | ||||
| 			{#if service.type === 'plausibleanalytics'} | ||||
| 				<PlausibleAnalytics bind:service {readOnly} /> | ||||
| 				<PlausibleAnalytics bind:service {isRunning} {readOnly} /> | ||||
| 			{:else if service.type === 'minio'} | ||||
| 				<MinIo {service} /> | ||||
| 			{:else if service.type === 'vscodeserver'} | ||||
|   | ||||
| @@ -12,15 +12,28 @@ export const post: RequestHandler = async (event) => { | ||||
| 		name, | ||||
| 		fqdn, | ||||
| 		exposePort, | ||||
| 		plausibleAnalytics: { email, username } | ||||
| 		plausibleAnalytics: { email, username, scriptName } | ||||
| 	} = await event.request.json(); | ||||
|  | ||||
| 	if (fqdn) fqdn = fqdn.toLowerCase(); | ||||
| 	if (email) email = email.toLowerCase(); | ||||
| 	if (exposePort) exposePort = Number(exposePort); | ||||
|  | ||||
| 	if (scriptName) { | ||||
| 		scriptName = scriptName.toLowerCase(); | ||||
| 		if (scriptName.startsWith('/')) { | ||||
| 			scriptName = scriptName.replaceAll(/\//gi, ''); | ||||
| 		} | ||||
| 	} | ||||
| 	try { | ||||
| 		await db.updatePlausibleAnalyticsService({ id, fqdn, name, email, username, exposePort }); | ||||
| 		await db.updatePlausibleAnalyticsService({ | ||||
| 			id, | ||||
| 			fqdn, | ||||
| 			name, | ||||
| 			email, | ||||
| 			username, | ||||
| 			exposePort, | ||||
| 			scriptName | ||||
| 		}); | ||||
| 		return { status: 201 }; | ||||
| 	} catch (error) { | ||||
| 		return ErrorHandler(error); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Andras Bacsai
					Andras Bacsai