Merge branch 'canary' into feat/better-auth-2

This commit is contained in:
Mauricio Siu
2025-02-25 23:05:57 -06:00
21 changed files with 479 additions and 62 deletions

View File

@@ -1,38 +1,38 @@
import {
type DomainSchema,
type Schema,
type Template,
generateRandomDomain,
type DomainSchema,
type Schema,
type Template,
generateRandomDomain,
} from "../utils";
export function generate(schema: Schema): Template {
const dashboardDomain = generateRandomDomain(schema);
const backendDomain = generateRandomDomain(schema);
const actionsDomain = generateRandomDomain(schema);
const dashboardDomain = generateRandomDomain(schema);
const backendDomain = generateRandomDomain(schema);
const actionsDomain = generateRandomDomain(schema);
const domains: DomainSchema[] = [
{
host: dashboardDomain,
port: 6791,
serviceName: "dashboard",
},
{
host: backendDomain,
port: 3210,
serviceName: "backend",
},
{
host: actionsDomain,
port: 3211,
serviceName: "backend",
},
];
const domains: DomainSchema[] = [
{
host: dashboardDomain,
port: 6791,
serviceName: "dashboard",
},
{
host: backendDomain,
port: 3210,
serviceName: "backend",
},
{
host: actionsDomain,
port: 3211,
serviceName: "backend",
},
];
const envs = [
`NEXT_PUBLIC_DEPLOYMENT_URL=http://${backendDomain}`,
`CONVEX_CLOUD_ORIGIN=http://${backendDomain}`,
`CONVEX_SITE_ORIGIN=http://${actionsDomain}`,
];
const envs = [
`NEXT_PUBLIC_DEPLOYMENT_URL=http://${backendDomain}`,
`CONVEX_CLOUD_ORIGIN=http://${backendDomain}`,
`CONVEX_SITE_ORIGIN=http://${actionsDomain}`,
];
return { envs, domains };
return { envs, domains };
}

View File

@@ -2,7 +2,10 @@ services:
glance:
image: glanceapp/glance
volumes:
- ../files/app/glance.yml:/app/glance.yml
- ../files/app/config/:/app/config
- ../files/app/assets:/app/assets
# Optionally, also mount docker socket if you want to use the docker containers widget
# - /var/run/docker.sock:/var/run/docker.sock:ro
ports:
- 8080
restart: unless-stopped
env_file: .env

View File

