feat: doocs
This commit is contained in:
13
Projects/kompose/docs/.editorconfig
Executable file
13
Projects/kompose/docs/.editorconfig
Executable file
@@ -0,0 +1,13 @@
|
|||||||
|
# editorconfig.org
|
||||||
|
root = true
|
||||||
|
|
||||||
|
[*]
|
||||||
|
indent_size = 2
|
||||||
|
indent_style = space
|
||||||
|
end_of_line = lf
|
||||||
|
charset = utf-8
|
||||||
|
trim_trailing_whitespace = true
|
||||||
|
insert_final_newline = true
|
||||||
|
|
||||||
|
[*.md]
|
||||||
|
trim_trailing_whitespace = false
|
||||||
2
Projects/kompose/docs/.env.example
Normal file
2
Projects/kompose/docs/.env.example
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
# Public URL, used for OG Image when running nuxt generate
|
||||||
|
NUXT_PUBLIC_SITE_URL=
|
||||||
3
Projects/kompose/docs/.gitignore
vendored
3
Projects/kompose/docs/.gitignore
vendored
@@ -22,3 +22,6 @@ logs
|
|||||||
.env
|
.env
|
||||||
.env.*
|
.env.*
|
||||||
!.env.example
|
!.env.example
|
||||||
|
|
||||||
|
# VSC
|
||||||
|
.history
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
hoist=true
|
shamefully-hoist=true
|
||||||
|
|||||||
@@ -1,23 +1,36 @@
|
|||||||
# Nuxt Minimal Starter
|
# Nuxt Docs Template
|
||||||
|
|
||||||
Look at the [Nuxt documentation](https://nuxt.com/docs/getting-started/introduction) to learn more.
|
[](https://ui.nuxt.com)
|
||||||
|
|
||||||
|
Use this template to build your own documentation with [Nuxt UI](https://ui.nuxt.com) quickly.
|
||||||
|
|
||||||
|
- [Live demo](https://docs-template.nuxt.dev/)
|
||||||
|
- [Documentation](https://ui.nuxt.com/docs/getting-started/installation)
|
||||||
|
|
||||||
|
<a href="https://docs-template.nuxt.dev/" target="_blank">
|
||||||
|
<picture>
|
||||||
|
<source media="(prefers-color-scheme: dark)" srcset="https://ui.nuxt.com/assets/templates/nuxt/docs-dark.png">
|
||||||
|
<source media="(prefers-color-scheme: light)" srcset="https://ui.nuxt.com/assets/templates/nuxt/docs-light.png">
|
||||||
|
<img alt="Nuxt Docs Template" src="https://ui.nuxt.com/assets/templates/nuxt/docs-light.png">
|
||||||
|
</picture>
|
||||||
|
</a>
|
||||||
|
|
||||||
|
## Quick Start
|
||||||
|
|
||||||
|
```bash [Terminal]
|
||||||
|
npm create nuxt@latest -- -t github:nuxt-ui-templates/docs
|
||||||
|
```
|
||||||
|
|
||||||
|
## Deploy your own
|
||||||
|
|
||||||
|
[](https://vercel.com/new/clone?repository-name=docs&repository-url=https%3A%2F%2Fgithub.com%2Fnuxt-ui-templates%2Fdocs&demo-image=https%3A%2F%2Fui.nuxt.com%2Fassets%2Ftemplates%2Fnuxt%2Fdocs-dark.png&demo-url=https%3A%2F%2Fdocs-template.nuxt.dev%2F&demo-title=Nuxt%20Docs%20Template&demo-description=A%20documentation%20template%20powered%20by%20Nuxt%20Content.)
|
||||||
|
|
||||||
## Setup
|
## Setup
|
||||||
|
|
||||||
Make sure to install dependencies:
|
Make sure to install the dependencies:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# npm
|
|
||||||
npm install
|
|
||||||
|
|
||||||
# pnpm
|
|
||||||
pnpm install
|
pnpm install
|
||||||
|
|
||||||
# yarn
|
|
||||||
yarn install
|
|
||||||
|
|
||||||
# bun
|
|
||||||
bun install
|
|
||||||
```
|
```
|
||||||
|
|
||||||
## Development Server
|
## Development Server
|
||||||
@@ -25,17 +38,7 @@ bun install
|
|||||||
Start the development server on `http://localhost:3000`:
|
Start the development server on `http://localhost:3000`:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# npm
|
|
||||||
npm run dev
|
|
||||||
|
|
||||||
# pnpm
|
|
||||||
pnpm dev
|
pnpm dev
|
||||||
|
|
||||||
# yarn
|
|
||||||
yarn dev
|
|
||||||
|
|
||||||
# bun
|
|
||||||
bun run dev
|
|
||||||
```
|
```
|
||||||
|
|
||||||
## Production
|
## Production
|
||||||
@@ -43,33 +46,17 @@ bun run dev
|
|||||||
Build the application for production:
|
Build the application for production:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# npm
|
|
||||||
npm run build
|
|
||||||
|
|
||||||
# pnpm
|
|
||||||
pnpm build
|
pnpm build
|
||||||
|
|
||||||
# yarn
|
|
||||||
yarn build
|
|
||||||
|
|
||||||
# bun
|
|
||||||
bun run build
|
|
||||||
```
|
```
|
||||||
|
|
||||||
Locally preview production build:
|
Locally preview production build:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# npm
|
|
||||||
npm run preview
|
|
||||||
|
|
||||||
# pnpm
|
|
||||||
pnpm preview
|
pnpm preview
|
||||||
|
|
||||||
# yarn
|
|
||||||
yarn preview
|
|
||||||
|
|
||||||
# bun
|
|
||||||
bun run preview
|
|
||||||
```
|
```
|
||||||
|
|
||||||
Check out the [deployment documentation](https://nuxt.com/docs/getting-started/deployment) for more information.
|
Check out the [deployment documentation](https://nuxt.com/docs/getting-started/deployment) for more information.
|
||||||
|
|
||||||
|
## Renovate integration
|
||||||
|
|
||||||
|
Install [Renovate GitHub app](https://github.com/apps/renovate/installations/select_target) on your repository and you are good to go.
|
||||||
|
|||||||
73
Projects/kompose/docs/app/app.config.ts
Normal file
73
Projects/kompose/docs/app/app.config.ts
Normal file
@@ -0,0 +1,73 @@
|
|||||||
|
export default defineAppConfig({
|
||||||
|
ui: {
|
||||||
|
colors: {
|
||||||
|
primary: 'emerald',
|
||||||
|
secondary: 'fuchsia',
|
||||||
|
neutral: 'zinc'
|
||||||
|
},
|
||||||
|
footer: {
|
||||||
|
slots: {
|
||||||
|
root: 'border-t border-default',
|
||||||
|
left: 'text-sm text-muted'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
seo: {
|
||||||
|
siteName: 'Kompose'
|
||||||
|
},
|
||||||
|
header: {
|
||||||
|
title: '',
|
||||||
|
to: '/',
|
||||||
|
logo: {
|
||||||
|
alt: '',
|
||||||
|
light: '',
|
||||||
|
dark: ''
|
||||||
|
},
|
||||||
|
search: true,
|
||||||
|
colorMode: true,
|
||||||
|
links: [{
|
||||||
|
'icon': 'i-simple-icons-github',
|
||||||
|
'to': 'https://github.com/nuxt-ui-templates/docs',
|
||||||
|
'target': '_blank',
|
||||||
|
'aria-label': 'GitHub'
|
||||||
|
}]
|
||||||
|
},
|
||||||
|
footer: {
|
||||||
|
credits: `Built with Nuxt UI • © ${new Date().getFullYear()}`,
|
||||||
|
colorMode: false,
|
||||||
|
links: [{
|
||||||
|
'icon': 'i-simple-icons-discord',
|
||||||
|
'to': 'https://go.nuxt.com/discord',
|
||||||
|
'target': '_blank',
|
||||||
|
'aria-label': 'Nuxt on Discord'
|
||||||
|
}, {
|
||||||
|
'icon': 'i-simple-icons-x',
|
||||||
|
'to': 'https://go.nuxt.com/x',
|
||||||
|
'target': '_blank',
|
||||||
|
'aria-label': 'Nuxt on X'
|
||||||
|
}, {
|
||||||
|
'icon': 'i-simple-icons-github',
|
||||||
|
'to': 'https://github.com/nuxt/ui',
|
||||||
|
'target': '_blank',
|
||||||
|
'aria-label': 'Nuxt UI on GitHub'
|
||||||
|
}]
|
||||||
|
},
|
||||||
|
toc: {
|
||||||
|
title: 'Table of Contents',
|
||||||
|
bottom: {
|
||||||
|
title: 'Community',
|
||||||
|
edit: 'https://github.com/nuxt-ui-templates/docs/edit/main/content',
|
||||||
|
links: [{
|
||||||
|
icon: 'i-lucide-star',
|
||||||
|
label: 'Star on GitHub',
|
||||||
|
to: 'https://github.com/nuxt/ui',
|
||||||
|
target: '_blank'
|
||||||
|
}, {
|
||||||
|
icon: 'i-lucide-book-open',
|
||||||
|
label: 'Nuxt UI docs',
|
||||||
|
to: 'https://ui.nuxt.com/docs/getting-started/installation/nuxt',
|
||||||
|
target: '_blank'
|
||||||
|
}]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
@@ -1,6 +1,51 @@
|
|||||||
|
<script setup lang="ts">
|
||||||
|
const { seo } = useAppConfig()
|
||||||
|
|
||||||
|
const { data: navigation } = await useAsyncData('navigation', () => queryCollectionNavigation('docs'))
|
||||||
|
const { data: files } = useLazyAsyncData('search', () => queryCollectionSearchSections('docs'), {
|
||||||
|
server: false
|
||||||
|
})
|
||||||
|
|
||||||
|
useHead({
|
||||||
|
meta: [
|
||||||
|
{ name: 'viewport', content: 'width=device-width, initial-scale=1' }
|
||||||
|
],
|
||||||
|
link: [
|
||||||
|
{ rel: 'icon', href: '/favicon.ico' }
|
||||||
|
],
|
||||||
|
htmlAttrs: {
|
||||||
|
lang: 'en'
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
useSeoMeta({
|
||||||
|
titleTemplate: `%s - ${seo?.siteName}`,
|
||||||
|
ogSiteName: seo?.siteName,
|
||||||
|
twitterCard: 'summary_large_image'
|
||||||
|
})
|
||||||
|
|
||||||
|
provide('navigation', navigation)
|
||||||
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<div>
|
<UApp>
|
||||||
<NuxtRouteAnnouncer />
|
<NuxtLoadingIndicator />
|
||||||
<NuxtWelcome />
|
|
||||||
</div>
|
<AppHeader />
|
||||||
|
|
||||||
|
<UMain>
|
||||||
|
<NuxtLayout>
|
||||||
|
<NuxtPage />
|
||||||
|
</NuxtLayout>
|
||||||
|
</UMain>
|
||||||
|
|
||||||
|
<AppFooter />
|
||||||
|
|
||||||
|
<ClientOnly>
|
||||||
|
<LazyUContentSearch
|
||||||
|
:files="files"
|
||||||
|
:navigation="navigation"
|
||||||
|
/>
|
||||||
|
</ClientOnly>
|
||||||
|
</UApp>
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
25
Projects/kompose/docs/app/assets/css/main.css
Normal file
25
Projects/kompose/docs/app/assets/css/main.css
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
@import "tailwindcss";
|
||||||
|
@import "@nuxt/ui";
|
||||||
|
|
||||||
|
@source "../../../content/**/*";
|
||||||
|
|
||||||
|
@theme static {
|
||||||
|
--container-8xl: 90rem;
|
||||||
|
--font-sans: 'Public Sans', sans-serif;
|
||||||
|
|
||||||
|
--color-green-50: #EFFDF5;
|
||||||
|
--color-green-100: #D9FBE8;
|
||||||
|
--color-green-200: #B3F5D1;
|
||||||
|
--color-green-300: #75EDAE;
|
||||||
|
--color-green-400: #00DC82;
|
||||||
|
--color-green-500: #00C16A;
|
||||||
|
--color-green-600: #00A155;
|
||||||
|
--color-green-700: #007F45;
|
||||||
|
--color-green-800: #016538;
|
||||||
|
--color-green-900: #0A5331;
|
||||||
|
--color-green-950: #052E16;
|
||||||
|
}
|
||||||
|
|
||||||
|
:root {
|
||||||
|
--ui-container: var(--container-8xl);
|
||||||
|
}
|
||||||
23
Projects/kompose/docs/app/components/AppFooter.vue
Normal file
23
Projects/kompose/docs/app/components/AppFooter.vue
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
<script setup lang="ts">
|
||||||
|
const { footer } = useAppConfig()
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<UFooter>
|
||||||
|
<template #left>
|
||||||
|
{{ footer.credits }}
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<template #right>
|
||||||
|
<UColorModeButton v-if="footer?.colorMode" />
|
||||||
|
|
||||||
|
<template v-if="footer?.links">
|
||||||
|
<UButton
|
||||||
|
v-for="(link, index) of footer?.links"
|
||||||
|
:key="index"
|
||||||
|
v-bind="{ color: 'neutral', variant: 'ghost', ...link }"
|
||||||
|
/>
|
||||||
|
</template>
|
||||||
|
</template>
|
||||||
|
</UFooter>
|
||||||
|
</template>
|
||||||
72
Projects/kompose/docs/app/components/AppHeader.vue
Normal file
72
Projects/kompose/docs/app/components/AppHeader.vue
Normal file
@@ -0,0 +1,72 @@
|
|||||||
|
<script setup lang="ts">
|
||||||
|
import type { ContentNavigationItem } from '@nuxt/content'
|
||||||
|
|
||||||
|
const navigation = inject<Ref<ContentNavigationItem[]>>('navigation')
|
||||||
|
|
||||||
|
const { header } = useAppConfig()
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<UHeader
|
||||||
|
:ui="{ center: 'flex-1' }"
|
||||||
|
:to="header?.to || '/'"
|
||||||
|
>
|
||||||
|
<UContentSearchButton
|
||||||
|
v-if="header?.search"
|
||||||
|
:collapsed="false"
|
||||||
|
class="w-full"
|
||||||
|
/>
|
||||||
|
|
||||||
|
<template
|
||||||
|
v-if="header?.logo?.dark || header?.logo?.light || header?.title"
|
||||||
|
#title
|
||||||
|
>
|
||||||
|
<UColorModeImage
|
||||||
|
v-if="header?.logo?.dark || header?.logo?.light"
|
||||||
|
:light="header?.logo?.light!"
|
||||||
|
:dark="header?.logo?.dark!"
|
||||||
|
:alt="header?.logo?.alt"
|
||||||
|
class="h-6 w-auto shrink-0"
|
||||||
|
/>
|
||||||
|
|
||||||
|
<span v-else-if="header?.title">
|
||||||
|
{{ header.title }}
|
||||||
|
</span>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<template
|
||||||
|
v-else
|
||||||
|
#left
|
||||||
|
>
|
||||||
|
<NuxtLink :to="header?.to || '/'">
|
||||||
|
<AppLogo class="w-auto h-6 shrink-0" />
|
||||||
|
</NuxtLink>
|
||||||
|
|
||||||
|
<TemplateMenu />
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<template #right>
|
||||||
|
<UContentSearchButton
|
||||||
|
v-if="header?.search"
|
||||||
|
class="lg:hidden"
|
||||||
|
/>
|
||||||
|
|
||||||
|
<UColorModeButton v-if="header?.colorMode" />
|
||||||
|
|
||||||
|
<template v-if="header?.links">
|
||||||
|
<UButton
|
||||||
|
v-for="(link, index) of header.links"
|
||||||
|
:key="index"
|
||||||
|
v-bind="{ color: 'neutral', variant: 'ghost', ...link }"
|
||||||
|
/>
|
||||||
|
</template>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<template #body>
|
||||||
|
<UContentNavigation
|
||||||
|
highlight
|
||||||
|
:navigation="navigation"
|
||||||
|
/>
|
||||||
|
</template>
|
||||||
|
</UHeader>
|
||||||
|
</template>
|
||||||
40
Projects/kompose/docs/app/components/AppLogo.vue
Normal file
40
Projects/kompose/docs/app/components/AppLogo.vue
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
<template>
|
||||||
|
<svg
|
||||||
|
width="1020"
|
||||||
|
height="200"
|
||||||
|
viewBox="0 0 1020 200"
|
||||||
|
fill="none"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
>
|
||||||
|
<path
|
||||||
|
d="M377 200C379.16 200 381 198.209 381 196V103C381 103 386 112 395 127L434 194C435.785 197.74 439.744 200 443 200H470V50H443C441.202 50 439 51.4941 439 54V148L421 116L385 55C383.248 51.8912 379.479 50 376 50H350V200H377Z"
|
||||||
|
fill="currentColor"
|
||||||
|
/>
|
||||||
|
<path
|
||||||
|
d="M726 92H739C742.314 92 745 89.3137 745 86V60H773V92H800V116H773V159C773 169.5 778.057 174 787 174H800V200H783C759.948 200 745 185.071 745 160V116H726V92Z"
|
||||||
|
fill="currentColor"
|
||||||
|
/>
|
||||||
|
<path
|
||||||
|
d="M591 92V154C591 168.004 585.742 179.809 578 188C570.258 196.191 559.566 200 545 200C530.434 200 518.742 196.191 511 188C503.389 179.809 498 168.004 498 154V92H514C517.412 92 520.769 92.622 523 95C525.231 97.2459 526 98.5652 526 102V154C526 162.059 526.457 167.037 530 171C533.543 174.831 537.914 176 545 176C552.217 176 555.457 174.831 559 171C562.543 167.037 563 162.059 563 154V102C563 98.5652 563.769 96.378 566 94C567.96 91.9107 570.028 91.9599 573 92C573.411 92.0055 574.586 92 575 92H591Z"
|
||||||
|
fill="currentColor"
|
||||||
|
/>
|
||||||
|
<path
|
||||||
|
d="M676 144L710 92H684C680.723 92 677.812 93.1758 676 96L660 120L645 97C643.188 94.1758 639.277 92 636 92H611L645 143L608 200H634C637.25 200 640.182 196.787 642 194L660 167L679 195C680.818 197.787 683.75 200 687 200H713L676 144Z"
|
||||||
|
fill="currentColor"
|
||||||
|
/>
|
||||||
|
<path
|
||||||
|
d="M168 200H279C282.542 200 285.932 198.756 289 197C292.068 195.244 295.23 193.041 297 190C298.77 186.959 300.002 183.51 300 179.999C299.998 176.488 298.773 173.04 297 170.001L222 41C220.23 37.96 218.067 35.7552 215 34C211.933 32.2448 207.542 31 204 31C200.458 31 197.067 32.2448 194 34C190.933 35.7552 188.77 37.96 187 41L168 74L130 9.99764C128.228 6.95784 126.068 3.75491 123 2C119.932 0.245087 116.542 0 113 0C109.458 0 106.068 0.245087 103 2C99.9323 3.75491 96.7717 6.95784 95 9.99764L2 170.001C0.226979 173.04 0.00154312 176.488 1.90993e-06 179.999C-0.0015393 183.51 0.229648 186.959 2 190C3.77035 193.04 6.93245 195.244 10 197C13.0675 198.756 16.4578 200 20 200H90C117.737 200 137.925 187.558 152 164L186 105L204 74L259 168H186L168 200ZM89 168H40L113 42L150 105L125.491 147.725C116.144 163.01 105.488 168 89 168Z"
|
||||||
|
fill="var(--ui-primary)"
|
||||||
|
/>
|
||||||
|
<path
|
||||||
|
d="M958 60.0001H938C933.524 60.0001 929.926 59.9395 927 63C924.074 65.8905 925 67.5792 925 72V141C925 151.372 923.648 156.899 919 162C914.352 166.931 908.468 169 899 169C889.705 169 882.648 166.931 878 162C873.352 156.899 873 151.372 873 141V72.0001C873 67.5793 872.926 65.8906 870 63.0001C867.074 59.9396 863.476 60.0001 859 60.0001H840V141C840 159.023 845.016 173.458 855 184C865.156 194.542 879.893 200 899 200C918.107 200 932.844 194.542 943 184C953.156 173.458 958 159.023 958 141V60.0001Z"
|
||||||
|
fill="var(--ui-primary)"
|
||||||
|
/>
|
||||||
|
<path
|
||||||
|
fill-rule="evenodd"
|
||||||
|
clip-rule="evenodd"
|
||||||
|
d="M1000 60.0233L1020 60V77L1020 128V156.007L1020 181L1020 189.004C1020 192.938 1019.98 194.429 1017 197.001C1014.02 199.725 1009.56 200 1005 200H986.001V181.006L986 130.012V70.0215C986 66.1576 986.016 64.5494 989 62.023C991.819 59.6358 995.437 60.0233 1000 60.0233Z"
|
||||||
|
fill="var(--ui-primary)"
|
||||||
|
/>
|
||||||
|
</svg>
|
||||||
|
</template>
|
||||||
249
Projects/kompose/docs/app/components/OgImage/OgImageDocs.vue
Normal file
249
Projects/kompose/docs/app/components/OgImage/OgImageDocs.vue
Normal file
@@ -0,0 +1,249 @@
|
|||||||
|
<script lang="ts" setup>
|
||||||
|
import { ref } from 'vue'
|
||||||
|
|
||||||
|
const isHovered = ref(false)
|
||||||
|
const glowIntensity = ref(0)
|
||||||
|
|
||||||
|
const handleMouseMove = (e: MouseEvent) => {
|
||||||
|
const rect = (e.target as HTMLElement).getBoundingClientRect()
|
||||||
|
const x = ((e.clientX - rect.left) / rect.width) * 100
|
||||||
|
const y = ((e.clientY - rect.top) / rect.height) * 100
|
||||||
|
glowIntensity.value = Math.max(0, 1 - Math.sqrt(Math.pow(x - 50, 2) + Math.pow(y - 50, 2)) / 70)
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<div
|
||||||
|
class="w-full h-full flex items-center justify-center bg-[#0a0e27] relative overflow-hidden"
|
||||||
|
@mouseenter="isHovered = true"
|
||||||
|
@mouseleave="isHovered = false; glowIntensity = 0"
|
||||||
|
@mousemove="handleMouseMove"
|
||||||
|
>
|
||||||
|
<!-- Animated background grid -->
|
||||||
|
<svg class="absolute inset-0 w-full h-full opacity-20" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<defs>
|
||||||
|
<pattern id="grid" width="40" height="40" patternUnits="userSpaceOnUse">
|
||||||
|
<path d="M 40 0 L 0 0 0 40" fill="none" stroke="#00d4ff" stroke-width="0.5" opacity="0.3"/>
|
||||||
|
</pattern>
|
||||||
|
<pattern id="hexGrid" width="60" height="52" patternUnits="userSpaceOnUse">
|
||||||
|
<path d="M30 0 L45 13 L45 39 L30 52 L15 39 L15 13 Z" fill="none" stroke="#00d4ff" stroke-width="0.5" opacity="0.2"/>
|
||||||
|
</pattern>
|
||||||
|
</defs>
|
||||||
|
<rect width="100%" height="100%" fill="url(#grid)" />
|
||||||
|
<rect width="100%" height="100%" fill="url(#hexGrid)" />
|
||||||
|
</svg>
|
||||||
|
|
||||||
|
<!-- Glowing orb effect -->
|
||||||
|
<svg class="absolute inset-0 w-full h-full pointer-events-none">
|
||||||
|
<defs>
|
||||||
|
<radialGradient id="glow" cx="50%" cy="50%">
|
||||||
|
<stop offset="0%" :stop-color="`rgba(0, 212, 255, ${glowIntensity * 0.4})`" />
|
||||||
|
<stop offset="50%" :stop-color="`rgba(0, 100, 255, ${glowIntensity * 0.2})`" />
|
||||||
|
<stop offset="100%" stop-color="rgba(0, 0, 0, 0)" />
|
||||||
|
</radialGradient>
|
||||||
|
</defs>
|
||||||
|
<circle cx="50%" cy="50%" r="300" fill="url(#glow)" />
|
||||||
|
</svg>
|
||||||
|
|
||||||
|
<!-- Main logo tag container -->
|
||||||
|
<div
|
||||||
|
class="relative z-10 transition-all duration-500 ease-out"
|
||||||
|
:class="{ 'scale-105': isHovered }"
|
||||||
|
>
|
||||||
|
<!-- Tag shape with carbon fiber background -->
|
||||||
|
<svg
|
||||||
|
width="500"
|
||||||
|
height="200"
|
||||||
|
viewBox="0 0 500 200"
|
||||||
|
class="drop-shadow-2xl"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
>
|
||||||
|
<defs>
|
||||||
|
<!-- Carbon fiber pattern -->
|
||||||
|
<pattern id="carbon" x="0" y="0" width="20" height="20" patternUnits="userSpaceOnUse">
|
||||||
|
<rect width="20" height="20" fill="#1a1d2e"/>
|
||||||
|
<path d="M0,0 L10,10 M10,0 L20,10 M0,10 L10,20" stroke="#0f1119" stroke-width="1" opacity="0.5"/>
|
||||||
|
<path d="M10,0 L0,10 M20,0 L10,10 M10,10 L0,20" stroke="#252939" stroke-width="1" opacity="0.3"/>
|
||||||
|
</pattern>
|
||||||
|
|
||||||
|
<!-- Mesh overlay pattern -->
|
||||||
|
<pattern id="mesh" x="0" y="0" width="30" height="30" patternUnits="userSpaceOnUse">
|
||||||
|
<circle cx="15" cy="15" r="1" fill="#00d4ff" opacity="0.3"/>
|
||||||
|
<line x1="15" y1="0" x2="15" y2="30" stroke="#00d4ff" stroke-width="0.3" opacity="0.2"/>
|
||||||
|
<line x1="0" y1="15" x2="30" y2="15" stroke="#00d4ff" stroke-width="0.3" opacity="0.2"/>
|
||||||
|
</pattern>
|
||||||
|
|
||||||
|
<!-- Metallic gradient -->
|
||||||
|
<linearGradient id="metalGrad" x1="0%" y1="0%" x2="100%" y2="100%">
|
||||||
|
<stop offset="0%" style="stop-color:#2d3548;stop-opacity:1" />
|
||||||
|
<stop offset="50%" style="stop-color:#1a1d2e;stop-opacity:1" />
|
||||||
|
<stop offset="100%" style="stop-color:#0f1421;stop-opacity:1" />
|
||||||
|
</linearGradient>
|
||||||
|
|
||||||
|
<!-- Glow filter -->
|
||||||
|
<filter id="glow-filter">
|
||||||
|
<feGaussianBlur stdDeviation="3" result="coloredBlur"/>
|
||||||
|
<feMerge>
|
||||||
|
<feMergeNode in="coloredBlur"/>
|
||||||
|
<feMergeNode in="SourceGraphic"/>
|
||||||
|
</feMerge>
|
||||||
|
</filter>
|
||||||
|
|
||||||
|
<!-- Inner shadow -->
|
||||||
|
<filter id="innerShadow">
|
||||||
|
<feGaussianBlur in="SourceAlpha" stdDeviation="3"/>
|
||||||
|
<feOffset dx="0" dy="2" result="offsetblur"/>
|
||||||
|
<feComponentTransfer>
|
||||||
|
<feFuncA type="linear" slope="0.5"/>
|
||||||
|
</feComponentTransfer>
|
||||||
|
<feMerge>
|
||||||
|
<feMergeNode/>
|
||||||
|
<feMergeNode in="SourceGraphic"/>
|
||||||
|
</feMerge>
|
||||||
|
</filter>
|
||||||
|
</defs>
|
||||||
|
|
||||||
|
<!-- Tag base shape with angled cut -->
|
||||||
|
<path
|
||||||
|
d="M 20,20 L 450,20 L 480,100 L 450,180 L 20,180 L 50,100 Z"
|
||||||
|
fill="url(#carbon)"
|
||||||
|
stroke="url(#metalGrad)"
|
||||||
|
stroke-width="2"
|
||||||
|
/>
|
||||||
|
|
||||||
|
<!-- Mesh overlay -->
|
||||||
|
<path
|
||||||
|
d="M 20,20 L 450,20 L 480,100 L 450,180 L 20,180 L 50,100 Z"
|
||||||
|
fill="url(#mesh)"
|
||||||
|
/>
|
||||||
|
|
||||||
|
<!-- Inner border glow -->
|
||||||
|
<path
|
||||||
|
d="M 25,25 L 448,25 L 476,100 L 448,175 L 25,175 L 52,100 Z"
|
||||||
|
fill="none"
|
||||||
|
:stroke="isHovered ? '#00d4ff' : '#003d4f'"
|
||||||
|
stroke-width="1.5"
|
||||||
|
:opacity="isHovered ? 0.8 : 0.4"
|
||||||
|
class="transition-all duration-300"
|
||||||
|
filter="url(#glow-filter)"
|
||||||
|
/>
|
||||||
|
|
||||||
|
<!-- Corner rivets -->
|
||||||
|
<circle cx="35" cy="35" r="4" fill="#1a1d2e" stroke="#00d4ff" stroke-width="1" opacity="0.6"/>
|
||||||
|
<circle cx="465" cy="35" r="4" fill="#1a1d2e" stroke="#00d4ff" stroke-width="1" opacity="0.6"/>
|
||||||
|
<circle cx="35" cy="165" r="4" fill="#1a1d2e" stroke="#00d4ff" stroke-width="1" opacity="0.6"/>
|
||||||
|
<circle cx="465" cy="165" r="4" fill="#1a1d2e" stroke="#00d4ff" stroke-width="1" opacity="0.6"/>
|
||||||
|
|
||||||
|
<!-- Decorative tech lines -->
|
||||||
|
<line x1="70" y1="50" x2="150" y2="50" stroke="#00d4ff" stroke-width="1" opacity="0.4"/>
|
||||||
|
<line x1="70" y1="55" x2="140" y2="55" stroke="#00d4ff" stroke-width="0.5" opacity="0.3"/>
|
||||||
|
<line x1="350" y1="50" x2="430" y2="50" stroke="#00d4ff" stroke-width="1" opacity="0.4"/>
|
||||||
|
<line x1="360" y1="55" x2="430" y2="55" stroke="#00d4ff" stroke-width="0.5" opacity="0.3"/>
|
||||||
|
|
||||||
|
<line x1="70" y1="150" x2="150" y2="150" stroke="#00d4ff" stroke-width="1" opacity="0.4"/>
|
||||||
|
<line x1="70" y1="145" x2="140" y2="145" stroke="#00d4ff" stroke-width="0.5" opacity="0.3"/>
|
||||||
|
<line x1="350" y1="150" x2="430" y2="150" stroke="#00d4ff" stroke-width="1" opacity="0.4"/>
|
||||||
|
<line x1="360" y1="145" x2="430" y2="145" stroke="#00d4ff" stroke-width="0.5" opacity="0.3"/>
|
||||||
|
|
||||||
|
<!-- Logo text "kmpse" -->
|
||||||
|
<text
|
||||||
|
x="250"
|
||||||
|
y="115"
|
||||||
|
font-family="'Courier New', monospace"
|
||||||
|
font-size="72"
|
||||||
|
font-weight="bold"
|
||||||
|
text-anchor="middle"
|
||||||
|
fill="#00d4ff"
|
||||||
|
filter="url(#glow-filter)"
|
||||||
|
:opacity="isHovered ? 1 : 0.9"
|
||||||
|
class="transition-opacity duration-300"
|
||||||
|
>
|
||||||
|
kmpse
|
||||||
|
</text>
|
||||||
|
|
||||||
|
<!-- Text shadow/depth -->
|
||||||
|
<text
|
||||||
|
x="252"
|
||||||
|
y="117"
|
||||||
|
font-family="'Courier New', monospace"
|
||||||
|
font-size="72"
|
||||||
|
font-weight="bold"
|
||||||
|
text-anchor="middle"
|
||||||
|
fill="#001a1f"
|
||||||
|
opacity="0.6"
|
||||||
|
>
|
||||||
|
kmpse
|
||||||
|
</text>
|
||||||
|
|
||||||
|
<!-- Scanline effect -->
|
||||||
|
<rect
|
||||||
|
x="20"
|
||||||
|
y="20"
|
||||||
|
width="460"
|
||||||
|
height="160"
|
||||||
|
fill="none"
|
||||||
|
stroke="#00d4ff"
|
||||||
|
stroke-width="0.5"
|
||||||
|
opacity="0.1"
|
||||||
|
clip-path="polygon(0 20%, 100% 20%, 100% 22%, 0 22%)"
|
||||||
|
>
|
||||||
|
<animateTransform
|
||||||
|
attributeName="transform"
|
||||||
|
type="translate"
|
||||||
|
from="0 -180"
|
||||||
|
to="0 180"
|
||||||
|
dur="3s"
|
||||||
|
repeatCount="indefinite"
|
||||||
|
/>
|
||||||
|
</rect>
|
||||||
|
|
||||||
|
<!-- Subtle version number -->
|
||||||
|
<text
|
||||||
|
x="430"
|
||||||
|
y="170"
|
||||||
|
font-family="'Courier New', monospace"
|
||||||
|
font-size="10"
|
||||||
|
fill="#00d4ff"
|
||||||
|
opacity="0.4"
|
||||||
|
>
|
||||||
|
v4.0
|
||||||
|
</text>
|
||||||
|
</svg>
|
||||||
|
|
||||||
|
<!-- Additional floating particles -->
|
||||||
|
<div class="absolute inset-0 pointer-events-none">
|
||||||
|
<div
|
||||||
|
v-for="i in 5"
|
||||||
|
:key="i"
|
||||||
|
class="absolute w-1 h-1 bg-cyan-400 rounded-full opacity-30"
|
||||||
|
:style="{
|
||||||
|
left: `${20 + i * 15}%`,
|
||||||
|
top: `${30 + (i % 2) * 40}%`,
|
||||||
|
animation: `float ${3 + i * 0.5}s ease-in-out infinite`,
|
||||||
|
animationDelay: `${i * 0.2}s`
|
||||||
|
}"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Status indicator -->
|
||||||
|
<div class="absolute bottom-8 left-8 flex items-center gap-2 text-cyan-400 text-sm font-mono">
|
||||||
|
<div
|
||||||
|
class="w-2 h-2 rounded-full bg-cyan-400"
|
||||||
|
:class="{ 'animate-pulse': isHovered }"
|
||||||
|
/>
|
||||||
|
<span :class="{ 'text-cyan-300': isHovered }">SYSTEM.ACTIVE</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
@keyframes float {
|
||||||
|
0%, 100% {
|
||||||
|
transform: translateY(0px);
|
||||||
|
}
|
||||||
|
50% {
|
||||||
|
transform: translateY(-10px);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
84
Projects/kompose/docs/app/components/PageHeaderLinks.vue
Normal file
84
Projects/kompose/docs/app/components/PageHeaderLinks.vue
Normal file
@@ -0,0 +1,84 @@
|
|||||||
|
<script setup lang="ts">
|
||||||
|
import { useClipboard } from '@vueuse/core'
|
||||||
|
|
||||||
|
const route = useRoute()
|
||||||
|
const toast = useToast()
|
||||||
|
const { copy, copied } = useClipboard()
|
||||||
|
const site = useSiteConfig()
|
||||||
|
const isCopying = ref(false)
|
||||||
|
console.log(site)
|
||||||
|
|
||||||
|
const mdPath = computed(() => `${site.url}/raw${route.path}.md`)
|
||||||
|
|
||||||
|
const items = [
|
||||||
|
{
|
||||||
|
label: 'Copy Markdown link',
|
||||||
|
icon: 'i-lucide-link',
|
||||||
|
onSelect() {
|
||||||
|
copy(mdPath.value)
|
||||||
|
toast.add({
|
||||||
|
title: 'Copied to clipboard',
|
||||||
|
icon: 'i-lucide-check-circle'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: 'View as Markdown',
|
||||||
|
icon: 'i-simple-icons:markdown',
|
||||||
|
target: '_blank',
|
||||||
|
to: `/raw${route.path}.md`
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: 'Open in ChatGPT',
|
||||||
|
icon: 'i-simple-icons:openai',
|
||||||
|
target: '_blank',
|
||||||
|
to: `https://chatgpt.com/?hints=search&q=${encodeURIComponent(`Read ${mdPath.value} so I can ask questions about it.`)}`
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: 'Open in Claude',
|
||||||
|
icon: 'i-simple-icons:anthropic',
|
||||||
|
target: '_blank',
|
||||||
|
to: `https://claude.ai/new?q=${encodeURIComponent(`Read ${mdPath.value} so I can ask questions about it.`)}`
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
|
async function copyPage() {
|
||||||
|
isCopying.value = true
|
||||||
|
copy(await $fetch<string>(`/raw${route.path}.md`))
|
||||||
|
isCopying.value = false
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<UButtonGroup>
|
||||||
|
<UButton
|
||||||
|
label="Copy page"
|
||||||
|
:icon="copied ? 'i-lucide-copy-check' : 'i-lucide-copy'"
|
||||||
|
color="neutral"
|
||||||
|
variant="outline"
|
||||||
|
:loading="isCopying"
|
||||||
|
:ui="{
|
||||||
|
leadingIcon: [copied ? 'text-primary' : 'text-neutral', 'size-3.5']
|
||||||
|
}"
|
||||||
|
@click="copyPage"
|
||||||
|
/>
|
||||||
|
<UDropdownMenu
|
||||||
|
:items="items"
|
||||||
|
:content="{
|
||||||
|
align: 'end',
|
||||||
|
side: 'bottom',
|
||||||
|
sideOffset: 8
|
||||||
|
}"
|
||||||
|
:ui="{
|
||||||
|
content: 'w-48'
|
||||||
|
}"
|
||||||
|
>
|
||||||
|
<UButton
|
||||||
|
icon="i-lucide-chevron-down"
|
||||||
|
size="sm"
|
||||||
|
color="neutral"
|
||||||
|
variant="outline"
|
||||||
|
/>
|
||||||
|
</UDropdownMenu>
|
||||||
|
</UButtonGroup>
|
||||||
|
</template>
|
||||||
49
Projects/kompose/docs/app/components/TemplateMenu.vue
Normal file
49
Projects/kompose/docs/app/components/TemplateMenu.vue
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
<template>
|
||||||
|
<UDropdownMenu
|
||||||
|
v-slot="{ open }"
|
||||||
|
:modal="false"
|
||||||
|
:items="[{
|
||||||
|
label: 'Starter',
|
||||||
|
to: 'https://starter-template.nuxt.dev/'
|
||||||
|
}, {
|
||||||
|
label: 'Landing',
|
||||||
|
to: 'https://landing-template.nuxt.dev/'
|
||||||
|
}, {
|
||||||
|
label: 'Docs',
|
||||||
|
to: 'https://docs-template.nuxt.dev/',
|
||||||
|
color: 'primary',
|
||||||
|
checked: true,
|
||||||
|
type: 'checkbox'
|
||||||
|
}, {
|
||||||
|
label: 'SaaS',
|
||||||
|
to: 'https://saas-template.nuxt.dev/'
|
||||||
|
}, {
|
||||||
|
label: 'Dashboard',
|
||||||
|
to: 'https://dashboard-template.nuxt.dev/'
|
||||||
|
}, {
|
||||||
|
label: 'Chat',
|
||||||
|
to: 'https://chat-template.nuxt.dev/'
|
||||||
|
}, {
|
||||||
|
label: 'Portfolio',
|
||||||
|
to: 'https://portfolio-template.nuxt.dev/'
|
||||||
|
}, {
|
||||||
|
label: 'Changelog',
|
||||||
|
to: 'https://changelog-template.nuxt.dev/'
|
||||||
|
}]"
|
||||||
|
:content="{ align: 'start' }"
|
||||||
|
:ui="{ content: 'min-w-fit' }"
|
||||||
|
size="xs"
|
||||||
|
>
|
||||||
|
<UButton
|
||||||
|
label="Docs"
|
||||||
|
variant="subtle"
|
||||||
|
trailing-icon="i-lucide-chevron-down"
|
||||||
|
size="xs"
|
||||||
|
class="-mb-[6px] font-semibold rounded-full truncate"
|
||||||
|
:class="[open && 'bg-primary/15']"
|
||||||
|
:ui="{
|
||||||
|
trailingIcon: ['transition-transform duration-200', open ? 'rotate-180' : undefined].filter(Boolean).join(' ')
|
||||||
|
}"
|
||||||
|
/>
|
||||||
|
</UDropdownMenu>
|
||||||
|
</template>
|
||||||
@@ -0,0 +1,88 @@
|
|||||||
|
<script setup lang="ts">
|
||||||
|
const { isLoading } = useLoadingIndicator()
|
||||||
|
|
||||||
|
const appear = ref(false)
|
||||||
|
const appeared = ref(false)
|
||||||
|
|
||||||
|
onMounted(() => {
|
||||||
|
setTimeout(() => {
|
||||||
|
appear.value = true
|
||||||
|
setTimeout(() => {
|
||||||
|
appeared.value = true
|
||||||
|
}, 1000)
|
||||||
|
}, 0)
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<div
|
||||||
|
class="absolute w-full -top-px transition-all text-primary shrink-0"
|
||||||
|
:class="[
|
||||||
|
isLoading ? 'animate-pulse' : (appear ? '' : 'opacity-0'),
|
||||||
|
appeared ? 'duration-[400ms]': 'duration-1000'
|
||||||
|
]"
|
||||||
|
>
|
||||||
|
<svg
|
||||||
|
viewBox="0 0 1440 181"
|
||||||
|
fill="none"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
class="pointer-events-none"
|
||||||
|
>
|
||||||
|
<mask
|
||||||
|
id="path-1-inside-1_414_5526"
|
||||||
|
fill="white"
|
||||||
|
>
|
||||||
|
<path d="M0 0H1440V181H0V0Z" />
|
||||||
|
</mask>
|
||||||
|
<path
|
||||||
|
d="M0 0H1440V181H0V0Z"
|
||||||
|
fill="url(#paint0_linear_414_5526)"
|
||||||
|
fill-opacity="0.22"
|
||||||
|
/>
|
||||||
|
<path
|
||||||
|
d="M0 2H1440V-2H0V2Z"
|
||||||
|
fill="url(#paint1_linear_414_5526)"
|
||||||
|
mask="url(#path-1-inside-1_414_5526)"
|
||||||
|
/>
|
||||||
|
<defs>
|
||||||
|
<linearGradient
|
||||||
|
id="paint0_linear_414_5526"
|
||||||
|
x1="720"
|
||||||
|
y1="0"
|
||||||
|
x2="720"
|
||||||
|
y2="181"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
>
|
||||||
|
<stop stop-color="currentColor" />
|
||||||
|
<stop
|
||||||
|
offset="1"
|
||||||
|
stop-color="currentColor"
|
||||||
|
stop-opacity="0"
|
||||||
|
/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
id="paint1_linear_414_5526"
|
||||||
|
x1="0"
|
||||||
|
y1="90.5"
|
||||||
|
x2="1440"
|
||||||
|
y2="90.5"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
>
|
||||||
|
<stop
|
||||||
|
stop-color="currentColor"
|
||||||
|
stop-opacity="0"
|
||||||
|
/>
|
||||||
|
<stop
|
||||||
|
offset="0.395"
|
||||||
|
stop-color="currentColor"
|
||||||
|
/>
|
||||||
|
<stop
|
||||||
|
offset="1"
|
||||||
|
stop-color="currentColor"
|
||||||
|
stop-opacity="0"
|
||||||
|
/>
|
||||||
|
</linearGradient>
|
||||||
|
</defs>
|
||||||
|
</svg>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
183
Projects/kompose/docs/app/components/content/StarsBg.vue
Normal file
183
Projects/kompose/docs/app/components/content/StarsBg.vue
Normal file
@@ -0,0 +1,183 @@
|
|||||||
|
<script setup lang="ts">
|
||||||
|
interface Star {
|
||||||
|
x: number
|
||||||
|
y: number
|
||||||
|
size: number
|
||||||
|
}
|
||||||
|
|
||||||
|
const props = withDefaults(defineProps<{
|
||||||
|
starCount?: number
|
||||||
|
color?: string
|
||||||
|
speed?: 'slow' | 'normal' | 'fast'
|
||||||
|
size?: { min: number, max: number }
|
||||||
|
}>(), {
|
||||||
|
starCount: 300,
|
||||||
|
color: 'var(--ui-primary)',
|
||||||
|
speed: 'normal',
|
||||||
|
size: () => ({
|
||||||
|
min: 1,
|
||||||
|
max: 2
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
// Generate random star positions and sizes
|
||||||
|
const generateStars = (count: number): Star[] => {
|
||||||
|
return Array.from({ length: count }, () => ({
|
||||||
|
x: Math.floor(Math.random() * 2000),
|
||||||
|
y: Math.floor(Math.random() * 2000),
|
||||||
|
size: typeof props.size === 'number'
|
||||||
|
? props.size
|
||||||
|
: Math.random() * (props.size.max - props.size.min) + props.size.min
|
||||||
|
}))
|
||||||
|
}
|
||||||
|
|
||||||
|
// Define speed configurations once
|
||||||
|
const speedMap = {
|
||||||
|
slow: { duration: 200, opacity: 0.5, ratio: 0.3 },
|
||||||
|
normal: { duration: 150, opacity: 0.75, ratio: 0.3 },
|
||||||
|
fast: { duration: 100, opacity: 1, ratio: 0.4 }
|
||||||
|
}
|
||||||
|
|
||||||
|
// Use a more efficient approach to generate and store stars
|
||||||
|
const stars = useState<{ slow: Star[], normal: Star[], fast: Star[] }>('stars', () => {
|
||||||
|
return {
|
||||||
|
slow: generateStars(Math.floor(props.starCount * speedMap.slow.ratio)),
|
||||||
|
normal: generateStars(Math.floor(props.starCount * speedMap.normal.ratio)),
|
||||||
|
fast: generateStars(Math.floor(props.starCount * speedMap.fast.ratio))
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
// Compute star layers with different speeds and opacities
|
||||||
|
const starLayers = computed(() => [
|
||||||
|
{ stars: stars.value.fast, ...speedMap.fast },
|
||||||
|
{ stars: stars.value.normal, ...speedMap.normal },
|
||||||
|
{ stars: stars.value.slow, ...speedMap.slow }
|
||||||
|
])
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<div class="absolute pointer-events-none z-[-1] inset-y-0 inset-x-5 sm:inset-x-7 lg:inset-x-9 overflow-hidden">
|
||||||
|
<svg
|
||||||
|
class="absolute inset-0 pointer-events-none"
|
||||||
|
viewBox="0 0 1017 181"
|
||||||
|
fill="none"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
>
|
||||||
|
<g opacity="0.5">
|
||||||
|
<mask
|
||||||
|
id="path-1-inside-1_846_160841"
|
||||||
|
fill="white"
|
||||||
|
>
|
||||||
|
<path d="M0 0H1017V181H0V0Z" />
|
||||||
|
</mask>
|
||||||
|
<path
|
||||||
|
d="M0 0H1017V181H0V0Z"
|
||||||
|
fill="url(#paint0_radial_846_160841)"
|
||||||
|
fill-opacity="0.22"
|
||||||
|
/>
|
||||||
|
</g>
|
||||||
|
<defs>
|
||||||
|
<radialGradient
|
||||||
|
id="paint0_radial_846_160841"
|
||||||
|
cx="0"
|
||||||
|
cy="0"
|
||||||
|
r="1"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="translate(508.999 19.5) rotate(90.177) scale(161.501 509.002)"
|
||||||
|
>
|
||||||
|
<stop stop-color="var(--ui-primary)" />
|
||||||
|
<stop
|
||||||
|
offset="1"
|
||||||
|
stop-color="var(--ui-primary)"
|
||||||
|
stop-opacity="0"
|
||||||
|
/>
|
||||||
|
</radialGradient>
|
||||||
|
<linearGradient
|
||||||
|
id="paint1_linear_846_160841"
|
||||||
|
x1="10.9784"
|
||||||
|
y1="91"
|
||||||
|
x2="1017"
|
||||||
|
y2="90.502"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
>
|
||||||
|
<stop
|
||||||
|
stop-color="var(--ui-primary)"
|
||||||
|
stop-opacity="0"
|
||||||
|
/>
|
||||||
|
<stop
|
||||||
|
offset="0.395"
|
||||||
|
stop-color="var(--ui-primary)"
|
||||||
|
/>
|
||||||
|
<stop
|
||||||
|
offset="1"
|
||||||
|
stop-color="var(--ui-primary)"
|
||||||
|
stop-opacity="0"
|
||||||
|
/>
|
||||||
|
</linearGradient>
|
||||||
|
</defs>
|
||||||
|
</svg>
|
||||||
|
|
||||||
|
<div class="stars size-full absolute inset-x-0 top-0">
|
||||||
|
<div
|
||||||
|
v-for="(layer, index) in starLayers"
|
||||||
|
:key="index"
|
||||||
|
class="star-layer"
|
||||||
|
:style="{
|
||||||
|
'--star-duration': `${layer.duration}s`,
|
||||||
|
'--star-opacity': layer.opacity,
|
||||||
|
'--star-color': color
|
||||||
|
}"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
v-for="(star, starIndex) in layer.stars"
|
||||||
|
:key="starIndex"
|
||||||
|
class="star absolute rounded-full"
|
||||||
|
:style="{
|
||||||
|
left: `${star.x}px`,
|
||||||
|
top: `${star.y}px`,
|
||||||
|
width: `${star.size}px`,
|
||||||
|
height: `${star.size}px`,
|
||||||
|
backgroundColor: 'var(--star-color)',
|
||||||
|
opacity: 'var(--star-opacity)'
|
||||||
|
}"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
.stars {
|
||||||
|
left: 50%;
|
||||||
|
transform: translate(-50%);
|
||||||
|
-webkit-mask-image: linear-gradient(180deg,
|
||||||
|
rgba(217, 217, 217, 0) 0%,
|
||||||
|
rgba(217, 217, 217, 0.8) 25%,
|
||||||
|
#d9d9d9 50%,
|
||||||
|
rgba(217, 217, 217, 0.8) 75%,
|
||||||
|
rgba(217, 217, 217, 0) 100%);
|
||||||
|
mask-image: linear-gradient(180deg,
|
||||||
|
rgba(217, 217, 217, 0) 0%,
|
||||||
|
rgba(217, 217, 217, 0.8) 25%,
|
||||||
|
#d9d9d9 50%,
|
||||||
|
rgba(217, 217, 217, 0.8) 75%,
|
||||||
|
rgba(217, 217, 217, 0) 100%);
|
||||||
|
-webkit-mask-size: cover;
|
||||||
|
mask-size: cover;
|
||||||
|
}
|
||||||
|
|
||||||
|
.star-layer {
|
||||||
|
animation: risingStarsAnimation linear infinite;
|
||||||
|
animation-duration: var(--star-duration);
|
||||||
|
will-change: transform;
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes risingStarsAnimation {
|
||||||
|
0% {
|
||||||
|
transform: translateY(0);
|
||||||
|
}
|
||||||
|
100% {
|
||||||
|
transform: translateY(-2000px);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
42
Projects/kompose/docs/app/error.vue
Normal file
42
Projects/kompose/docs/app/error.vue
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
<script setup lang="ts">
|
||||||
|
import type { NuxtError } from '#app'
|
||||||
|
|
||||||
|
defineProps<{
|
||||||
|
error: NuxtError
|
||||||
|
}>()
|
||||||
|
|
||||||
|
useHead({
|
||||||
|
htmlAttrs: {
|
||||||
|
lang: 'en'
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
useSeoMeta({
|
||||||
|
title: 'Page not found',
|
||||||
|
description: 'We are sorry but this page could not be found.'
|
||||||
|
})
|
||||||
|
|
||||||
|
const { data: navigation } = await useAsyncData('navigation', () => queryCollectionNavigation('docs'))
|
||||||
|
const { data: files } = useLazyAsyncData('search', () => queryCollectionSearchSections('docs'), {
|
||||||
|
server: false
|
||||||
|
})
|
||||||
|
|
||||||
|
provide('navigation', navigation)
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<UApp>
|
||||||
|
<AppHeader />
|
||||||
|
|
||||||
|
<UError :error="error" />
|
||||||
|
|
||||||
|
<AppFooter />
|
||||||
|
|
||||||
|
<ClientOnly>
|
||||||
|
<LazyUContentSearch
|
||||||
|
:files="files"
|
||||||
|
:navigation="navigation"
|
||||||
|
/>
|
||||||
|
</ClientOnly>
|
||||||
|
</UApp>
|
||||||
|
</template>
|
||||||
24
Projects/kompose/docs/app/layouts/docs.vue
Normal file
24
Projects/kompose/docs/app/layouts/docs.vue
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
<script setup lang="ts">
|
||||||
|
import type { ContentNavigationItem } from '@nuxt/content'
|
||||||
|
import OgImageDocs from '~/components/OgImage/OgImageDocs.vue';
|
||||||
|
|
||||||
|
const navigation = inject<Ref<ContentNavigationItem[]>>('navigation')
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<UContainer>
|
||||||
|
<UPage>
|
||||||
|
<template #left>
|
||||||
|
<UPageAside>
|
||||||
|
<UContentNavigation
|
||||||
|
highlight
|
||||||
|
:navigation="navigation"
|
||||||
|
/>
|
||||||
|
<OgImageDocs />
|
||||||
|
</UPageAside>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<slot />
|
||||||
|
</UPage>
|
||||||
|
</UContainer>
|
||||||
|
</template>
|
||||||
114
Projects/kompose/docs/app/pages/[...slug].vue
Normal file
114
Projects/kompose/docs/app/pages/[...slug].vue
Normal file
@@ -0,0 +1,114 @@
|
|||||||
|
<script setup lang="ts">
|
||||||
|
import type { ContentNavigationItem } from '@nuxt/content'
|
||||||
|
import { findPageHeadline } from '@nuxt/content/utils'
|
||||||
|
|
||||||
|
definePageMeta({
|
||||||
|
layout: 'docs'
|
||||||
|
})
|
||||||
|
|
||||||
|
const route = useRoute()
|
||||||
|
const { toc } = useAppConfig()
|
||||||
|
const navigation = inject<Ref<ContentNavigationItem[]>>('navigation')
|
||||||
|
|
||||||
|
const { data: page } = await useAsyncData(route.path, () => queryCollection('docs').path(route.path).first())
|
||||||
|
if (!page.value) {
|
||||||
|
throw createError({ statusCode: 404, statusMessage: 'Page not found', fatal: true })
|
||||||
|
}
|
||||||
|
|
||||||
|
const { data: surround } = await useAsyncData(`${route.path}-surround`, () => {
|
||||||
|
return queryCollectionItemSurroundings('docs', route.path, {
|
||||||
|
fields: ['description']
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
const title = page.value.seo?.title || page.value.title
|
||||||
|
const description = page.value.seo?.description || page.value.description
|
||||||
|
|
||||||
|
useSeoMeta({
|
||||||
|
title,
|
||||||
|
ogTitle: title,
|
||||||
|
description,
|
||||||
|
ogDescription: description
|
||||||
|
})
|
||||||
|
|
||||||
|
const headline = computed(() => findPageHeadline(navigation?.value, page.value?.path))
|
||||||
|
|
||||||
|
defineOgImageComponent('Docs', {
|
||||||
|
headline: headline.value
|
||||||
|
})
|
||||||
|
|
||||||
|
const links = computed(() => {
|
||||||
|
const links = []
|
||||||
|
if (toc?.bottom?.edit) {
|
||||||
|
links.push({
|
||||||
|
icon: 'i-lucide-external-link',
|
||||||
|
label: 'Edit this page',
|
||||||
|
to: `${toc.bottom.edit}/${page?.value?.stem}.${page?.value?.extension}`,
|
||||||
|
target: '_blank'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
return [...links, ...(toc?.bottom?.links || [])].filter(Boolean)
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<UPage v-if="page">
|
||||||
|
<UPageHeader
|
||||||
|
:title="page.title"
|
||||||
|
:description="page.description"
|
||||||
|
:headline="headline"
|
||||||
|
>
|
||||||
|
<template #links>
|
||||||
|
<UButton
|
||||||
|
v-for="(link, index) in page.links"
|
||||||
|
:key="index"
|
||||||
|
v-bind="link"
|
||||||
|
/>
|
||||||
|
|
||||||
|
<PageHeaderLinks />
|
||||||
|
</template>
|
||||||
|
</UPageHeader>
|
||||||
|
|
||||||
|
<UPageBody>
|
||||||
|
<ContentRenderer
|
||||||
|
v-if="page"
|
||||||
|
:value="page"
|
||||||
|
/>
|
||||||
|
|
||||||
|
<USeparator v-if="surround?.length" />
|
||||||
|
|
||||||
|
<UContentSurround :surround="surround" />
|
||||||
|
</UPageBody>
|
||||||
|
|
||||||
|
<template
|
||||||
|
v-if="page?.body?.toc?.links?.length"
|
||||||
|
#right
|
||||||
|
>
|
||||||
|
<UContentToc
|
||||||
|
:title="toc?.title"
|
||||||
|
:links="page.body?.toc?.links"
|
||||||
|
>
|
||||||
|
<template
|
||||||
|
v-if="toc?.bottom"
|
||||||
|
#bottom
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
class="hidden lg:block space-y-6"
|
||||||
|
:class="{ '!mt-6': page.body?.toc?.links?.length }"
|
||||||
|
>
|
||||||
|
<USeparator
|
||||||
|
v-if="page.body?.toc?.links?.length"
|
||||||
|
type="dashed"
|
||||||
|
/>
|
||||||
|
|
||||||
|
<UPageLinks
|
||||||
|
:title="toc.bottom.title"
|
||||||
|
:links="links"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
</UContentToc>
|
||||||
|
</template>
|
||||||
|
</UPage>
|
||||||
|
</template>
|
||||||
24
Projects/kompose/docs/content.config.ts
Normal file
24
Projects/kompose/docs/content.config.ts
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
import { defineContentConfig, defineCollection, z } from '@nuxt/content'
|
||||||
|
|
||||||
|
export default defineContentConfig({
|
||||||
|
collections: {
|
||||||
|
landing: defineCollection({
|
||||||
|
type: 'page',
|
||||||
|
source: 'index.md'
|
||||||
|
}),
|
||||||
|
docs: defineCollection({
|
||||||
|
type: 'page',
|
||||||
|
source: {
|
||||||
|
include: '**',
|
||||||
|
},
|
||||||
|
schema: z.object({
|
||||||
|
links: z.array(z.object({
|
||||||
|
label: z.string(),
|
||||||
|
icon: z.string(),
|
||||||
|
to: z.string(),
|
||||||
|
target: z.string().optional()
|
||||||
|
})).optional()
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
88
Projects/kompose/docs/content/1.index.md
Normal file
88
Projects/kompose/docs/content/1.index.md
Normal file
@@ -0,0 +1,88 @@
|
|||||||
|
---
|
||||||
|
title: Introduction to Kompose
|
||||||
|
description: Learn about Kompose, your Docker Compose Symphony Conductor for managing multiple stacks with style and grace.
|
||||||
|
---
|
||||||
|
|
||||||
|
<OgImageDocs />
|
||||||
|
|
||||||
|
**Kompose** is a powerful Bash orchestration tool for managing multiple Docker Compose stacks with style and grace. Think of it as a conductor for your Docker symphony - each stack plays its part, and Kompose makes sure they're all in harmony.
|
||||||
|
|
||||||
|
**Kompose** is a powerful Bash orchestration tool for managing multiple Docker Compose stacks with style and grace. Think of it as a conductor for your Docker symphony - each stack plays its part, and Kompose makes sure they're all in harmony.
|
||||||
|
|
||||||
|
### Why Kompose?
|
||||||
|
|
||||||
|
:icon{name="lucide:target"} **One Command to Rule Them All** - Manage dozens of stacks with a single command
|
||||||
|
:icon{name="lucide:refresh-cw"} **Database Wizardry** - Export, import, and clean up PostgreSQL databases like a boss
|
||||||
|
:icon{name="lucide:tent"} **Hook System** - Extend functionality with custom pre/post operation hooks
|
||||||
|
:icon{name="lucide:globe"} **Network Maestro** - Smart network management with CLI overrides
|
||||||
|
:icon{name="lucide:lock-keyhole"} **Environment Juggler** - Override any environment variable on the fly
|
||||||
|
:icon{name="lucide:palette"} **Beautiful Output** - Color-coded logs and status indicators
|
||||||
|
:icon{name="lucide:flask-conical"} **Dry-Run Mode** - Test changes before applying them
|
||||||
|
|
||||||
|
### :icon{name="lucide:music"} Stack Management
|
||||||
|
- **Pattern-based selection**: Target stacks with globs, comma-separated lists, or wildcards
|
||||||
|
- **Bulk operations**: Execute commands across multiple stacks simultaneously
|
||||||
|
- **Status monitoring**: Visual feedback with color-coded success/failure indicators
|
||||||
|
- **Smart filtering**: Include/exclude stacks with flexible pattern matching
|
||||||
|
|
||||||
|
### :icon{name="lucide:hard-drive"} Database Operations
|
||||||
|
- **Automated backups**: Export PostgreSQL databases with timestamped dumps
|
||||||
|
- **Smart imports**: Auto-detect latest dumps or specify exact files
|
||||||
|
- **Drop & recreate**: Safe database import with connection termination
|
||||||
|
- **Cleanup utilities**: Keep only the latest dumps, remove old backups
|
||||||
|
- **Hook integration**: Custom pre/post operations for each database action
|
||||||
|
|
||||||
|
### :icon{name="lucide:git-branch"} Extensibility
|
||||||
|
- **Custom hooks**: Define `pre_db_export`, `post_db_export`, `pre_db_import`, `post_db_import`
|
||||||
|
- **Stack-specific logic**: Each stack can have unique operational requirements
|
||||||
|
- **Environment access**: Hooks inherit all environment variables
|
||||||
|
- **Dry-run aware**: Test hook execution without side effects
|
||||||
|
|
||||||
|
### :icon{name="lucide:globe"} Network Management
|
||||||
|
- **Unified network**: All stacks communicate on a single Docker network
|
||||||
|
- **CLI overrides**: Change network on-the-fly without editing configs
|
||||||
|
- **Traefik integration**: Seamless reverse proxy setup with proper network awareness
|
||||||
|
- **Multi-network support**: Special stacks can have additional internal networks
|
||||||
|
|
||||||
|
### :icon{name="lucide:wrench"} Environment Control
|
||||||
|
- **Global overrides**: Set environment variables via CLI flags
|
||||||
|
- **Layered configs**: Root `.env` + stack `.env` + CLI overrides
|
||||||
|
- **Precedence rules**: CLI > Stack > Root configuration hierarchy
|
||||||
|
- **Real-time changes**: No need to edit files for temporary overrides
|
||||||
|
|
||||||
|
## Quick Start
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Start all stacks
|
||||||
|
./kompose.sh "*" up -d
|
||||||
|
|
||||||
|
# View logs from specific stacks
|
||||||
|
./kompose.sh "blog,news" logs -f
|
||||||
|
|
||||||
|
# Export all databases
|
||||||
|
./kompose.sh "*" db:export
|
||||||
|
|
||||||
|
# Override network for staging
|
||||||
|
./kompose.sh --network staging "*" up -d
|
||||||
|
```
|
||||||
|
|
||||||
|
## Documentation Sections
|
||||||
|
|
||||||
|
### Getting Started
|
||||||
|
- [Installation Guide](/installation) - Set up Kompose on your system
|
||||||
|
- [Quick Start](/guide/quick-start) - Get up and running in minutes
|
||||||
|
|
||||||
|
### User Guide
|
||||||
|
- [Stack Management](/guide/stack-management) - Managing multiple stacks
|
||||||
|
- [Database Operations](/guide/database) - Backup and restore databases
|
||||||
|
- [Hooks System](/guide/hooks) - Extend with custom hooks
|
||||||
|
- [Configuration](/guide/configuration) - Configure Kompose and stacks
|
||||||
|
- [Network Architecture](/guide/network) - Understanding networking
|
||||||
|
- [Troubleshooting](/guide/troubleshooting) - Common issues and solutions
|
||||||
|
|
||||||
|
### Stack Reference
|
||||||
|
- [All Stacks](/stacks) - Detailed documentation for each stack
|
||||||
|
|
||||||
|
### Reference
|
||||||
|
- [CLI Reference](/reference/cli) - Complete command reference
|
||||||
|
- [Environment Variables](/reference/environment) - All configuration options
|
||||||
@@ -1,10 +1,8 @@
|
|||||||
---
|
---
|
||||||
title: Installation Guide
|
title: Installation Guide
|
||||||
description: Step-by-step guide to install and set up Kompose on your system
|
description: Running on your system in just a few minutes.
|
||||||
---
|
---
|
||||||
|
|
||||||
# Installation Guide
|
|
||||||
|
|
||||||
Get Kompose up and running on your system in just a few minutes.
|
Get Kompose up and running on your system in just a few minutes.
|
||||||
|
|
||||||
## Prerequisites
|
## Prerequisites
|
||||||
@@ -237,10 +235,10 @@ sudo systemctl enable docker
|
|||||||
|
|
||||||
Now that Kompose is installed, you can:
|
Now that Kompose is installed, you can:
|
||||||
|
|
||||||
1. [Start with the Quick Start Guide](/docs/guide/quick-start)
|
1. [Start with the Quick Start Guide](/guide/quick-start)
|
||||||
2. [Learn about Stack Management](/docs/guide/stack-management)
|
2. [Learn about Stack Management](/guide/stack-management)
|
||||||
3. [Explore Database Operations](/docs/guide/database)
|
3. [Explore Database Operations](/guide/database)
|
||||||
4. [Set up Custom Hooks](/docs/guide/hooks)
|
4. [Set up Custom Hooks](/guide/hooks)
|
||||||
|
|
||||||
## Updating Kompose
|
## Updating Kompose
|
||||||
|
|
||||||
@@ -277,4 +275,4 @@ rm -rf /path/to/kompose
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
**Need Help?** Check out the [Troubleshooting Guide](/docs/guide/troubleshooting) or [open an issue](https://github.com/yourusername/kompose/issues) on GitHub.
|
**Need Help?** Check out the [Troubleshooting Guide](/guide/troubleshooting) or [open an issue](https://github.com/yourusername/kompose/issues) on GitHub.
|
||||||
@@ -3,8 +3,6 @@ title: Configuration
|
|||||||
description: Configure Kompose and your stacks
|
description: Configure Kompose and your stacks
|
||||||
---
|
---
|
||||||
|
|
||||||
# Configuration
|
|
||||||
|
|
||||||
### Root Configuration (`.env`)
|
### Root Configuration (`.env`)
|
||||||
|
|
||||||
Global settings shared across all stacks:
|
Global settings shared across all stacks:
|
||||||
@@ -3,27 +3,25 @@ title: Database Operations
|
|||||||
description: Export, import, and manage PostgreSQL databases
|
description: Export, import, and manage PostgreSQL databases
|
||||||
---
|
---
|
||||||
|
|
||||||
# Database Operations
|
|
||||||
|
|
||||||
- **Automated backups**: Export PostgreSQL databases with timestamped dumps
|
- **Automated backups**: Export PostgreSQL databases with timestamped dumps
|
||||||
- **Smart imports**: Auto-detect latest dumps or specify exact files
|
- **Smart imports**: Auto-detect latest dumps or specify exact files
|
||||||
- **Drop & recreate**: Safe database import with connection termination
|
- **Drop & recreate**: Safe database import with connection termination
|
||||||
- **Cleanup utilities**: Keep only the latest dumps, remove old backups
|
- **Cleanup utilities**: Keep only the latest dumps, remove old backups
|
||||||
- **Hook integration**: Custom pre/post operations for each database action
|
- **Hook integration**: Custom pre/post operations for each database action
|
||||||
|
|
||||||
### <img src="https://game-icons.net/icons/000000/transparent/1x1/lorc/meat-hook.svg" alt="hook" style="display:inline; width:1.2em; height:1.2em; vertical-align:-0.15em;"> Extensibility
|
### :icon{name="lucide:git-branch"} Extensibility
|
||||||
- **Custom hooks**: Define `pre_db_export`, `post_db_export`, `pre_db_import`, `post_db_import`
|
- **Custom hooks**: Define `pre_db_export`, `post_db_export`, `pre_db_import`, `post_db_import`
|
||||||
- **Stack-specific logic**: Each stack can have unique operational requirements
|
- **Stack-specific logic**: Each stack can have unique operational requirements
|
||||||
- **Environment access**: Hooks inherit all environment variables
|
- **Environment access**: Hooks inherit all environment variables
|
||||||
- **Dry-run aware**: Test hook execution without side effects
|
- **Dry-run aware**: Test hook execution without side effects
|
||||||
|
|
||||||
### <img src="https://game-icons.net/icons/000000/transparent/1x1/delapouite/globe.svg" alt="network" style="display:inline; width:1.2em; height:1.2em; vertical-align:-0.15em;"> Network Management
|
### :icon{name="lucide:globe"} Network Management
|
||||||
- **Unified network**: All stacks communicate on a single Docker network
|
- **Unified network**: All stacks communicate on a single Docker network
|
||||||
- **CLI overrides**: Change network on-the-fly without editing configs
|
- **CLI overrides**: Change network on-the-fly without editing configs
|
||||||
- **Traefik integration**: Seamless reverse proxy setup with proper network awareness
|
- **Traefik integration**: Seamless reverse proxy setup with proper network awareness
|
||||||
- **Multi-network support**: Special stacks can have additional internal networks
|
- **Multi-network support**: Special stacks can have additional internal networks
|
||||||
|
|
||||||
### <img src="https://game-icons.net/icons/000000/transparent/1x1/delapouite/wrench.svg" alt="tools" style="display:inline; width:1.2em; height:1.2em; vertical-align:-0.15em;"> Environment Control
|
### :icon{name="lucide:wrench"} Environment Control
|
||||||
- **Global overrides**: Set environment variables via CLI flags
|
- **Global overrides**: Set environment variables via CLI flags
|
||||||
- **Layered configs**: Root `.env` + stack `.env` + CLI overrides
|
- **Layered configs**: Root `.env` + stack `.env` + CLI overrides
|
||||||
- **Precedence rules**: CLI > Stack > Root configuration hierarchy
|
- **Precedence rules**: CLI > Stack > Root configuration hierarchy
|
||||||
@@ -3,8 +3,6 @@ title: Hooks System
|
|||||||
description: Extend Kompose with custom hooks
|
description: Extend Kompose with custom hooks
|
||||||
---
|
---
|
||||||
|
|
||||||
# Hooks System
|
|
||||||
|
|
||||||
Extend Kompose functionality with custom hooks for each stack.
|
Extend Kompose functionality with custom hooks for each stack.
|
||||||
|
|
||||||
### Available Hooks
|
### Available Hooks
|
||||||
@@ -77,14 +75,14 @@ The `sexy` stack uses hooks for Directus schema management:
|
|||||||
|
|
||||||
### Hook Best Practices
|
### Hook Best Practices
|
||||||
|
|
||||||
<img src="https://game-icons.net/icons/000000/transparent/1x1/delapouite/check-mark.svg" alt="check" style="display:inline; width:1.2em; height:1.2em; vertical-align:-0.15em;"> **DO:**
|
✅ **DO:**
|
||||||
- Return 0 for success, 1 for failure
|
- Return 0 for success, 1 for failure
|
||||||
- Use indented output: `echo " Message"`
|
- Use indented output: `echo " Message"`
|
||||||
- Make non-critical operations return 0
|
- Make non-critical operations return 0
|
||||||
- Check container status before `docker exec`
|
- Check container status before `docker exec`
|
||||||
- Test in dry-run mode first
|
- Test in dry-run mode first
|
||||||
|
|
||||||
<img src="https://game-icons.net/icons/000000/transparent/1x1/delapouite/cancel.svg" alt="cancel" style="display:inline; width:1.2em; height:1.2em; vertical-align:-0.15em;"> **DON'T:**
|
❌ **DON'T:**
|
||||||
- Assume containers are running
|
- Assume containers are running
|
||||||
- Use blocking operations without timeouts
|
- Use blocking operations without timeouts
|
||||||
- Forget error handling
|
- Forget error handling
|
||||||
27
Projects/kompose/docs/content/3.guide/index.md
Normal file
27
Projects/kompose/docs/content/3.guide/index.md
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
---
|
||||||
|
title: User Guide
|
||||||
|
description: Comprehensive guide to using Kompose
|
||||||
|
---
|
||||||
|
|
||||||
|
Learn everything you need to know about using Kompose effectively.
|
||||||
|
|
||||||
|
## Getting Started
|
||||||
|
|
||||||
|
- [Quick Start](/guide/quick-start) - Get up and running in minutes
|
||||||
|
- [Installation](/installation) - Detailed installation instructions
|
||||||
|
|
||||||
|
## Core Concepts
|
||||||
|
|
||||||
|
- [Stack Management](/guide/stack-management) - Managing multiple Docker Compose stacks
|
||||||
|
- [Database Operations](/guide/database) - Backup, restore, and maintain databases
|
||||||
|
- [Hooks System](/guide/hooks) - Extend functionality with custom hooks
|
||||||
|
- [Network Architecture](/guide/network) - Understanding networking in Kompose
|
||||||
|
|
||||||
|
## Configuration
|
||||||
|
|
||||||
|
- [Configuration Guide](/guide/configuration) - Configure Kompose and stacks
|
||||||
|
- [Environment Variables](/reference/environment) - All available environment variables
|
||||||
|
|
||||||
|
## Troubleshooting
|
||||||
|
|
||||||
|
- [Common Issues](/guide/troubleshooting) - Solutions to common problems
|
||||||
@@ -3,8 +3,6 @@ title: Network Architecture
|
|||||||
description: Understanding Kompose network design
|
description: Understanding Kompose network design
|
||||||
---
|
---
|
||||||
|
|
||||||
# Network Architecture
|
|
||||||
|
|
||||||
### Single Network Design
|
### Single Network Design
|
||||||
|
|
||||||
All stacks communicate through a unified Docker network:
|
All stacks communicate through a unified Docker network:
|
||||||
@@ -3,8 +3,6 @@ title: Quick Start
|
|||||||
description: Get started with Kompose in minutes
|
description: Get started with Kompose in minutes
|
||||||
---
|
---
|
||||||
|
|
||||||
# Quick Start
|
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Clone the repository
|
# Clone the repository
|
||||||
git clone https://github.com/yourusername/kompose.git
|
git clone https://github.com/yourusername/kompose.git
|
||||||
@@ -25,5 +23,5 @@ chmod +x kompose.sh
|
|||||||
# Export all databases
|
# Export all databases
|
||||||
./kompose.sh "*" db:export
|
./kompose.sh "*" db:export
|
||||||
|
|
||||||
# That's it! <img src="https://game-icons.net/icons/000000/transparent/1x1/delapouite/firework-rocket.svg" alt="celebration" style="display:inline; width:1.2em; height:1.2em; vertical-align:-0.15em;">
|
# That's it! :icon{name="lucide:party-popper"}
|
||||||
```
|
```
|
||||||
@@ -3,8 +3,6 @@ title: Stack Management
|
|||||||
description: Learn how to manage multiple Docker Compose stacks
|
description: Learn how to manage multiple Docker Compose stacks
|
||||||
---
|
---
|
||||||
|
|
||||||
# Stack Management
|
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Start stacks
|
# Start stacks
|
||||||
./kompose.sh <pattern> up -d
|
./kompose.sh <pattern> up -d
|
||||||
@@ -3,11 +3,9 @@ title: Troubleshooting
|
|||||||
description: Common issues and solutions
|
description: Common issues and solutions
|
||||||
---
|
---
|
||||||
|
|
||||||
# Troubleshooting
|
|
||||||
|
|
||||||
### Common Issues
|
### Common Issues
|
||||||
|
|
||||||
#### <img src="https://game-icons.net/icons/000000/transparent/1x1/delapouite/cancel.svg" alt="error" style="display:inline; width:1.2em; height:1.2em; vertical-align:-0.15em;"> 404 Error from Traefik
|
#### :icon{name="lucide:ban"} 404 Error from Traefik
|
||||||
|
|
||||||
**Problem:** Websites return 404 even though containers are running
|
**Problem:** Websites return 404 even though containers are running
|
||||||
|
|
||||||
@@ -33,7 +31,7 @@ http://your-server:8080
|
|||||||
docker inspect blog_app | grep traefik
|
docker inspect blog_app | grep traefik
|
||||||
```
|
```
|
||||||
|
|
||||||
#### <img src="https://game-icons.net/icons/000000/transparent/1x1/delapouite/save.svg" alt="database" style="display:inline; width:1.2em; height:1.2em; vertical-align:-0.15em;"> Database Import Fails
|
#### :icon{name="lucide:hard-drive"} Database Import Fails
|
||||||
|
|
||||||
**Problem:** `db:import` command fails
|
**Problem:** `db:import` command fails
|
||||||
|
|
||||||
@@ -55,7 +53,7 @@ ls -lh news/*.sql
|
|||||||
./kompose.sh news db:import 2>&1 | tee import.log
|
./kompose.sh news db:import 2>&1 | tee import.log
|
||||||
```
|
```
|
||||||
|
|
||||||
#### <img src="https://game-icons.net/icons/000000/transparent/1x1/delapouite/plug.svg" alt="connection" style="display:inline; width:1.2em; height:1.2em; vertical-align:-0.15em;"> Container Won't Connect to Network
|
#### :icon{name="lucide:plug"} Container Won't Connect to Network
|
||||||
|
|
||||||
**Problem:** Container fails to join kompose network
|
**Problem:** Container fails to join kompose network
|
||||||
|
|
||||||
@@ -70,7 +68,7 @@ docker network create kompose
|
|||||||
./kompose.sh "*" up -d
|
./kompose.sh "*" up -d
|
||||||
```
|
```
|
||||||
|
|
||||||
#### <img src="https://game-icons.net/icons/000000/transparent/1x1/lorc/meat-hook.svg" alt="hook" style="display:inline; width:1.2em; height:1.2em; vertical-align:-0.15em;"> Hooks Not Executing
|
#### :icon{name="lucide:git-branch"} Hooks Not Executing
|
||||||
|
|
||||||
**Problem:** Custom hooks aren't running
|
**Problem:** Custom hooks aren't running
|
||||||
|
|
||||||
@@ -3,8 +3,6 @@ title: CLI Reference
|
|||||||
description: Complete command-line interface reference
|
description: Complete command-line interface reference
|
||||||
---
|
---
|
||||||
|
|
||||||
# CLI Reference
|
|
||||||
|
|
||||||
Complete reference for all Kompose CLI commands and options.
|
Complete reference for all Kompose CLI commands and options.
|
||||||
|
|
||||||
## Synopsis
|
## Synopsis
|
||||||
@@ -116,7 +114,7 @@ Import PostgreSQL database from SQL dump file.
|
|||||||
./kompose.sh <stack> db:import path/to/dump.sql
|
./kompose.sh <stack> db:import path/to/dump.sql
|
||||||
```
|
```
|
||||||
|
|
||||||
**<img src="https://game-icons.net/icons/000000/transparent/1x1/delapouite/warning-sign.svg" alt="warning" style="display:inline; width:1.2em; height:1.2em; vertical-align:-0.15em;"> WARNING:** Drops and recreates the database!
|
**:icon{name="lucide:alert-triangle"} WARNING:** Drops and recreates the database!
|
||||||
|
|
||||||
### db:cleanup
|
### db:cleanup
|
||||||
|
|
||||||
@@ -3,8 +3,6 @@ title: Environment Variables
|
|||||||
description: Complete reference for all environment variables
|
description: Complete reference for all environment variables
|
||||||
---
|
---
|
||||||
|
|
||||||
# Environment Variables
|
|
||||||
|
|
||||||
Complete reference for all environment variables used in Kompose.
|
Complete reference for all environment variables used in Kompose.
|
||||||
|
|
||||||
## Global Variables
|
## Global Variables
|
||||||
@@ -107,17 +105,17 @@ DB_HOST=news-postgres # Overrides root
|
|||||||
|
|
||||||
### Security
|
### Security
|
||||||
|
|
||||||
- <img src="https://game-icons.net/icons/000000/transparent/1x1/delapouite/check-mark.svg" alt="check" style="display:inline; width:1.2em; height:1.2em; vertical-align:-0.15em;"> Use strong, random passwords
|
- ✅ Use strong, random passwords
|
||||||
- <img src="https://game-icons.net/icons/000000/transparent/1x1/delapouite/check-mark.svg" alt="check" style="display:inline; width:1.2em; height:1.2em; vertical-align:-0.15em;"> Never commit `.env` files to version control
|
- ✅ Never commit `.env` files to version control
|
||||||
- <img src="https://game-icons.net/icons/000000/transparent/1x1/delapouite/check-mark.svg" alt="check" style="display:inline; width:1.2em; height:1.2em; vertical-align:-0.15em;"> Use `.env.example` as template
|
- ✅ Use `.env.example` as template
|
||||||
- <img src="https://game-icons.net/icons/000000/transparent/1x1/delapouite/check-mark.svg" alt="check" style="display:inline; width:1.2em; height:1.2em; vertical-align:-0.15em;"> Rotate secrets regularly
|
- ✅ Rotate secrets regularly
|
||||||
|
|
||||||
### Organization
|
### Organization
|
||||||
|
|
||||||
- <img src="https://game-icons.net/icons/000000/transparent/1x1/delapouite/check-mark.svg" alt="check" style="display:inline; width:1.2em; height:1.2em; vertical-align:-0.15em;"> Document custom variables
|
- ✅ Document custom variables
|
||||||
- <img src="https://game-icons.net/icons/000000/transparent/1x1/delapouite/check-mark.svg" alt="check" style="display:inline; width:1.2em; height:1.2em; vertical-align:-0.15em;"> Group related variables
|
- ✅ Group related variables
|
||||||
- <img src="https://game-icons.net/icons/000000/transparent/1x1/delapouite/check-mark.svg" alt="check" style="display:inline; width:1.2em; height:1.2em; vertical-align:-0.15em;"> Use consistent naming
|
- ✅ Use consistent naming
|
||||||
- <img src="https://game-icons.net/icons/000000/transparent/1x1/delapouite/check-mark.svg" alt="check" style="display:inline; width:1.2em; height:1.2em; vertical-align:-0.15em;"> Keep defaults in root `.env`
|
- ✅ Keep defaults in root `.env`
|
||||||
|
|
||||||
## Generating Secrets
|
## Generating Secrets
|
||||||
|
|
||||||
26
Projects/kompose/docs/content/4.reference/index.md
Normal file
26
Projects/kompose/docs/content/4.reference/index.md
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
---
|
||||||
|
title: Reference Documentation
|
||||||
|
description: Complete reference documentation for Kompose
|
||||||
|
---
|
||||||
|
|
||||||
|
Complete reference documentation for all aspects of Kompose.
|
||||||
|
|
||||||
|
## Command Line
|
||||||
|
|
||||||
|
- [CLI Reference](/reference/cli) - All commands and options
|
||||||
|
- [Stack Patterns](/reference/cli#stack-patterns) - Pattern matching syntax
|
||||||
|
|
||||||
|
## Configuration
|
||||||
|
|
||||||
|
- [Environment Variables](/reference/environment) - All environment variables
|
||||||
|
- [Configuration Files](/guide/configuration) - File structure and precedence
|
||||||
|
|
||||||
|
## Stack Reference
|
||||||
|
|
||||||
|
- [Stack Documentation](/stacks) - Detailed docs for each stack
|
||||||
|
|
||||||
|
## Advanced Topics
|
||||||
|
|
||||||
|
- [Network Architecture](/guide/network) - Network design and configuration
|
||||||
|
- [Hook System](/guide/hooks) - Writing custom hooks
|
||||||
|
- [Database Operations](/guide/database) - Advanced database management
|
||||||
145
Projects/kompose/docs/content/5.stacks/auth.md
Normal file
145
Projects/kompose/docs/content/5.stacks/auth.md
Normal file
@@ -0,0 +1,145 @@
|
|||||||
|
---
|
||||||
|
title: Auth - The Bouncer at Your Digital Club
|
||||||
|
description: "You shall not pass... without proper credentials!"
|
||||||
|
navigation:
|
||||||
|
icon: i-lucide-lock-keyhole
|
||||||
|
---
|
||||||
|
|
||||||
|
> *"You shall not pass... without proper credentials!"* - Keycloak, probably
|
||||||
|
|
||||||
|
## What's This All About?
|
||||||
|
|
||||||
|
This stack is your authentication and identity management powerhouse. Think of it as the super-sophisticated bouncer for all your services - checking IDs, managing VIP lists, and making sure only the cool kids (authorized users) get into your digital club.
|
||||||
|
|
||||||
|
## The Star of the Show
|
||||||
|
|
||||||
|
### :icon{name="lucide:drama"} Keycloak
|
||||||
|
|
||||||
|
**Container**: `auth_keycloak`
|
||||||
|
**Image**: `quay.io/keycloak/keycloak:latest`
|
||||||
|
**Home**: https://auth.pivoine.art
|
||||||
|
|
||||||
|
Keycloak is like having a Swiss Army knife for authentication. It handles:
|
||||||
|
- :icon{name="lucide:user"} **Single Sign-On (SSO)**: Log in once, access everything. Magic!
|
||||||
|
- :icon{name="lucide:ticket"} **Identity Brokering**: Connect with Google, GitHub, and other OAuth providers
|
||||||
|
- :icon{name="lucide:users"} **User Management**: Keep track of who's who in your digital zoo
|
||||||
|
- :icon{name="lucide:lock"} **OAuth 2.0 & OpenID Connect**: Industry-standard security protocols (the fancy stuff)
|
||||||
|
- :icon{name="lucide:shield"} **Authorization Services**: Fine-grained control over who can do what
|
||||||
|
|
||||||
|
## Configuration Breakdown
|
||||||
|
|
||||||
|
### Database Connection
|
||||||
|
Keycloak stores all its secrets (not literally, they're hashed!) in PostgreSQL:
|
||||||
|
```
|
||||||
|
Database: keycloak
|
||||||
|
Host: Shared data stack (postgres)
|
||||||
|
```
|
||||||
|
|
||||||
|
### Admin Access
|
||||||
|
**Username**: `admin` (creative, right?)
|
||||||
|
**Password**: Check your `.env` file (and change it, please!)
|
||||||
|
|
||||||
|
### Proxy Mode
|
||||||
|
Running in `edge` mode because we're living on the edge (behind Traefik)! This tells Keycloak to trust the proxy headers for HTTPS and hostname info.
|
||||||
|
|
||||||
|
## How It Works
|
||||||
|
|
||||||
|
1. **Startup**: Keycloak boots up and connects to the PostgreSQL database
|
||||||
|
2. **Health Check**: Every 30 seconds, it's like "Hey, I'm still alive!" (/health endpoint)
|
||||||
|
3. **Proxy Magic**: Traefik routes `https://auth.pivoine.art` → Keycloak
|
||||||
|
4. **SSL Termination**: Traefik handles HTTPS, Keycloak just chills on HTTP internally
|
||||||
|
|
||||||
|
## Environment Variables Explained
|
||||||
|
|
||||||
|
| Variable | What It Does | Cool Factor |
|
||||||
|
|----------|-------------|-------------|
|
||||||
|
| `KC_DB` | Database type (postgres) | :icon{name="simple-icons:postgresql"} Elephants never forget |
|
||||||
|
| `KC_DB_URL` | JDBC connection string | :icon{name="lucide:plug"} The digital umbilical cord |
|
||||||
|
| `KC_HOSTNAME` | Public-facing URL | :icon{name="lucide:globe"} Your internet identity |
|
||||||
|
| `KC_PROXY` | Proxy mode setting | :icon{name="lucide:drama"} Trust the middleman |
|
||||||
|
| `KC_FEATURES` | Enabled features (docker) | 🐳 Whale hello there! |
|
||||||
|
|
||||||
|
## Ports & Networking
|
||||||
|
|
||||||
|
- **Internal Port**: 8080 (Keycloak's cozy home)
|
||||||
|
- **External Access**: Via Traefik at https://auth.pivoine.art
|
||||||
|
- **Network**: `kompose` (the gang's all here)
|
||||||
|
|
||||||
|
## Health & Monitoring
|
||||||
|
|
||||||
|
Keycloak does a self-check every 30 seconds:
|
||||||
|
```bash
|
||||||
|
curl -f http://localhost:8080/health
|
||||||
|
```
|
||||||
|
If it doesn't respond within 5 seconds or fails 3 times in a row, Docker knows something's up and will restart it (like turning it off and on again, but automated).
|
||||||
|
|
||||||
|
## Common Tasks
|
||||||
|
|
||||||
|
### Access the Admin Console
|
||||||
|
```
|
||||||
|
URL: https://auth.pivoine.art
|
||||||
|
Login: Your admin credentials from .env
|
||||||
|
```
|
||||||
|
|
||||||
|
### View Logs
|
||||||
|
```bash
|
||||||
|
docker logs auth_keycloak -f
|
||||||
|
```
|
||||||
|
|
||||||
|
### Restart After Config Changes
|
||||||
|
```bash
|
||||||
|
docker compose restart
|
||||||
|
```
|
||||||
|
|
||||||
|
### Connect a New Application
|
||||||
|
1. Log into Keycloak admin console
|
||||||
|
2. Create a new Client
|
||||||
|
3. Configure redirect URIs
|
||||||
|
4. Grab your client ID and secret
|
||||||
|
5. Integrate with your app (check Keycloak docs)
|
||||||
|
|
||||||
|
## Integration Tips
|
||||||
|
|
||||||
|
When integrating other services with Keycloak:
|
||||||
|
- **Discovery URL**: `https://auth.pivoine.art/realms/{realm}/.well-known/openid-configuration`
|
||||||
|
- **Default Realm**: Usually "master" but create your own!
|
||||||
|
- **Client Types**: Public (SPAs), Confidential (Backend apps)
|
||||||
|
|
||||||
|
## Troubleshooting
|
||||||
|
|
||||||
|
**Q: Can't log in to admin console?**
|
||||||
|
A: Check your `KC_ADMIN_USERNAME` and `KC_ADMIN_PASSWORD` in `.env`
|
||||||
|
|
||||||
|
**Q: Getting SSL errors?**
|
||||||
|
A: Make sure `KC_HOSTNAME` matches your Traefik setup
|
||||||
|
|
||||||
|
**Q: Changes not taking effect?**
|
||||||
|
A: Clear your browser cache, Keycloak loves to cache things
|
||||||
|
|
||||||
|
**Q: Database connection issues?**
|
||||||
|
A: Ensure the `data` stack is running and healthy
|
||||||
|
|
||||||
|
## Security Notes :icon{name="lucide:lock"}
|
||||||
|
|
||||||
|
- :icon{name="lucide:siren"} **Change the default admin password** (seriously, do it now)
|
||||||
|
- :icon{name="lucide:lock-keyhole"} Database credentials are shared via root `.env`
|
||||||
|
- :icon{name="lucide:globe"} Always access via HTTPS in production
|
||||||
|
- :icon{name="lucide:file-text"} Enable audit logging for compliance
|
||||||
|
- :icon{name="lucide:target"} Use realms to separate different applications/teams
|
||||||
|
|
||||||
|
## Fun Facts
|
||||||
|
|
||||||
|
- Keycloak is maintained by Red Hat (yeah, the Linux people!)
|
||||||
|
- It supports social login with Google, Facebook, GitHub, and more
|
||||||
|
- You can theme it to match your brand (goodbye boring login pages!)
|
||||||
|
- It handles thousands of users without breaking a sweat
|
||||||
|
|
||||||
|
## Resources
|
||||||
|
|
||||||
|
- [Keycloak Documentation](https://www.keycloak.org/documentation)
|
||||||
|
- [Getting Started Guide](https://www.keycloak.org/guides#getting-started)
|
||||||
|
- [Admin REST API](https://www.keycloak.org/docs-api/latest/rest-api/)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
*Remember: With great authentication power comes great responsibility. Don't be the person who uses "admin/admin" in production.* :icon{name="lucide:shield-check"}
|
||||||
@@ -1,10 +1,10 @@
|
|||||||
---
|
---
|
||||||
title: <20> Auto Stack - Your Ansible Automation Wingman
|
title: Auto - Ansible Automation Wingman
|
||||||
description: "Automating the boring stuff since... well, today!"
|
description: "Automating the boring stuff since... well, today!"
|
||||||
|
navigation:
|
||||||
|
icon: i-lucide-bot
|
||||||
---
|
---
|
||||||
|
|
||||||
# 🤖 Auto Stack - Your Ansible Automation Wingman
|
|
||||||
|
|
||||||
> *"Automating the boring stuff since... well, today!"* - Semaphore UI
|
> *"Automating the boring stuff since... well, today!"* - Semaphore UI
|
||||||
|
|
||||||
## What's This All About?
|
## What's This All About?
|
||||||
@@ -13,7 +13,7 @@ This is your command center for Ansible automation! Semaphore UI is like having
|
|||||||
|
|
||||||
## The Dream Team
|
## The Dream Team
|
||||||
|
|
||||||
### 🎯 Semaphore UI
|
### :icon{name="lucide:target"} Semaphore UI
|
||||||
|
|
||||||
**Container**: `auto_app`
|
**Container**: `auto_app`
|
||||||
**Image**: `semaphoreui/semaphore:v2.16.18`
|
**Image**: `semaphoreui/semaphore:v2.16.18`
|
||||||
@@ -21,12 +21,12 @@ This is your command center for Ansible automation! Semaphore UI is like having
|
|||||||
**Home**: http://localhost:3000 (Traefik labels commented out - local access only for now!)
|
**Home**: http://localhost:3000 (Traefik labels commented out - local access only for now!)
|
||||||
|
|
||||||
Semaphore is the fancy GUI wrapper around Ansible that makes you look like a DevOps wizard:
|
Semaphore is the fancy GUI wrapper around Ansible that makes you look like a DevOps wizard:
|
||||||
- 📋 **Project Management**: Organize your playbooks like a boss
|
- :icon{name="lucide:clipboard"} **Project Management**: Organize your playbooks like a boss
|
||||||
- 🎮 **Job Execution**: Run Ansible tasks with a click
|
- :icon{name="lucide:gamepad-2"} **Job Execution**: Run Ansible tasks with a click
|
||||||
- 📊 **Task Monitoring**: Watch your automation in real-time
|
- :icon{name="lucide:bar-chart"} **Task Monitoring**: Watch your automation in real-time
|
||||||
- 📧 **Email Alerts**: Get notified when things succeed (or explode)
|
- :icon{name="lucide:mail"} **Email Alerts**: Get notified when things succeed (or explode)
|
||||||
- 🔐 **User Management**: Team collaboration without the chaos
|
- :icon{name="lucide:lock-keyhole"} **User Management**: Team collaboration without the chaos
|
||||||
- 📜 **Audit Logs**: Know who deployed what and when
|
- :icon{name="lucide:scroll"} **Audit Logs**: Know who deployed what and when
|
||||||
|
|
||||||
### 🏃♂️ Semaphore Runner
|
### 🏃♂️ Semaphore Runner
|
||||||
|
|
||||||
@@ -65,10 +65,10 @@ Configured to send alerts via SMTP when tasks complete. Perfect for those "deplo
|
|||||||
|
|
||||||
| Variable | What It Does | Why You Care |
|
| Variable | What It Does | Why You Care |
|
||||||
|----------|-------------|--------------|
|
|----------|-------------|--------------|
|
||||||
| `SEMAPHORE_DB_*` | PostgreSQL connection | 🐘 Where memories live |
|
| `SEMAPHORE_DB_*` | PostgreSQL connection | :icon{name="simple-icons:postgresql"} Where memories live |
|
||||||
| `SEMAPHORE_ADMIN` | Admin username | 👑 The supreme commander |
|
| `SEMAPHORE_ADMIN` | Admin username | 👑 The supreme commander |
|
||||||
| `SEMAPHORE_EMAIL_*` | SMTP settings | 📧 "Your deploy finished!" |
|
| `SEMAPHORE_EMAIL_*` | SMTP settings | :icon{name="lucide:mail"} "Your deploy finished!" |
|
||||||
| `SEMAPHORE_RUNNER_REGISTRATION_TOKEN` | Runner auth token | 🎫 Runner's VIP pass |
|
| `SEMAPHORE_RUNNER_REGISTRATION_TOKEN` | Runner auth token | :icon{name="lucide:ticket"} Runner's VIP pass |
|
||||||
|
|
||||||
## Ports & Networking
|
## Ports & Networking
|
||||||
|
|
||||||
@@ -170,15 +170,15 @@ A: Double-check SMTP settings in `.env` file
|
|||||||
**Q: Can't log in?**
|
**Q: Can't log in?**
|
||||||
A: Default is `admin`/`changeme` - check if you changed it and forgot!
|
A: Default is `admin`/`changeme` - check if you changed it and forgot!
|
||||||
|
|
||||||
## Security Tips 🔒
|
## Security Tips :icon{name="lucide:lock"}
|
||||||
|
|
||||||
- 🔑 Store SSH keys properly (private keys in Semaphore, never in repos)
|
- :icon{name="lucide:key"} Store SSH keys properly (private keys in Semaphore, never in repos)
|
||||||
- 🔐 Use Ansible Vault for sensitive variables
|
- :icon{name="lucide:lock-keyhole"} Use Ansible Vault for sensitive variables
|
||||||
- 👥 Create individual user accounts (don't share the admin account)
|
- :icon{name="lucide:users"} Create individual user accounts (don't share the admin account)
|
||||||
- 📝 Review audit logs regularly
|
- :icon{name="lucide:file-text"} Review audit logs regularly
|
||||||
- 🚫 Don't store passwords in plain text in playbooks
|
- :icon{name="lucide:ban"} Don't store passwords in plain text in playbooks
|
||||||
|
|
||||||
## Pro Tips 💡
|
## Pro Tips :icon{name="lucide:lightbulb"}
|
||||||
|
|
||||||
1. **Use Surveys**: Create web forms for playbook variables (great for non-technical users)
|
1. **Use Surveys**: Create web forms for playbook variables (great for non-technical users)
|
||||||
2. **Schedule Tasks**: Set up cron-like scheduling for regular maintenance
|
2. **Schedule Tasks**: Set up cron-like scheduling for regular maintenance
|
||||||
@@ -196,11 +196,11 @@ A: Default is `admin`/`changeme` - check if you changed it and forgot!
|
|||||||
|
|
||||||
## Why Semaphore is Awesome
|
## Why Semaphore is Awesome
|
||||||
|
|
||||||
- ✨ Makes Ansible actually fun to use
|
- :icon{name="lucide:sparkles"} Makes Ansible actually fun to use
|
||||||
- 🎨 Beautiful, modern interface
|
- :icon{name="lucide:palette"} Beautiful, modern interface
|
||||||
- 🔄 Task history and versioning
|
- :icon{name="lucide:refresh-cw"} Task history and versioning
|
||||||
- 👁️ Real-time execution logs
|
- 👁️ Real-time execution logs
|
||||||
- 🎯 RBAC (Role-Based Access Control)
|
- :icon{name="lucide:target"} RBAC (Role-Based Access Control)
|
||||||
- 🆓 Open source and free
|
- 🆓 Open source and free
|
||||||
|
|
||||||
## Resources
|
## Resources
|
||||||
@@ -211,4 +211,4 @@ A: Default is `admin`/`changeme` - check if you changed it and forgot!
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
*"Automation is not about replacing humans, it's about freeing them to do more interesting things. Like browsing memes while your servers configure themselves."* 🤖✨
|
*"Automation is not about replacing humans, it's about freeing them to do more interesting things. Like browsing memes while your servers configure themselves."* :icon{name="lucide:bot"}:icon{name="lucide:sparkles"}
|
||||||
@@ -1,30 +1,30 @@
|
|||||||
---
|
---
|
||||||
title: Blog Stack - Your Lightning-Fast Static Site Delivery
|
title: Blog - Lightning-Fast Static Site Delivery
|
||||||
description: "Speed is my middle name"
|
description: "Speed is my middle name"
|
||||||
|
navigation:
|
||||||
|
icon: i-lucide-file-text
|
||||||
---
|
---
|
||||||
|
|
||||||
# 📝 Blog Stack - Your Lightning-Fast Static Site Delivery
|
|
||||||
|
|
||||||
> *"Speed is my middle name"* - Static Web Server
|
> *"Speed is my middle name"* - Static Web Server
|
||||||
|
|
||||||
## What's This All About?
|
## What's This All About?
|
||||||
|
|
||||||
This stack serves your static blog with the speed of a caffeinated cheetah! It's a blazing-fast static web server written in Rust 🦀, serving pre-built HTML, CSS, and JavaScript files without any server-side processing overhead.
|
This stack serves your static blog with the speed of a caffeinated cheetah! It's a blazing-fast static web server written in Rust :icon{name="simple-icons:rust"}, serving pre-built HTML, CSS, and JavaScript files without any server-side processing overhead.
|
||||||
|
|
||||||
## The Speed Demon
|
## The Speed Demon
|
||||||
|
|
||||||
### ⚡ Static Web Server
|
### :icon{name="lucide:zap"} Static Web Server
|
||||||
|
|
||||||
**Container**: `blog_app`
|
**Container**: `blog_app`
|
||||||
**Image**: `joseluisq/static-web-server:latest`
|
**Image**: `joseluisq/static-web-server:latest`
|
||||||
**Home**: https://pivoine.art
|
**Home**: https://pivoine.art
|
||||||
|
|
||||||
Think of this as nginx's cooler, faster cousin who runs marathons in their spare time:
|
Think of this as nginx's cooler, faster cousin who runs marathons in their spare time:
|
||||||
- 🚀 **Blazing Fast**: Written in Rust for maximum performance
|
- :icon{name="lucide:rocket"} **Blazing Fast**: Written in Rust for maximum performance
|
||||||
- 📦 **Tiny Footprint**: Minimal resource usage
|
- :icon{name="lucide:package"} **Tiny Footprint**: Minimal resource usage
|
||||||
- 🎯 **Simple**: Does one thing really, really well
|
- :icon{name="lucide:target"} **Simple**: Does one thing really, really well
|
||||||
- 🔒 **Secure**: No dynamic code execution means fewer attack vectors
|
- :icon{name="lucide:lock"} **Secure**: No dynamic code execution means fewer attack vectors
|
||||||
- 📊 **HTTP/2**: Modern protocol support for faster loading
|
- :icon{name="lucide:bar-chart"} **HTTP/2**: Modern protocol support for faster loading
|
||||||
|
|
||||||
## Architecture
|
## Architecture
|
||||||
|
|
||||||
@@ -52,7 +52,7 @@ This means you can update your blog by just replacing files on the host! No cont
|
|||||||
### No Health Check? No Problem!
|
### No Health Check? No Problem!
|
||||||
Static web servers are so simple and reliable that Docker health checks aren't really necessary. Traefik can tell if it's alive by checking the port - if it responds, it's healthy!
|
Static web servers are so simple and reliable that Docker health checks aren't really necessary. Traefik can tell if it's alive by checking the port - if it responds, it's healthy!
|
||||||
|
|
||||||
## Traefik Magic 🎩✨
|
## Traefik Magic :icon{name="lucide:hat"}:icon{name="lucide:sparkles"}
|
||||||
|
|
||||||
All the routing is handled by Traefik labels:
|
All the routing is handled by Traefik labels:
|
||||||
- **HTTP → HTTPS**: Automatic redirect for security
|
- **HTTP → HTTPS**: Automatic redirect for security
|
||||||
@@ -76,29 +76,29 @@ All the routing is handled by Traefik labels:
|
|||||||
|
|
||||||
3. **That's it!** The server automatically serves the new content
|
3. **That's it!** The server automatically serves the new content
|
||||||
|
|
||||||
No restarts, no cache clearing, no drama! 🎭
|
No restarts, no cache clearing, no drama! :icon{name="lucide:drama"}
|
||||||
|
|
||||||
## What Makes Static Sites Awesome
|
## What Makes Static Sites Awesome
|
||||||
|
|
||||||
### Speed 🏎️
|
### Speed :icon{name="lucide:car"}
|
||||||
- No database queries
|
- No database queries
|
||||||
- No server-side rendering
|
- No server-side rendering
|
||||||
- Just pure file serving
|
- Just pure file serving
|
||||||
- CDN-friendly
|
- CDN-friendly
|
||||||
|
|
||||||
### Security 🔒
|
### Security :icon{name="lucide:lock"}
|
||||||
- No SQL injection
|
- No SQL injection
|
||||||
- No XSS vulnerabilities (from server)
|
- No XSS vulnerabilities (from server)
|
||||||
- No admin panel to hack
|
- No admin panel to hack
|
||||||
- No WordPress updates to forget
|
- No WordPress updates to forget
|
||||||
|
|
||||||
### Cost 💰
|
### Cost :icon{name="lucide:dollar-sign"}
|
||||||
- Minimal server resources
|
- Minimal server resources
|
||||||
- Can handle huge traffic spikes
|
- Can handle huge traffic spikes
|
||||||
- No expensive database servers
|
- No expensive database servers
|
||||||
- Can run on a potato (almost)
|
- Can run on a potato (almost)
|
||||||
|
|
||||||
### Reliability 🎯
|
### Reliability :icon{name="lucide:target"}
|
||||||
- Nothing to break
|
- Nothing to break
|
||||||
- Nothing to update constantly
|
- Nothing to update constantly
|
||||||
- No dependency conflicts
|
- No dependency conflicts
|
||||||
@@ -112,7 +112,7 @@ No restarts, no cache clearing, no drama! 🎭
|
|||||||
|
|
||||||
## Common Static Site Generators
|
## Common Static Site Generators
|
||||||
|
|
||||||
### Hugo 🚀
|
### Hugo :icon{name="lucide:rocket"}
|
||||||
The speed champion, written in Go
|
The speed champion, written in Go
|
||||||
```bash
|
```bash
|
||||||
hugo new site myblog
|
hugo new site myblog
|
||||||
@@ -121,7 +121,7 @@ hugo server -D
|
|||||||
hugo build
|
hugo build
|
||||||
```
|
```
|
||||||
|
|
||||||
### Jekyll 💎
|
### Jekyll :icon{name="simple-icons:ruby"}
|
||||||
The Ruby classic, GitHub Pages favorite
|
The Ruby classic, GitHub Pages favorite
|
||||||
```bash
|
```bash
|
||||||
jekyll new myblog
|
jekyll new myblog
|
||||||
@@ -129,7 +129,7 @@ jekyll serve
|
|||||||
jekyll build
|
jekyll build
|
||||||
```
|
```
|
||||||
|
|
||||||
### Gatsby ⚛️
|
### Gatsby :icon{name="simple-icons:react"}
|
||||||
React-based, GraphQL-powered
|
React-based, GraphQL-powered
|
||||||
```bash
|
```bash
|
||||||
gatsby new myblog
|
gatsby new myblog
|
||||||
@@ -137,13 +137,13 @@ gatsby develop
|
|||||||
gatsby build
|
gatsby build
|
||||||
```
|
```
|
||||||
|
|
||||||
### 11ty (Eleventy) 🎈
|
### 11ty (Eleventy) :icon{name="lucide:heart"}
|
||||||
Simple, JavaScript-based
|
Simple, JavaScript-based
|
||||||
```bash
|
```bash
|
||||||
npx @11ty/eleventy
|
npx @11ty/eleventy
|
||||||
```
|
```
|
||||||
|
|
||||||
## Performance Tips 💡
|
## Performance Tips :icon{name="lucide:lightbulb"}
|
||||||
|
|
||||||
1. **Image Optimization**: Use WebP or AVIF formats
|
1. **Image Optimization**: Use WebP or AVIF formats
|
||||||
2. **Minification**: Compress CSS, JS, HTML
|
2. **Minification**: Compress CSS, JS, HTML
|
||||||
@@ -185,7 +185,7 @@ A: Static sites are rarely slow - check your image sizes and network
|
|||||||
**Q: Can't access the site?**
|
**Q: Can't access the site?**
|
||||||
A: Verify Traefik is running and DNS points to your server
|
A: Verify Traefik is running and DNS points to your server
|
||||||
|
|
||||||
## Security Considerations 🛡️
|
## Security Considerations :icon{name="lucide:shield"}
|
||||||
|
|
||||||
✅ **Good News**: Static sites are inherently secure
|
✅ **Good News**: Static sites are inherently secure
|
||||||
✅ **HTTPS**: Handled by Traefik with automatic certificates
|
✅ **HTTPS**: Handled by Traefik with automatic certificates
|
||||||
@@ -215,13 +215,13 @@ Create a `404.html` in your static site root:
|
|||||||
|
|
||||||
The server will automatically use it for missing pages!
|
The server will automatically use it for missing pages!
|
||||||
|
|
||||||
## Content Ideas for Your Blog 📚
|
## Content Ideas for Your Blog :icon{name="lucide:book-open"}
|
||||||
|
|
||||||
- 💻 Tech tutorials and guides
|
- :icon{name="lucide:laptop"} Tech tutorials and guides
|
||||||
- 🎨 Design showcases and portfolios
|
- :icon{name="lucide:palette"} Design showcases and portfolios
|
||||||
- 📝 Personal thoughts and experiences
|
- :icon{name="lucide:file-text"} Personal thoughts and experiences
|
||||||
- 🔧 Project documentation
|
- :icon{name="lucide:wrench"} Project documentation
|
||||||
- 🎯 Case studies and success stories
|
- :icon{name="lucide:target"} Case studies and success stories
|
||||||
- 🌟 Whatever makes your heart sing!
|
- 🌟 Whatever makes your heart sing!
|
||||||
|
|
||||||
## Fun Facts
|
## Fun Facts
|
||||||
@@ -240,4 +240,4 @@ The server will automatically use it for missing pages!
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
*"The fastest code is the code that doesn't run. The fastest server is the one that just serves files."* - Ancient DevOps Wisdom 📜
|
*"The fastest code is the code that doesn't run. The fastest server is the one that just serves files."* - Ancient DevOps Wisdom :icon{name="lucide:scroll"}
|
||||||
@@ -1,10 +1,10 @@
|
|||||||
---
|
---
|
||||||
title: ⛓ Chain Stack - Workflow Automation Powerhouse
|
title: Chain - Workflow Automation Powerhouse
|
||||||
description: "If you can dream it, you can automate it!"
|
description: "If you can dream it, you can automate it!"
|
||||||
|
navigation:
|
||||||
|
icon: i-lucide-link-2
|
||||||
---
|
---
|
||||||
|
|
||||||
# ⛓️ Chain Stack - Workflow Automation Powerhouse
|
|
||||||
|
|
||||||
> *"If you can dream it, you can automate it!"* - n8n philosophy
|
> *"If you can dream it, you can automate it!"* - n8n philosophy
|
||||||
|
|
||||||
## What's This All About?
|
## What's This All About?
|
||||||
@@ -13,7 +13,7 @@ This stack is your automation Swiss Army knife! n8n lets you connect different a
|
|||||||
|
|
||||||
## The Star of the Show
|
## The Star of the Show
|
||||||
|
|
||||||
### ⚡ n8n
|
### :icon{name="lucide:zap"} n8n
|
||||||
|
|
||||||
**Container**: `chain_app`
|
**Container**: `chain_app`
|
||||||
**Image**: `n8nio/n8n:latest`
|
**Image**: `n8nio/n8n:latest`
|
||||||
@@ -21,14 +21,14 @@ This stack is your automation Swiss Army knife! n8n lets you connect different a
|
|||||||
**Port**: 5678
|
**Port**: 5678
|
||||||
|
|
||||||
n8n is workflow automation done right:
|
n8n is workflow automation done right:
|
||||||
- 🔌 **400+ Integrations**: Connect virtually anything
|
- :icon{name="lucide:plug"} **400+ Integrations**: Connect virtually anything
|
||||||
- 🎨 **Visual Builder**: Drag-and-drop workflow creation
|
- :icon{name="lucide:palette"} **Visual Builder**: Drag-and-drop workflow creation
|
||||||
- 💻 **Code Nodes**: Write JavaScript when you need it
|
- :icon{name="lucide:laptop"} **Code Nodes**: Write JavaScript when you need it
|
||||||
- 🪝 **Webhooks**: Trigger workflows from anywhere
|
- :icon{name="lucide:git-branch"} **Webhooks**: Trigger workflows from anywhere
|
||||||
- ⏰ **Scheduling**: Cron-style automation
|
- :icon{name="lucide:clock"} **Scheduling**: Cron-style automation
|
||||||
- 📊 **Data Transformation**: Powerful data manipulation
|
- :icon{name="lucide:bar-chart"} **Data Transformation**: Powerful data manipulation
|
||||||
- 🔄 **Error Handling**: Retry logic and fallbacks
|
- :icon{name="lucide:refresh-cw"} **Error Handling**: Retry logic and fallbacks
|
||||||
- 📝 **Version Control**: Export workflows as JSON
|
- :icon{name="lucide:file-text"} **Version Control**: Export workflows as JSON
|
||||||
|
|
||||||
## Configuration Breakdown
|
## Configuration Breakdown
|
||||||
|
|
||||||
@@ -39,12 +39,12 @@ Database: n8n
|
|||||||
Host: Shared data stack (postgres)
|
Host: Shared data stack (postgres)
|
||||||
```
|
```
|
||||||
|
|
||||||
### Basic Auth 🔒
|
### Basic Auth :icon{name="lucide:lock"}
|
||||||
**Default Credentials**:
|
**Default Credentials**:
|
||||||
- Username: `admin`
|
- Username: `admin`
|
||||||
- Password: `changeme`
|
- Password: `changeme`
|
||||||
|
|
||||||
**⚠️ CRITICAL**: Change these immediately after first login!
|
**:icon{name="lucide:alert-triangle"} CRITICAL**: Change these immediately after first login!
|
||||||
|
|
||||||
### Encryption Key
|
### Encryption Key
|
||||||
Credentials are encrypted using `N8N_ENCRYPTION_KEY`. This is auto-generated during setup. Never lose this key or you'll lose access to saved credentials!
|
Credentials are encrypted using `N8N_ENCRYPTION_KEY`. This is auto-generated during setup. Never lose this key or you'll lose access to saved credentials!
|
||||||
@@ -65,7 +65,7 @@ Credentials are encrypted using `N8N_ENCRYPTION_KEY`. This is auto-generated dur
|
|||||||
Password: changeme
|
Password: changeme
|
||||||
```
|
```
|
||||||
|
|
||||||
3. **⚠️ IMMEDIATELY Change Password**:
|
3. **:icon{name="lucide:alert-triangle"} IMMEDIATELY Change Password**:
|
||||||
- Click user icon (top right)
|
- Click user icon (top right)
|
||||||
- Settings → Personal
|
- Settings → Personal
|
||||||
- Change password
|
- Change password
|
||||||
@@ -99,12 +99,12 @@ A: Check `N8N_ENCRYPTION_KEY` hasn't changed
|
|||||||
**Q: Workflow not triggering?**
|
**Q: Workflow not triggering?**
|
||||||
A: Verify it's activated and check execution logs
|
A: Verify it's activated and check execution logs
|
||||||
|
|
||||||
## Security Notes 🔒
|
## Security Notes :icon{name="lucide:lock"}
|
||||||
|
|
||||||
- 🔑 **Encryption Key**: Store securely
|
- :icon{name="lucide:key"} **Encryption Key**: Store securely
|
||||||
- 🔐 **Change Default Auth**: ASAP!
|
- :icon{name="lucide:lock-keyhole"} **Change Default Auth**: ASAP!
|
||||||
- 🌐 **HTTPS Only**: Via Traefik
|
- :icon{name="lucide:globe"} **HTTPS Only**: Via Traefik
|
||||||
- 🔒 **OAuth**: Use for sensitive integrations
|
- :icon{name="lucide:lock"} **OAuth**: Use for sensitive integrations
|
||||||
|
|
||||||
## Resources
|
## Resources
|
||||||
|
|
||||||
@@ -114,4 +114,4 @@ A: Verify it's activated and check execution logs
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
*"Automation isn't about replacing humans - it's about freeing them to do what they do best: think creatively and solve complex problems."* ⚡🔗
|
*"Automation isn't about replacing humans - it's about freeing them to do what they do best: think creatively and solve complex problems."* :icon{name="lucide:zap"}:icon{name="lucide:link"}
|
||||||
@@ -1,10 +1,10 @@
|
|||||||
---
|
---
|
||||||
title: <20> Chat Stack - Your Personal Notification HQ
|
title: Chat - Personal Notification HQ
|
||||||
description: "Ding! You've got... pretty much everything"
|
description: "Ding! You've got... pretty much everything"
|
||||||
|
navigation:
|
||||||
|
icon: i-lucide-message-circle
|
||||||
---
|
---
|
||||||
|
|
||||||
# 💬 Chat Stack - Your Personal Notification HQ
|
|
||||||
|
|
||||||
> *"Ding! You've got... pretty much everything"* - Gotify
|
> *"Ding! You've got... pretty much everything"* - Gotify
|
||||||
|
|
||||||
## What's This All About?
|
## What's This All About?
|
||||||
@@ -13,7 +13,7 @@ Gotify is your self-hosted push notification server! Think of it as your persona
|
|||||||
|
|
||||||
## The Notification Ninja
|
## The Notification Ninja
|
||||||
|
|
||||||
### 🔔 Gotify Server
|
### :icon{name="lucide:bell"} Gotify Server
|
||||||
|
|
||||||
**Container**: `chat_app`
|
**Container**: `chat_app`
|
||||||
**Image**: `gotify/server:latest`
|
**Image**: `gotify/server:latest`
|
||||||
@@ -21,12 +21,12 @@ Gotify is your self-hosted push notification server! Think of it as your persona
|
|||||||
|
|
||||||
Gotify is the Swiss Army knife of push notifications:
|
Gotify is the Swiss Army knife of push notifications:
|
||||||
- 📱 **Mobile Apps**: iOS and Android clients available
|
- 📱 **Mobile Apps**: iOS and Android clients available
|
||||||
- 🌐 **Web Interface**: Check notifications in your browser
|
- :icon{name="lucide:globe"} **Web Interface**: Check notifications in your browser
|
||||||
- 🔌 **REST API**: Send notifications from anything
|
- :icon{name="lucide:plug"} **REST API**: Send notifications from anything
|
||||||
- 🔒 **App Tokens**: Separate tokens for different applications
|
- :icon{name="lucide:lock"} **App Tokens**: Separate tokens for different applications
|
||||||
- 📊 **Priority Levels**: From "meh" to "WAKE UP NOW!"
|
- :icon{name="lucide:bar-chart"} **Priority Levels**: From "meh" to "WAKE UP NOW!"
|
||||||
- 🎨 **Markdown Support**: Rich formatted messages
|
- :icon{name="lucide:palette"} **Markdown Support**: Rich formatted messages
|
||||||
- 📦 **Simple**: Written in Go, single binary, no fuss
|
- :icon{name="lucide:package"} **Simple**: Written in Go, single binary, no fuss
|
||||||
|
|
||||||
## How It Works
|
## How It Works
|
||||||
|
|
||||||
@@ -50,14 +50,14 @@ Path: /app/data
|
|||||||
```
|
```
|
||||||
|
|
||||||
This stores:
|
This stores:
|
||||||
- 🗄️ SQLite database (users, apps, messages)
|
- :icon{name="lucide:database"} SQLite database (users, apps, messages)
|
||||||
- 🖼️ Application images
|
- 🖼️ Application images
|
||||||
- ⚙️ Server configuration
|
- ⚙️ Server configuration
|
||||||
|
|
||||||
### No Exposed Port
|
### No Exposed Port
|
||||||
All access goes through Traefik at https://chat.pivoine.art - clean and secure!
|
All access goes through Traefik at https://chat.pivoine.art - clean and secure!
|
||||||
|
|
||||||
## First Time Setup 🚀
|
## First Time Setup :icon{name="lucide:rocket"}
|
||||||
|
|
||||||
1. **Start the stack**:
|
1. **Start the stack**:
|
||||||
```bash
|
```bash
|
||||||
@@ -74,7 +74,7 @@ All access goes through Traefik at https://chat.pivoine.art - clean and secure!
|
|||||||
3. **IMMEDIATELY change the password**:
|
3. **IMMEDIATELY change the password**:
|
||||||
- Click on your username
|
- Click on your username
|
||||||
- Go to Settings
|
- Go to Settings
|
||||||
- Change that password right now! 🔒
|
- Change that password right now! :icon{name="lucide:lock"}
|
||||||
|
|
||||||
4. **Create an application**:
|
4. **Create an application**:
|
||||||
- Apps → New Application
|
- Apps → New Application
|
||||||
@@ -106,7 +106,7 @@ def send_notification(title, message, priority=5):
|
|||||||
}
|
}
|
||||||
requests.post(url, headers=headers, data=data)
|
requests.post(url, headers=headers, data=data)
|
||||||
|
|
||||||
send_notification("Deploy Complete", "Your app is live! 🚀")
|
send_notification("Deploy Complete", "Your app is live! :icon{name="lucide:rocket"}")
|
||||||
```
|
```
|
||||||
|
|
||||||
### Using Bash Script
|
### Using Bash Script
|
||||||
@@ -127,7 +127,7 @@ notify() {
|
|||||||
notify "Backup Complete" "All files backed up successfully" 8
|
notify "Backup Complete" "All files backed up successfully" 8
|
||||||
```
|
```
|
||||||
|
|
||||||
## Priority Levels 🎯
|
## Priority Levels :icon{name="lucide:target"}
|
||||||
|
|
||||||
| Priority | Use Case | Example |
|
| Priority | Use Case | Example |
|
||||||
|----------|----------|---------|
|
|----------|----------|---------|
|
||||||
@@ -135,7 +135,7 @@ notify "Backup Complete" "All files backed up successfully" 8
|
|||||||
| 2 | Low | FYI messages |
|
| 2 | Low | FYI messages |
|
||||||
| 5 | Normal | Standard notifications |
|
| 5 | Normal | Standard notifications |
|
||||||
| 8 | High | Important updates |
|
| 8 | High | Important updates |
|
||||||
| 10 | Emergency | WAKE UP! SERVER IS ON FIRE! 🔥 |
|
| 10 | Emergency | WAKE UP! SERVER IS ON FIRE! :icon{name="lucide:flame"} |
|
||||||
|
|
||||||
## Real-World Use Cases
|
## Real-World Use Cases
|
||||||
|
|
||||||
@@ -208,13 +208,13 @@ Download from:
|
|||||||
## Web Interface Features
|
## Web Interface Features
|
||||||
|
|
||||||
- 📱 Desktop notifications (browser permission needed)
|
- 📱 Desktop notifications (browser permission needed)
|
||||||
- 🔍 Search through message history
|
- :icon{name="lucide:search"} Search through message history
|
||||||
- 🗑️ Delete individual or all messages
|
- 🗑️ Delete individual or all messages
|
||||||
- 👥 Manage applications and clients
|
- :icon{name="lucide:users"} Manage applications and clients
|
||||||
- ⚙️ Configure server settings
|
- ⚙️ Configure server settings
|
||||||
- 📊 View message statistics
|
- :icon{name="lucide:bar-chart"} View message statistics
|
||||||
|
|
||||||
## Security Best Practices 🔒
|
## Security Best Practices :icon{name="lucide:lock"}
|
||||||
|
|
||||||
1. **Change Default Credentials**: First thing, every time
|
1. **Change Default Credentials**: First thing, every time
|
||||||
2. **Use App Tokens**: Different token for each application/script
|
2. **Use App Tokens**: Different token for each application/script
|
||||||
@@ -236,7 +236,7 @@ curl -X POST "https://chat.pivoine.art/message" \
|
|||||||
- ✅ Database migration
|
- ✅ Database migration
|
||||||
- ✅ Frontend build
|
- ✅ Frontend build
|
||||||
- ✅ Backend restart
|
- ✅ Backend restart
|
||||||
- ⚠️ Cache warmup (slower than expected)
|
- :icon{name="lucide:alert-triangle"} Cache warmup (slower than expected)
|
||||||
|
|
||||||
**Next**: Monitor performance metrics" \
|
**Next**: Monitor performance metrics" \
|
||||||
-F "priority=5"
|
-F "priority=5"
|
||||||
@@ -307,16 +307,16 @@ Use HTTP request node:
|
|||||||
- Headers: `X-Gotify-Key: YOUR_TOKEN`
|
- Headers: `X-Gotify-Key: YOUR_TOKEN`
|
||||||
- Body: JSON with title, message, priority
|
- Body: JSON with title, message, priority
|
||||||
|
|
||||||
## Why Gotify Rocks 🎸
|
## Why Gotify Rocks :icon{name="lucide:music"}
|
||||||
|
|
||||||
- ✨ Self-hosted (your data, your server)
|
- :icon{name="lucide:sparkles"} Self-hosted (your data, your server)
|
||||||
- 🆓 Completely free and open source
|
- 🆓 Completely free and open source
|
||||||
- 🚀 Super lightweight (Go binary + SQLite)
|
- :icon{name="lucide:rocket"} Super lightweight (Go binary + SQLite)
|
||||||
- 📱 Native mobile apps
|
- 📱 Native mobile apps
|
||||||
- 🔌 Dead simple API
|
- :icon{name="lucide:plug"} Dead simple API
|
||||||
- 🎨 Clean, modern interface
|
- :icon{name="lucide:palette"} Clean, modern interface
|
||||||
- 🔒 No third-party dependencies
|
- :icon{name="lucide:lock"} No third-party dependencies
|
||||||
- 💪 Active development
|
- :icon{name="lucide:dumbbell"} Active development
|
||||||
|
|
||||||
## Resources
|
## Resources
|
||||||
|
|
||||||
@@ -327,4 +327,4 @@ Use HTTP request node:
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
*"The only notifications worth getting are the ones you control."* - Someone who's tired of their phone buzzing 📵✨
|
*"The only notifications worth getting are the ones you control."* - Someone who's tired of their phone buzzing :icon{name="lucide:phone-off"}:icon{name="lucide:sparkles"}
|
||||||
@@ -1,10 +1,10 @@
|
|||||||
---
|
---
|
||||||
title: <20> Code Stack - Your Private GitHub Alternative
|
title: Code - Private GitHub Alternative
|
||||||
description: "Give them Git, make them great!"
|
description: "Give them Git, make them great!"
|
||||||
|
navigation:
|
||||||
|
icon: i-lucide-git-branch
|
||||||
---
|
---
|
||||||
|
|
||||||
# 🦊 Code Stack - Your Private GitHub Alternative
|
|
||||||
|
|
||||||
> *"Give them Git, make them great!"* - Some wise developer
|
> *"Give them Git, make them great!"* - Some wise developer
|
||||||
|
|
||||||
## What's This All About?
|
## What's This All About?
|
||||||
@@ -13,7 +13,7 @@ This stack is your personal GitHub - a lightweight, powerful, self-hosted Git se
|
|||||||
|
|
||||||
## The Star of the Show
|
## The Star of the Show
|
||||||
|
|
||||||
### 🦊 Gitea
|
### :icon{name="lucide:git-branch"} Gitea
|
||||||
|
|
||||||
**Container**: `code_app`
|
**Container**: `code_app`
|
||||||
**Image**: `gitea/gitea:latest`
|
**Image**: `gitea/gitea:latest`
|
||||||
@@ -21,14 +21,14 @@ This stack is your personal GitHub - a lightweight, powerful, self-hosted Git se
|
|||||||
**SSH**: ssh://git@git.localhost:2222
|
**SSH**: ssh://git@git.localhost:2222
|
||||||
|
|
||||||
Gitea packs a serious punch for its size:
|
Gitea packs a serious punch for its size:
|
||||||
- 📦 **Git Hosting**: Unlimited private/public repositories
|
- :icon{name="lucide:package"} **Git Hosting**: Unlimited private/public repositories
|
||||||
- 🔀 **Pull Requests**: Full code review workflow
|
- 🔀 **Pull Requests**: Full code review workflow
|
||||||
- 🐛 **Issue Tracking**: Built-in project management
|
- 🐛 **Issue Tracking**: Built-in project management
|
||||||
- 👥 **Organizations & Teams**: Multi-user collaboration
|
- :icon{name="lucide:users"} **Organizations & Teams**: Multi-user collaboration
|
||||||
- 🪝 **Webhooks**: CI/CD integration ready
|
- :icon{name="lucide:git-branch"} **Webhooks**: CI/CD integration ready
|
||||||
- 📝 **Wiki**: Documentation for your projects
|
- :icon{name="lucide:file-text"} **Wiki**: Documentation for your projects
|
||||||
- 🏷️ **Releases**: Package and distribute your software
|
- :icon{name="lucide:tag"} **Releases**: Package and distribute your software
|
||||||
- 🔐 **Built-in OAuth**: Use it as an auth provider!
|
- :icon{name="lucide:lock-keyhole"} **Built-in OAuth**: Use it as an auth provider!
|
||||||
|
|
||||||
## Configuration Breakdown
|
## Configuration Breakdown
|
||||||
|
|
||||||
@@ -57,12 +57,12 @@ On first access, you'll see the installation wizard. Most settings are pre-confi
|
|||||||
|
|
||||||
| Variable | What It Does | Cool Factor |
|
| Variable | What It Does | Cool Factor |
|
||||||
|----------|-------------|-------------|
|
|----------|-------------|-------------|
|
||||||
| `COMPOSE_PROJECT_NAME` | Stack identifier | 📦 Keeps things organized |
|
| `COMPOSE_PROJECT_NAME` | Stack identifier | :icon{name="lucide:package"} Keeps things organized |
|
||||||
| `DOCKER_IMAGE` | Gitea version to use | 🏷️ Stay current or pinned |
|
| `DOCKER_IMAGE` | Gitea version to use | :icon{name="lucide:tag"} Stay current or pinned |
|
||||||
| `TRAEFIK_HOST` | Your domain | 🌐 How the world finds you |
|
| `TRAEFIK_HOST` | Your domain | :icon{name="lucide:globe"} How the world finds you |
|
||||||
| `SSH_PORT` | SSH clone port | 🔌 Non-standard for safety |
|
| `SSH_PORT` | SSH clone port | :icon{name="lucide:plug"} Non-standard for safety |
|
||||||
| `APP_PORT` | Web interface port | 🎯 Internal routing |
|
| `APP_PORT` | Web interface port | :icon{name="lucide:target"} Internal routing |
|
||||||
| `DB_*` | Database connection | 🐘 Where memories live |
|
| `DB_*` | Database connection | :icon{name="simple-icons:postgresql"} Where memories live |
|
||||||
|
|
||||||
## Ports & Networking
|
## Ports & Networking
|
||||||
|
|
||||||
@@ -116,7 +116,7 @@ docker logs code_app -f
|
|||||||
- Email: your@email.com
|
- Email: your@email.com
|
||||||
- Password: Strong and unique!
|
- Password: Strong and unique!
|
||||||
|
|
||||||
6. **Install!** 🎉
|
6. **Install!** :icon{name="lucide:party-popper"}
|
||||||
|
|
||||||
### Creating Your First Repository
|
### Creating Your First Repository
|
||||||
|
|
||||||
@@ -240,16 +240,16 @@ A: Reset from CLI:
|
|||||||
docker exec code_app gitea admin user change-password --username admin --password newpassword
|
docker exec code_app gitea admin user change-password --username admin --password newpassword
|
||||||
```
|
```
|
||||||
|
|
||||||
## Security Notes 🔒
|
## Security Notes :icon{name="lucide:lock"}
|
||||||
|
|
||||||
- 🔑 **SSH Keys**: Always use SSH keys, not passwords
|
- :icon{name="lucide:key"} **SSH Keys**: Always use SSH keys, not passwords
|
||||||
- 🔐 **Database Credentials**: Stored in root `.env`
|
- :icon{name="lucide:lock-keyhole"} **Database Credentials**: Stored in root `.env`
|
||||||
- 🌐 **HTTPS Only**: Traefik handles SSL automatically
|
- :icon{name="lucide:globe"} **HTTPS Only**: Traefik handles SSL automatically
|
||||||
- 👥 **Private Repos**: Default for security
|
- :icon{name="lucide:users"} **Private Repos**: Default for security
|
||||||
- 🔒 **2FA**: Enable in user settings for extra security
|
- :icon{name="lucide:lock"} **2FA**: Enable in user settings for extra security
|
||||||
- 📝 **Audit Log**: Review in admin panel regularly
|
- :icon{name="lucide:file-text"} **Audit Log**: Review in admin panel regularly
|
||||||
|
|
||||||
## Pro Tips 💡
|
## Pro Tips :icon{name="lucide:lightbulb"}
|
||||||
|
|
||||||
1. **Protected Branches**: Require reviews before merging to main
|
1. **Protected Branches**: Require reviews before merging to main
|
||||||
2. **Git LFS**: Enable for large files (models, assets, etc.)
|
2. **Git LFS**: Enable for large files (models, assets, etc.)
|
||||||
@@ -269,4 +269,4 @@ docker exec code_app gitea admin user change-password --username admin --passwor
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
*"Why use someone else's Git when you can host your own? Take back control, one commit at a time."* 🦊✨
|
*"Why use someone else's Git when you can host your own? Take back control, one commit at a time."* :icon{name="lucide:git-branch"}:icon{name="lucide:sparkles"}
|
||||||
@@ -1,10 +1,10 @@
|
|||||||
---
|
---
|
||||||
title: Homepage Dashboard (Dash)
|
title: Homepage Dashboard (Dash)
|
||||||
description: Documentation for the dash stack
|
description: Documentation for the dash stack
|
||||||
|
navigation:
|
||||||
|
icon: i-lucide-bar-chart
|
||||||
---
|
---
|
||||||
|
|
||||||
# Homepage Dashboard (Dash)
|
|
||||||
|
|
||||||
This directory contains the configuration for the [Homepage](https://gethomepage.dev) dashboard service, which provides a centralized view of all kompose.sh services.
|
This directory contains the configuration for the [Homepage](https://gethomepage.dev) dashboard service, which provides a centralized view of all kompose.sh services.
|
||||||
|
|
||||||
## Structure
|
## Structure
|
||||||
@@ -1,10 +1,10 @@
|
|||||||
---
|
---
|
||||||
title: Data Stack - The Memory Palace of Your Infrastructure
|
title: Data - The Memory Palace of Your Infrastructure
|
||||||
description: "In data we trust... and backup, and replicate, and backup again"
|
description: "In data we trust... and backup, and replicate, and backup again"
|
||||||
|
navigation:
|
||||||
|
icon: i-lucide-database
|
||||||
---
|
---
|
||||||
|
|
||||||
# 🗄️ Data Stack - The Memory Palace of Your Infrastructure
|
|
||||||
|
|
||||||
> *"In data we trust... and backup, and replicate, and backup again"* - Every DBA Ever
|
> *"In data we trust... and backup, and replicate, and backup again"* - Every DBA Ever
|
||||||
|
|
||||||
## What's This All About?
|
## What's This All About?
|
||||||
@@ -13,7 +13,7 @@ This is the beating heart of your infrastructure - where all the data lives, bre
|
|||||||
|
|
||||||
## The Data Dream Team
|
## The Data Dream Team
|
||||||
|
|
||||||
### 🐘 PostgreSQL
|
### :icon{name="simple-icons:postgresql"} PostgreSQL
|
||||||
|
|
||||||
**Container**: `data_postgres`
|
**Container**: `data_postgres`
|
||||||
**Image**: `postgres:latest`
|
**Image**: `postgres:latest`
|
||||||
@@ -21,11 +21,11 @@ This is the beating heart of your infrastructure - where all the data lives, bre
|
|||||||
**Volume**: `pgdata`
|
**Volume**: `pgdata`
|
||||||
|
|
||||||
The elephant in the room (literally, look at the logo!). PostgreSQL is your rock-solid relational database:
|
The elephant in the room (literally, look at the logo!). PostgreSQL is your rock-solid relational database:
|
||||||
- 💪 **ACID Compliance**: Your data stays consistent, always
|
- :icon{name="lucide:dumbbell"} **ACID Compliance**: Your data stays consistent, always
|
||||||
- 🔒 **Rock Solid**: Banks trust it, you should too
|
- :icon{name="lucide:lock"} **Rock Solid**: Banks trust it, you should too
|
||||||
- 📊 **Advanced Features**: JSON, full-text search, geospatial data
|
- :icon{name="lucide:bar-chart"} **Advanced Features**: JSON, full-text search, geospatial data
|
||||||
- 🚀 **Performance**: Handles millions of rows like a champ
|
- :icon{name="lucide:rocket"} **Performance**: Handles millions of rows like a champ
|
||||||
- 🔄 **Extensible**: PostGIS, TimescaleDB, and more
|
- :icon{name="lucide:refresh-cw"} **Extensible**: PostGIS, TimescaleDB, and more
|
||||||
|
|
||||||
**Who Uses It**:
|
**Who Uses It**:
|
||||||
- `auth` → Keycloak database
|
- `auth` → Keycloak database
|
||||||
@@ -33,20 +33,20 @@ The elephant in the room (literally, look at the logo!). PostgreSQL is your rock
|
|||||||
- `auto` → Semaphore database
|
- `auto` → Semaphore database
|
||||||
- `sexy` → Directus CMS database
|
- `sexy` → Directus CMS database
|
||||||
- `track` → Umami analytics database
|
- `track` → Umami analytics database
|
||||||
- Basically, everyone! 🎉
|
- Basically, everyone! :icon{name="lucide:party-popper"}
|
||||||
|
|
||||||
### ⚡ Redis
|
### :icon{name="lucide:zap"} Redis
|
||||||
|
|
||||||
**Container**: `data_redis`
|
**Container**: `data_redis`
|
||||||
**Image**: `redis:latest`
|
**Image**: `redis:latest`
|
||||||
**Port**: 6379
|
**Port**: 6379
|
||||||
|
|
||||||
The speed demon of data storage! Redis is your in-memory cache:
|
The speed demon of data storage! Redis is your in-memory cache:
|
||||||
- 🏎️ **Lightning Fast**: Sub-millisecond response times
|
- :icon{name="lucide:car"} **Lightning Fast**: Sub-millisecond response times
|
||||||
- 💾 **In-Memory**: Data lives in RAM for max speed
|
- :icon{name="lucide:hard-drive"} **In-Memory**: Data lives in RAM for max speed
|
||||||
- 🔑 **Key-Value Store**: Simple and effective
|
- :icon{name="lucide:key"} **Key-Value Store**: Simple and effective
|
||||||
- 📦 **Pub/Sub**: Real-time messaging support
|
- :icon{name="lucide:package"} **Pub/Sub**: Real-time messaging support
|
||||||
- ⏰ **Expiration**: Auto-delete old data
|
- :icon{name="lucide:clock"} **Expiration**: Auto-delete old data
|
||||||
|
|
||||||
**Who Uses It**:
|
**Who Uses It**:
|
||||||
- `sexy` → Directus cache for faster API responses
|
- `sexy` → Directus cache for faster API responses
|
||||||
@@ -60,11 +60,11 @@ The speed demon of data storage! Redis is your in-memory cache:
|
|||||||
**Home**: http://localhost:8088
|
**Home**: http://localhost:8088
|
||||||
|
|
||||||
Your graphical database management interface:
|
Your graphical database management interface:
|
||||||
- 🖱️ **Visual Interface**: No SQL required (but you can if you want!)
|
- :icon{name="lucide:mouse"} **Visual Interface**: No SQL required (but you can if you want!)
|
||||||
- 📊 **Query Tool**: Run queries and see pretty results
|
- :icon{name="lucide:bar-chart"} **Query Tool**: Run queries and see pretty results
|
||||||
- 🔍 **Database Explorer**: Browse tables, views, functions
|
- :icon{name="lucide:search"} **Database Explorer**: Browse tables, views, functions
|
||||||
- 📈 **Monitoring**: Check performance and connections
|
- :icon{name="lucide:trending-up"} **Monitoring**: Check performance and connections
|
||||||
- 🛠️ **Management**: Create, modify, backup databases
|
- :icon{name="lucide:hammer"} **Management**: Create, modify, backup databases
|
||||||
|
|
||||||
## Architecture Overview
|
## Architecture Overview
|
||||||
|
|
||||||
@@ -119,7 +119,7 @@ ADMIN_PASSWORD=your_password
|
|||||||
|
|
||||||
**Data Persistence**: `pgadmin-data` volume stores your server configurations
|
**Data Persistence**: `pgadmin-data` volume stores your server configurations
|
||||||
|
|
||||||
## First Time Setup 🚀
|
## First Time Setup :icon{name="lucide:rocket"}
|
||||||
|
|
||||||
### Postgres
|
### Postgres
|
||||||
|
|
||||||
@@ -244,7 +244,7 @@ docker exec data_redis redis-cli INFO stats
|
|||||||
docker exec -it data_redis redis-cli MONITOR
|
docker exec -it data_redis redis-cli MONITOR
|
||||||
```
|
```
|
||||||
|
|
||||||
### Flush All Data (⚠️ DANGER!)
|
### Flush All Data (:icon{name="lucide:alert-triangle"} DANGER!)
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
docker exec data_redis redis-cli FLUSHALL
|
docker exec data_redis redis-cli FLUSHALL
|
||||||
@@ -265,7 +265,7 @@ docker exec data_redis redis-cli INFO memory
|
|||||||
| Redis | 6379 | 6379 | Direct + kompose network |
|
| Redis | 6379 | 6379 | Direct + kompose network |
|
||||||
| pgAdmin | 80 | 8088 | http://localhost:8088 |
|
| pgAdmin | 80 | 8088 | http://localhost:8088 |
|
||||||
|
|
||||||
## Volumes & Persistence 💾
|
## Volumes & Persistence :icon{name="lucide:hard-drive"}
|
||||||
|
|
||||||
### pgdata
|
### pgdata
|
||||||
PostgreSQL database files live here. **DON'T DELETE THIS** unless you enjoy pain!
|
PostgreSQL database files live here. **DON'T DELETE THIS** unless you enjoy pain!
|
||||||
@@ -273,7 +273,7 @@ PostgreSQL database files live here. **DON'T DELETE THIS** unless you enjoy pain
|
|||||||
### pgadmin-data
|
### pgadmin-data
|
||||||
Your pgAdmin settings and configurations.
|
Your pgAdmin settings and configurations.
|
||||||
|
|
||||||
## Security Best Practices 🔒
|
## Security Best Practices :icon{name="lucide:lock"}
|
||||||
|
|
||||||
1. **Strong Passwords**: Use long, random passwords
|
1. **Strong Passwords**: Use long, random passwords
|
||||||
2. **Network Isolation**: Only expose ports you need
|
2. **Network Isolation**: Only expose ports you need
|
||||||
@@ -282,7 +282,7 @@ Your pgAdmin settings and configurations.
|
|||||||
5. **SSL Connections**: Consider enabling for production
|
5. **SSL Connections**: Consider enabling for production
|
||||||
6. **Update Regularly**: Keep images up to date
|
6. **Update Regularly**: Keep images up to date
|
||||||
|
|
||||||
## Performance Tips 💡
|
## Performance Tips :icon{name="lucide:lightbulb"}
|
||||||
|
|
||||||
### PostgresSQL Server
|
### PostgresSQL Server
|
||||||
|
|
||||||
@@ -368,7 +368,7 @@ pgbouncer:
|
|||||||
- **SLOWLOG**: Track slow commands
|
- **SLOWLOG**: Track slow commands
|
||||||
- **CLIENT LIST**: Active connections
|
- **CLIENT LIST**: Active connections
|
||||||
|
|
||||||
## When Things Go Wrong 🚨
|
## When Things Go Wrong :icon{name="lucide:siren"}
|
||||||
|
|
||||||
### Database Corruption
|
### Database Corruption
|
||||||
1. Stop all applications
|
1. Stop all applications
|
||||||
@@ -387,11 +387,11 @@ pgbouncer:
|
|||||||
3. Increase max_connections (PostgreSQL)
|
3. Increase max_connections (PostgreSQL)
|
||||||
4. Implement connection pooling
|
4. Implement connection pooling
|
||||||
|
|
||||||
## Fun Database Facts 🎓
|
## Fun Database Facts :icon{name="lucide:graduation-cap"}
|
||||||
|
|
||||||
- PostgreSQL started in 1986 at UC Berkeley (older than some developers!)
|
- PostgreSQL started in 1986 at UC Berkeley (older than some developers!)
|
||||||
- Redis stands for "REmote DIctionary Server"
|
- Redis stands for "REmote DIctionary Server"
|
||||||
- PostgreSQL supports storing emojis (🐘💖)
|
- PostgreSQL supports storing emojis (:icon{name="simple-icons:postgresql"}💖)
|
||||||
- Redis can process millions of operations per second
|
- Redis can process millions of operations per second
|
||||||
- pgAdmin is used by database admins worldwide
|
- pgAdmin is used by database admins worldwide
|
||||||
|
|
||||||
@@ -404,4 +404,4 @@ pgbouncer:
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
*"Data is the new oil, but unlike oil, you can actually back it up."* - Modern DevOps Proverb 💾✨
|
*"Data is the new oil, but unlike oil, you can actually back it up."* - Modern DevOps Proverb :icon{name="lucide:hard-drive"}:icon{name="lucide:sparkles"}
|
||||||
@@ -1,10 +1,10 @@
|
|||||||
---
|
---
|
||||||
title: <20> Dock Stack - Your Docker Compose Command Center
|
title: Dock - Docker Compose Command Center
|
||||||
description: "Making Docker Compose actually fun since 2023"
|
description: "Making Docker Compose actually fun since 2023"
|
||||||
|
navigation:
|
||||||
|
icon: i-lucide-ship-wheel
|
||||||
---
|
---
|
||||||
|
|
||||||
# 🐳 Dock Stack - Your Docker Compose Command Center
|
|
||||||
|
|
||||||
> *"Making Docker Compose actually fun since 2023"* - Dockge
|
> *"Making Docker Compose actually fun since 2023"* - Dockge
|
||||||
|
|
||||||
## What's This All About?
|
## What's This All About?
|
||||||
@@ -21,13 +21,13 @@ Dockge (pronounced "dog-ee" 🐕) is a fancy, self-hosted web UI for managing Do
|
|||||||
**Home**: http://localhost:5001
|
**Home**: http://localhost:5001
|
||||||
|
|
||||||
Dockge makes Docker Compose management feel like playing with LEGO:
|
Dockge makes Docker Compose management feel like playing with LEGO:
|
||||||
- 📋 **Visual Stack Management**: See all your compose stacks at a glance
|
- :icon{name="lucide:clipboard"} **Visual Stack Management**: See all your compose stacks at a glance
|
||||||
- ✏️ **Built-in Editor**: Edit compose files right in the browser
|
- ✏️ **Built-in Editor**: Edit compose files right in the browser
|
||||||
- 🚀 **One-Click Deploy**: Start, stop, restart with a button
|
- :icon{name="lucide:rocket"} **One-Click Deploy**: Start, stop, restart with a button
|
||||||
- 📊 **Real-time Logs**: Watch your containers do their thing
|
- :icon{name="lucide:bar-chart"} **Real-time Logs**: Watch your containers do their thing
|
||||||
- 📝 **Compose File Preview**: See what you're deploying before you deploy it
|
- :icon{name="lucide:file-text"} **Compose File Preview**: See what you're deploying before you deploy it
|
||||||
- 🎨 **Clean Interface**: No cluttered UI, just what you need
|
- :icon{name="lucide:palette"} **Clean Interface**: No cluttered UI, just what you need
|
||||||
- 🔄 **Update Tracking**: Know when your stacks have changes
|
- :icon{name="lucide:refresh-cw"} **Update Tracking**: Know when your stacks have changes
|
||||||
|
|
||||||
## How It Works
|
## How It Works
|
||||||
|
|
||||||
@@ -64,7 +64,7 @@ This is where Dockge looks for your compose files. All the `kompose` stacks shou
|
|||||||
mkdir -p /root/repos/compose
|
mkdir -p /root/repos/compose
|
||||||
```
|
```
|
||||||
|
|
||||||
## First Time Setup 🚀
|
## First Time Setup :icon{name="lucide:rocket"}
|
||||||
|
|
||||||
1. **Ensure stacks directory exists**:
|
1. **Ensure stacks directory exists**:
|
||||||
```bash
|
```bash
|
||||||
@@ -84,7 +84,7 @@ mkdir -p /root/repos/compose
|
|||||||
4. **Create your first user**:
|
4. **Create your first user**:
|
||||||
- First visitor gets to create the admin account
|
- First visitor gets to create the admin account
|
||||||
- Choose a strong password
|
- Choose a strong password
|
||||||
- You're in! 🎉
|
- You're in! :icon{name="lucide:party-popper"}
|
||||||
|
|
||||||
## Using Dockge Like a Pro
|
## Using Dockge Like a Pro
|
||||||
|
|
||||||
@@ -102,16 +102,16 @@ mkdir -p /root/repos/compose
|
|||||||
- 8080:80
|
- 8080:80
|
||||||
```
|
```
|
||||||
4. **Click "Deploy"**
|
4. **Click "Deploy"**
|
||||||
5. **Watch it go!** 🚀
|
5. **Watch it go!** :icon{name="lucide:rocket"}
|
||||||
|
|
||||||
### Managing Existing Stacks
|
### Managing Existing Stacks
|
||||||
|
|
||||||
From the dashboard, you can:
|
From the dashboard, you can:
|
||||||
- ▶️ **Start**: Fire up all containers
|
- ▶️ **Start**: Fire up all containers
|
||||||
- ⏸️ **Stop**: Gracefully stop everything
|
- ⏸️ **Stop**: Gracefully stop everything
|
||||||
- 🔄 **Restart**: Quick bounce
|
- :icon{name="lucide:refresh-cw"} **Restart**: Quick bounce
|
||||||
- 📝 **Edit**: Change the compose file
|
- :icon{name="lucide:file-text"} **Edit**: Change the compose file
|
||||||
- 🔧 **Update**: Pull new images and redeploy
|
- :icon{name="lucide:wrench"} **Update**: Pull new images and redeploy
|
||||||
- 🗑️ **Delete**: Remove stack completely
|
- 🗑️ **Delete**: Remove stack completely
|
||||||
|
|
||||||
### Viewing Logs
|
### Viewing Logs
|
||||||
@@ -162,7 +162,7 @@ Then restart Dockge:
|
|||||||
docker compose down && docker compose up -d
|
docker compose down && docker compose up -d
|
||||||
```
|
```
|
||||||
|
|
||||||
## Features You'll Love ❤️
|
## Features You'll Love :icon{name="lucide:heart"}
|
||||||
|
|
||||||
### Terminal Access
|
### Terminal Access
|
||||||
Click "Terminal" to get a shell in any container - no `docker exec` needed!
|
Click "Terminal" to get a shell in any container - no `docker exec` needed!
|
||||||
@@ -185,9 +185,9 @@ Select multiple stacks and start/stop them all at once.
|
|||||||
- **Network**: `kompose` (sees all your other containers)
|
- **Network**: `kompose` (sees all your other containers)
|
||||||
- **Docker Socket**: Full access (read + write)
|
- **Docker Socket**: Full access (read + write)
|
||||||
|
|
||||||
## Security Considerations 🔒
|
## Security Considerations :icon{name="lucide:lock"}
|
||||||
|
|
||||||
### ⚠️ Important Security Notes
|
### :icon{name="lucide:alert-triangle"} Important Security Notes
|
||||||
|
|
||||||
1. **No Built-in Auth Beyond First User**: After creating admin, there's basic auth
|
1. **No Built-in Auth Beyond First User**: After creating admin, there's basic auth
|
||||||
2. **Docker Socket Access**: Dockge can do ANYTHING Docker can
|
2. **Docker Socket Access**: Dockge can do ANYTHING Docker can
|
||||||
@@ -256,7 +256,7 @@ A: Check Docker socket performance, might have many containers
|
|||||||
**Q: Lost admin password?**
|
**Q: Lost admin password?**
|
||||||
A: Delete the Dockge volume and start fresh (you'll lose user accounts)
|
A: Delete the Dockge volume and start fresh (you'll lose user accounts)
|
||||||
|
|
||||||
## Advanced Tips 💡
|
## Advanced Tips :icon{name="lucide:lightbulb"}
|
||||||
|
|
||||||
### Custom Network Configuration
|
### Custom Network Configuration
|
||||||
|
|
||||||
@@ -313,12 +313,12 @@ services:
|
|||||||
|
|
||||||
## Why Choose Dockge?
|
## Why Choose Dockge?
|
||||||
|
|
||||||
- 🎯 **Compose-Native**: Built specifically for docker-compose
|
- :icon{name="lucide:target"} **Compose-Native**: Built specifically for docker-compose
|
||||||
- 🪶 **Lightweight**: Tiny footprint, fast UI
|
- 🪶 **Lightweight**: Tiny footprint, fast UI
|
||||||
- 🎨 **Beautiful**: Clean, modern interface
|
- :icon{name="lucide:palette"} **Beautiful**: Clean, modern interface
|
||||||
- 🔧 **Simple**: Does one thing really well
|
- :icon{name="lucide:wrench"} **Simple**: Does one thing really well
|
||||||
- 🆓 **Free**: Open source, no enterprise upsells
|
- 🆓 **Free**: Open source, no enterprise upsells
|
||||||
- 👨💻 **Dev-Friendly**: Doesn't hide the compose file from you
|
- 👨:icon{name="lucide:laptop"} **Dev-Friendly**: Doesn't hide the compose file from you
|
||||||
|
|
||||||
## Integration Ideas
|
## Integration Ideas
|
||||||
|
|
||||||
@@ -335,7 +335,7 @@ deploy:
|
|||||||
|
|
||||||
### With Monitoring
|
### With Monitoring
|
||||||
|
|
||||||
Dockge + Grafana + Prometheus = 📊 Beautiful dashboards
|
Dockge + Grafana + Prometheus = :icon{name="lucide:bar-chart"} Beautiful dashboards
|
||||||
|
|
||||||
### With Backup Tools
|
### With Backup Tools
|
||||||
|
|
||||||
@@ -353,4 +353,4 @@ Automated backups of your compose files:
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
*"The best UI is the one that gets out of your way and lets you work."* - Dockge Philosophy 🐳✨
|
*"The best UI is the one that gets out of your way and lets you work."* - Dockge Philosophy 🐳:icon{name="lucide:sparkles"}
|
||||||
@@ -1,10 +1,10 @@
|
|||||||
---
|
---
|
||||||
title: <20> Home Stack - Your Smart Home Command Center
|
title: Home - Smart Home Command Center
|
||||||
description: "Home is where the automation is!"
|
description: "Home is where the automation is!"
|
||||||
|
navigation:
|
||||||
|
icon: i-lucide-home
|
||||||
---
|
---
|
||||||
|
|
||||||
# 🏠 Home Stack - Your Smart Home Command Center
|
|
||||||
|
|
||||||
> *"Home is where the automation is!"* - Every Home Assistant user
|
> *"Home is where the automation is!"* - Every Home Assistant user
|
||||||
|
|
||||||
## What's This All About?
|
## What's This All About?
|
||||||
@@ -13,7 +13,7 @@ This stack transforms your house into a smart home! Home Assistant is the open-s
|
|||||||
|
|
||||||
## The Star of the Show
|
## The Star of the Show
|
||||||
|
|
||||||
### 🏠 Home Assistant
|
### :icon{name="lucide:home"} Home Assistant
|
||||||
|
|
||||||
**Container**: `home_app`
|
**Container**: `home_app`
|
||||||
**Image**: `ghcr.io/home-assistant/home-assistant:stable`
|
**Image**: `ghcr.io/home-assistant/home-assistant:stable`
|
||||||
@@ -21,14 +21,14 @@ This stack transforms your house into a smart home! Home Assistant is the open-s
|
|||||||
**Port**: 8123
|
**Port**: 8123
|
||||||
|
|
||||||
Home Assistant is your smart home's mission control:
|
Home Assistant is your smart home's mission control:
|
||||||
- 🔌 **2000+ Integrations**: Control almost anything
|
- :icon{name="lucide:plug"} **2000+ Integrations**: Control almost anything
|
||||||
- 🤖 **Powerful Automations**: If this, then that (but better!)
|
- :icon{name="lucide:bot"} **Powerful Automations**: If this, then that (but better!)
|
||||||
- 🎨 **Beautiful UI**: Customizable dashboards
|
- :icon{name="lucide:palette"} **Beautiful UI**: Customizable dashboards
|
||||||
- 📱 **Mobile Apps**: Control from anywhere (iOS & Android)
|
- 📱 **Mobile Apps**: Control from anywhere (iOS & Android)
|
||||||
- 🗣️ **Voice Control**: Alexa, Google, Siri integration
|
- 🗣️ **Voice Control**: Alexa, Google, Siri integration
|
||||||
- 🔐 **Privacy First**: Your data stays home
|
- :icon{name="lucide:lock-keyhole"} **Privacy First**: Your data stays home
|
||||||
- 🌙 **Energy Monitoring**: Track usage and costs
|
- 🌙 **Energy Monitoring**: Track usage and costs
|
||||||
- 📊 **History & Analytics**: Visualize your home
|
- :icon{name="lucide:bar-chart"} **History & Analytics**: Visualize your home
|
||||||
|
|
||||||
## Configuration Breakdown
|
## Configuration Breakdown
|
||||||
|
|
||||||
@@ -61,10 +61,10 @@ This makes backups super easy - just copy the config folder!
|
|||||||
|
|
||||||
| Variable | What It Does | Cool Factor |
|
| Variable | What It Does | Cool Factor |
|
||||||
|----------|-------------|-------------|
|
|----------|-------------|-------------|
|
||||||
| `COMPOSE_PROJECT_NAME` | Stack identifier | 📦 Organization |
|
| `COMPOSE_PROJECT_NAME` | Stack identifier | :icon{name="lucide:package"} Organization |
|
||||||
| `TZ` | Your timezone | ⏰ CRITICAL for automations! |
|
| `TZ` | Your timezone | :icon{name="lucide:clock"} CRITICAL for automations! |
|
||||||
| `TRAEFIK_HOST` | Domain name | 🌐 Your home's address |
|
| `TRAEFIK_HOST` | Domain name | :icon{name="lucide:globe"} Your home's address |
|
||||||
| `APP_PORT` | Web interface port | 🎯 Internal routing |
|
| `APP_PORT` | Web interface port | :icon{name="lucide:target"} Internal routing |
|
||||||
|
|
||||||
## Troubleshooting
|
## Troubleshooting
|
||||||
|
|
||||||
@@ -77,12 +77,12 @@ A: Check network mode is set to `host` for mDNS discovery
|
|||||||
**Q: Automations not triggering?**
|
**Q: Automations not triggering?**
|
||||||
A: Verify timezone is set correctly - this is crucial!
|
A: Verify timezone is set correctly - this is crucial!
|
||||||
|
|
||||||
## Security Notes 🔒
|
## Security Notes :icon{name="lucide:lock"}
|
||||||
|
|
||||||
- 🔐 **Strong Password**: Your home security depends on it!
|
- :icon{name="lucide:lock-keyhole"} **Strong Password**: Your home security depends on it!
|
||||||
- 🌐 **HTTPS Only**: Traefik provides SSL automatically
|
- :icon{name="lucide:globe"} **HTTPS Only**: Traefik provides SSL automatically
|
||||||
- 👁️ **Two-Factor**: Enable in user profile
|
- 👁️ **Two-Factor**: Enable in user profile
|
||||||
- 🔑 **API Tokens**: Use long-lived tokens, not passwords
|
- :icon{name="lucide:key"} **API Tokens**: Use long-lived tokens, not passwords
|
||||||
|
|
||||||
## Resources
|
## Resources
|
||||||
|
|
||||||
@@ -92,4 +92,4 @@ A: Verify timezone is set correctly - this is crucial!
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
*"The smart home isn't about the technology - it's about making life simpler, more comfortable, and maybe a little more magical."* ✨🏠
|
*"The smart home isn't about the technology - it's about making life simpler, more comfortable, and maybe a little more magical."* :icon{name="lucide:sparkles"}:icon{name="lucide:home"}
|
||||||
51
Projects/kompose/docs/content/5.stacks/index.md
Normal file
51
Projects/kompose/docs/content/5.stacks/index.md
Normal file
@@ -0,0 +1,51 @@
|
|||||||
|
---
|
||||||
|
title: Stack Reference
|
||||||
|
description: Detailed documentation for all Kompose stacks
|
||||||
|
---
|
||||||
|
|
||||||
|
This section contains detailed documentation for each stack in the Kompose ecosystem.
|
||||||
|
|
||||||
|
## Available Stacks
|
||||||
|
|
||||||
|
- [Auth](/stacks/auth)
|
||||||
|
- [Auto](/stacks/auto)
|
||||||
|
- [Blog](/stacks/blog)
|
||||||
|
- [Chain](/stacks/chain)
|
||||||
|
- [Chat](/stacks/chat)
|
||||||
|
- [Code](/stacks/code)
|
||||||
|
- [Dash](/stacks/dash)
|
||||||
|
- [Data](/stacks/data)
|
||||||
|
- [Dock](/stacks/dock)
|
||||||
|
- [Home](/stacks/home)
|
||||||
|
- [Link](/stacks/link)
|
||||||
|
- [News](/stacks/news)
|
||||||
|
- [Proxy](/stacks/proxy)
|
||||||
|
- [Sexy](/stacks/sexy)
|
||||||
|
- [Trace](/stacks/trace)
|
||||||
|
- [Track](/stacks/track)
|
||||||
|
- [Vault](/stacks/vault)
|
||||||
|
- [Vpn](/stacks/vpn)
|
||||||
|
|
||||||
|
## Stack Categories
|
||||||
|
|
||||||
|
### Infrastructure Stacks
|
||||||
|
Core infrastructure services that other stacks depend on:
|
||||||
|
- [Data](/stacks/data) - PostgreSQL & Redis databases
|
||||||
|
- [Proxy](/stacks/proxy) - Traefik reverse proxy
|
||||||
|
- [Trace](/stacks/trace) - SigNoz observability
|
||||||
|
- [Vault](/stacks/vault) - Vaultwarden password manager
|
||||||
|
- [VPN](/stacks/vpn) - WireGuard VPN
|
||||||
|
|
||||||
|
### Application Stacks
|
||||||
|
Production application services:
|
||||||
|
- [Auth](/stacks/auth) - Keycloak authentication
|
||||||
|
- [Blog](/stacks/blog) - Static website server
|
||||||
|
- [News](/stacks/news) - Letterspace newsletter platform
|
||||||
|
- [Sexy](/stacks/sexy) - Directus CMS
|
||||||
|
|
||||||
|
### Utility Stacks
|
||||||
|
Management and monitoring tools:
|
||||||
|
- [Dock](/stacks/dock) - Dockge Docker UI
|
||||||
|
- [Chat](/stacks/chat) - Gotify notifications
|
||||||
|
- [Track](/stacks/track) - Umami analytics
|
||||||
|
- [Auto](/stacks/auto) - Semaphore CI/CD
|
||||||
@@ -1,10 +1,10 @@
|
|||||||
---
|
---
|
||||||
title: <20> Link Stack - Bookmark Manager
|
title: Link - Bookmark Manager
|
||||||
description: Documentation for the link stack
|
description: Documentation for the link stack
|
||||||
|
navigation:
|
||||||
|
icon: i-lucide-link
|
||||||
---
|
---
|
||||||
|
|
||||||
# 🔗 Link Stack - Bookmark Manager
|
|
||||||
|
|
||||||
Complete documentation for Linkwarden is available in the artifacts.
|
Complete documentation for Linkwarden is available in the artifacts.
|
||||||
|
|
||||||
## Quick Start
|
## Quick Start
|
||||||
@@ -1,19 +1,19 @@
|
|||||||
---
|
---
|
||||||
title: News Stack - Your Self-Hosted Newsletter Empire
|
title: News - Self-Hosted Newsletter Empire
|
||||||
description: "Forget MailChimp, we're going full indie!"
|
description: "Forget MailChimp, we're going full indie!"
|
||||||
|
navigation:
|
||||||
|
icon: i-lucide-newspaper
|
||||||
---
|
---
|
||||||
|
|
||||||
# 📰 News Stack - Your Self-Hosted Newsletter Empire
|
|
||||||
|
|
||||||
> *"Forget MailChimp, we're going full indie!"* - Letterspace
|
> *"Forget MailChimp, we're going full indie!"* - Letterspace
|
||||||
|
|
||||||
## What's This All About?
|
## What's This All About?
|
||||||
|
|
||||||
This is Letterspace - your open-source, privacy-focused newsletter platform! Think Substack meets indie-hacker meets "I actually own my subscriber list." Send beautiful newsletters, manage subscribers, track campaigns, and keep all your data under YOUR control!
|
This is Letterspace - open-source, privacy-focused newsletter platform! Think Substack meets indie-hacker meets "I actually own my subscriber list." Send beautiful newsletters, manage subscribers, track campaigns, and keep all your data under YOUR control!
|
||||||
|
|
||||||
## The Publishing Powerhouse
|
## The Publishing Powerhouse
|
||||||
|
|
||||||
### 📬 Letterspace Backend
|
### :icon{name="lucide:mailbox"} Letterspace Backend
|
||||||
|
|
||||||
**Container**: `news_backend`
|
**Container**: `news_backend`
|
||||||
**Image**: Custom build from the monorepo
|
**Image**: Custom build from the monorepo
|
||||||
@@ -21,14 +21,14 @@ This is Letterspace - your open-source, privacy-focused newsletter platform! Thi
|
|||||||
**Technology**: Node.js + Express + Prisma + PostgreSQL
|
**Technology**: Node.js + Express + Prisma + PostgreSQL
|
||||||
|
|
||||||
The brains of the operation:
|
The brains of the operation:
|
||||||
- 📝 **Email Campaigns**: Create and send newsletters
|
- :icon{name="lucide:file-text"} **Email Campaigns**: Create and send newsletters
|
||||||
- 👥 **Subscriber Management**: Import, export, segment
|
- :icon{name="lucide:users"} **Subscriber Management**: Import, export, segment
|
||||||
- 📊 **Analytics**: Track opens, clicks, and engagement
|
- :icon{name="lucide:bar-chart"} **Analytics**: Track opens, clicks, and engagement
|
||||||
- 🎨 **Templates**: Reusable email templates
|
- :icon{name="lucide:palette"} **Templates**: Reusable email templates
|
||||||
- 📧 **SMTP Integration**: Works with any email provider
|
- :icon{name="lucide:mail"} **SMTP Integration**: Works with any email provider
|
||||||
- 🔐 **Double Opt-in**: Legal compliance built-in
|
- :icon{name="lucide:lock-keyhole"} **Double Opt-in**: Legal compliance built-in
|
||||||
- 🗄️ **Database-Driven**: PostgreSQL for reliability
|
- :icon{name="lucide:database"} **Database-Driven**: PostgreSQL for reliability
|
||||||
- 🚀 **Cron Jobs**: Automated sending and maintenance
|
- :icon{name="lucide:rocket"} **Cron Jobs**: Automated sending and maintenance
|
||||||
|
|
||||||
### The Stack Structure
|
### The Stack Structure
|
||||||
|
|
||||||
@@ -45,35 +45,35 @@ news/
|
|||||||
│ └── shared/ ← Shared utilities
|
│ └── shared/ ← Shared utilities
|
||||||
```
|
```
|
||||||
|
|
||||||
## Features That Make You Look Pro ✨
|
## Features That Make You Look Pro :icon{name="lucide:sparkles"}
|
||||||
|
|
||||||
### Campaign Management
|
### Campaign Management
|
||||||
- 📧 Create beautiful emails with templates
|
- :icon{name="lucide:mail"} Create beautiful emails with templates
|
||||||
- 📅 Schedule sends for later
|
- 📅 Schedule sends for later
|
||||||
- 🎯 Segment subscribers by tags/lists
|
- :icon{name="lucide:target"} Segment subscribers by tags/lists
|
||||||
- 📝 Preview before sending
|
- :icon{name="lucide:file-text"} Preview before sending
|
||||||
- 🔄 A/B testing (coming soon™)
|
- :icon{name="lucide:refresh-cw"} A/B testing (coming soon™)
|
||||||
|
|
||||||
### Subscriber Management
|
### Subscriber Management
|
||||||
- 📥 Import via CSV
|
- 📥 Import via CSV
|
||||||
- ✅ Double opt-in confirmation
|
- ✅ Double opt-in confirmation
|
||||||
- 🏷️ Tag and categorize
|
- :icon{name="lucide:tag"} Tag and categorize
|
||||||
- 📊 View engagement history
|
- :icon{name="lucide:bar-chart"} View engagement history
|
||||||
- 🚫 Easy unsubscribe management
|
- :icon{name="lucide:ban"} Easy unsubscribe management
|
||||||
|
|
||||||
### Analytics Dashboard
|
### Analytics Dashboard
|
||||||
- 📈 Open rates
|
- :icon{name="lucide:trending-up"} Open rates
|
||||||
- 👆 Click-through rates
|
- 👆 Click-through rates
|
||||||
- 📉 Unsubscribe rates
|
- 📉 Unsubscribe rates
|
||||||
- 📊 Subscriber growth over time
|
- :icon{name="lucide:bar-chart"} Subscriber growth over time
|
||||||
- 🎯 Campaign performance
|
- :icon{name="lucide:target"} Campaign performance
|
||||||
|
|
||||||
### Email Features
|
### Email Features
|
||||||
- 🎨 Custom HTML templates
|
- :icon{name="lucide:palette"} Custom HTML templates
|
||||||
- 📱 Mobile-responsive designs
|
- 📱 Mobile-responsive designs
|
||||||
- 🖼️ Image support
|
- 🖼️ Image support
|
||||||
- 🔗 Link tracking
|
- :icon{name="lucide:link"} Link tracking
|
||||||
- 👤 Personalization ({{name}}, etc.)
|
- :icon{name="lucide:user"} Personalization ({{name}}, etc.)
|
||||||
|
|
||||||
## Configuration Breakdown
|
## Configuration Breakdown
|
||||||
|
|
||||||
@@ -108,7 +108,7 @@ JWT_SECRET=your-super-secret-key-here
|
|||||||
```
|
```
|
||||||
Generate with: `openssl rand -hex 32`
|
Generate with: `openssl rand -hex 32`
|
||||||
|
|
||||||
## First Time Setup 🚀
|
## First Time Setup :icon{name="lucide:rocket"}
|
||||||
|
|
||||||
1. **Ensure database exists**:
|
1. **Ensure database exists**:
|
||||||
```bash
|
```bash
|
||||||
@@ -177,7 +177,7 @@ The backend runs several automated jobs:
|
|||||||
- `GET /api/v1/lists` - View all lists
|
- `GET /api/v1/lists` - View all lists
|
||||||
- `POST /api/v1/lists/:id/subscribers` - Add to list
|
- `POST /api/v1/lists/:id/subscribers` - Add to list
|
||||||
|
|
||||||
## Sending Your First Newsletter 📬
|
## Sending Your First Newsletter :icon{name="lucide:mailbox"}
|
||||||
|
|
||||||
1. **Create a list**:
|
1. **Create a list**:
|
||||||
```bash
|
```bash
|
||||||
@@ -233,7 +233,7 @@ The backend runs several automated jobs:
|
|||||||
- `Click` - Link clicks
|
- `Click` - Link clicks
|
||||||
- `Unsubscribe` - Opt-outs
|
- `Unsubscribe` - Opt-outs
|
||||||
|
|
||||||
## Privacy & Compliance 🔒
|
## Privacy & Compliance :icon{name="lucide:lock"}
|
||||||
|
|
||||||
### GDPR Compliant
|
### GDPR Compliant
|
||||||
- ✅ Double opt-in
|
- ✅ Double opt-in
|
||||||
@@ -317,7 +317,7 @@ docker exec news_backend npx prisma migrate reset
|
|||||||
**Q: API not responding?**
|
**Q: API not responding?**
|
||||||
A: Check if PostgreSQL is healthy and JWT_SECRET is set
|
A: Check if PostgreSQL is healthy and JWT_SECRET is set
|
||||||
|
|
||||||
## Email Best Practices 📧
|
## Email Best Practices :icon{name="lucide:mail"}
|
||||||
|
|
||||||
### Subject Lines
|
### Subject Lines
|
||||||
- Keep under 50 characters
|
- Keep under 50 characters
|
||||||
@@ -370,7 +370,7 @@ trackOpen(subscriberId, campaignId)
|
|||||||
trackClick(subscriberId, linkUrl)
|
trackClick(subscriberId, linkUrl)
|
||||||
```
|
```
|
||||||
|
|
||||||
## Scaling Tips 🚀
|
## Scaling Tips :icon{name="lucide:rocket"}
|
||||||
|
|
||||||
### For Large Lists (10k+ subscribers)
|
### For Large Lists (10k+ subscribers)
|
||||||
1. Use dedicated SMTP service (SendGrid, Mailgun)
|
1. Use dedicated SMTP service (SendGrid, Mailgun)
|
||||||
@@ -394,4 +394,4 @@ trackClick(subscriberId, linkUrl)
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
*"The money is in the list, but the trust is in respecting that list."* - Email Marketing Wisdom 💌✨
|
*"The money is in the list, but the trust is in respecting that list."* - Email Marketing Wisdom 💌:icon{name="lucide:sparkles"}
|
||||||
@@ -1,10 +1,10 @@
|
|||||||
---
|
---
|
||||||
title: Proxy Stack - The Traffic Cop of Your Infrastructure
|
title: Proxy - The Traffic Cop of Your Infrastructure
|
||||||
description: "Beep beep! Make way for HTTPS traffic!"
|
description: "Beep beep! Make way for HTTPS traffic!"
|
||||||
|
navigation:
|
||||||
|
icon: i-lucide-traffic-cone
|
||||||
---
|
---
|
||||||
|
|
||||||
# 🚦 Proxy Stack - The Traffic Cop of Your Infrastructure
|
|
||||||
|
|
||||||
> *"Beep beep! Make way for HTTPS traffic!"* - Traefik
|
> *"Beep beep! Make way for HTTPS traffic!"* - Traefik
|
||||||
|
|
||||||
## What's This All About?
|
## What's This All About?
|
||||||
@@ -13,7 +13,7 @@ Traefik (pronounced "traffic") is your reverse proxy and load balancer extraordi
|
|||||||
|
|
||||||
## The Traffic Master
|
## The Traffic Master
|
||||||
|
|
||||||
### 🎯 Traefik
|
### :icon{name="lucide:target"} Traefik
|
||||||
|
|
||||||
**Container**: `proxy_app`
|
**Container**: `proxy_app`
|
||||||
**Image**: `traefik:latest`
|
**Image**: `traefik:latest`
|
||||||
@@ -21,13 +21,13 @@ Traefik (pronounced "traffic") is your reverse proxy and load balancer extraordi
|
|||||||
**Home**: http://localhost:8080/dashboard/
|
**Home**: http://localhost:8080/dashboard/
|
||||||
|
|
||||||
Traefik is the Swiss Army knife of reverse proxies:
|
Traefik is the Swiss Army knife of reverse proxies:
|
||||||
- 🔒 **Auto SSL**: Let's Encrypt certificates automatically
|
- :icon{name="lucide:lock"} **Auto SSL**: Let's Encrypt certificates automatically
|
||||||
- 🏷️ **Service Discovery**: Finds your containers via Docker labels
|
- :icon{name="lucide:tag"} **Service Discovery**: Finds your containers via Docker labels
|
||||||
- 🔄 **Auto-Config**: No config files to edit (mostly!)
|
- :icon{name="lucide:refresh-cw"} **Auto-Config**: No config files to edit (mostly!)
|
||||||
- 📊 **Dashboard**: Beautiful visual overview
|
- :icon{name="lucide:bar-chart"} **Dashboard**: Beautiful visual overview
|
||||||
- ⚡ **Fast**: Written in Go for max performance
|
- :icon{name="lucide:zap"} **Fast**: Written in Go for max performance
|
||||||
- 🔌 **Middleware**: Compress, auth, rate limit, and more
|
- :icon{name="lucide:plug"} **Middleware**: Compress, auth, rate limit, and more
|
||||||
- 🎯 **Load Balancing**: Distribute traffic intelligently
|
- :icon{name="lucide:target"} **Load Balancing**: Distribute traffic intelligently
|
||||||
|
|
||||||
## How It Works
|
## How It Works
|
||||||
|
|
||||||
@@ -85,7 +85,7 @@ Let's decode the Traefik startup commands:
|
|||||||
- Stores certs in `/letsencrypt/acme.json`
|
- Stores certs in `/letsencrypt/acme.json`
|
||||||
- Auto-renewal (60 days before expiry)
|
- Auto-renewal (60 days before expiry)
|
||||||
|
|
||||||
## Dashboard Access 📊
|
## Dashboard Access :icon{name="lucide:bar-chart"}
|
||||||
|
|
||||||
### Development/Testing
|
### Development/Testing
|
||||||
```
|
```
|
||||||
@@ -93,11 +93,11 @@ URL: http://localhost:8080/dashboard/
|
|||||||
```
|
```
|
||||||
|
|
||||||
**Features**:
|
**Features**:
|
||||||
- 📋 All routers and services
|
- :icon{name="lucide:clipboard"} All routers and services
|
||||||
- 🔒 Active certificates
|
- :icon{name="lucide:lock"} Active certificates
|
||||||
- 🌐 Entry points status
|
- :icon{name="lucide:globe"} Entry points status
|
||||||
- 📊 Real-time metrics
|
- :icon{name="lucide:bar-chart"} Real-time metrics
|
||||||
- 🔍 Request logs
|
- :icon{name="lucide:search"} Request logs
|
||||||
|
|
||||||
### Production (Secure It!)
|
### Production (Secure It!)
|
||||||
|
|
||||||
@@ -113,7 +113,7 @@ Generate password hash:
|
|||||||
htpasswd -nb admin your_password
|
htpasswd -nb admin your_password
|
||||||
```
|
```
|
||||||
|
|
||||||
## Label-Based Configuration 🏷️
|
## Label-Based Configuration :icon{name="lucide:tag"}
|
||||||
|
|
||||||
Every service in kompose uses Traefik labels. Here's what they mean:
|
Every service in kompose uses Traefik labels. Here's what they mean:
|
||||||
|
|
||||||
@@ -158,7 +158,7 @@ labels:
|
|||||||
docker network create kompose
|
docker network create kompose
|
||||||
```
|
```
|
||||||
|
|
||||||
## SSL Certificate Management 🔒
|
## SSL Certificate Management :icon{name="lucide:lock"}
|
||||||
|
|
||||||
### Let's Encrypt Process
|
### Let's Encrypt Process
|
||||||
|
|
||||||
@@ -174,7 +174,7 @@ docker network create kompose
|
|||||||
/var/local/data/traefik/letsencrypt/acme.json
|
/var/local/data/traefik/letsencrypt/acme.json
|
||||||
```
|
```
|
||||||
|
|
||||||
**⚠️ PROTECT THIS FILE!**
|
**:icon{name="lucide:alert-triangle"} PROTECT THIS FILE!**
|
||||||
- Contains private keys
|
- Contains private keys
|
||||||
- Encrypted by Traefik
|
- Encrypted by Traefik
|
||||||
- Backup regularly
|
- Backup regularly
|
||||||
@@ -189,7 +189,7 @@ http://localhost:8080/dashboard/#/http/routers
|
|||||||
sudo cat /var/local/data/traefik/letsencrypt/acme.json | jq '.resolver.Certificates'
|
sudo cat /var/local/data/traefik/letsencrypt/acme.json | jq '.resolver.Certificates'
|
||||||
```
|
```
|
||||||
|
|
||||||
## Common Middleware 🔧
|
## Common Middleware :icon{name="lucide:wrench"}
|
||||||
|
|
||||||
### Rate Limiting
|
### Rate Limiting
|
||||||
```yaml
|
```yaml
|
||||||
@@ -218,7 +218,7 @@ sudo cat /var/local/data/traefik/letsencrypt/acme.json | jq '.resolver.Certifica
|
|||||||
- "traefik.http.middlewares.stripprefix.stripprefix.prefixes=/api"
|
- "traefik.http.middlewares.stripprefix.stripprefix.prefixes=/api"
|
||||||
```
|
```
|
||||||
|
|
||||||
## Health Check 🏥
|
## Health Check :icon{name="lucide:hospital"}
|
||||||
|
|
||||||
Traefik has a built-in health check:
|
Traefik has a built-in health check:
|
||||||
```bash
|
```bash
|
||||||
@@ -271,7 +271,7 @@ docker logs proxy_app -f
|
|||||||
|
|
||||||
4. **Check dashboard** to confirm routing
|
4. **Check dashboard** to confirm routing
|
||||||
|
|
||||||
## Troubleshooting 🔍
|
## Troubleshooting :icon{name="lucide:search"}
|
||||||
|
|
||||||
**Q: Service not accessible?**
|
**Q: Service not accessible?**
|
||||||
```bash
|
```bash
|
||||||
@@ -334,7 +334,7 @@ services:
|
|||||||
- "traefik.http.services.myapp.loadbalancer.server.weight=10"
|
- "traefik.http.services.myapp.loadbalancer.server.weight=10"
|
||||||
```
|
```
|
||||||
|
|
||||||
## Security Best Practices 🛡️
|
## Security Best Practices :icon{name="lucide:shield"}
|
||||||
|
|
||||||
1. **Secure Dashboard**:
|
1. **Secure Dashboard**:
|
||||||
- Add authentication
|
- Add authentication
|
||||||
@@ -359,7 +359,7 @@ services:
|
|||||||
- Watch for unusual patterns
|
- Watch for unusual patterns
|
||||||
- Set up alerts for errors
|
- Set up alerts for errors
|
||||||
|
|
||||||
## Performance Tips ⚡
|
## Performance Tips :icon{name="lucide:zap"}
|
||||||
|
|
||||||
1. **Enable Compression**: Already done for most services!
|
1. **Enable Compression**: Already done for most services!
|
||||||
2. **HTTP/2**: Automatically enabled with HTTPS
|
2. **HTTP/2**: Automatically enabled with HTTPS
|
||||||
@@ -367,7 +367,7 @@ services:
|
|||||||
4. **Caching**: Use middleware or CDN
|
4. **Caching**: Use middleware or CDN
|
||||||
5. **Keep-Alive**: Enabled by default
|
5. **Keep-Alive**: Enabled by default
|
||||||
|
|
||||||
## Fun Traefik Facts 🎓
|
## Fun Traefik Facts :icon{name="lucide:graduation-cap"}
|
||||||
|
|
||||||
- Written in Go (blazing fast!)
|
- Written in Go (blazing fast!)
|
||||||
- Powers thousands of production systems
|
- Powers thousands of production systems
|
||||||
@@ -384,4 +384,4 @@ services:
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
*"Life is like a reverse proxy - it's all about routing requests to the right destination."* - Ancient Traefik Wisdom 🚦✨
|
*"Life is like a reverse proxy - it's all about routing requests to the right destination."* - Ancient Traefik Wisdom :icon{name="lucide:traffic-cone"}:icon{name="lucide:sparkles"}
|
||||||
@@ -1,10 +1,10 @@
|
|||||||
---
|
---
|
||||||
title: <20> Sexy Stack - Your Headless CMS Runway
|
title: Sexy - Headless CMS Runway
|
||||||
description: "We make content management look good!"
|
description: "We make content management look good!"
|
||||||
|
navigation:
|
||||||
|
icon: i-lucide-sparkles
|
||||||
---
|
---
|
||||||
|
|
||||||
# 💅 Sexy Stack - Your Headless CMS Runway
|
|
||||||
|
|
||||||
> *"We make content management look good!"* - Directus + SvelteKit
|
> *"We make content management look good!"* - Directus + SvelteKit
|
||||||
|
|
||||||
## What's This All About?
|
## What's This All About?
|
||||||
@@ -13,7 +13,7 @@ This is your full-stack content management system! A headless CMS (Directus) pai
|
|||||||
|
|
||||||
## The Power Couple
|
## The Power Couple
|
||||||
|
|
||||||
### 🎨 Directus API
|
### :icon{name="lucide:palette"} Directus API
|
||||||
|
|
||||||
**Container**: `sexy_api`
|
**Container**: `sexy_api`
|
||||||
**Image**: `directus/directus:11.12.0`
|
**Image**: `directus/directus:11.12.0`
|
||||||
@@ -21,16 +21,16 @@ This is your full-stack content management system! A headless CMS (Directus) pai
|
|||||||
**Home**: https://sexy.pivoine.art/api
|
**Home**: https://sexy.pivoine.art/api
|
||||||
|
|
||||||
Directus is the headless CMS that doesn't make you cry:
|
Directus is the headless CMS that doesn't make you cry:
|
||||||
- 📊 **Database-First**: Works with your existing database
|
- :icon{name="lucide:bar-chart"} **Database-First**: Works with your existing database
|
||||||
- 🎛️ **Admin Panel**: Beautiful UI out of the box
|
- 🎛️ **Admin Panel**: Beautiful UI out of the box
|
||||||
- 🔌 **REST + GraphQL**: Choose your flavor
|
- :icon{name="lucide:plug"} **REST + GraphQL**: Choose your flavor
|
||||||
- 🖼️ **Asset Management**: Images, videos, files - all handled
|
- 🖼️ **Asset Management**: Images, videos, files - all handled
|
||||||
- 👥 **User Roles**: Granular permissions
|
- :icon{name="lucide:users"} **User Roles**: Granular permissions
|
||||||
- 🔄 **Real-time**: WebSocket support for live updates
|
- :icon{name="lucide:refresh-cw"} **Real-time**: WebSocket support for live updates
|
||||||
- 🎨 **Customizable**: Extensions, hooks, custom fields
|
- :icon{name="lucide:palette"} **Customizable**: Extensions, hooks, custom fields
|
||||||
- 🔐 **Auth**: Built-in user management and SSO
|
- :icon{name="lucide:lock-keyhole"} **Auth**: Built-in user management and SSO
|
||||||
|
|
||||||
### ⚡ SvelteKit Frontend
|
### :icon{name="lucide:zap"} SvelteKit Frontend
|
||||||
|
|
||||||
**Container**: `sexy_frontend`
|
**Container**: `sexy_frontend`
|
||||||
**Image**: `node:22`
|
**Image**: `node:22`
|
||||||
@@ -38,12 +38,12 @@ Directus is the headless CMS that doesn't make you cry:
|
|||||||
**Home**: https://sexy.pivoine.art
|
**Home**: https://sexy.pivoine.art
|
||||||
|
|
||||||
The face of your content:
|
The face of your content:
|
||||||
- 🚀 **Lightning Fast**: Svelte's magic compilation
|
- :icon{name="lucide:rocket"} **Lightning Fast**: Svelte's magic compilation
|
||||||
- 🎯 **SEO Friendly**: Server-side rendering
|
- :icon{name="lucide:target"} **SEO Friendly**: Server-side rendering
|
||||||
- 📱 **Responsive**: Mobile-first design
|
- 📱 **Responsive**: Mobile-first design
|
||||||
- 🎨 **Beautiful**: Because sexy.pivoine.art deserves it
|
- :icon{name="lucide:palette"} **Beautiful**: Because sexy.pivoine.art deserves it
|
||||||
- 🔄 **Real-time Updates**: Live data from Directus
|
- :icon{name="lucide:refresh-cw"} **Real-time Updates**: Live data from Directus
|
||||||
- 💅 **Styled**: Tailwind CSS + custom design
|
- :icon{name="lucide:sparkles"} **Styled**: Tailwind CSS + custom design
|
||||||
|
|
||||||
## Architecture
|
## Architecture
|
||||||
|
|
||||||
@@ -106,7 +106,7 @@ Running from `/var/www/sexy.pivoine.art`:
|
|||||||
node build/index.js
|
node build/index.js
|
||||||
```
|
```
|
||||||
|
|
||||||
## First Time Setup 🚀
|
## First Time Setup :icon{name="lucide:rocket"}
|
||||||
|
|
||||||
### 1. Create Database
|
### 1. Create Database
|
||||||
```bash
|
```bash
|
||||||
@@ -163,16 +163,16 @@ Password: Your ADMIN_PASSWORD
|
|||||||
### Data Model
|
### Data Model
|
||||||
|
|
||||||
**Field Types**:
|
**Field Types**:
|
||||||
- 📝 Text (String, Text, Markdown)
|
- :icon{name="lucide:file-text"} Text (String, Text, Markdown)
|
||||||
- 🔢 Numbers (Integer, Float, Decimal)
|
- 🔢 Numbers (Integer, Float, Decimal)
|
||||||
- 📅 Dates (Date, DateTime, Time)
|
- 📅 Dates (Date, DateTime, Time)
|
||||||
- ✅ Booleans & Toggles
|
- ✅ Booleans & Toggles
|
||||||
- 🎨 JSON & Code
|
- :icon{name="lucide:palette"} JSON & Code
|
||||||
- 🔗 Relations (O2M, M2O, M2M)
|
- :icon{name="lucide:link"} Relations (O2M, M2O, M2M)
|
||||||
- 🖼️ Files & Images
|
- 🖼️ Files & Images
|
||||||
- 📍 Geolocation
|
- 📍 Geolocation
|
||||||
|
|
||||||
## API Usage 🔌
|
## API Usage :icon{name="lucide:plug"}
|
||||||
|
|
||||||
### REST API
|
### REST API
|
||||||
|
|
||||||
@@ -268,7 +268,7 @@ Directus automatically generates thumbnails:
|
|||||||
>
|
>
|
||||||
```
|
```
|
||||||
|
|
||||||
## Real-Time Updates 🔄
|
## Real-Time Updates :icon{name="lucide:refresh-cw"}
|
||||||
|
|
||||||
### WebSocket Connection
|
### WebSocket Connection
|
||||||
|
|
||||||
@@ -288,7 +288,7 @@ client.subscribe('posts', {
|
|||||||
});
|
});
|
||||||
```
|
```
|
||||||
|
|
||||||
## Extensions & Customization 🔧
|
## Extensions & Customization :icon{name="lucide:wrench"}
|
||||||
|
|
||||||
### Custom Hooks
|
### Custom Hooks
|
||||||
|
|
||||||
@@ -357,7 +357,7 @@ Custom extensions and functionality.
|
|||||||
- **Author**: Create own posts
|
- **Author**: Create own posts
|
||||||
- **Public**: Read published content
|
- **Public**: Read published content
|
||||||
|
|
||||||
## Performance Optimization 🚀
|
## Performance Optimization :icon{name="lucide:rocket"}
|
||||||
|
|
||||||
### Caching Strategy
|
### Caching Strategy
|
||||||
```javascript
|
```javascript
|
||||||
@@ -377,7 +377,7 @@ CACHE_TTL=300 // 5 minutes
|
|||||||
- Query result caching
|
- Query result caching
|
||||||
- Connection pooling
|
- Connection pooling
|
||||||
|
|
||||||
## Security Best Practices 🔒
|
## Security Best Practices :icon{name="lucide:lock"}
|
||||||
|
|
||||||
1. **Change Default Password**: First thing!
|
1. **Change Default Password**: First thing!
|
||||||
2. **API Access Tokens**: Use tokens, not passwords
|
2. **API Access Tokens**: Use tokens, not passwords
|
||||||
@@ -429,15 +429,15 @@ A: Check WEBSOCKETS_ENABLED=true and wss:// connection
|
|||||||
- Version control
|
- Version control
|
||||||
- Multi-language support
|
- Multi-language support
|
||||||
|
|
||||||
## Why This Stack is Sexy 💅
|
## Why This Stack is Sexy :icon{name="lucide:sparkles"}
|
||||||
|
|
||||||
- ✨ **Developer Experience**: Joy to work with
|
- :icon{name="lucide:sparkles"} **Developer Experience**: Joy to work with
|
||||||
- 🚀 **Performance**: Fast out of the box
|
- :icon{name="lucide:rocket"} **Performance**: Fast out of the box
|
||||||
- 🎨 **Design**: Beautiful admin interface
|
- :icon{name="lucide:palette"} **Design**: Beautiful admin interface
|
||||||
- 🔧 **Flexibility**: Customize everything
|
- :icon{name="lucide:wrench"} **Flexibility**: Customize everything
|
||||||
- 📱 **Modern**: Built with latest tech
|
- 📱 **Modern**: Built with latest tech
|
||||||
- 🆓 **Open Source**: Free forever
|
- 🆓 **Open Source**: Free forever
|
||||||
- 💪 **Production Ready**: Powers serious sites
|
- :icon{name="lucide:dumbbell"} **Production Ready**: Powers serious sites
|
||||||
|
|
||||||
## Resources
|
## Resources
|
||||||
|
|
||||||
@@ -448,4 +448,4 @@ A: Check WEBSOCKETS_ENABLED=true and wss:// connection
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
*"Content management should feel like art, not work."* - Sexy Philosophy 💅✨
|
*"Content management should feel like art, not work."* - Sexy Philosophy :icon{name="lucide:sparkles"}:icon{name="lucide:sparkles"}
|
||||||
@@ -1,19 +1,19 @@
|
|||||||
---
|
---
|
||||||
title: <20> Trace Stack - Your Observability Command Center
|
title: Trace - Observability Command Center
|
||||||
description: "When your app goes boom, we tell you why!"
|
description: "When your app goes boom, we tell you why!"
|
||||||
|
navigation:
|
||||||
|
icon: i-lucide-search
|
||||||
---
|
---
|
||||||
|
|
||||||
# 🔍 Trace Stack - Your Observability Command Center
|
|
||||||
|
|
||||||
> *"When your app goes boom, we tell you why!"* - SigNoz
|
> *"When your app goes boom, we tell you why!"* - SigNoz
|
||||||
|
|
||||||
## What's This All About?
|
## What's This All About?
|
||||||
|
|
||||||
SigNoz is your all-in-one observability platform! Think of it as having X-ray vision for your applications - see traces, metrics, and logs all in one place. It's like Datadog or New Relic, but open-source and running on YOUR infrastructure. When something breaks at 3 AM, SigNoz tells you exactly what, where, and why! 🚨
|
SigNoz is your all-in-one observability platform! Think of it as having X-ray vision for your applications - see traces, metrics, and logs all in one place. It's like Datadog or New Relic, but open-source and running on YOUR infrastructure. When something breaks at 3 AM, SigNoz tells you exactly what, where, and why! :icon{name="lucide:siren"}
|
||||||
|
|
||||||
## The Observability Avengers
|
## The Observability Avengers
|
||||||
|
|
||||||
### 🎯 SigNoz
|
### :icon{name="lucide:target"} SigNoz
|
||||||
|
|
||||||
**Container**: `trace_app`
|
**Container**: `trace_app`
|
||||||
**Image**: `signoz/signoz:v0.96.1`
|
**Image**: `signoz/signoz:v0.96.1`
|
||||||
@@ -21,56 +21,56 @@ SigNoz is your all-in-one observability platform! Think of it as having X-ray vi
|
|||||||
**Home**: http://localhost:7070
|
**Home**: http://localhost:7070
|
||||||
|
|
||||||
Your main dashboard and query engine:
|
Your main dashboard and query engine:
|
||||||
- 📊 **APM**: Application Performance Monitoring
|
- :icon{name="lucide:bar-chart"} **APM**: Application Performance Monitoring
|
||||||
- 🔍 **Distributed Tracing**: Follow requests across services
|
- :icon{name="lucide:search"} **Distributed Tracing**: Follow requests across services
|
||||||
- 📈 **Metrics**: CPU, memory, custom metrics
|
- :icon{name="lucide:trending-up"} **Metrics**: CPU, memory, custom metrics
|
||||||
- 📝 **Logs**: Centralized log management
|
- :icon{name="lucide:file-text"} **Logs**: Centralized log management
|
||||||
- 🎯 **Alerting**: Get notified when things break
|
- :icon{name="lucide:target"} **Alerting**: Get notified when things break
|
||||||
- 🔗 **Service Maps**: Visualize your architecture
|
- :icon{name="lucide:link"} **Service Maps**: Visualize your architecture
|
||||||
- ⏱️ **Performance**: Find bottlenecks
|
- ⏱️ **Performance**: Find bottlenecks
|
||||||
- 🐛 **Error Tracking**: Catch and debug errors
|
- 🐛 **Error Tracking**: Catch and debug errors
|
||||||
|
|
||||||
### 🗄️ ClickHouse
|
### :icon{name="lucide:database"} ClickHouse
|
||||||
|
|
||||||
**Container**: `trace_clickhouse`
|
**Container**: `trace_clickhouse`
|
||||||
**Image**: `clickhouse/clickhouse-server:25.5.6`
|
**Image**: `clickhouse/clickhouse-server:25.5.6`
|
||||||
|
|
||||||
The speed demon database:
|
The speed demon database:
|
||||||
- ⚡ **Columnar Storage**: Insanely fast queries
|
- :icon{name="lucide:zap"} **Columnar Storage**: Insanely fast queries
|
||||||
- 📊 **Analytics**: Perfect for time-series data
|
- :icon{name="lucide:bar-chart"} **Analytics**: Perfect for time-series data
|
||||||
- 💾 **Compression**: Stores LOTS of data efficiently
|
- :icon{name="lucide:hard-drive"} **Compression**: Stores LOTS of data efficiently
|
||||||
- 🚀 **Performance**: Millions of rows/second
|
- :icon{name="lucide:rocket"} **Performance**: Millions of rows/second
|
||||||
- 📈 **Scalable**: Grows with your needs
|
- :icon{name="lucide:trending-up"} **Scalable**: Grows with your needs
|
||||||
|
|
||||||
### 🐘 ZooKeeper
|
### :icon{name="simple-icons:postgresql"} ZooKeeper
|
||||||
|
|
||||||
**Container**: `trace_zookeeper`
|
**Container**: `trace_zookeeper`
|
||||||
**Image**: `signoz/zookeeper:3.7.1`
|
**Image**: `signoz/zookeeper:3.7.1`
|
||||||
|
|
||||||
The coordinator:
|
The coordinator:
|
||||||
- 🎭 **Orchestration**: Manages distributed systems
|
- :icon{name="lucide:drama"} **Orchestration**: Manages distributed systems
|
||||||
- 🔄 **Coordination**: Keeps ClickHouse in sync
|
- :icon{name="lucide:refresh-cw"} **Coordination**: Keeps ClickHouse in sync
|
||||||
- 📋 **Configuration**: Centralized config management
|
- :icon{name="lucide:clipboard"} **Configuration**: Centralized config management
|
||||||
|
|
||||||
### 📡 OpenTelemetry Collector
|
### :icon{name="lucide:satellite"} OpenTelemetry Collector
|
||||||
|
|
||||||
**Container**: `trace_otel_collector`
|
**Container**: `trace_otel_collector`
|
||||||
**Image**: `signoz/signoz-otel-collector:v0.129.6`
|
**Image**: `signoz/signoz-otel-collector:v0.129.6`
|
||||||
|
|
||||||
The data pipeline:
|
The data pipeline:
|
||||||
- 📥 **Receives**: Traces, metrics, logs from apps
|
- 📥 **Receives**: Traces, metrics, logs from apps
|
||||||
- 🔄 **Processes**: Transforms and enriches data
|
- :icon{name="lucide:refresh-cw"} **Processes**: Transforms and enriches data
|
||||||
- 📤 **Exports**: Sends to ClickHouse
|
- 📤 **Exports**: Sends to ClickHouse
|
||||||
- 🎯 **Sampling**: Smart data collection
|
- :icon{name="lucide:target"} **Sampling**: Smart data collection
|
||||||
- 🔌 **Flexible**: Supports many data formats
|
- :icon{name="lucide:plug"} **Flexible**: Supports many data formats
|
||||||
|
|
||||||
### 🔧 Schema Migrators
|
### :icon{name="lucide:wrench"} Schema Migrators
|
||||||
|
|
||||||
**Containers**: `trace_migrator_sync` & `trace_migrator_async`
|
**Containers**: `trace_migrator_sync` & `trace_migrator_async`
|
||||||
|
|
||||||
The database janitors:
|
The database janitors:
|
||||||
- 🗂️ **Migrations**: Set up database schema
|
- 🗂️ **Migrations**: Set up database schema
|
||||||
- 🔄 **Updates**: Apply schema changes
|
- :icon{name="lucide:refresh-cw"} **Updates**: Apply schema changes
|
||||||
- 🏗️ **Initialization**: Prepare ClickHouse
|
- 🏗️ **Initialization**: Prepare ClickHouse
|
||||||
|
|
||||||
## Architecture Overview
|
## Architecture Overview
|
||||||
@@ -87,7 +87,7 @@ SigNoz UI ← You (investigate issues)
|
|||||||
|
|
||||||
## The Three Pillars of Observability
|
## The Three Pillars of Observability
|
||||||
|
|
||||||
### 1. 📊 Metrics (The Numbers)
|
### 1. :icon{name="lucide:bar-chart"} Metrics (The Numbers)
|
||||||
What's happening right now?
|
What's happening right now?
|
||||||
- Request rate (requests/second)
|
- Request rate (requests/second)
|
||||||
- Error rate (errors/second)
|
- Error rate (errors/second)
|
||||||
@@ -96,7 +96,7 @@ What's happening right now?
|
|||||||
|
|
||||||
**Example**: "API calls are up 200% but error rate is only 1%"
|
**Example**: "API calls are up 200% but error rate is only 1%"
|
||||||
|
|
||||||
### 2. 🔍 Traces (The Journey)
|
### 2. :icon{name="lucide:search"} Traces (The Journey)
|
||||||
How did a request flow through your system?
|
How did a request flow through your system?
|
||||||
- Distributed tracing across services
|
- Distributed tracing across services
|
||||||
- See exact path of each request
|
- See exact path of each request
|
||||||
@@ -105,7 +105,7 @@ How did a request flow through your system?
|
|||||||
|
|
||||||
**Example**: "User login → Auth service (50ms) → Database (200ms) → Session storage (10ms)"
|
**Example**: "User login → Auth service (50ms) → Database (200ms) → Session storage (10ms)"
|
||||||
|
|
||||||
### 3. 📝 Logs (The Details)
|
### 3. :icon{name="lucide:file-text"} Logs (The Details)
|
||||||
What exactly happened?
|
What exactly happened?
|
||||||
- Application logs
|
- Application logs
|
||||||
- System logs
|
- System logs
|
||||||
@@ -144,7 +144,7 @@ SIGNOZ_TELEMETRYSTORE_CLICKHOUSE_DSN=tcp://clickhouse:9000
|
|||||||
STORAGE=clickhouse # Backend storage engine
|
STORAGE=clickhouse # Backend storage engine
|
||||||
```
|
```
|
||||||
|
|
||||||
## First Time Setup 🚀
|
## First Time Setup :icon{name="lucide:rocket"}
|
||||||
|
|
||||||
### 1. Ensure Dependencies Ready
|
### 1. Ensure Dependencies Ready
|
||||||
```bash
|
```bash
|
||||||
@@ -240,42 +240,42 @@ span.end();
|
|||||||
3. See your service appear!
|
3. See your service appear!
|
||||||
4. Click on it to see traces
|
4. Click on it to see traces
|
||||||
|
|
||||||
## Using SigNoz Like a Pro 🎯
|
## Using SigNoz Like a Pro :icon{name="lucide:target"}
|
||||||
|
|
||||||
### Services View
|
### Services View
|
||||||
See all your microservices:
|
See all your microservices:
|
||||||
- 📊 Request rate
|
- :icon{name="lucide:bar-chart"} Request rate
|
||||||
- ⏱️ Latency (P50, P90, P99)
|
- ⏱️ Latency (P50, P90, P99)
|
||||||
- ❌ Error rate
|
- ❌ Error rate
|
||||||
- 🔥 Top endpoints
|
- :icon{name="lucide:flame"} Top endpoints
|
||||||
|
|
||||||
### Traces View
|
### Traces View
|
||||||
Debug individual requests:
|
Debug individual requests:
|
||||||
- 🔍 Search by service, operation, duration
|
- :icon{name="lucide:search"} Search by service, operation, duration
|
||||||
- 📈 Visualize request flow
|
- :icon{name="lucide:trending-up"} Visualize request flow
|
||||||
- ⏱️ See exact timings
|
- ⏱️ See exact timings
|
||||||
- 🐛 Find errors with full context
|
- 🐛 Find errors with full context
|
||||||
|
|
||||||
### Metrics View (Dashboards)
|
### Metrics View (Dashboards)
|
||||||
Create custom dashboards:
|
Create custom dashboards:
|
||||||
- 📊 Application metrics
|
- :icon{name="lucide:bar-chart"} Application metrics
|
||||||
- 💻 Infrastructure metrics
|
- :icon{name="lucide:laptop"} Infrastructure metrics
|
||||||
- 📈 Business KPIs
|
- :icon{name="lucide:trending-up"} Business KPIs
|
||||||
- 🎯 Custom queries
|
- :icon{name="lucide:target"} Custom queries
|
||||||
|
|
||||||
### Logs View
|
### Logs View
|
||||||
Query all your logs:
|
Query all your logs:
|
||||||
- 🔍 Full-text search
|
- :icon{name="lucide:search"} Full-text search
|
||||||
- 🏷️ Filter by attributes
|
- :icon{name="lucide:tag"} Filter by attributes
|
||||||
- ⏰ Time-based queries
|
- :icon{name="lucide:clock"} Time-based queries
|
||||||
- 🔗 Correlation with traces
|
- :icon{name="lucide:link"} Correlation with traces
|
||||||
|
|
||||||
### Alerts
|
### Alerts
|
||||||
Set up notifications:
|
Set up notifications:
|
||||||
- 📧 Email alerts
|
- :icon{name="lucide:mail"} Email alerts
|
||||||
- 💬 Slack notifications
|
- :icon{name="lucide:message-circle"} Slack notifications
|
||||||
- 📱 PagerDuty integration
|
- 📱 PagerDuty integration
|
||||||
- 🔔 Custom webhooks
|
- :icon{name="lucide:bell"} Custom webhooks
|
||||||
|
|
||||||
## Common Queries & Dashboards
|
## Common Queries & Dashboards
|
||||||
|
|
||||||
@@ -303,8 +303,8 @@ Limit: 10
|
|||||||
|
|
||||||
### Service Dependencies
|
### Service Dependencies
|
||||||
Auto-generated service map shows:
|
Auto-generated service map shows:
|
||||||
- 🔗 Which services call which
|
- :icon{name="lucide:link"} Which services call which
|
||||||
- 📊 Request volumes
|
- :icon{name="lucide:bar-chart"} Request volumes
|
||||||
- ⏱️ Latencies between services
|
- ⏱️ Latencies between services
|
||||||
- ❌ Error rates
|
- ❌ Error rates
|
||||||
|
|
||||||
@@ -416,7 +416,7 @@ zookeeper_data → /bitnami/zookeeper
|
|||||||
```
|
```
|
||||||
Coordination state.
|
Coordination state.
|
||||||
|
|
||||||
## Performance Tuning 🚀
|
## Performance Tuning :icon{name="lucide:rocket"}
|
||||||
|
|
||||||
### Sampling
|
### Sampling
|
||||||
Don't send ALL traces (too expensive):
|
Don't send ALL traces (too expensive):
|
||||||
@@ -442,7 +442,7 @@ environment:
|
|||||||
MAX_MEMORY_USAGE: 10000000000 # 10GB
|
MAX_MEMORY_USAGE: 10000000000 # 10GB
|
||||||
```
|
```
|
||||||
|
|
||||||
## Troubleshooting 🔧
|
## Troubleshooting :icon{name="lucide:wrench"}
|
||||||
|
|
||||||
**Q: No data appearing in SigNoz?**
|
**Q: No data appearing in SigNoz?**
|
||||||
```bash
|
```bash
|
||||||
@@ -510,7 +510,7 @@ Set and track SLOs:
|
|||||||
4. Optimize query
|
4. Optimize query
|
||||||
5. Verify improvement in metrics
|
5. Verify improvement in metrics
|
||||||
|
|
||||||
### 2. Error Investigation 🔥
|
### 2. Error Investigation :icon{name="lucide:flame"}
|
||||||
**Problem**: Users reporting 500 errors
|
**Problem**: Users reporting 500 errors
|
||||||
**Solution**:
|
**Solution**:
|
||||||
1. Check error rate dashboard
|
1. Check error rate dashboard
|
||||||
@@ -519,7 +519,7 @@ Set and track SLOs:
|
|||||||
4. Identify null pointer exception
|
4. Identify null pointer exception
|
||||||
5. Deploy fix and monitor
|
5. Deploy fix and monitor
|
||||||
|
|
||||||
### 3. Capacity Planning 📊
|
### 3. Capacity Planning :icon{name="lucide:bar-chart"}
|
||||||
**Problem**: Need to scale before Black Friday
|
**Problem**: Need to scale before Black Friday
|
||||||
**Solution**:
|
**Solution**:
|
||||||
1. Review historical metrics
|
1. Review historical metrics
|
||||||
@@ -540,13 +540,13 @@ Set and track SLOs:
|
|||||||
## Why SigNoz is Awesome
|
## Why SigNoz is Awesome
|
||||||
|
|
||||||
- 🆓 **Open Source**: Free forever, no limits
|
- 🆓 **Open Source**: Free forever, no limits
|
||||||
- 🚀 **Fast**: ClickHouse is CRAZY fast
|
- :icon{name="lucide:rocket"} **Fast**: ClickHouse is CRAZY fast
|
||||||
- 🎯 **Complete**: Metrics + Traces + Logs in one
|
- :icon{name="lucide:target"} **Complete**: Metrics + Traces + Logs in one
|
||||||
- 📊 **Powerful**: Query anything, any way
|
- :icon{name="lucide:bar-chart"} **Powerful**: Query anything, any way
|
||||||
- 🔒 **Private**: Your data stays on your server
|
- :icon{name="lucide:lock"} **Private**: Your data stays on your server
|
||||||
- 💰 **Cost-Effective**: No per-seat pricing
|
- :icon{name="lucide:dollar-sign"} **Cost-Effective**: No per-seat pricing
|
||||||
- 🛠️ **Flexible**: Customize everything
|
- :icon{name="lucide:hammer"} **Flexible**: Customize everything
|
||||||
- 📈 **Scalable**: Grows with your needs
|
- :icon{name="lucide:trending-up"} **Scalable**: Grows with your needs
|
||||||
|
|
||||||
## Resources
|
## Resources
|
||||||
|
|
||||||
@@ -557,4 +557,4 @@ Set and track SLOs:
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
*"You can't fix what you can't see. SigNoz makes everything visible."* - Observability Wisdom 🔍✨
|
*"You can't fix what you can't see. SigNoz makes everything visible."* - Observability Wisdom :icon{name="lucide:search"}:icon{name="lucide:sparkles"}
|
||||||
@@ -1,19 +1,19 @@
|
|||||||
---
|
---
|
||||||
title: <20> Track Stack - Your Privacy-First Analytics HQ
|
title: Track - Privacy-First Analytics HQ
|
||||||
description: "We count visitors, not cookies!"
|
description: "We count visitors, not cookies!"
|
||||||
|
navigation:
|
||||||
|
icon: i-lucide-bar-chart
|
||||||
---
|
---
|
||||||
|
|
||||||
# 📊 Track Stack - Your Privacy-First Analytics HQ
|
|
||||||
|
|
||||||
> *"We count visitors, not cookies!"* - Umami Analytics
|
> *"We count visitors, not cookies!"* - Umami Analytics
|
||||||
|
|
||||||
## What's This All About?
|
## What's This All About?
|
||||||
|
|
||||||
Umami is your self-hosted, privacy-focused alternative to Google Analytics! It's like having all the insights without selling your soul (or your visitors' data) to Big Tech. Track what matters, respect privacy, stay GDPR compliant, and sleep well at night knowing you're not contributing to the surveillance economy! 🕵️♂️
|
Umami is your self-hosted, privacy-focused alternative to Google Analytics! It's like having all the insights without selling your soul (or your visitors' data) to Big Tech. Track what matters, respect privacy, stay GDPR compliant, and sleep well at night knowing you're not contributing to the surveillance economy! :icon{name="lucide:search"}
|
||||||
|
|
||||||
## The Analytics Ace
|
## The Analytics Ace
|
||||||
|
|
||||||
### 📈 Umami
|
### :icon{name="lucide:trending-up"} Umami
|
||||||
|
|
||||||
**Container**: `track_app`
|
**Container**: `track_app`
|
||||||
**Image**: `ghcr.io/umami-software/umami:postgresql-latest`
|
**Image**: `ghcr.io/umami-software/umami:postgresql-latest`
|
||||||
@@ -21,36 +21,36 @@ Umami is your self-hosted, privacy-focused alternative to Google Analytics! It's
|
|||||||
**Home**: https://umami.pivoine.art
|
**Home**: https://umami.pivoine.art
|
||||||
|
|
||||||
Umami is analytics done right:
|
Umami is analytics done right:
|
||||||
- 🔒 **Privacy-First**: No cookies, no tracking pixels, no creepy stuff
|
- :icon{name="lucide:lock"} **Privacy-First**: No cookies, no tracking pixels, no creepy stuff
|
||||||
- 🇪🇺 **GDPR Compliant**: By design, not as an afterthought
|
- 🇪🇺 **GDPR Compliant**: By design, not as an afterthought
|
||||||
- 📊 **Beautiful Dashboards**: Real-time, clean, insightful
|
- :icon{name="lucide:bar-chart"} **Beautiful Dashboards**: Real-time, clean, insightful
|
||||||
- 🌍 **Multi-Site**: Track unlimited websites
|
- 🌍 **Multi-Site**: Track unlimited websites
|
||||||
- 👥 **Team Features**: Invite team members
|
- :icon{name="lucide:users"} **Team Features**: Invite team members
|
||||||
- 📱 **Events Tracking**: Custom events and goals
|
- 📱 **Events Tracking**: Custom events and goals
|
||||||
- 🎨 **Simple Script**: Just one line of JavaScript
|
- :icon{name="lucide:palette"} **Simple Script**: Just one line of JavaScript
|
||||||
- 🆓 **Open Source**: Free forever, your data, your server
|
- 🆓 **Open Source**: Free forever, your data, your server
|
||||||
|
|
||||||
## Features That Make Sense ✨
|
## Features That Make Sense :icon{name="lucide:sparkles"}
|
||||||
|
|
||||||
### Core Metrics
|
### Core Metrics
|
||||||
- 📈 **Page Views**: Real-time visitor counts
|
- :icon{name="lucide:trending-up"} **Page Views**: Real-time visitor counts
|
||||||
- 👤 **Unique Visitors**: Who's new, who's returning
|
- :icon{name="lucide:user"} **Unique Visitors**: Who's new, who's returning
|
||||||
- 🌐 **Referrers**: Where traffic comes from
|
- :icon{name="lucide:globe"} **Referrers**: Where traffic comes from
|
||||||
- 📱 **Devices**: Desktop vs Mobile vs Tablet
|
- 📱 **Devices**: Desktop vs Mobile vs Tablet
|
||||||
- 🌍 **Countries**: Geographic distribution
|
- 🌍 **Countries**: Geographic distribution
|
||||||
- 🖥️ **Browsers**: Chrome, Firefox, Safari, etc.
|
- :icon{name="lucide:monitor"} **Browsers**: Chrome, Firefox, Safari, etc.
|
||||||
- 💻 **Operating Systems**: Windows, Mac, Linux, etc.
|
- :icon{name="lucide:laptop"} **Operating Systems**: Windows, Mac, Linux, etc.
|
||||||
- 📄 **Pages**: Most popular content
|
- :icon{name="lucide:file"} **Pages**: Most popular content
|
||||||
|
|
||||||
### Advanced Features
|
### Advanced Features
|
||||||
- 🎯 **Custom Events**: Track buttons, forms, videos
|
- :icon{name="lucide:target"} **Custom Events**: Track buttons, forms, videos
|
||||||
- ⏱️ **Time on Site**: Engagement metrics
|
- ⏱️ **Time on Site**: Engagement metrics
|
||||||
- 📊 **Real-time Data**: Live visitor updates
|
- :icon{name="lucide:bar-chart"} **Real-time Data**: Live visitor updates
|
||||||
- 📅 **Date Ranges**: Custom time periods
|
- 📅 **Date Ranges**: Custom time periods
|
||||||
- 🔍 **Filters**: Drill down into data
|
- :icon{name="lucide:search"} **Filters**: Drill down into data
|
||||||
- 📤 **Export Data**: CSV downloads
|
- 📤 **Export Data**: CSV downloads
|
||||||
- 🔗 **Share Links**: Public dashboard links
|
- :icon{name="lucide:link"} **Share Links**: Public dashboard links
|
||||||
- 🎨 **Themes**: Light/Dark mode
|
- :icon{name="lucide:palette"} **Themes**: Light/Dark mode
|
||||||
|
|
||||||
## Configuration Breakdown
|
## Configuration Breakdown
|
||||||
|
|
||||||
@@ -77,7 +77,7 @@ Every 30 seconds, Umami pings itself:
|
|||||||
curl -f http://localhost:3000/api/heartbeat
|
curl -f http://localhost:3000/api/heartbeat
|
||||||
```
|
```
|
||||||
|
|
||||||
## First Time Setup 🚀
|
## First Time Setup :icon{name="lucide:rocket"}
|
||||||
|
|
||||||
### 1. Create Database
|
### 1. Create Database
|
||||||
```bash
|
```bash
|
||||||
@@ -96,7 +96,7 @@ Username: admin
|
|||||||
Password: umami
|
Password: umami
|
||||||
```
|
```
|
||||||
|
|
||||||
**🚨 IMMEDIATELY CHANGE THE PASSWORD!**
|
**:icon{name="lucide:siren"} IMMEDIATELY CHANGE THE PASSWORD!**
|
||||||
1. Click on username → Profile
|
1. Click on username → Profile
|
||||||
2. Change password
|
2. Change password
|
||||||
3. Breathe easy
|
3. Breathe easy
|
||||||
@@ -134,15 +134,15 @@ Place in `<head>` section:
|
|||||||
</script>
|
</script>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<!-- Your content -->
|
<!-- content -->
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
```
|
```
|
||||||
|
|
||||||
## Tracking Events 🎯
|
## Tracking Events :icon{name="lucide:target"}
|
||||||
|
|
||||||
### Automatic Tracking
|
### Automatic Tracking
|
||||||
Page views are tracked automatically. That's it! 🎉
|
Page views are tracked automatically. That's it! :icon{name="lucide:party-popper"}
|
||||||
|
|
||||||
### Custom Events
|
### Custom Events
|
||||||
|
|
||||||
@@ -228,13 +228,13 @@ umami.track('Social Share', {
|
|||||||
});
|
});
|
||||||
```
|
```
|
||||||
|
|
||||||
## Dashboard Features 📊
|
## Dashboard Features :icon{name="lucide:bar-chart"}
|
||||||
|
|
||||||
### Overview
|
### Overview
|
||||||
- 👁️ Real-time visitor count
|
- 👁️ Real-time visitor count
|
||||||
- 📈 Views & visitors today
|
- :icon{name="lucide:trending-up"} Views & visitors today
|
||||||
- 🕐 Average time on site
|
- 🕐 Average time on site
|
||||||
- 🔄 Bounce rate
|
- :icon{name="lucide:refresh-cw"} Bounce rate
|
||||||
|
|
||||||
### Realtime View
|
### Realtime View
|
||||||
Watch visitors as they browse:
|
Watch visitors as they browse:
|
||||||
@@ -245,10 +245,10 @@ Watch visitors as they browse:
|
|||||||
|
|
||||||
### Reports
|
### Reports
|
||||||
- 📅 Custom date ranges
|
- 📅 Custom date ranges
|
||||||
- 📊 Page comparisons
|
- :icon{name="lucide:bar-chart"} Page comparisons
|
||||||
- 🌍 Geographic heatmaps
|
- 🌍 Geographic heatmaps
|
||||||
- 📱 Device breakdowns
|
- 📱 Device breakdowns
|
||||||
- 🔍 Referrer analysis
|
- :icon{name="lucide:search"} Referrer analysis
|
||||||
|
|
||||||
### Filters
|
### Filters
|
||||||
Drill down with:
|
Drill down with:
|
||||||
@@ -259,7 +259,7 @@ Drill down with:
|
|||||||
- OS
|
- OS
|
||||||
- URL path
|
- URL path
|
||||||
|
|
||||||
## Multi-Website Management 🌐
|
## Multi-Website Management :icon{name="lucide:globe"}
|
||||||
|
|
||||||
### Add Multiple Sites
|
### Add Multiple Sites
|
||||||
```
|
```
|
||||||
@@ -286,7 +286,7 @@ Website → Share → Enable & Copy URL
|
|||||||
|
|
||||||
Anyone with the link can view stats (no login needed)!
|
Anyone with the link can view stats (no login needed)!
|
||||||
|
|
||||||
## Privacy Features 🔒
|
## Privacy Features :icon{name="lucide:lock"}
|
||||||
|
|
||||||
### What Umami Does NOT Track
|
### What Umami Does NOT Track
|
||||||
- ❌ Personal information
|
- ❌ Personal information
|
||||||
@@ -317,7 +317,7 @@ Umami is GDPR-compliant by default:
|
|||||||
- **Network**: `kompose` (database access)
|
- **Network**: `kompose` (database access)
|
||||||
- **Database**: PostgreSQL (from data stack)
|
- **Database**: PostgreSQL (from data stack)
|
||||||
|
|
||||||
## API Access 🔌
|
## API Access :icon{name="lucide:plug"}
|
||||||
|
|
||||||
Umami has a REST API for programmatic access!
|
Umami has a REST API for programmatic access!
|
||||||
|
|
||||||
@@ -351,7 +351,7 @@ curl -X POST https://umami.pivoine.art/api/send \
|
|||||||
}'
|
}'
|
||||||
```
|
```
|
||||||
|
|
||||||
## Performance & Scaling 📈
|
## Performance & Scaling :icon{name="lucide:trending-up"}
|
||||||
|
|
||||||
### For Small Sites (<10k/month)
|
### For Small Sites (<10k/month)
|
||||||
Default setup works great! No optimization needed.
|
Default setup works great! No optimization needed.
|
||||||
@@ -362,10 +362,10 @@ Default setup works great! No optimization needed.
|
|||||||
- ✅ Monitor disk space
|
- ✅ Monitor disk space
|
||||||
|
|
||||||
### For Large Sites (100k+/month)
|
### For Large Sites (100k+/month)
|
||||||
- 🚀 Increase PostgreSQL memory
|
- :icon{name="lucide:rocket"} Increase PostgreSQL memory
|
||||||
- 🚀 Add read replicas
|
- :icon{name="lucide:rocket"} Add read replicas
|
||||||
- 🚀 Consider CDN for script.js
|
- :icon{name="lucide:rocket"} Consider CDN for script.js
|
||||||
- 🚀 Enable database connection pooling
|
- :icon{name="lucide:rocket"} Enable database connection pooling
|
||||||
|
|
||||||
### Optimization Tips
|
### Optimization Tips
|
||||||
```sql
|
```sql
|
||||||
@@ -376,7 +376,7 @@ VACUUM ANALYZE;
|
|||||||
SELECT * FROM pg_stat_user_indexes;
|
SELECT * FROM pg_stat_user_indexes;
|
||||||
```
|
```
|
||||||
|
|
||||||
## Data Management 🗄️
|
## Data Management :icon{name="lucide:database"}
|
||||||
|
|
||||||
### Export Data
|
### Export Data
|
||||||
```
|
```
|
||||||
@@ -400,7 +400,7 @@ DELETE FROM event
|
|||||||
WHERE created_at < NOW() - INTERVAL '1 year';
|
WHERE created_at < NOW() - INTERVAL '1 year';
|
||||||
```
|
```
|
||||||
|
|
||||||
## Troubleshooting 🔧
|
## Troubleshooting :icon{name="lucide:wrench"}
|
||||||
|
|
||||||
**Q: Script not loading?**
|
**Q: Script not loading?**
|
||||||
A: Check browser console for errors, verify script URL is correct
|
A: Check browser console for errors, verify script URL is correct
|
||||||
@@ -463,22 +463,22 @@ Install via plugin or add to theme's `header.php`:
|
|||||||
| Feature | Umami | Google Analytics |
|
| Feature | Umami | Google Analytics |
|
||||||
|---------|-------|------------------|
|
|---------|-------|------------------|
|
||||||
| Privacy | ✅ Excellent | ❌ Terrible |
|
| Privacy | ✅ Excellent | ❌ Terrible |
|
||||||
| GDPR | ✅ Compliant | ⚠️ Complicated |
|
| GDPR | ✅ Compliant | :icon{name="lucide:alert-triangle"} Complicated |
|
||||||
| Data Ownership | ✅ Yours | ❌ Google's |
|
| Data Ownership | ✅ Yours | ❌ Google's |
|
||||||
| Cookie Banner | ✅ Not needed | ❌ Required |
|
| Cookie Banner | ✅ Not needed | ❌ Required |
|
||||||
| Speed | ✅ Fast | ⚠️ Slower |
|
| Speed | ✅ Fast | :icon{name="lucide:alert-triangle"} Slower |
|
||||||
| Setup | ✅ Simple | ⚠️ Complex |
|
| Setup | ✅ Simple | :icon{name="lucide:alert-triangle"} Complex |
|
||||||
| Cost | ✅ Free | ✅ Free (but...) |
|
| Cost | ✅ Free | ✅ Free (but...) |
|
||||||
| Learning Curve | ✅ Easy | ❌ Steep |
|
| Learning Curve | ✅ Easy | ❌ Steep |
|
||||||
|
|
||||||
## Why Track with Umami? 🎯
|
## Why Track with Umami? :icon{name="lucide:target"}
|
||||||
|
|
||||||
- 🔒 **Privacy**: Respect your visitors
|
- :icon{name="lucide:lock"} **Privacy**: Respect your visitors
|
||||||
- 📊 **Insights**: Get data that matters
|
- :icon{name="lucide:bar-chart"} **Insights**: Get data that matters
|
||||||
- 🎨 **Simple**: No complexity overload
|
- :icon{name="lucide:palette"} **Simple**: No complexity overload
|
||||||
- 🆓 **Free**: No limits, no upsells
|
- 🆓 **Free**: No limits, no upsells
|
||||||
- 🚀 **Fast**: Lightweight script
|
- :icon{name="lucide:rocket"} **Fast**: Lightweight script
|
||||||
- 💪 **Reliable**: Self-hosted stability
|
- :icon{name="lucide:dumbbell"} **Reliable**: Self-hosted stability
|
||||||
- 🌍 **Ethical**: Do the right thing
|
- 🌍 **Ethical**: Do the right thing
|
||||||
|
|
||||||
## Advanced Features
|
## Advanced Features
|
||||||
@@ -512,4 +512,4 @@ Track conversion paths:
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
*"The best analytics are the ones that respect privacy while still giving you the insights you need."* - Ethical Analytics Manifesto 📊✨
|
*"The best analytics are the ones that respect privacy while still giving you the insights you need."* - Ethical Analytics Manifesto :icon{name="lucide:bar-chart"}:icon{name="lucide:sparkles"}
|
||||||
@@ -1,19 +1,19 @@
|
|||||||
---
|
---
|
||||||
title: Vault Stack - Your Password Fort Knox
|
title: Vault - Password Fort Knox
|
||||||
description: "One password to rule them all!"
|
description: "One password to rule them all!"
|
||||||
|
navigation:
|
||||||
|
icon: i-lucide-lock-keyhole
|
||||||
---
|
---
|
||||||
|
|
||||||
# 🔐 Vault Stack - Your Password Fort Knox
|
|
||||||
|
|
||||||
> *"One password to rule them all!"* - Vaultwarden
|
> *"One password to rule them all!"* - Vaultwarden
|
||||||
|
|
||||||
## What's This All About?
|
## What's This All About?
|
||||||
|
|
||||||
Vaultwarden is your self-hosted password manager - a lightweight, Rust-powered alternative to Bitwarden. It's like having a super-secure vault in your pocket, accessible from anywhere, that remembers all your passwords so you don't have to! No more "password123" or writing passwords on sticky notes. 🔒
|
Vaultwarden is your self-hosted password manager - a lightweight, Rust-powered alternative to Bitwarden. It's like having a super-secure vault in your pocket, accessible from anywhere, that remembers all your passwords so you don't have to! No more "password123" or writing passwords on sticky notes. :icon{name="lucide:lock"}
|
||||||
|
|
||||||
## The Security Guardian
|
## The Security Guardian
|
||||||
|
|
||||||
### 🛡️ Vaultwarden
|
### :icon{name="lucide:shield"} Vaultwarden
|
||||||
|
|
||||||
**Container**: `vault_app`
|
**Container**: `vault_app`
|
||||||
**Image**: `vaultwarden/server:latest`
|
**Image**: `vaultwarden/server:latest`
|
||||||
@@ -21,15 +21,15 @@ Vaultwarden is your self-hosted password manager - a lightweight, Rust-powered a
|
|||||||
**Home**: https://vault.pivoine.art
|
**Home**: https://vault.pivoine.art
|
||||||
|
|
||||||
Vaultwarden is your digital security blanket:
|
Vaultwarden is your digital security blanket:
|
||||||
- 🔐 **Password Vault**: Store unlimited passwords
|
- :icon{name="lucide:lock-keyhole"} **Password Vault**: Store unlimited passwords
|
||||||
- 🗂️ **Secure Notes**: Credit cards, identities, documents
|
- 🗂️ **Secure Notes**: Credit cards, identities, documents
|
||||||
- 🔄 **Sync Everywhere**: Desktop, mobile, browser extensions
|
- :icon{name="lucide:refresh-cw"} **Sync Everywhere**: Desktop, mobile, browser extensions
|
||||||
- 👥 **Sharing**: Securely share with family/team
|
- :icon{name="lucide:users"} **Sharing**: Securely share with family/team
|
||||||
- 🔑 **2FA Support**: TOTP, YubiKey, Duo
|
- :icon{name="lucide:key"} **2FA Support**: TOTP, YubiKey, Duo
|
||||||
- 📱 **Mobile Apps**: iOS & Android (official Bitwarden apps)
|
- 📱 **Mobile Apps**: iOS & Android (official Bitwarden apps)
|
||||||
- 🌐 **Browser Extensions**: Chrome, Firefox, Safari, Edge
|
- :icon{name="lucide:globe"} **Browser Extensions**: Chrome, Firefox, Safari, Edge
|
||||||
- 💰 **Free**: All premium features, no limits
|
- :icon{name="lucide:dollar-sign"} **Free**: All premium features, no limits
|
||||||
- 🦀 **Rust-Powered**: Secure, fast, resource-efficient
|
- :icon{name="simple-icons:rust"} **Rust-Powered**: Secure, fast, resource-efficient
|
||||||
|
|
||||||
## Why Vaultwarden vs Bitwarden Official?
|
## Why Vaultwarden vs Bitwarden Official?
|
||||||
|
|
||||||
@@ -37,7 +37,7 @@ Vaultwarden is your digital security blanket:
|
|||||||
|---------|-------------|-------------------|
|
|---------|-------------|-------------------|
|
||||||
| Resource Usage | 🟢 Tiny | 🟡 Heavy (needs MSSQL) |
|
| Resource Usage | 🟢 Tiny | 🟡 Heavy (needs MSSQL) |
|
||||||
| Setup | 🟢 Simple | 🟡 Complex |
|
| Setup | 🟢 Simple | 🟡 Complex |
|
||||||
| Premium Features | 🟢 All free | 💰 Paid |
|
| Premium Features | 🟢 All free | :icon{name="lucide:dollar-sign"} Paid |
|
||||||
| Compatibility | ✅ 100% | ✅ 100% |
|
| Compatibility | ✅ 100% | ✅ 100% |
|
||||||
| Updates | 🟢 Community | 🟢 Official |
|
| Updates | 🟢 Community | 🟢 Official |
|
||||||
|
|
||||||
@@ -46,32 +46,32 @@ Both use the same client apps - just different servers!
|
|||||||
## Features That Matter 🌟
|
## Features That Matter 🌟
|
||||||
|
|
||||||
### Password Management
|
### Password Management
|
||||||
- 🔐 **Unlimited Passwords**: No caps, no limits
|
- :icon{name="lucide:lock-keyhole"} **Unlimited Passwords**: No caps, no limits
|
||||||
- 🔍 **Search**: Find credentials instantly
|
- :icon{name="lucide:search"} **Search**: Find credentials instantly
|
||||||
- 📁 **Folders**: Organize by category
|
- :icon{name="lucide:folder"} **Folders**: Organize by category
|
||||||
- 🏷️ **Tags**: Multiple ways to organize
|
- :icon{name="lucide:tag"} **Tags**: Multiple ways to organize
|
||||||
- ⭐ **Favorites**: Quick access to common items
|
- ⭐ **Favorites**: Quick access to common items
|
||||||
- 📝 **Notes**: Attach notes to any item
|
- :icon{name="lucide:file-text"} **Notes**: Attach notes to any item
|
||||||
|
|
||||||
### Secure Storage Types
|
### Secure Storage Types
|
||||||
- 🔑 **Login**: Username + password combos
|
- :icon{name="lucide:key"} **Login**: Username + password combos
|
||||||
- 💳 **Card**: Credit/debit card info
|
- 💳 **Card**: Credit/debit card info
|
||||||
- 🆔 **Identity**: Personal info, addresses
|
- 🆔 **Identity**: Personal info, addresses
|
||||||
- 📄 **Secure Note**: Encrypted text
|
- :icon{name="lucide:file"} **Secure Note**: Encrypted text
|
||||||
|
|
||||||
### Security Features
|
### Security Features
|
||||||
- 🔒 **End-to-End Encryption**: Zero-knowledge architecture
|
- :icon{name="lucide:lock"} **End-to-End Encryption**: Zero-knowledge architecture
|
||||||
- 🔐 **Master Password**: Only you know it
|
- :icon{name="lucide:lock-keyhole"} **Master Password**: Only you know it
|
||||||
- 📱 **Two-Factor Auth**: Extra security layer
|
- 📱 **Two-Factor Auth**: Extra security layer
|
||||||
- 🔄 **Password Generator**: Strong random passwords
|
- :icon{name="lucide:refresh-cw"} **Password Generator**: Strong random passwords
|
||||||
- ⚠️ **Security Reports**: Weak, reused, compromised passwords
|
- :icon{name="lucide:alert-triangle"} **Security Reports**: Weak, reused, compromised passwords
|
||||||
- 📊 **Vault Health**: Check security score
|
- :icon{name="lucide:bar-chart"} **Vault Health**: Check security score
|
||||||
|
|
||||||
### Sharing & Organization
|
### Sharing & Organization
|
||||||
- 👥 **Organizations**: Team password sharing
|
- :icon{name="lucide:users"} **Organizations**: Team password sharing
|
||||||
- 📁 **Collections**: Group shared passwords
|
- :icon{name="lucide:folder"} **Collections**: Group shared passwords
|
||||||
- 🔐 **Granular Permissions**: Control who sees what
|
- :icon{name="lucide:lock-keyhole"} **Granular Permissions**: Control who sees what
|
||||||
- 📧 **Emergency Access**: Trusted contacts can request access
|
- :icon{name="lucide:mail"} **Emergency Access**: Trusted contacts can request access
|
||||||
|
|
||||||
## Configuration Breakdown
|
## Configuration Breakdown
|
||||||
|
|
||||||
@@ -113,7 +113,7 @@ SIGNUPS_ALLOWED=false
|
|||||||
```
|
```
|
||||||
Disable public signups after creating your account!
|
Disable public signups after creating your account!
|
||||||
|
|
||||||
## First Time Setup 🚀
|
## First Time Setup :icon{name="lucide:rocket"}
|
||||||
|
|
||||||
### 1. Start the Stack
|
### 1. Start the Stack
|
||||||
```bash
|
```bash
|
||||||
@@ -128,7 +128,7 @@ Email: your@email.com
|
|||||||
Master Password: Something STRONG!
|
Master Password: Something STRONG!
|
||||||
```
|
```
|
||||||
|
|
||||||
**⚠️ MASTER PASSWORD WARNING**:
|
**:icon{name="lucide:alert-triangle"} MASTER PASSWORD WARNING**:
|
||||||
- Only you know it
|
- Only you know it
|
||||||
- Cannot be recovered if lost
|
- Cannot be recovered if lost
|
||||||
- Write it down somewhere safe
|
- Write it down somewhere safe
|
||||||
@@ -164,7 +164,7 @@ docker compose restart
|
|||||||
3. Enter: `https://vault.pivoine.art`
|
3. Enter: `https://vault.pivoine.art`
|
||||||
4. Login with your credentials
|
4. Login with your credentials
|
||||||
|
|
||||||
## Using Your Vault 🔑
|
## Using Your Vault :icon{name="lucide:key"}
|
||||||
|
|
||||||
### Adding Passwords
|
### Adding Passwords
|
||||||
|
|
||||||
@@ -172,7 +172,7 @@ docker compose restart
|
|||||||
1. Visit website and login
|
1. Visit website and login
|
||||||
2. Extension detects login form
|
2. Extension detects login form
|
||||||
3. Click "Save" when prompted
|
3. Click "Save" when prompted
|
||||||
4. Done! 🎉
|
4. Done! :icon{name="lucide:party-popper"}
|
||||||
|
|
||||||
**Manually**:
|
**Manually**:
|
||||||
1. Click "+" in vault
|
1. Click "+" in vault
|
||||||
@@ -214,11 +214,11 @@ Access at: `https://vault.pivoine.art/admin`
|
|||||||
**Admin Token Required** (from .env)
|
**Admin Token Required** (from .env)
|
||||||
|
|
||||||
### Admin Features
|
### Admin Features
|
||||||
- 👥 View all users
|
- :icon{name="lucide:users"} View all users
|
||||||
- 🔐 Disable/delete users
|
- :icon{name="lucide:lock-keyhole"} Disable/delete users
|
||||||
- 📧 Resend invitations
|
- :icon{name="lucide:mail"} Resend invitations
|
||||||
- 🗑️ Delete accounts
|
- 🗑️ Delete accounts
|
||||||
- 📊 View diagnostics
|
- :icon{name="lucide:bar-chart"} View diagnostics
|
||||||
- ⚙️ Configure settings
|
- ⚙️ Configure settings
|
||||||
|
|
||||||
### Useful Admin Tasks
|
### Useful Admin Tasks
|
||||||
@@ -234,7 +234,7 @@ Admin Panel → Diagnostics
|
|||||||
```
|
```
|
||||||
Shows config, health checks, versions
|
Shows config, health checks, versions
|
||||||
|
|
||||||
## Sharing with Organizations 👥
|
## Sharing with Organizations :icon{name="lucide:users"}
|
||||||
|
|
||||||
### Create Organization
|
### Create Organization
|
||||||
1. New → Organization
|
1. New → Organization
|
||||||
@@ -254,7 +254,7 @@ Shows config, health checks, versions
|
|||||||
3. Set permissions per user
|
3. Set permissions per user
|
||||||
4. Members can access shared passwords
|
4. Members can access shared passwords
|
||||||
|
|
||||||
## Security Best Practices 🛡️
|
## Security Best Practices :icon{name="lucide:shield"}
|
||||||
|
|
||||||
### Master Password
|
### Master Password
|
||||||
- ✅ Use a passphrase: `correct-horse-battery-staple`
|
- ✅ Use a passphrase: `correct-horse-battery-staple`
|
||||||
@@ -271,11 +271,11 @@ Shows config, health checks, versions
|
|||||||
- ✅ Consider hardware key (YubiKey)
|
- ✅ Consider hardware key (YubiKey)
|
||||||
|
|
||||||
### Vault Hygiene
|
### Vault Hygiene
|
||||||
- 🔄 Regular security reports
|
- :icon{name="lucide:refresh-cw"} Regular security reports
|
||||||
- 🔍 Update weak passwords
|
- :icon{name="lucide:search"} Update weak passwords
|
||||||
- 🗑️ Remove old accounts
|
- 🗑️ Remove old accounts
|
||||||
- 📧 Use unique emails when possible
|
- :icon{name="lucide:mail"} Use unique emails when possible
|
||||||
- 🔐 Never reuse passwords
|
- :icon{name="lucide:lock-keyhole"} Never reuse passwords
|
||||||
|
|
||||||
### Backup Strategy
|
### Backup Strategy
|
||||||
```bash
|
```bash
|
||||||
@@ -328,7 +328,7 @@ tar -czf vault-backup-$(date +%Y%m%d).tar.gz ./bitwarden/
|
|||||||
└── rsa_key.* # Server keys
|
└── rsa_key.* # Server keys
|
||||||
```
|
```
|
||||||
|
|
||||||
**🚨 CRITICAL**: Backup this entire directory regularly!
|
**:icon{name="lucide:siren"} CRITICAL**: Backup this entire directory regularly!
|
||||||
|
|
||||||
## Performance & Limits
|
## Performance & Limits
|
||||||
|
|
||||||
@@ -343,7 +343,7 @@ tar -czf vault-backup-$(date +%Y%m%d).tar.gz ./bitwarden/
|
|||||||
- Organizations: Unlimited
|
- Organizations: Unlimited
|
||||||
- File attachments: 1GB per user (configurable)
|
- File attachments: 1GB per user (configurable)
|
||||||
|
|
||||||
## Troubleshooting 🔧
|
## Troubleshooting :icon{name="lucide:wrench"}
|
||||||
|
|
||||||
**Q: Can't log in?**
|
**Q: Can't log in?**
|
||||||
A: Check master password, verify server URL in apps
|
A: Check master password, verify server URL in apps
|
||||||
@@ -381,7 +381,7 @@ Vaultwarden supports imports from:
|
|||||||
4. Upload file
|
4. Upload file
|
||||||
5. Import!
|
5. Import!
|
||||||
|
|
||||||
## Browser Extension Tips 💡
|
## Browser Extension Tips :icon{name="lucide:lightbulb"}
|
||||||
|
|
||||||
### Keyboard Shortcuts
|
### Keyboard Shortcuts
|
||||||
- `Ctrl+Shift+L`: Auto-fill last used login
|
- `Ctrl+Shift+L`: Auto-fill last used login
|
||||||
@@ -427,13 +427,13 @@ Organize shared items:
|
|||||||
|
|
||||||
## Why Self-Host Your Passwords?
|
## Why Self-Host Your Passwords?
|
||||||
|
|
||||||
- 🔒 **Full Control**: Your data, your server
|
- :icon{name="lucide:lock"} **Full Control**: Your data, your server
|
||||||
- 🕵️ **Privacy**: No third-party access
|
- 🕵️ **Privacy**: No third-party access
|
||||||
- 💰 **Cost**: Free premium features
|
- :icon{name="lucide:dollar-sign"} **Cost**: Free premium features
|
||||||
- 🚀 **Performance**: Local network speed
|
- :icon{name="lucide:rocket"} **Performance**: Local network speed
|
||||||
- 🛡️ **Security**: You control the security
|
- :icon{name="lucide:shield"} **Security**: You control the security
|
||||||
- 🌍 **Independence**: Not dependent on cloud service
|
- 🌍 **Independence**: Not dependent on cloud service
|
||||||
- 📊 **Transparency**: Open source, auditable
|
- :icon{name="lucide:bar-chart"} **Transparency**: Open source, auditable
|
||||||
|
|
||||||
## Resources
|
## Resources
|
||||||
|
|
||||||
@@ -443,4 +443,4 @@ Organize shared items:
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
*"The best password is the one you don't have to remember because it's safely stored in your vault."* - Password Wisdom 🔐✨
|
*"The best password is the one you don't have to remember because it's safely stored in your vault."* - Password Wisdom :icon{name="lucide:lock-keyhole"}:icon{name="lucide:sparkles"}
|
||||||
@@ -1,10 +1,10 @@
|
|||||||
---
|
---
|
||||||
title: <20> VPN Stack - Your Encrypted Tunnel to Freedom
|
title: VPN - Encrypted Tunnel to Freedom
|
||||||
description: "The internet, but make it private!"
|
description: "The internet, but make it private!"
|
||||||
|
navigation:
|
||||||
|
icon: i-lucide-plug
|
||||||
---
|
---
|
||||||
|
|
||||||
# 🔌 VPN Stack - Your Encrypted Tunnel to Freedom
|
|
||||||
|
|
||||||
> *"The internet, but make it private!"* - WireGuard
|
> *"The internet, but make it private!"* - WireGuard
|
||||||
|
|
||||||
## What's This All About?
|
## What's This All About?
|
||||||
@@ -13,7 +13,7 @@ WG-Easy is your self-hosted VPN server powered by WireGuard! It's like having yo
|
|||||||
|
|
||||||
## The Privacy Protector
|
## The Privacy Protector
|
||||||
|
|
||||||
### 🛡️ WG-Easy
|
### :icon{name="lucide:shield"} WG-Easy
|
||||||
|
|
||||||
**Container**: `vpn_app`
|
**Container**: `vpn_app`
|
||||||
**Image**: `ghcr.io/wg-easy/wg-easy:15`
|
**Image**: `ghcr.io/wg-easy/wg-easy:15`
|
||||||
@@ -21,24 +21,24 @@ WG-Easy is your self-hosted VPN server powered by WireGuard! It's like having yo
|
|||||||
**Home**: https://vpn.pivoine.art
|
**Home**: https://vpn.pivoine.art
|
||||||
|
|
||||||
WG-Easy makes WireGuard actually easy:
|
WG-Easy makes WireGuard actually easy:
|
||||||
- 🎨 **Beautiful Web UI**: Manage VPN from browser
|
- :icon{name="lucide:palette"} **Beautiful Web UI**: Manage VPN from browser
|
||||||
- 📱 **QR Codes**: Instant mobile setup
|
- 📱 **QR Codes**: Instant mobile setup
|
||||||
- 👥 **Multi-Client**: Unlimited devices
|
- :icon{name="lucide:users"} **Multi-Client**: Unlimited devices
|
||||||
- ⚡ **WireGuard**: Modern, fast, secure protocol
|
- :icon{name="lucide:zap"} **WireGuard**: Modern, fast, secure protocol
|
||||||
- 📊 **Traffic Stats**: See bandwidth usage
|
- :icon{name="lucide:bar-chart"} **Traffic Stats**: See bandwidth usage
|
||||||
- 🔒 **Encrypted**: Industry-standard crypto
|
- :icon{name="lucide:lock"} **Encrypted**: Industry-standard crypto
|
||||||
- 🌍 **Route All Traffic**: Or split-tunnel
|
- 🌍 **Route All Traffic**: Or split-tunnel
|
||||||
- 🚀 **Performance**: Faster than OpenVPN
|
- :icon{name="lucide:rocket"} **Performance**: Faster than OpenVPN
|
||||||
|
|
||||||
## WireGuard: The Modern VPN Protocol
|
## WireGuard: The Modern VPN Protocol
|
||||||
|
|
||||||
### Why WireGuard is Awesome
|
### Why WireGuard is Awesome
|
||||||
- ⚡ **Fast**: 4000+ lines of code vs OpenVPN's 600,000+
|
- :icon{name="lucide:zap"} **Fast**: 4000+ lines of code vs OpenVPN's 600,000+
|
||||||
- 🔒 **Secure**: State-of-the-art cryptography
|
- :icon{name="lucide:lock"} **Secure**: State-of-the-art cryptography
|
||||||
- 📱 **Battery Friendly**: Less power consumption
|
- 📱 **Battery Friendly**: Less power consumption
|
||||||
- 🔄 **Roaming**: Seamless connection switching
|
- :icon{name="lucide:refresh-cw"} **Roaming**: Seamless connection switching
|
||||||
- 🐧 **Linux Kernel**: Built into Linux 5.6+
|
- 🐧 **Linux Kernel**: Built into Linux 5.6+
|
||||||
- 🎯 **Simple**: Easier to audit and configure
|
- :icon{name="lucide:target"} **Simple**: Easier to audit and configure
|
||||||
|
|
||||||
## Configuration Breakdown
|
## Configuration Breakdown
|
||||||
|
|
||||||
@@ -93,7 +93,7 @@ sysctls:
|
|||||||
- net.ipv4.conf.all.src_valid_mark=1 # Packet routing
|
- net.ipv4.conf.all.src_valid_mark=1 # Packet routing
|
||||||
```
|
```
|
||||||
|
|
||||||
## First Time Setup 🚀
|
## First Time Setup :icon{name="lucide:rocket"}
|
||||||
|
|
||||||
### 1. Ensure Ports are Open
|
### 1. Ensure Ports are Open
|
||||||
|
|
||||||
@@ -201,7 +201,7 @@ AllowedIPs = 0.0.0.0/0, ::/0
|
|||||||
PersistentKeepalive = 25
|
PersistentKeepalive = 25
|
||||||
```
|
```
|
||||||
|
|
||||||
## Using Your VPN 🌐
|
## Using Your VPN :icon{name="lucide:globe"}
|
||||||
|
|
||||||
### Full Tunnel (All Traffic)
|
### Full Tunnel (All Traffic)
|
||||||
|
|
||||||
@@ -209,7 +209,7 @@ PersistentKeepalive = 25
|
|||||||
- ✅ Complete privacy
|
- ✅ Complete privacy
|
||||||
- ✅ Bypass geo-blocks
|
- ✅ Bypass geo-blocks
|
||||||
- ✅ Secure public WiFi
|
- ✅ Secure public WiFi
|
||||||
- ⚠️ Slightly slower (routing through your server)
|
- :icon{name="lucide:alert-triangle"} Slightly slower (routing through your server)
|
||||||
|
|
||||||
### Split Tunnel (Selective Routing)
|
### Split Tunnel (Selective Routing)
|
||||||
|
|
||||||
@@ -222,27 +222,27 @@ AllowedIPs = 10.0.0.0/24 # Only home network
|
|||||||
```
|
```
|
||||||
|
|
||||||
**Benefits**:
|
**Benefits**:
|
||||||
- 🏠 Access home services
|
- :icon{name="lucide:home"} Access home services
|
||||||
- 🌐 Normal internet speed
|
- :icon{name="lucide:globe"} Normal internet speed
|
||||||
- 📊 Less VPN bandwidth
|
- :icon{name="lucide:bar-chart"} Less VPN bandwidth
|
||||||
|
|
||||||
## Traffic Statistics 📊
|
## Traffic Statistics :icon{name="lucide:bar-chart"}
|
||||||
|
|
||||||
Web UI shows for each client:
|
Web UI shows for each client:
|
||||||
- 📥 **Download**: Data received
|
- 📥 **Download**: Data received
|
||||||
- 📤 **Upload**: Data sent
|
- 📤 **Upload**: Data sent
|
||||||
- 🕐 **Last Seen**: When last connected
|
- 🕐 **Last Seen**: When last connected
|
||||||
- 📈 **Charts**: Bandwidth over time
|
- :icon{name="lucide:trending-up"} **Charts**: Bandwidth over time
|
||||||
|
|
||||||
## Common Use Cases
|
## Common Use Cases
|
||||||
|
|
||||||
### 1. Secure Public WiFi ☕
|
### 1. Secure Public WiFi :icon{name="lucide:coffee"}
|
||||||
```
|
```
|
||||||
Coffee Shop WiFi → WireGuard → Your Server → Internet
|
Coffee Shop WiFi → WireGuard → Your Server → Internet
|
||||||
```
|
```
|
||||||
Encrypt traffic on untrusted networks.
|
Encrypt traffic on untrusted networks.
|
||||||
|
|
||||||
### 2. Access Home Network 🏠
|
### 2. Access Home Network :icon{name="lucide:home"}
|
||||||
```
|
```
|
||||||
You (anywhere) → VPN → Home Network → NAS, Printer, etc.
|
You (anywhere) → VPN → Home Network → NAS, Printer, etc.
|
||||||
```
|
```
|
||||||
@@ -266,7 +266,7 @@ Deploy VPN servers in different countries:
|
|||||||
- EU server for European services
|
- EU server for European services
|
||||||
- Home server for local access
|
- Home server for local access
|
||||||
|
|
||||||
## Security Features 🔒
|
## Security Features :icon{name="lucide:lock"}
|
||||||
|
|
||||||
### Encryption
|
### Encryption
|
||||||
- **Protocol**: Noise Protocol Framework
|
- **Protocol**: Noise Protocol Framework
|
||||||
@@ -274,7 +274,7 @@ Deploy VPN servers in different countries:
|
|||||||
- **Cipher**: ChaCha20-Poly1305
|
- **Cipher**: ChaCha20-Poly1305
|
||||||
- **Hash**: BLAKE2s
|
- **Hash**: BLAKE2s
|
||||||
|
|
||||||
**Translation**: Military-grade encryption! 💪
|
**Translation**: Military-grade encryption! :icon{name="lucide:dumbbell"}
|
||||||
|
|
||||||
### Authentication
|
### Authentication
|
||||||
- **Public/Private Keys**: Per-client keypairs
|
- **Public/Private Keys**: Per-client keypairs
|
||||||
@@ -286,7 +286,7 @@ Deploy VPN servers in different countries:
|
|||||||
- **Perfect Forward Secrecy**: Past sessions stay secure
|
- **Perfect Forward Secrecy**: Past sessions stay secure
|
||||||
- **IP Masquerading**: Hides your real IP
|
- **IP Masquerading**: Hides your real IP
|
||||||
|
|
||||||
## DNS Configuration 🌐
|
## DNS Configuration :icon{name="lucide:globe"}
|
||||||
|
|
||||||
### Default DNS (Cloudflare)
|
### Default DNS (Cloudflare)
|
||||||
```bash
|
```bash
|
||||||
@@ -315,7 +315,7 @@ WG_DEFAULT_DNS=94.140.14.14
|
|||||||
WG_DEFAULT_DNS=192.168.1.2
|
WG_DEFAULT_DNS=192.168.1.2
|
||||||
```
|
```
|
||||||
|
|
||||||
## Performance Optimization ⚡
|
## Performance Optimization :icon{name="lucide:zap"}
|
||||||
|
|
||||||
### Enable BBR (Better Congestion Control)
|
### Enable BBR (Better Congestion Control)
|
||||||
```bash
|
```bash
|
||||||
@@ -338,7 +338,7 @@ MTU = 1420 # Default, try 1500 if stable
|
|||||||
PersistentKeepalive = 25
|
PersistentKeepalive = 25
|
||||||
```
|
```
|
||||||
|
|
||||||
## Troubleshooting 🔧
|
## Troubleshooting :icon{name="lucide:wrench"}
|
||||||
|
|
||||||
**Q: Can't connect to VPN?**
|
**Q: Can't connect to VPN?**
|
||||||
```bash
|
```bash
|
||||||
@@ -442,7 +442,7 @@ docker logs vpn_app -f
|
|||||||
### Bandwidth Stats
|
### Bandwidth Stats
|
||||||
Web UI shows real-time graphs for each client!
|
Web UI shows real-time graphs for each client!
|
||||||
|
|
||||||
## Backup & Restore 🔄
|
## Backup & Restore :icon{name="lucide:refresh-cw"}
|
||||||
|
|
||||||
### Backup Configuration
|
### Backup Configuration
|
||||||
```bash
|
```bash
|
||||||
@@ -463,7 +463,7 @@ docker exec vpn_app tar -xzf /tmp/wg-backup.tar.gz -C /
|
|||||||
docker compose restart
|
docker compose restart
|
||||||
```
|
```
|
||||||
|
|
||||||
## Security Best Practices 🛡️
|
## Security Best Practices :icon{name="lucide:shield"}
|
||||||
|
|
||||||
1. **Strong Password**: Use bcrypt hash for web UI
|
1. **Strong Password**: Use bcrypt hash for web UI
|
||||||
2. **Regular Updates**: Keep WG-Easy updated
|
2. **Regular Updates**: Keep WG-Easy updated
|
||||||
@@ -475,13 +475,13 @@ docker compose restart
|
|||||||
|
|
||||||
## Why Self-Host a VPN?
|
## Why Self-Host a VPN?
|
||||||
|
|
||||||
- 🔒 **Full Control**: Your server, your rules
|
- :icon{name="lucide:lock"} **Full Control**: Your server, your rules
|
||||||
- 💰 **Cost Effective**: No monthly fees
|
- :icon{name="lucide:dollar-sign"} **Cost Effective**: No monthly fees
|
||||||
- 🚀 **Performance**: Direct to your server
|
- :icon{name="lucide:rocket"} **Performance**: Direct to your server
|
||||||
- 🕵️ **Privacy**: No third-party logging
|
- 🕵️ **Privacy**: No third-party logging
|
||||||
- 🌍 **Flexibility**: Use any server location
|
- 🌍 **Flexibility**: Use any server location
|
||||||
- 📊 **Transparency**: You know what's happening
|
- :icon{name="lucide:bar-chart"} **Transparency**: You know what's happening
|
||||||
- 🛠️ **Customization**: Configure exactly as needed
|
- :icon{name="lucide:hammer"} **Customization**: Configure exactly as needed
|
||||||
|
|
||||||
## Resources
|
## Resources
|
||||||
|
|
||||||
@@ -491,4 +491,4 @@ docker compose restart
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
*"Privacy is not about having something to hide. It's about protecting what you value."* - VPN Philosophy 🔒✨
|
*"Privacy is not about having something to hide. It's about protecting what you value."* - VPN Philosophy :icon{name="lucide:lock"}:icon{name="lucide:sparkles"}
|
||||||
@@ -1,29 +0,0 @@
|
|||||||
---
|
|
||||||
title: User Guide
|
|
||||||
description: Comprehensive guide to using Kompose
|
|
||||||
---
|
|
||||||
|
|
||||||
# User Guide
|
|
||||||
|
|
||||||
Learn everything you need to know about using Kompose effectively.
|
|
||||||
|
|
||||||
## Getting Started
|
|
||||||
|
|
||||||
- [Quick Start](/docs/guide/quick-start) - Get up and running in minutes
|
|
||||||
- [Installation](/docs/installation) - Detailed installation instructions
|
|
||||||
|
|
||||||
## Core Concepts
|
|
||||||
|
|
||||||
- [Stack Management](/docs/guide/stack-management) - Managing multiple Docker Compose stacks
|
|
||||||
- [Database Operations](/docs/guide/database) - Backup, restore, and maintain databases
|
|
||||||
- [Hooks System](/docs/guide/hooks) - Extend functionality with custom hooks
|
|
||||||
- [Network Architecture](/docs/guide/network) - Understanding networking in Kompose
|
|
||||||
|
|
||||||
## Configuration
|
|
||||||
|
|
||||||
- [Configuration Guide](/docs/guide/configuration) - Configure Kompose and stacks
|
|
||||||
- [Environment Variables](/docs/reference/environment) - All available environment variables
|
|
||||||
|
|
||||||
## Troubleshooting
|
|
||||||
|
|
||||||
- [Common Issues](/docs/guide/troubleshooting) - Solutions to common problems
|
|
||||||
@@ -1,88 +0,0 @@
|
|||||||
---
|
|
||||||
title: Introduction to Kompose
|
|
||||||
description: Learn about Kompose, your Docker Compose Symphony Conductor for managing multiple stacks with style and grace.
|
|
||||||
---
|
|
||||||
|
|
||||||
# Introduction to Kompose
|
|
||||||
|
|
||||||
**Kompose** is a powerful Bash orchestration tool for managing multiple Docker Compose stacks with style and grace. Think of it as a conductor for your Docker symphony - each stack plays its part, and Kompose makes sure they're all in harmony.
|
|
||||||
|
|
||||||
**Kompose** is a powerful Bash orchestration tool for managing multiple Docker Compose stacks with style and grace. Think of it as a conductor for your Docker symphony - each stack plays its part, and Kompose makes sure they're all in harmony.
|
|
||||||
|
|
||||||
### Why Kompose?
|
|
||||||
|
|
||||||
<img src="https://game-icons.net/icons/000000/transparent/1x1/delapouite/archery-target.svg" alt="target" style="display:inline; width:1.2em; height:1.2em; vertical-align:-0.15em;"> **One Command to Rule Them All** - Manage dozens of stacks with a single command
|
|
||||||
<img src="https://game-icons.net/icons/000000/transparent/1x1/lorc/reload.svg" alt="reload" style="display:inline; width:1.2em; height:1.2em; vertical-align:-0.15em;"> **Database Wizardry** - Export, import, and clean up PostgreSQL databases like a boss
|
|
||||||
<img src="https://game-icons.net/icons/000000/transparent/1x1/delapouite/circus-tent.svg" alt="tent" style="display:inline; width:1.2em; height:1.2em; vertical-align:-0.15em;"> **Hook System** - Extend functionality with custom pre/post operation hooks
|
|
||||||
<img src="https://game-icons.net/icons/000000/transparent/1x1/delapouite/globe.svg" alt="network" style="display:inline; width:1.2em; height:1.2em; vertical-align:-0.15em;"> **Network Maestro** - Smart network management with CLI overrides
|
|
||||||
<img src="https://game-icons.net/icons/000000/transparent/1x1/lorc/padlock.svg" alt="lock" style="display:inline; width:1.2em; height:1.2em; vertical-align:-0.15em;"> **Environment Juggler** - Override any environment variable on the fly
|
|
||||||
<img src="https://game-icons.net/icons/000000/transparent/1x1/delapouite/paint-brush.svg" alt="colors" style="display:inline; width:1.2em; height:1.2em; vertical-align:-0.15em;"> **Beautiful Output** - Color-coded logs and status indicators
|
|
||||||
<img src="https://game-icons.net/icons/000000/transparent/1x1/lorc/round-bottom-flask.svg" alt="test" style="display:inline; width:1.2em; height:1.2em; vertical-align:-0.15em;"> **Dry-Run Mode** - Test changes before applying them
|
|
||||||
|
|
||||||
### <img src="https://game-icons.net/icons/000000/transparent/1x1/lorc/musical-notes.svg" alt="music" style="display:inline; width:1.2em; height:1.2em; vertical-align:-0.15em;"> Stack Management
|
|
||||||
- **Pattern-based selection**: Target stacks with globs, comma-separated lists, or wildcards
|
|
||||||
- **Bulk operations**: Execute commands across multiple stacks simultaneously
|
|
||||||
- **Status monitoring**: Visual feedback with color-coded success/failure indicators
|
|
||||||
- **Smart filtering**: Include/exclude stacks with flexible pattern matching
|
|
||||||
|
|
||||||
### <img src="https://game-icons.net/icons/000000/transparent/1x1/delapouite/save.svg" alt="database" style="display:inline; width:1.2em; height:1.2em; vertical-align:-0.15em;"> Database Operations
|
|
||||||
- **Automated backups**: Export PostgreSQL databases with timestamped dumps
|
|
||||||
- **Smart imports**: Auto-detect latest dumps or specify exact files
|
|
||||||
- **Drop & recreate**: Safe database import with connection termination
|
|
||||||
- **Cleanup utilities**: Keep only the latest dumps, remove old backups
|
|
||||||
- **Hook integration**: Custom pre/post operations for each database action
|
|
||||||
|
|
||||||
### <img src="https://game-icons.net/icons/000000/transparent/1x1/lorc/meat-hook.svg" alt="hook" style="display:inline; width:1.2em; height:1.2em; vertical-align:-0.15em;"> Extensibility
|
|
||||||
- **Custom hooks**: Define `pre_db_export`, `post_db_export`, `pre_db_import`, `post_db_import`
|
|
||||||
- **Stack-specific logic**: Each stack can have unique operational requirements
|
|
||||||
- **Environment access**: Hooks inherit all environment variables
|
|
||||||
- **Dry-run aware**: Test hook execution without side effects
|
|
||||||
|
|
||||||
### <img src="https://game-icons.net/icons/000000/transparent/1x1/delapouite/globe.svg" alt="network" style="display:inline; width:1.2em; height:1.2em; vertical-align:-0.15em;"> Network Management
|
|
||||||
- **Unified network**: All stacks communicate on a single Docker network
|
|
||||||
- **CLI overrides**: Change network on-the-fly without editing configs
|
|
||||||
- **Traefik integration**: Seamless reverse proxy setup with proper network awareness
|
|
||||||
- **Multi-network support**: Special stacks can have additional internal networks
|
|
||||||
|
|
||||||
### <img src="https://game-icons.net/icons/000000/transparent/1x1/delapouite/wrench.svg" alt="tools" style="display:inline; width:1.2em; height:1.2em; vertical-align:-0.15em;"> Environment Control
|
|
||||||
- **Global overrides**: Set environment variables via CLI flags
|
|
||||||
- **Layered configs**: Root `.env` + stack `.env` + CLI overrides
|
|
||||||
- **Precedence rules**: CLI > Stack > Root configuration hierarchy
|
|
||||||
- **Real-time changes**: No need to edit files for temporary overrides
|
|
||||||
|
|
||||||
## Quick Start
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Start all stacks
|
|
||||||
./kompose.sh "*" up -d
|
|
||||||
|
|
||||||
# View logs from specific stacks
|
|
||||||
./kompose.sh "blog,news" logs -f
|
|
||||||
|
|
||||||
# Export all databases
|
|
||||||
./kompose.sh "*" db:export
|
|
||||||
|
|
||||||
# Override network for staging
|
|
||||||
./kompose.sh --network staging "*" up -d
|
|
||||||
```
|
|
||||||
|
|
||||||
## Documentation Sections
|
|
||||||
|
|
||||||
### Getting Started
|
|
||||||
- [Installation Guide](/docs/installation) - Set up Kompose on your system
|
|
||||||
- [Quick Start](/docs/guide/quick-start) - Get up and running in minutes
|
|
||||||
|
|
||||||
### User Guide
|
|
||||||
- [Stack Management](/docs/guide/stack-management) - Managing multiple stacks
|
|
||||||
- [Database Operations](/docs/guide/database) - Backup and restore databases
|
|
||||||
- [Hooks System](/docs/guide/hooks) - Extend with custom hooks
|
|
||||||
- [Configuration](/docs/guide/configuration) - Configure Kompose and stacks
|
|
||||||
- [Network Architecture](/docs/guide/network) - Understanding networking
|
|
||||||
- [Troubleshooting](/docs/guide/troubleshooting) - Common issues and solutions
|
|
||||||
|
|
||||||
### Stack Reference
|
|
||||||
- [All Stacks](/docs/stacks) - Detailed documentation for each stack
|
|
||||||
|
|
||||||
### Reference
|
|
||||||
- [CLI Reference](/docs/reference/cli) - Complete command reference
|
|
||||||
- [Environment Variables](/docs/reference/environment) - All configuration options
|
|
||||||
@@ -1,28 +0,0 @@
|
|||||||
---
|
|
||||||
title: Reference Documentation
|
|
||||||
description: Complete reference documentation for Kompose
|
|
||||||
---
|
|
||||||
|
|
||||||
# Reference Documentation
|
|
||||||
|
|
||||||
Complete reference documentation for all aspects of Kompose.
|
|
||||||
|
|
||||||
## Command Line
|
|
||||||
|
|
||||||
- [CLI Reference](/docs/reference/cli) - All commands and options
|
|
||||||
- [Stack Patterns](/docs/reference/cli#stack-patterns) - Pattern matching syntax
|
|
||||||
|
|
||||||
## Configuration
|
|
||||||
|
|
||||||
- [Environment Variables](/docs/reference/environment) - All environment variables
|
|
||||||
- [Configuration Files](/docs/guide/configuration) - File structure and precedence
|
|
||||||
|
|
||||||
## Stack Reference
|
|
||||||
|
|
||||||
- [Stack Documentation](/docs/stacks) - Detailed docs for each stack
|
|
||||||
|
|
||||||
## Advanced Topics
|
|
||||||
|
|
||||||
- [Network Architecture](/docs/guide/network) - Network design and configuration
|
|
||||||
- [Hook System](/docs/guide/hooks) - Writing custom hooks
|
|
||||||
- [Database Operations](/docs/guide/database) - Advanced database management
|
|
||||||
@@ -1,145 +0,0 @@
|
|||||||
---
|
|
||||||
title: Auth Stack - The Bouncer at Your Digital Club
|
|
||||||
description: "You shall not pass... without proper credentials!"
|
|
||||||
---
|
|
||||||
|
|
||||||
# <img src="https://game-icons.net/icons/000000/transparent/1x1/lorc/padlock.svg" alt="lock" style="display:inline; width:1.2em; height:1.2em; vertical-align:-0.15em;"> Auth Stack - The Bouncer at Your Digital Club
|
|
||||||
|
|
||||||
> *"You shall not pass... without proper credentials!"* - Keycloak, probably
|
|
||||||
|
|
||||||
## What's This All About?
|
|
||||||
|
|
||||||
This stack is your authentication and identity management powerhouse. Think of it as the super-sophisticated bouncer for all your services - checking IDs, managing VIP lists, and making sure only the cool kids (authorized users) get into your digital club.
|
|
||||||
|
|
||||||
## The Star of the Show
|
|
||||||
|
|
||||||
### <img src="https://game-icons.net/icons/000000/transparent/1x1/delapouite/theater.svg" alt="theater" style="display:inline; width:1.2em; height:1.2em; vertical-align:-0.15em;"> Keycloak
|
|
||||||
|
|
||||||
**Container**: `auth_keycloak`
|
|
||||||
**Image**: `quay.io/keycloak/keycloak:latest`
|
|
||||||
**Home**: https://auth.pivoine.art
|
|
||||||
|
|
||||||
Keycloak is like having a Swiss Army knife for authentication. It handles:
|
|
||||||
- <img src="https://game-icons.net/icons/000000/transparent/1x1/delapouite/person.svg" alt="user" style="display:inline; width:1.2em; height:1.2em; vertical-align:-0.15em;"> **Single Sign-On (SSO)**: Log in once, access everything. Magic!
|
|
||||||
- <img src="https://game-icons.net/icons/000000/transparent/1x1/delapouite/ticket.svg" alt="ticket" style="display:inline; width:1.2em; height:1.2em; vertical-align:-0.15em;"> **Identity Brokering**: Connect with Google, GitHub, and other OAuth providers
|
|
||||||
- <img src="https://game-icons.net/icons/000000/transparent/1x1/delapouite/three-friends.svg" alt="users" style="display:inline; width:1.2em; height:1.2em; vertical-align:-0.15em;"> **User Management**: Keep track of who's who in your digital zoo
|
|
||||||
- <img src="https://game-icons.net/icons/000000/transparent/1x1/lorc/locked-fortress.svg" alt="security" style="display:inline; width:1.2em; height:1.2em; vertical-align:-0.15em;"> **OAuth 2.0 & OpenID Connect**: Industry-standard security protocols (the fancy stuff)
|
|
||||||
- <img src="https://game-icons.net/icons/000000/transparent/1x1/lorc/shield.svg" alt="shield" style="display:inline; width:1.2em; height:1.2em; vertical-align:-0.15em;"> **Authorization Services**: Fine-grained control over who can do what
|
|
||||||
|
|
||||||
## Configuration Breakdown
|
|
||||||
|
|
||||||
### Database Connection
|
|
||||||
Keycloak stores all its secrets (not literally, they're hashed!) in PostgreSQL:
|
|
||||||
```
|
|
||||||
Database: keycloak
|
|
||||||
Host: Shared data stack (postgres)
|
|
||||||
```
|
|
||||||
|
|
||||||
### Admin Access
|
|
||||||
**Username**: `admin` (creative, right?)
|
|
||||||
**Password**: Check your `.env` file (and change it, please!)
|
|
||||||
|
|
||||||
### Proxy Mode
|
|
||||||
Running in `edge` mode because we're living on the edge (behind Traefik)! This tells Keycloak to trust the proxy headers for HTTPS and hostname info.
|
|
||||||
|
|
||||||
## How It Works
|
|
||||||
|
|
||||||
1. **Startup**: Keycloak boots up and connects to the PostgreSQL database
|
|
||||||
2. **Health Check**: Every 30 seconds, it's like "Hey, I'm still alive!" (/health endpoint)
|
|
||||||
3. **Proxy Magic**: Traefik routes `https://auth.pivoine.art` → Keycloak
|
|
||||||
4. **SSL Termination**: Traefik handles HTTPS, Keycloak just chills on HTTP internally
|
|
||||||
|
|
||||||
## Environment Variables Explained
|
|
||||||
|
|
||||||
| Variable | What It Does | Cool Factor |
|
|
||||||
|----------|-------------|-------------|
|
|
||||||
| `KC_DB` | Database type (postgres) | <img src="https://game-icons.net/icons/000000/transparent/1x1/delapouite/elephant.svg" alt="elephant" style="display:inline; width:1.2em; height:1.2em; vertical-align:-0.15em;"> Elephants never forget |
|
|
||||||
| `KC_DB_URL` | JDBC connection string | <img src="https://game-icons.net/icons/000000/transparent/1x1/delapouite/plug.svg" alt="plug" style="display:inline; width:1.2em; height:1.2em; vertical-align:-0.15em;"> The digital umbilical cord |
|
|
||||||
| `KC_HOSTNAME` | Public-facing URL | <img src="https://game-icons.net/icons/000000/transparent/1x1/delapouite/globe.svg" alt="globe" style="display:inline; width:1.2em; height:1.2em; vertical-align:-0.15em;"> Your internet identity |
|
|
||||||
| `KC_PROXY` | Proxy mode setting | <img src="https://game-icons.net/icons/000000/transparent/1x1/delapouite/theater.svg" alt="proxy" style="display:inline; width:1.2em; height:1.2em; vertical-align:-0.15em;"> Trust the middleman |
|
|
||||||
| `KC_FEATURES` | Enabled features (docker) | <img src="https://game-icons.net/icons/000000/transparent/1x1/lorc/whale-tail.svg" alt="docker" style="display:inline; width:1.2em; height:1.2em; vertical-align:-0.15em;"> Whale hello there! |
|
|
||||||
|
|
||||||
## Ports & Networking
|
|
||||||
|
|
||||||
- **Internal Port**: 8080 (Keycloak's cozy home)
|
|
||||||
- **External Access**: Via Traefik at https://auth.pivoine.art
|
|
||||||
- **Network**: `kompose` (the gang's all here)
|
|
||||||
|
|
||||||
## Health & Monitoring
|
|
||||||
|
|
||||||
Keycloak does a self-check every 30 seconds:
|
|
||||||
```bash
|
|
||||||
curl -f http://localhost:8080/health
|
|
||||||
```
|
|
||||||
If it doesn't respond within 5 seconds or fails 3 times in a row, Docker knows something's up and will restart it (like turning it off and on again, but automated).
|
|
||||||
|
|
||||||
## Common Tasks
|
|
||||||
|
|
||||||
### Access the Admin Console
|
|
||||||
```
|
|
||||||
URL: https://auth.pivoine.art
|
|
||||||
Login: Your admin credentials from .env
|
|
||||||
```
|
|
||||||
|
|
||||||
### View Logs
|
|
||||||
```bash
|
|
||||||
docker logs auth_keycloak -f
|
|
||||||
```
|
|
||||||
|
|
||||||
### Restart After Config Changes
|
|
||||||
```bash
|
|
||||||
docker compose restart
|
|
||||||
```
|
|
||||||
|
|
||||||
### Connect a New Application
|
|
||||||
1. Log into Keycloak admin console
|
|
||||||
2. Create a new Client
|
|
||||||
3. Configure redirect URIs
|
|
||||||
4. Grab your client ID and secret
|
|
||||||
5. Integrate with your app (check Keycloak docs)
|
|
||||||
|
|
||||||
## Integration Tips
|
|
||||||
|
|
||||||
When integrating other services with Keycloak:
|
|
||||||
- **Discovery URL**: `https://auth.pivoine.art/realms/{realm}/.well-known/openid-configuration`
|
|
||||||
- **Default Realm**: Usually "master" but create your own!
|
|
||||||
- **Client Types**: Public (SPAs), Confidential (Backend apps)
|
|
||||||
|
|
||||||
## Troubleshooting
|
|
||||||
|
|
||||||
**Q: Can't log in to admin console?**
|
|
||||||
A: Check your `KC_ADMIN_USERNAME` and `KC_ADMIN_PASSWORD` in `.env`
|
|
||||||
|
|
||||||
**Q: Getting SSL errors?**
|
|
||||||
A: Make sure `KC_HOSTNAME` matches your Traefik setup
|
|
||||||
|
|
||||||
**Q: Changes not taking effect?**
|
|
||||||
A: Clear your browser cache, Keycloak loves to cache things
|
|
||||||
|
|
||||||
**Q: Database connection issues?**
|
|
||||||
A: Ensure the `data` stack is running and healthy
|
|
||||||
|
|
||||||
## Security Notes <img src="https://game-icons.net/icons/000000/transparent/1x1/lorc/locked-fortress.svg" alt="security" style="display:inline; width:1.2em; height:1.2em; vertical-align:-0.15em;">
|
|
||||||
|
|
||||||
- <img src="https://game-icons.net/icons/000000/transparent/1x1/delapouite/siren.svg" alt="alert" style="display:inline; width:1.2em; height:1.2em; vertical-align:-0.15em;"> **Change the default admin password** (seriously, do it now)
|
|
||||||
- <img src="https://game-icons.net/icons/000000/transparent/1x1/lorc/padlock.svg" alt="lock" style="display:inline; width:1.2em; height:1.2em; vertical-align:-0.15em;"> Database credentials are shared via root `.env`
|
|
||||||
- <img src="https://game-icons.net/icons/000000/transparent/1x1/delapouite/globe.svg" alt="globe" style="display:inline; width:1.2em; height:1.2em; vertical-align:-0.15em;"> Always access via HTTPS in production
|
|
||||||
- <img src="https://game-icons.net/icons/000000/transparent/1x1/delapouite/scroll-unfurled.svg" alt="log" style="display:inline; width:1.2em; height:1.2em; vertical-align:-0.15em;"> Enable audit logging for compliance
|
|
||||||
- <img src="https://game-icons.net/icons/000000/transparent/1x1/delapouite/archery-target.svg" alt="target" style="display:inline; width:1.2em; height:1.2em; vertical-align:-0.15em;"> Use realms to separate different applications/teams
|
|
||||||
|
|
||||||
## Fun Facts
|
|
||||||
|
|
||||||
- Keycloak is maintained by Red Hat (yeah, the Linux people!)
|
|
||||||
- It supports social login with Google, Facebook, GitHub, and more
|
|
||||||
- You can theme it to match your brand (goodbye boring login pages!)
|
|
||||||
- It handles thousands of users without breaking a sweat
|
|
||||||
|
|
||||||
## Resources
|
|
||||||
|
|
||||||
- [Keycloak Documentation](https://www.keycloak.org/documentation)
|
|
||||||
- [Getting Started Guide](https://www.keycloak.org/guides#getting-started)
|
|
||||||
- [Admin REST API](https://www.keycloak.org/docs-api/latest/rest-api/)
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
*Remember: With great authentication power comes great responsibility. Don't be the person who uses "admin/admin" in production.* <img src="https://game-icons.net/icons/000000/transparent/1x1/lorc/superhero.svg" alt="hero" style="display:inline; width:1.2em; height:1.2em; vertical-align:-0.15em;">
|
|
||||||
@@ -1,53 +0,0 @@
|
|||||||
---
|
|
||||||
title: Stack Reference
|
|
||||||
description: Detailed documentation for all Kompose stacks
|
|
||||||
---
|
|
||||||
|
|
||||||
# Stack Reference
|
|
||||||
|
|
||||||
This section contains detailed documentation for each stack in the Kompose ecosystem.
|
|
||||||
|
|
||||||
## Available Stacks
|
|
||||||
|
|
||||||
- [Auth](/docs/stacks/auth)
|
|
||||||
- [Auto](/docs/stacks/auto)
|
|
||||||
- [Blog](/docs/stacks/blog)
|
|
||||||
- [Chain](/docs/stacks/chain)
|
|
||||||
- [Chat](/docs/stacks/chat)
|
|
||||||
- [Code](/docs/stacks/code)
|
|
||||||
- [Dash](/docs/stacks/dash)
|
|
||||||
- [Data](/docs/stacks/data)
|
|
||||||
- [Dock](/docs/stacks/dock)
|
|
||||||
- [Home](/docs/stacks/home)
|
|
||||||
- [Link](/docs/stacks/link)
|
|
||||||
- [News](/docs/stacks/news)
|
|
||||||
- [Proxy](/docs/stacks/proxy)
|
|
||||||
- [Sexy](/docs/stacks/sexy)
|
|
||||||
- [Trace](/docs/stacks/trace)
|
|
||||||
- [Track](/docs/stacks/track)
|
|
||||||
- [Vault](/docs/stacks/vault)
|
|
||||||
- [Vpn](/docs/stacks/vpn)
|
|
||||||
|
|
||||||
## Stack Categories
|
|
||||||
|
|
||||||
### Infrastructure Stacks
|
|
||||||
Core infrastructure services that other stacks depend on:
|
|
||||||
- [Data](/docs/stacks/data) - PostgreSQL & Redis databases
|
|
||||||
- [Proxy](/docs/stacks/proxy) - Traefik reverse proxy
|
|
||||||
- [Trace](/docs/stacks/trace) - SigNoz observability
|
|
||||||
- [Vault](/docs/stacks/vault) - Vaultwarden password manager
|
|
||||||
- [VPN](/docs/stacks/vpn) - WireGuard VPN
|
|
||||||
|
|
||||||
### Application Stacks
|
|
||||||
Production application services:
|
|
||||||
- [Auth](/docs/stacks/auth) - Keycloak authentication
|
|
||||||
- [Blog](/docs/stacks/blog) - Static website server
|
|
||||||
- [News](/docs/stacks/news) - Letterspace newsletter platform
|
|
||||||
- [Sexy](/docs/stacks/sexy) - Directus CMS
|
|
||||||
|
|
||||||
### Utility Stacks
|
|
||||||
Management and monitoring tools:
|
|
||||||
- [Dock](/docs/stacks/dock) - Dockge Docker UI
|
|
||||||
- [Chat](/docs/stacks/chat) - Gotify notifications
|
|
||||||
- [Track](/docs/stacks/track) - Umami analytics
|
|
||||||
- [Auto](/docs/stacks/auto) - Semaphore CI/CD
|
|
||||||
6
Projects/kompose/docs/eslint.config.mjs
Normal file
6
Projects/kompose/docs/eslint.config.mjs
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
// @ts-check
|
||||||
|
import withNuxt from './.nuxt/eslint.config.mjs'
|
||||||
|
|
||||||
|
export default withNuxt(
|
||||||
|
// Your custom configs here
|
||||||
|
)
|
||||||
@@ -1,38 +1,100 @@
|
|||||||
// https://nuxt.com/docs/api/configuration/nuxt-config
|
// https://nuxt.com/docs/api/configuration/nuxt-config
|
||||||
export default defineNuxtConfig({
|
export default defineNuxtConfig({
|
||||||
compatibilityDate: '2025-07-15',
|
modules: [
|
||||||
devtools: { enabled: true },
|
'@nuxt/eslint',
|
||||||
|
'@nuxt/image',
|
||||||
|
'@nuxt/ui',
|
||||||
|
'@nuxt/content',
|
||||||
|
'nuxt-og-image',
|
||||||
|
'nuxt-llms'
|
||||||
|
],
|
||||||
|
|
||||||
|
// content: {
|
||||||
|
// build: {
|
||||||
|
// markdown: {
|
||||||
|
// // Object syntax can be used to override default options
|
||||||
|
// remarkPlugins: {
|
||||||
|
// // Override remark-emoji options
|
||||||
|
// 'remark-emoji': {
|
||||||
|
// options: {
|
||||||
|
// emoticon: true
|
||||||
|
// }
|
||||||
|
// },
|
||||||
|
// // Disable remark-gfm
|
||||||
|
// 'remark-gfm': false,
|
||||||
|
// // Add remark-oembed
|
||||||
|
// 'remark-oembed': {
|
||||||
|
// // Options
|
||||||
|
// }
|
||||||
|
// },
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// },
|
||||||
|
|
||||||
|
devtools: {
|
||||||
|
enabled: false
|
||||||
|
},
|
||||||
|
|
||||||
|
css: ['~/assets/css/main.css'],
|
||||||
|
|
||||||
content: {
|
content: {
|
||||||
experimental: { nativeSqlite: true },
|
|
||||||
build: {
|
build: {
|
||||||
markdown: {
|
markdown: {
|
||||||
// Object syntax can be used to override default options
|
toc: {
|
||||||
remarkPlugins: {
|
searchDepth: 1
|
||||||
// Override remark-emoji options
|
}
|
||||||
'remark-emoji': {
|
|
||||||
options: {
|
|
||||||
emoticon: true
|
|
||||||
}
|
|
||||||
},
|
|
||||||
// Disable remark-gfm
|
|
||||||
'remark-gfm': false,
|
|
||||||
// Add remark-oembed
|
|
||||||
'remark-oembed': {
|
|
||||||
// Options
|
|
||||||
}
|
|
||||||
},
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
modules: [
|
|
||||||
'@nuxt/content',
|
compatibilityDate: '2024-07-11',
|
||||||
'@nuxt/eslint',
|
|
||||||
'@nuxt/image',
|
nitro: {
|
||||||
'@nuxt/icon',
|
prerender: {
|
||||||
'@nuxt/fonts',
|
routes: [
|
||||||
'@nuxt/scripts',
|
'/'
|
||||||
'nuxt-zod-i18n',
|
],
|
||||||
'@nuxtjs/i18n'
|
crawlLinks: true,
|
||||||
],
|
autoSubfolderIndex: false
|
||||||
extends: ['docus']
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
eslint: {
|
||||||
|
config: {
|
||||||
|
stylistic: {
|
||||||
|
commaDangle: 'never',
|
||||||
|
braceStyle: '1tbs'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
icon: {
|
||||||
|
provider: 'iconify'
|
||||||
|
},
|
||||||
|
|
||||||
|
llms: {
|
||||||
|
domain: 'https://docs-template.nuxt.dev/',
|
||||||
|
title: 'Nuxt Docs Template',
|
||||||
|
description: 'A template for building documentation with Nuxt UI and Nuxt Content.',
|
||||||
|
full: {
|
||||||
|
title: 'Nuxt Docs Template - Full Documentation',
|
||||||
|
description: 'This is the full documentation for the Nuxt Docs Template.'
|
||||||
|
},
|
||||||
|
sections: [
|
||||||
|
{
|
||||||
|
title: 'Getting Started',
|
||||||
|
contentCollection: 'docs',
|
||||||
|
contentFilters: [
|
||||||
|
{ field: 'path', operator: 'LIKE', value: '/getting-started%' }
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: 'Essentials',
|
||||||
|
contentCollection: 'docs',
|
||||||
|
contentFilters: [
|
||||||
|
{ field: 'path', operator: 'LIKE', value: '/essentials%' }
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -1,40 +1,36 @@
|
|||||||
{
|
{
|
||||||
"name": "kompose-docs",
|
"name": "nuxt-ui-template-docs",
|
||||||
"type": "module",
|
|
||||||
"private": true,
|
"private": true,
|
||||||
|
"type": "module",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"build": "nuxt build --extend docus",
|
"build": "nuxt build",
|
||||||
"dev": "nuxt dev --extend docus",
|
"dev": "nuxt dev",
|
||||||
"generate": "nuxt generate",
|
|
||||||
"preview": "nuxt preview",
|
"preview": "nuxt preview",
|
||||||
"postinstall": "nuxt prepare"
|
"postinstall": "nuxt prepare",
|
||||||
|
"lint": "eslint .",
|
||||||
|
"typecheck": "nuxt typecheck"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@googlemaps/markerclusterer": "^2.6.2",
|
"@iconify-json/lucide": "^1.2.68",
|
||||||
"@nuxt/content": "3.7.1",
|
"@iconify-json/simple-icons": "^1.2.54",
|
||||||
"@nuxt/eslint": "1.9.0",
|
"@iconify-json/vscode-icons": "^1.2.30",
|
||||||
"@nuxt/fonts": "0.11.4",
|
"@nuxt/content": "^3.7.1",
|
||||||
"@nuxt/icon": "2.0.0",
|
"@nuxt/image": "^1.11.0",
|
||||||
"@nuxt/image": "1.11.0",
|
"@nuxt/ui": "^4.0.1",
|
||||||
"@nuxt/scripts": "0.12.1",
|
"@tailwindcss/typography": "^0.5.19",
|
||||||
"@nuxtjs/i18n": "^10.1.0",
|
"better-sqlite3": "^12.4.1",
|
||||||
"@unhead/vue": "^2.0.18",
|
"nuxt": "^4.1.2",
|
||||||
"docus": "^5.2.0",
|
"nuxt-llms": "0.1.3",
|
||||||
"eslint": "^9.37.0",
|
"nuxt-og-image": "^5.1.11"
|
||||||
"nuxt": "^4.1.3",
|
|
||||||
"nuxt-zod-i18n": "^1.12.1",
|
|
||||||
"remark-oembed": "^1.2.2",
|
|
||||||
"vue": "^3.5.22",
|
|
||||||
"vue-router": "^4.5.1",
|
|
||||||
"zod": "^3.25.76",
|
|
||||||
"zod-to-json-schema": "3.24.6"
|
|
||||||
},
|
},
|
||||||
"packageManager": "pnpm@10.13.1",
|
"devDependencies": {
|
||||||
"pnpm": {
|
"@nuxt/eslint": "^1.9.0",
|
||||||
"onlyBuiltDependencies": [
|
"eslint": "^9.37.0",
|
||||||
"@tailwindcss/oxide",
|
"typescript": "^5.9.3",
|
||||||
"better-sqlite3",
|
"vue-tsc": "^3.1.0"
|
||||||
"vue-demi"
|
},
|
||||||
]
|
"resolutions": {
|
||||||
}
|
"unimport": "4.1.1"
|
||||||
|
},
|
||||||
|
"packageManager": "pnpm@10.18.0"
|
||||||
}
|
}
|
||||||
|
|||||||
1553
Projects/kompose/docs/pnpm-lock.yaml
generated
1553
Projects/kompose/docs/pnpm-lock.yaml
generated
File diff suppressed because it is too large
Load Diff
@@ -1,3 +1,10 @@
|
|||||||
onlyBuiltDependencies:
|
ignoredBuiltDependencies:
|
||||||
|
- '@parcel/watcher'
|
||||||
- '@tailwindcss/oxide'
|
- '@tailwindcss/oxide'
|
||||||
|
- esbuild
|
||||||
|
- unrs-resolver
|
||||||
- vue-demi
|
- vue-demi
|
||||||
|
|
||||||
|
onlyBuiltDependencies:
|
||||||
|
- better-sqlite3
|
||||||
|
- sharp
|
||||||
|
|||||||
@@ -1,2 +0,0 @@
|
|||||||
User-Agent: *
|
|
||||||
Disallow:
|
|
||||||
13
Projects/kompose/docs/renovate.json
Normal file
13
Projects/kompose/docs/renovate.json
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"extends": [
|
||||||
|
"github>nuxt/renovate-config-nuxt"
|
||||||
|
],
|
||||||
|
"lockFileMaintenance": {
|
||||||
|
"enabled": true
|
||||||
|
},
|
||||||
|
"packageRules": [{
|
||||||
|
"matchDepTypes": ["resolutions"],
|
||||||
|
"enabled": false
|
||||||
|
}],
|
||||||
|
"postUpdateOptions": ["pnpmDedupe"]
|
||||||
|
}
|
||||||
27
Projects/kompose/docs/server/routes/raw/[...slug].md.get.ts
Normal file
27
Projects/kompose/docs/server/routes/raw/[...slug].md.get.ts
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
import { withLeadingSlash } from 'ufo'
|
||||||
|
import { stringify } from 'minimark/stringify'
|
||||||
|
import { queryCollection } from '@nuxt/content/nitro'
|
||||||
|
import type { Collections } from '@nuxt/content'
|
||||||
|
|
||||||
|
export default eventHandler(async (event) => {
|
||||||
|
const slug = getRouterParams(event)['slug.md']
|
||||||
|
if (!slug?.endsWith('.md')) {
|
||||||
|
throw createError({ statusCode: 404, statusMessage: 'Page not found', fatal: true })
|
||||||
|
}
|
||||||
|
|
||||||
|
const path = withLeadingSlash(slug.replace('.md', ''))
|
||||||
|
|
||||||
|
const page = await queryCollection(event, 'docs' as keyof Collections).path(path).first()
|
||||||
|
if (!page) {
|
||||||
|
throw createError({ statusCode: 404, statusMessage: 'Page not found', fatal: true })
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add title and description to the top of the page if missing
|
||||||
|
if (page.body.value[0]?.[0] !== 'h1') {
|
||||||
|
page.body.value.unshift(['blockquote', {}, page.description])
|
||||||
|
page.body.value.unshift(['h1', {}, page.title])
|
||||||
|
}
|
||||||
|
|
||||||
|
setHeader(event, 'Content-Type', 'text/markdown; charset=utf-8')
|
||||||
|
return stringify({ ...page.body, type: 'minimark' }, { format: 'markdown/html' })
|
||||||
|
})
|
||||||
@@ -1,18 +1,4 @@
|
|||||||
{
|
{
|
||||||
// https://nuxt.com/docs/guide/concepts/typescript
|
// https://nuxt.com/docs/guide/concepts/typescript
|
||||||
"files": [],
|
"extends": "./.nuxt/tsconfig.json"
|
||||||
"references": [
|
|
||||||
{
|
|
||||||
"path": "./.nuxt/tsconfig.app.json"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"path": "./.nuxt/tsconfig.server.json"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"path": "./.nuxt/tsconfig.shared.json"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"path": "./.nuxt/tsconfig.node.json"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user