feat: Custom script path for Plausible
This commit is contained in:
parent
1f087cc29a
commit
24c655d7ef
@ -0,0 +1,24 @@
|
|||||||
|
-- RedefineTables
|
||||||
|
PRAGMA foreign_keys=OFF;
|
||||||
|
CREATE TABLE "new_PlausibleAnalytics" (
|
||||||
|
"id" TEXT NOT NULL PRIMARY KEY,
|
||||||
|
"email" TEXT,
|
||||||
|
"username" TEXT,
|
||||||
|
"password" TEXT NOT NULL,
|
||||||
|
"postgresqlUser" TEXT NOT NULL,
|
||||||
|
"postgresqlPassword" TEXT NOT NULL,
|
||||||
|
"postgresqlDatabase" TEXT NOT NULL,
|
||||||
|
"postgresqlPublicPort" INTEGER,
|
||||||
|
"secretKeyBase" TEXT,
|
||||||
|
"scriptName" TEXT NOT NULL DEFAULT 'plausible.js',
|
||||||
|
"serviceId" TEXT NOT NULL,
|
||||||
|
"createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
"updatedAt" DATETIME NOT NULL,
|
||||||
|
CONSTRAINT "PlausibleAnalytics_serviceId_fkey" FOREIGN KEY ("serviceId") REFERENCES "Service" ("id") ON DELETE RESTRICT ON UPDATE CASCADE
|
||||||
|
);
|
||||||
|
INSERT INTO "new_PlausibleAnalytics" ("createdAt", "email", "id", "password", "postgresqlDatabase", "postgresqlPassword", "postgresqlPublicPort", "postgresqlUser", "secretKeyBase", "serviceId", "updatedAt", "username") SELECT "createdAt", "email", "id", "password", "postgresqlDatabase", "postgresqlPassword", "postgresqlPublicPort", "postgresqlUser", "secretKeyBase", "serviceId", "updatedAt", "username" FROM "PlausibleAnalytics";
|
||||||
|
DROP TABLE "PlausibleAnalytics";
|
||||||
|
ALTER TABLE "new_PlausibleAnalytics" RENAME TO "PlausibleAnalytics";
|
||||||
|
CREATE UNIQUE INDEX "PlausibleAnalytics_serviceId_key" ON "PlausibleAnalytics"("serviceId");
|
||||||
|
PRAGMA foreign_key_check;
|
||||||
|
PRAGMA foreign_keys=ON;
|
@ -322,6 +322,7 @@ model PlausibleAnalytics {
|
|||||||
postgresqlDatabase String
|
postgresqlDatabase String
|
||||||
postgresqlPublicPort Int?
|
postgresqlPublicPort Int?
|
||||||
secretKeyBase String?
|
secretKeyBase String?
|
||||||
|
scriptName String @default("plausible.js")
|
||||||
serviceId String @unique
|
serviceId String @unique
|
||||||
service Service @relation(fields: [serviceId], references: [id])
|
service Service @relation(fields: [serviceId], references: [id])
|
||||||
createdAt DateTime @default(now())
|
createdAt DateTime @default(now())
|
||||||
|
@ -329,7 +329,8 @@ export async function updatePlausibleAnalyticsService({
|
|||||||
email,
|
email,
|
||||||
exposePort,
|
exposePort,
|
||||||
username,
|
username,
|
||||||
name
|
name,
|
||||||
|
scriptName
|
||||||
}: {
|
}: {
|
||||||
id: string;
|
id: string;
|
||||||
fqdn: string;
|
fqdn: string;
|
||||||
@ -337,8 +338,12 @@ export async function updatePlausibleAnalyticsService({
|
|||||||
name: string;
|
name: string;
|
||||||
email: string;
|
email: string;
|
||||||
username: string;
|
username: string;
|
||||||
|
scriptName: string;
|
||||||
}): Promise<void> {
|
}): 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 } });
|
await prisma.service.update({ where: { id }, data: { name, fqdn, exposePort } });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -55,6 +55,9 @@ frontend http
|
|||||||
http-request redirect location {{{redirectValue}}} code ${
|
http-request redirect location {{{redirectValue}}} code ${
|
||||||
dev ? 302 : 301
|
dev ? 302 : 301
|
||||||
} if { req.hdr(host) -i {{redirectTo}} }
|
} 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}}
|
{{/services}}
|
||||||
|
|
||||||
{{#coolify}}
|
{{#coolify}}
|
||||||
@ -218,7 +221,15 @@ export async function configureHAProxy(): Promise<void> {
|
|||||||
const services = await listServicesWithIncludes();
|
const services = await listServicesWithIncludes();
|
||||||
|
|
||||||
for (const service of services) {
|
for (const service of services) {
|
||||||
const { fqdn, id, type, destinationDocker, destinationDockerId, updatedAt } = service;
|
const {
|
||||||
|
fqdn,
|
||||||
|
id,
|
||||||
|
type,
|
||||||
|
destinationDocker,
|
||||||
|
destinationDockerId,
|
||||||
|
updatedAt,
|
||||||
|
plausibleAnalytics
|
||||||
|
} = service;
|
||||||
if (destinationDockerId) {
|
if (destinationDockerId) {
|
||||||
const { engine } = destinationDocker;
|
const { engine } = destinationDocker;
|
||||||
const found = supportedServiceTypesAndVersions.find((a) => a.name === type);
|
const found = supportedServiceTypesAndVersions.find((a) => a.name === type);
|
||||||
@ -232,6 +243,12 @@ export async function configureHAProxy(): Promise<void> {
|
|||||||
const isWWW = fqdn.includes('www.');
|
const isWWW = fqdn.includes('www.');
|
||||||
const redirectValue = `${isHttps ? 'https://' : 'http://'}${domain}%[capture.req.uri]`;
|
const redirectValue = `${isHttps ? 'https://' : 'http://'}${domain}%[capture.req.uri]`;
|
||||||
if (isRunning) {
|
if (isRunning) {
|
||||||
|
// Plausible Analytics custom script
|
||||||
|
let scriptName = false;
|
||||||
|
if (type === 'plausibleanalytics' && plausibleAnalytics.scriptName !== 'plausible.js') {
|
||||||
|
scriptName = plausibleAnalytics.scriptName;
|
||||||
|
}
|
||||||
|
|
||||||
data.services.push({
|
data.services.push({
|
||||||
id,
|
id,
|
||||||
port,
|
port,
|
||||||
@ -241,7 +258,8 @@ export async function configureHAProxy(): Promise<void> {
|
|||||||
isHttps,
|
isHttps,
|
||||||
redirectValue,
|
redirectValue,
|
||||||
redirectTo: isWWW ? domain.replace('www.', '') : 'www.' + domain,
|
redirectTo: isWWW ? domain.replace('www.', '') : 'www.' + domain,
|
||||||
updatedAt: updatedAt.getTime()
|
updatedAt: updatedAt.getTime(),
|
||||||
|
scriptName
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,13 +1,32 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
|
import { session } from '$app/stores';
|
||||||
|
|
||||||
import CopyPasswordField from '$lib/components/CopyPasswordField.svelte';
|
import CopyPasswordField from '$lib/components/CopyPasswordField.svelte';
|
||||||
|
import Explainer from '$lib/components/Explainer.svelte';
|
||||||
import { t } from '$lib/translations';
|
import { t } from '$lib/translations';
|
||||||
export let service;
|
export let service;
|
||||||
export let readOnly;
|
export let readOnly;
|
||||||
|
export let isRunning;
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<div class="flex space-x-1 py-5 font-bold">
|
<div class="flex space-x-1 py-5 font-bold">
|
||||||
<div class="title">Plausible Analytics</div>
|
<div class="title">Plausible Analytics</div>
|
||||||
</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">
|
<div class="grid grid-cols-2 items-center px-10">
|
||||||
<label for="email">{$t('forms.email')}</label>
|
<label for="email">{$t('forms.email')}</label>
|
||||||
<input
|
<input
|
||||||
|
@ -188,7 +188,7 @@
|
|||||||
{/if}
|
{/if}
|
||||||
|
|
||||||
{#if service.type === 'plausibleanalytics'}
|
{#if service.type === 'plausibleanalytics'}
|
||||||
<PlausibleAnalytics bind:service {readOnly} />
|
<PlausibleAnalytics bind:service {isRunning} {readOnly} />
|
||||||
{:else if service.type === 'minio'}
|
{:else if service.type === 'minio'}
|
||||||
<MinIo {service} />
|
<MinIo {service} />
|
||||||
{:else if service.type === 'vscodeserver'}
|
{:else if service.type === 'vscodeserver'}
|
||||||
|
@ -12,15 +12,28 @@ export const post: RequestHandler = async (event) => {
|
|||||||
name,
|
name,
|
||||||
fqdn,
|
fqdn,
|
||||||
exposePort,
|
exposePort,
|
||||||
plausibleAnalytics: { email, username }
|
plausibleAnalytics: { email, username, scriptName }
|
||||||
} = await event.request.json();
|
} = await event.request.json();
|
||||||
|
|
||||||
if (fqdn) fqdn = fqdn.toLowerCase();
|
if (fqdn) fqdn = fqdn.toLowerCase();
|
||||||
if (email) email = email.toLowerCase();
|
if (email) email = email.toLowerCase();
|
||||||
if (exposePort) exposePort = Number(exposePort);
|
if (exposePort) exposePort = Number(exposePort);
|
||||||
|
if (scriptName) {
|
||||||
|
scriptName = scriptName.toLowerCase();
|
||||||
|
if (scriptName.startsWith('/')) {
|
||||||
|
scriptName = scriptName.replaceAll(/\//gi, '');
|
||||||
|
}
|
||||||
|
}
|
||||||
try {
|
try {
|
||||||
await db.updatePlausibleAnalyticsService({ id, fqdn, name, email, username, exposePort });
|
await db.updatePlausibleAnalyticsService({
|
||||||
|
id,
|
||||||
|
fqdn,
|
||||||
|
name,
|
||||||
|
email,
|
||||||
|
username,
|
||||||
|
exposePort,
|
||||||
|
scriptName
|
||||||
|
});
|
||||||
return { status: 201 };
|
return { status: 201 };
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
return ErrorHandler(error);
|
return ErrorHandler(error);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user