@@ -17,7 +17,7 @@ export function generate(schema: Schema): Template {
const mounts: Template["mounts"] = [
{
filePath: "/app/glance.yml",
filePath: "/app/config/glance.yml",
content: `
branding:
hide-footer: true

View File

@@ -0,0 +1,40 @@
services:
linkwarden:
environment:
- NEXTAUTH_SECRET
- NEXTAUTH_URL
- DATABASE_URL=postgresql://linkwarden:${POSTGRES_PASSWORD}@postgres:5432/linkwarden
restart: unless-stopped
image: ghcr.io/linkwarden/linkwarden:v2.9.3
ports:
- 3000
volumes:
- linkwarden-data:/data/data
depends_on:
- postgres
healthcheck:
test: curl --fail http://localhost:3000 || exit 1
interval: 60s
retries: 2
start_period: 60s
timeout: 15s
postgres:
image: postgres:17-alpine
restart: unless-stopped
user: postgres
environment:
POSTGRES_USER: linkwarden
POSTGRES_DB: linkwarden
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
volumes:
- postgres-data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready"]
interval: 10s
timeout: 5s
retries: 5
volumes:
linkwarden-data:
postgres-data:

View File

@@ -0,0 +1,33 @@
import {
type DomainSchema,
type Schema,
type Template,
generateBase64,
generatePassword,
generateRandomDomain,
} from "../utils";
export function generate(schema: Schema): Template {
const mainDomain = generateRandomDomain(schema);
const postgresPassword = generatePassword();
const nextSecret = generateBase64(32);
const domains: DomainSchema[] = [
{
host: mainDomain,
port: 3000,
serviceName: "linkwarden",
},
];
const envs = [
`POSTGRES_PASSWORD=${postgresPassword}`,
`NEXTAUTH_SECRET=${nextSecret}`,
`NEXTAUTH_URL=http://${mainDomain}/api/v1/auth`,
];
return {
domains,
envs,
};
}

View File

@@ -0,0 +1,25 @@
services:
mailpit:
image: axllent/mailpit:v1.22.3
restart: unless-stopped
ports:
- '1025:1025'
volumes:
- 'mailpit-data:/data'
environment:
- MP_SMTP_AUTH_ALLOW_INSECURE=true
- MP_MAX_MESSAGES=5000
- MP_DATABASE=/data/mailpit.db
- MP_UI_AUTH=${MP_UI_AUTH}
- MP_SMTP_AUTH=${MP_SMTP_AUTH}
healthcheck:
test:
- CMD
- /mailpit
- readyz
interval: 5s
timeout: 20s
retries: 10
volumes:
mailpit-data:

View File

@@ -0,0 +1,31 @@
import {
type DomainSchema,
type Schema,
type Template,
generateBase64,
generatePassword,
generateRandomDomain,
} from "../utils";
export function generate(schema: Schema): Template {
const domains: DomainSchema[] = [
{
host: generateRandomDomain(schema),
port: 8025,
serviceName: "mailpit",
},
];
const defaultPassword = generatePassword();
const envs = [
"# Uncomment below if you want basic auth on UI and SMTP",
`#MP_UI_AUTH=mailpit:${defaultPassword}`,
`#MP_SMTP_AUTH=mailpit:${defaultPassword}`,
];
return {
domains,
envs,
};
}

View File

@@ -0,0 +1,21 @@
services:
pocket-id:
image: ghcr.io/pocket-id/pocket-id:v0.35.1
restart: unless-stopped
environment:
- PUBLIC_UI_CONFIG_DISABLED
- PUBLIC_APP_URL
- TRUST_PROXY
ports:
- 80
volumes:
- pocket-id-data:/app/backend/data
healthcheck:
test: "curl -f http://localhost/health"
interval: 1m30s
timeout: 5s
retries: 2
start_period: 10s
volumes:
pocket-id-data:

View File

@@ -0,0 +1,29 @@
import {
type DomainSchema,
type Schema,
type Template,
generateRandomDomain,
} from "../utils";
export function generate(schema: Schema): Template {
const mainDomain = generateRandomDomain(schema);
const domains: DomainSchema[] = [
{
host: mainDomain,
port: 80,
serviceName: "pocket-id",
},
];
const envs = [
"PUBLIC_UI_CONFIG_DISABLED=false",
`PUBLIC_APP_URL=http://${mainDomain}`,
"TRUST_PROXY=true",
];
return {
domains,
envs,
};
}

View File

@@ -25,8 +25,8 @@ export const templates: TemplateData[] = [
"Outline is a self-hosted knowledge base and documentation platform that allows you to build and manage your own knowledge base applications.",
links: {
github: "https://github.com/outline/outline",
website: "https://outline.com/",
docs: "https://docs.outline.com/",
website: "https://getoutline.com/",
docs: "https://docs.getoutline.com/s/guide",
},
logo: "outline.png",
load: () => import("./outline/index").then((m) => m.generate),
@@ -393,6 +393,21 @@ export const templates: TemplateData[] = [
tags: ["chat"],
load: () => import("./open-webui/index").then((m) => m.generate),
},
{
id: "mailpit",
name: "Mailpit",
version: "v1.22.3",
description:
"Mailpit is a tiny, self-contained, and secure email & SMTP testing tool with API for developers.",
logo: "mailpit.svg",
links: {
github: "https://github.com/axllent/mailpit",
website: "https://mailpit.axllent.org/",
docs: "https://mailpit.axllent.org/docs/",
},
tags: ["email", "smtp"],
load: () => import("./mailpit/index").then((m) => m.generate),
},
{
id: "listmonk",
name: "Listmonk",
@@ -426,7 +441,7 @@ export const templates: TemplateData[] = [
{
id: "umami",
name: "Umami",
version: "v2.14.0",
version: "v2.16.1",
description:
"Umami is a simple, fast, privacy-focused alternative to Google Analytics.",
logo: "umami.png",
@@ -662,6 +677,21 @@ export const templates: TemplateData[] = [
tags: ["open-source"],
load: () => import("./vaultwarden/index").then((m) => m.generate),
},
{
id: "linkwarden",
name: "Linkwarden",
version: "2.9.3",
description:
"Self-hosted, open-source collaborative bookmark manager to collect, organize and archive webpages.",
logo: "linkwarden.png",
links: {
github: "https://github.com/linkwarden/linkwarden",
website: "https://linkwarden.app/",
docs: "https://docs.linkwarden.app/",
},
tags: ["bookmarks", "link-sharing"],
load: () => import("./linkwarden/index").then((m) => m.generate),
},
{
id: "hi-events",
name: "Hi.events",
@@ -1093,6 +1123,21 @@ export const templates: TemplateData[] = [
tags: ["identity", "auth"],
load: () => import("./logto/index").then((m) => m.generate),
},
{
id: "pocket-id",
name: "Pocket ID",
version: "0.35.1",
description:
"A simple and easy-to-use OIDC provider that allows users to authenticate with their passkeys to your services.",
logo: "pocket-id.svg",
links: {
github: "https://github.com/pocket-id/pocket-id",
website: "https://pocket-id.org/",
docs: "https://pocket-id.org/docs",
},
tags: ["identity", "auth"],
load: () => import("./pocket-id/index").then((m) => m.generate),
},
{
id: "penpot",
name: "Penpot",
@@ -1559,4 +1604,18 @@ export const templates: TemplateData[] = [
tags: ["backend", "database", "api"],
load: () => import("./convex/index").then((m) => m.generate),
},
{
id: "wikijs",
name: "Wiki.js",
version: "2.5",
description: "The most powerful and extensible open source Wiki software.",
logo: "wikijs.svg",
links: {
github: "https://github.com/requarks/wiki",
website: "https://js.wiki/",
docs: "https://docs.requarks.io/",
},
tags: ["knowledge-base", "self-hosted", "documentation"],
load: () => import("./wikijs/index").then((m) => m.generate),
},
];

View File

@@ -1,6 +1,6 @@
services:
umami:
image: ghcr.io/umami-software/umami:postgresql-v2.14.0
image: ghcr.io/umami-software/umami:postgresql-v2.16.1
restart: always
healthcheck:
test: ["CMD-SHELL", "curl http://localhost:3000/api/heartbeat"]

View File

@@ -0,0 +1,31 @@
version: '3.5'
services:
wiki:
image: ghcr.io/requarks/wiki:2.5
restart: unless-stopped
environment:
- DB_TYPE
- DB_HOST
- DB_PORT
- DB_USER
- DB_PASS
- DB_NAME
depends_on:
- db
labels:
- traefik.enable=true
- traefik.constraint-label-stack=wikijs
db:
image: postgres:14
restart: unless-stopped
environment:
- POSTGRES_USER
- POSTGRES_PASSWORD
- POSTGRES_DB
volumes:
- wiki-db-data:/var/lib/postgresql/data
networks:
dokploy-network:
external: true
volumes:
wiki-db-data:

View File

@@ -0,0 +1,35 @@
import {
type DomainSchema,
type Schema,
type Template,
generateRandomDomain,
} from "../utils";
export function generate(schema: Schema): Template {
const domains: DomainSchema[] = [
{
host: generateRandomDomain(schema),
port: 3000,
serviceName: "wiki",
},
];
const envs = [
"# Database Setup",
"POSTGRES_USER=wikijs",
"POSTGRES_PASSWORD=wikijsrocks",
"POSTGRES_DB=wiki",
"# WikiJS Database Connection",
"DB_TYPE=postgres",
"DB_HOST=db",
"DB_PORT=5432",
"DB_USER=wikijs",
"DB_PASS=wikijsrocks",
"DB_NAME=wiki",
];
return {
domains,
envs,
};
}